微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ds28b20和1602还有电机驱动后,显示不出来

ds28b20和1602还有电机驱动后,显示不出来

时间:10-02 整理:3721RD 点击:
我单独写了一个1602与温度模块的检测程序,显示与测温都是正常,直流电机部分换一个普通主函数也是可以用的
现在我把两个综合起来,结果出现了问题【电机也不再转动,温度显示不再变化,总是就显示一个数字15.6,而且其中的1还是乱码】
感觉自己没看到哪里问题,有点尴尬,希望大家慷慨赐教,微笑~

#include<reg52.h>
#include<intrins.h>
#include<math.h>
     
#define uint unsigned int
#define uchar unsigned char

uchar code table[]="Temp is:";
uchar code table1[]={"A2 dangwei:"};

sbit DQ=P1^7; //连接DS18B20
sbit rs=P2^6; //连接1602 RS脚
sbit rw= P2^5; //连接1602 的R/W脚,可选择是否编译
sbit en=P2^7; //连接1602 E脚

uchar tplsb,tpmsb; // 温度值低位、高位字节
uint temp;

sbit en1=P1^0;      
sbit s1=P1^1;   
sbit s2=P1^2;      
uchar t=0;   
uchar m1=0;   
uchar m2=0;   
uchar tmp1,tmp2;
void motor(uchar index, char speed)  
{  
if(speed>=-100 && speed<=100)  
{  
  if(index==1)  
  {  
   m1=abs(speed);  
   if(speed<0)  
   {  
    s1=0;  
    s2=1;  
   }  
   else   
   {  
    s1=1;  
    s2=0;  
   }  
  }  
}  
}

void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*******************产生复位脉冲初始化DS18B20**************/
void reset(void)
{
uint i;
DQ=0;
i=100;
while(i--);
DQ=1;// 产生上升沿
i=4;
while(i--);
}

/********************* 等待应答脉冲*********************/
void wait(void)
{
uint i;
while(DQ);
while(~DQ); // 检测到应答脉冲
i=4;
while(i--);
}

bit readbit(void)
{
uint i;
bit b;
DQ=0;
i++;
DQ=1;
i++;i++;// 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
b=DQ;
i=10;
while(i--);
return (b);
}

/******************* 读取数据的一个字节**************************/
uchar readbyte(void)
{
uchar i,j,b;
b=0;
for(i=0;i<8;i++)
{
j=readbit();
b=(j<<7)|(b>>1);
}
return(b);
}

/******************写数据的一个字节,满足写1和写0的时隙要求************/
void writebyte(uchar b)
{
uint i;
uchar j;
bit btmp;
for(j=0;j<8;j++)
{
btmp=b&0x01;
b=b>>1; // 取下一位(由低位向高位)
if(btmp)
{
DQ=0;
i++;i++;
DQ=1;
i=10;
while(i--);// 整个写1时隙不低于60us
}
else
{
DQ=0;
i=10;
while(i--); // 保持低在60us到120us之间
DQ=1;
i++;i++;
}
}
}

/************************* 启动温度转换********************/
void convert(void)
{
reset();// 产生复位脉冲,初始化DS18B20
wait();//等待DS18B20给出应答脉冲
writebyte(0xcc);// skip rom 命令
writebyte(0x44);// convert T 命令
}

/********************* 读取温度值****************************/
uint readtemp(void)
{
float tt;
reset();
wait();
delay(1);
writebyte(0xcc);// skip rom 命令
writebyte(0xbe);// read scratchpad 命令
tplsb=readbyte();// 温度值低位字节(其中低4位为二进制的"小数"部分)
tpmsb=readbyte();// 高位值高位字节(其中高5位为符号位)
temp=tpmsb;
temp<<=8;
temp=temp|tplsb;
tt=temp*0.0625;
temp=tt*10+0.5;
return (temp);
}

void write1602_com(uint com)//1602写命令
{
rs=0;
rw=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}

void write1602_date(uchar date)//1602写数据
{
rs=1;
rw=0;
P0=date;


delay(5);
en=1;
delay(5);
en=0;
}

void init1602(void) //1602初始化
{
write1602_com(0x38);//设置显示模式
write1602_com(0x0c);//设置开显示,不显示光标
write1602_com(0x06);//写一个字符后地址加一
write1602_com(0x01);//显示清0
}

void display(uint temp) //显示函数
{
uchar a1,a2,a3,a4;
a1=temp/100;
a2=temp%100;
a3=a2/10;
a4=a2%10;
write1602_com(0x80+0x40+0x09);//第一行第9个位置显示温度的十位、个位和小数点后一位
write1602_date(a1+0x30);
delay(1);
write1602_date(a3+0x30);
delay(1);
write1602_date('.');
delay(1);
write1602_date(a4+0x30);
delay(1);
}
void display1()
{
uchar num;
write1602_com(0x80+0x01); // 在第一行开头显示“Welcome to”
for(num=0;num<11;num++)
{
write1602_date(table1[num]);
delay(5);
}
write1602_com(0x80+0x40); //在第二行开头显示“TEMP IS”
for(num=0;num<8;num++)
{
write1602_date(table[num]);
delay(5);
}
write1602_com(0x80+0x40+0x0d);
write1602_date(0xdf); //显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码
write1602_date(0x43); //显示"C"符号,0x43是液晶屏字符库里大写C的地址码
}

void main()
{
TMOD=0x02;

TH0=0x9B;
TL0=0x9B;  
EA=1;
ET0=1;
TR0=1;

init1602(); //1602初始化

convert();

delay(1000);// 启动温度转换,需要750ms

readtemp(); // 读取温度
while(1)

{

  display1();

  convert();

  display(readtemp());

  if(readtemp() <= 200)
  {
   
   write1602_com(0x80 + 0x0d);
  
   write1602_date(0+0x30);
  
   motor(1,0);
  }
  if(readtemp() > 200 && readtemp() <= 240)
  {
  
   write1602_com(0x80 + 0x0d);
  
   write1602_date(1+0x30);
  
   motor(1,30);   
   
  }
  if( readtemp > 240 && readtemp <= 280 )
  {
  
   write1602_com(0x80 + 0x0d);
  
   write1602_date(2+0x30);
  
   motor(1,60);
  }

  if( readtemp() > 280 && readtemp() <= 320 )
  {
  
   write1602_com(0x80 + 0x0d);
  
   write1602_date(3+0x30);
  
   motor(1,90);
  }
  delay(500);
  
}
}

void timer0() interrupt 1
{  
if(t==0)
  {  
   tmp1=m1;  
  }  
if(t<tmp1) en1=1; else en1=0;  iz
   t++;  
if(t>=100) t=0;
}  

那肯定是程序的问题了啊

目前找不到问题呢,测过之后发现是中断冲突,您能帮我看看不

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top