用STC89C52单片机和DS18B20显示温度,程序无语法错误,无警告,但是就是显示不了温度,一直显示00.0,求大神帮分析下程序,看哪里不对
#include<reg52.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs = P3^5;
sbit rw = P3^6;
sbit lcden = P3^4;
sbit we=P2^7;
sbit du=P2^6;
sbit dq=P2^2;
uchar shi,fen,miao,count;
uint temp;
float f_temp;
/*----------延时子函数----------*/
void delayms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=124;j>0;j--);
}
void write_com(uchar com) //向12864写指令
{
uint i;
rs=0;rw=0;lcden=1;
P0=com;
i=12;while(i>0)i--; //延时98微秒
lcden=0;
i=12;while(i>0)i--; //延时98微秒
}
void write_dat(uchar dat)//向12864写数据
{
uint i;
rs=1;rw=0;lcden=1;
P0=dat;
i=12;while(i>0)i--; //延时98微秒
lcden=0;
i=12;while(i>0)i--; //延时98微秒
}
void init12864()
{
uint i;
du=0;
we=0;
delayms(2);
write_com(0x30);
i=12;while(i>0)i--; //延时98微秒
write_com(0x30); //选择8bit数据流
i=12;while(i>0)i--; //延时98微秒
write_com(0x0c); //开显示(无游标、不反白)
i=12;while(i>0)i--; //延时98微秒
write_com(0x01); //清除显示,并且设定地址指针为00H
delayms(5);
write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
i=12;while(i>0)i--; //延时98微秒
}
/*--------------初始化DS18B20------------------*/
void initds18b20()
{
uint i;
dq=0; //总线拉低
i=70;while(i>0)i--; //延时562微秒
dq=1; //总线拉高
i=4;while(i>0)i--; //延时35微秒
}
/*--------------------读一位数据------------------*/
bit readbit(void)
{
uint i;
bit dat;
dq=0;i++; //i++做延时用
dq=1;i++;i++;
dat=dq;
i=4;while(i>0)i--; //延时34微秒
return (dat);
}
uchar readds18b20()
{
uchar i,j,dat;
dat=0;
for(i=0;i<8;i++)
{
j=readbit();
dat=j<<7; //读出的数据在最低位,移动到最高位去
dat>>=1; //回移一位,8次读出
}
return dat; //返回字节
}
/*----------------向DS18B20写一个字节--------------------*/
void writeds18b20(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j=0;j<8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
dq=0;
i++;i++;
dq=1;
i=6;while(i>0)i--; //延时51微秒
}
else
{
dq=0;
i=10;while(i>0)i--; //延时83微秒
dq=1;
i++;i++;
}
}
}
void startds18b20()
{
initds18b20();
delayms(1);
writeds18b20(0xcc);
writeds18b20(0x44);
}
uint gettemp()
{
uchar a,b;
initds18b20();
delayms(1);
writeds18b20(0xcc);
writeds18b20(0xbe);
a=readds18b20();
b=readds18b20();
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;//小数点左移4位
temp=f_temp*10+0.5;//取小数点后1位显示,+0.5表示四舍五入
return temp;
}
void distemp()
{
uint t;
t=gettemp();
write_com(0x90);
write_dat(0x30+t/100);
write_dat(0x30+t%100/10);
write_dat(0x20+14);
write_dat(0x30+t%10);
}
void main()
{
init12864();
startds18b20();
while(1)
{
distemp();
}
}
|