有兄弟写过DS18B20+1602的程序吗?大家帮我看看有啥问题,昨晚显示温度为25.5度,今天怎么还是显示为25.5度呢
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit DQ=P2^2;
uchar dates[]={0,0,0};
uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
void delay_us(uchar x) //延时 x * 1.084 + 2.73 us
{
while(--x);
}
void delay_ms(uint z) //延时任意ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=240;y>0;y--);
}
void DS18B20_init()
{
DQ = 1; //拉高数据总线线
_nop_(); //延时1us
DQ = 0; //拉低数据总线
delay_us(250); //延时273us
delay_us(250); //延时273us
DQ = 1; //释放总线
delay_us(75); //延时84us,等待DS18B2发存在信号
delay_us(210); //延时230us
DQ = 1; //释放总线
}
void DS18B20_write_byte(uchar temp)
{
uchar i;
ACC = temp;
for(i=8;i>0;i--)
{
DQ = 0;
delay_us(12); //延时15.73us
DQ = ACC0;
ACC>>=1;
delay_us(40); //延时46us
DQ = 1;
_nop_();
}
}
uchar DS18B20_read_byte()
{
uchar i;
for(i=8;i>0;i--)
{
ACC>>=1;
DQ = 0;
delay_us(8); //延时11.4us
DQ = 1;
_nop_();
ACC7 = DQ;
delay_us(45); //延时51.5us
DQ = 1;
}
return ACC;
}
uint DS18B20_read()
{
uchar wh,wl;
uint temp;
float t;
DS18B20_init(); //复位信号
DS18B20_write_byte(0xcc); //跳过ROM命令
DS18B20_write_byte(0x44); //执行温度转换命令
delay_ms(1); //等待温度转换
DS18B20_init(); //复位信号
DS18B20_write_byte(0xcc); //跳过ROM命令
DS18B20_write_byte(0xbe); //读暂存器命令
wl = DS18B20_read_byte(); //读温度的低字节
wh = DS18B20_read_byte(); //读温度的高字节
_nop_();
temp = wh;
temp<<=8;
temp|=wl;
t = temp*0.0625;
temp = t*10+0.5;
return temp;
}
void dealvel(uint v)
{
dates[0] =v/100;
dates[1] =v%100/10;
dates[2]=v%10;
}
void main()
{ uchar t;
init();
while(1)
{
t=DS18B20_read();
dealvel(t) ;
write_com(0x80+0x45);
write_date(dates[0]+0x30);
write_com(0x80+0x46);
write_date(dates[1]+0x30);
write_com(0x80+0x47);
write_date(dates[2]+0x30);
//delay(2);
}
}
请大家帮我看一下啊,程序运行没问题,就是显示数值一直不变呢,昨晚搞了一晚上,也没搞明白
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>