用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();
}
}
|