发布时间 : 星期一 文章基于51单片机的数字温度计DS18B20全部注释更新完毕开始阅读fb8aed54804d2b160b4ec0ab
#include
sbit rs=P2^4;//向液晶控制器器写数据,写命令选择端 sbit rw=P2^5;//向液晶器读,写选择端 sbit en=P2^6;//使能信号端,lcd1602
sbit DQ=P3^3;//温度传输线,一线双向数据传输 uchar s;
uchar code a[]=%uchar code b[]=%uchar code c[]=%uchar code d[]=%uchar code e[]=\
void delay(uint x)//延时x毫秒,晶振为12MHz { uint i,j; for(i=x;i>0;i--) for(j=120;j>0;j--); }
void lcdxie_zhiling(uchar zhiling);//lcd1602写指令 void lcdxie_shuju(uchar shuju);//lcd1602写数据 void lcdchushihua();//初始化lcd1602 void dschushihua();//18B20初始化 bit dubit();//读一位数据函数
uchar du_zijie();//读一个字节数据函数 void xie_zijie(uchar dat);//向18B20写一个字节 void fenpin1(uchar t);//分频显示整数温度
void fenpin2(uchar t);//分频显示小数温度 void hanshuchushihua();//函数初始化 void main() {
uchar H,L,N,D;
hanshuchushihua();//函数初始化
while(1) {
dschushihua();//18B20初始化 } }
void hanshuchushihua()//函数初始化 {
lcdchushihua();//初始化lcd1602
lcdxie_zhiling(0x80+0x01);
delay(1); //小延时,做缓冲 fenpin1(N);//显示温度的整数部分 fenpin2(D);//显示温度的小数部分 L=du_zijie();//先读的是温度值低位 H=du_zijie();//接着读的是温度值高位
N=H*16+L/16;//整数部分,实际温度值=(H*256+L)/16,即:H*16+L/16 D=(L)*10/16;//小数部分,将余数乘以10再除以16取整,即第一位小数
for(s=0;s<14;s++)//显示\爱到花开\ { }
lcdxie_zhiling(0x80+0x40+0x02); for(s=0;s<6;s++) {
lcdxie_shuju(b[s]);//显示\今天\ delay(5); }
lcdxie_zhiling(0x80+0x40+0x0a); lcdxie_shuju(d[0]);//显示\
lcdxie_zhiling(0x80+0x40+0x0c); lcdxie_shuju(d[1]);//显示\ delay(5);
if(du_zijie()==1)//如果du_zijie()返回的值为1,则18B20可能以坏,将进入死循环 {
lcdxie_zhiling(0x80+0x04); for(s=0;s<5;s++)//显示\; {
lcdxie_shuju(e[s]); delay(5); }
lcdxie_shuju(a[s]); delay(5);
}
while(1);//进入死循环
delay(10); }
void lcdxie_zhiling(uchar zhiling)//lcd1602写指令 {
rs=0; //选择写命令模式
P0=zhiling;//将要写的命令字送到数据总线上 delay(5); //稍作延时以待数据稳定 en=1;
//使能端给一高脉冲,因为初始化函数中已经将lcden置0
delay(5); //稍作延时 en=0; }
void lcdxie_shuju(uchar shuju)//lcd1602写数据 {
rs=1; //选择写数据模式
P0=shuju;//将要写的数据字送到数据总线上 delay(5); //稍作延时以待数据稳定 en=1;
//使能端给一高脉冲,因为初始化函数中已经将lcden置0 //将使能端置0以完成高脉冲
delay(5);//稍作延时 en=0; }
void lcdchushihua()//初始化lcd1602 { rs=0;
//将使能端置0以完成高脉冲