DS18B20的温度读取和液晶显示_第1页
DS18B20的温度读取和液晶显示_第2页
DS18B20的温度读取和液晶显示_第3页
DS18B20的温度读取和液晶显示_第4页
DS18B20的温度读取和液晶显示_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上TX-1开发板DS18B20的温度读取和液晶显示#include#include#define uchar unsigned char#define uint unsigned intuchar code digit10=;uchar code error=Error!Check!;uchar time;uchar TL,TH,TN,TD; sbit dula=P26;sbit wela=P27;sbit lcdrs=P35;sbit lcden=P34;sbit DQ=P22;void delayus(uint z);void delay1ms();void del

2、aynms(uchar n);void lcd_init();void lcd_wc(uchar com);void lcd_wd(uchar dat);bit Init_DS18B20();void display_error();void display_dot();void display_temp1(uchar x);void display_temp2(uchar x);WriteOneChar(uchar dat);uchar ReadOneChar(void);void ReadyReadTemp();void main()lcd_init();delaynms(5);displ

3、ay_dot();while(Init_DS18B20()=1) display_error(); while(1) /不断检测并显示温度delaynms(100);ReadyReadTemp(); /读温度准备TL=ReadOneChar(); /先读的是温度值低位TH=ReadOneChar(); /接着读的是温度值高位TN=TH*16+TL/16; /实际温度值=(TH*256+TL)/16,即:TH*16+TL/16 /这样得出的是温度的整数部分,小数部分被丢弃了TD=(TL%16)*10/16; /计算温度的小数部分,将余数乘以10再除以16取整,/这样得到的是温度小数部分的第一位数

4、字(保留1位小数)display_temp1(TN); /显示温度的整数部分display_temp2(TD); /显示温度的小数部分 delaynms(10); void lcd_init()dula=0;wela=0;lcd_wc(0x38);delaynms(5);lcd_wc(0x38);/写两次以确保初始化成功lcd_wc(0x01);lcd_wc(0x0e);lcd_wc(0x06);lcd_wc(0x80);void lcd_wc(uchar com)lcdrs=0;P0=com;delaynms(3);lcden=1;delaynms(6);lcden=0;void lcd_w

5、d(uchar dat)lcdrs=1;P0=dat;delaynms(3);lcden=1;delaynms(6);lcden=0;void delay1ms()unsigned char i,j;for(i=0;i10;i+)for(j=0;j33;j+); void delaynms(uchar n)unsigned char i;for(i=0;in;i+)delay1ms();bit Init_DS18B20()bit flag;DQ = 1; /先将数据线拉高for(time=0;time2;time+); /略微延时约6微秒DQ = 0; /再将数据线从高拉低,要求保持48096

6、0usfor(time=0;time200;time+);/略微延时约600微?(以向DS18B20发出一持续480960us的低电平复位脉冲)DQ = 1; /释放数据线(将数据线拉高) for(time=0;time20;time+); /延时约30us(释放总线后需等待1560us让DS18B20输出存在脉冲)flag=DQ; /让单片机检测是否输出了存在脉冲(DQ=0表示存在) for(time=0;time200;time+);/延时足够长时间,等待存在脉冲输出完毕return(flag); /返回检测成功标志 void display_error()uchar i;lcd_wc(0

7、x80); /写显示地址,将在第1行第1列开始显示i = 0; /从第一个字符开始显示while(errori != 0)/只要没有写到结束标志,就继续写lcd_wd(errori); /将字符常量写入LCDi+; /指向下一个字符delaynms(100); /延时100ms较长时间,以看清关于显示的说明while(1); /进入死循环,等待查明原因void display_dot() lcd_wc(0x49+0x80);/写显示地址,将在第2行第10列开始显示 lcd_wd(.); /将小数点的字符常量写入LCDdelaynms(50); /延时1ms给硬件一点反应时间void displ

8、ay_temp1(uchar x)uchar j,k,l; /j,k,l分别储存温度的百位、十位和个位j=x/100; /取百位k=(x%100)/10; /取十位l=x%10; /取个位 lcd_wc(0x46+0x80);/写显示地址,将在第2行第7列开始显示lcd_wd(digitj); /将百位数字的字符常量写入LCDlcd_wd(digitk); /将十位数字的字符常量写入LCDlcd_wd(digitl); /将个位数字的字符常量写入LCDdelaynms(50); /延时1ms给硬件一点反应时间 void display_temp2(uchar x) lcd_wc(0x4a+0x

9、80); /写显示地址,将在第2行第11列开始显示lcd_wd(digitx); /将小数部分的第一位数字字符常量写入LCDdelaynms(50); /延时1ms给硬件一点反应时间WriteOneChar(uchar dat)uchar i=0;for(i=0;i8;i+) DQ =1; / 先将数据线拉高 _nop_(); /等待一个机器周期 DQ=0; /将数据线从高拉低时即启动写时序 DQ=dat&0x01; /利用与运算取出要写的某位二进制数据,/并将其送到数据线上等待DS18B20采样 for(time=0;time10;time+);/延时约30us,DS18B20在拉低后的约1

10、560us期间从数据线上采样 DQ=1; /释放数据线 for(time=0;time=1; /将dat中的各二进制位数据右移1位 for(time=0;time4;time+); /稍作延时,给硬件一点反应时间uchar ReadOneChar()unsigned char i=0;unsigned char dat; /储存读出的一个字节数据for (i=0;i=1; _nop_(); /等待一个机器周期 DQ = 1; /将数据线人为拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time2;time+);/延时约6us,使主机在15us内采样 if(DQ=1) dat|=0x80; /如果读到的数据是1,则将1存入datelsedat|=0x00; /如果读到的数据是0,则将0存入dat for(time=0;time8;time+);/延时3us,两个读时序之间必须有大于1us的恢复期 return(dat); /返回读出的十进制数据void ReadyReadTemp()Init_DS18B20(); /将DS18B20初始化WriteOneChar(0xCC); / 跳过读序号列号操作WriteO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论