新手请教关于DS18B20+1602的问题,请兄弟们看看
有兄弟写过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 =v/100;
dates =v%100/10;
dates=v%10;
}
void main()
{ uchar t;
init();
while(1)
{
t=DS18B20_read();
dealvel(t) ;
write_com(0x80+0x45);
write_date(dates+0x30);
write_com(0x80+0x46);
write_date(dates+0x30);
write_com(0x80+0x47);
write_date(dates+0x30);
//delay(2);
}
}
请大家帮我看一下啊,程序运行没问题,就是显示数值一直不变呢,昨晚搞了一晚上,也没搞明白 咋没人理我? http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4158711&bbs_page_no=1&search_mode=1&search_text=DS18b20&bbs_id=1006
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1593236&bbs_page_no=1&search_mode=1&search_text=DS18b20&bbs_id=1006 应该是你读取/写入温度数据的延时不对吧,要注意ds18b20的时序
这个比较简洁
void wr_ds18b20(uchar com)
{
uchar i;
for(i=0;i<8;i++)
{
ds18b20_dq=0;
ds18b20_dq=com&0x01;
delay(5);
ds18b20_dq=1;
com=com>>1;
}
}
uchar rd_ds18b20(void)
{
uchar i,com;
for(i=0;i<8;i++)
{
ds18b20_dq=0;
com=com>>1;
ds18b20_dq=1;
if(ds18b20_dq)
com=com|0x80;
delay(4);
}
return com;
} 可能坏了!!
呵呵 {:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:} {:sweat:}{:funk:}{:funk:}{:funk:} 上两张截图来看看!!!!
页:
[1]