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

2019-07-15 12:15发布

我单独写了一个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;
}  


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
chenwei6991627
1楼-- · 2019-07-15 15:22
那肯定是程序的问题了啊
心尘羽化
2楼-- · 2019-07-15 19:07
chenwei6991627 发表于 2016-12-26 13:19
那肯定是程序的问题了啊

目前找不到问题呢,测过之后发现是中断冲突,您能帮我看看不
糖炒栗子余粟
3楼-- · 2019-07-15 22:20
 精彩回答 2  元偷偷看……
人中狼
4楼-- · 2019-07-16 02:49
糖炒栗子余粟 发表于 2017-11-25 20:50
楼主问题找到了吗

你最好能开一个新的主题来提出自己的疑问和问题现象,一年前的主题,估计不会有回复你的
6华仔
5楼-- · 2019-07-16 03:23
ds18b20对时序的要求要非常的高,你在进行测温的时候把总中断关了试试,不要让中断影响测温。

一周热门 更多>