我单独写了一个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;
}
一周热门 更多>