串行扩展应用
利用 DS18B20 和 LED 实现单总线温度测量系统的数字管。DS18B测量范围为-55℃~128℃。由于只接有两个 LED数字管,所以显示的值只能在 00~~99 之间。
(1)硬件图
Proteus仿真图:
(2)软件设计
#include<reg51.h> #include"intrins.h" #define uchar unsigned char #define uint unsigned int #define out P0 sbit smg1=out^4; sbit smg2=out^5; sbit DQ=P3^7; void delay5(uchar); void init_ds18b20(void); uchar readbyte(void); void writebyte(uchar); uchar retemp(void);
void main(){ uchar i,temp; delay5(1000); while(1){ temp=retemp(); for(i=0;i<10;i ){ out=(temp/10)&0x0f; smg1=0; smg2=1; delay5(1000); out=(temp)&0x0f; smg1=1; smg2=0; delay5(1000); } } }
void delay5(uchar n){ do{ nop(); nop(); nop(); n–; }while(n); }
void init_ds18b20(void){ uchar x=0; DQ=0; delay5(120); DQ=1; delay5(16); delay5(80); }
uchar readbyte(void){ uchar i=0; uchar date=0; for(i=8;i>0;i–){ DQ=0; delay5(1); DQ=1; date>>=1; if(DQ)date|=0x80; delay5(11); } return(date); }
void writebyte(uchar dat){ uchar i=0; for(i=8;i>0;i–){ DQ=0; DQ=dat&0x01; delay5(12); DQ=1; dat>>=1; delay5(5); } }
uchar retemp(void){ uchar a,b,tt; uint t; init_ds18b20(); writebyte(0xcc); writebyte(0x44); init_ds18b20(); writebyte(0xcc); writebyte(0xbe); a=readbyte(); b=readbyte(); t=b; t<<=8; t=t|a; tt=t*0.0625; return(tt); }
(3)效果图
模拟运行状态①(未操作温度)
模拟运行状态②(未操作温度)
模拟运行状态③(ds18b按下20个按钮,温度升高)
模拟运行状态④(ds18b按下20个按钮,温度升高)
实验结论及分析
1.程序的核心思想
①DS18B不同于传统的热敏电阻,DS18B20 单片机度可直接转换为单片机处理的串行数字信号。通过对 DS18B20 可以实现编程 9~12 位的温度读数可以分别读取 93.75ms 和 750ms 内完成 9 位和 12 位数量。测温范围-55℃~ 125℃,最大分辨率为 0.0625℃,在一10℃~ 85℃测温精度在范围内±0.5℃。 ②DS18B20也可以看作是一个小型单片机系统,它将温度信息收集到自己的内存中,然后通过一定的节拍将温度信息一个接一个地传输到at89c在单片机中进行二位数码管显数。
2.实验中遇到的问题
①lcd输入信息时记得初始化,否则不会显数。 ②注意DS18B20的温度信息一一传入at89c在单片机中严格控制节拍,节拍不正确会影响数据传输。 ③at89c51单片机的时钟频率应设置为11.0592mhz。