DS18B20与1602电路图与C语言编程.doc

上传人:cn****1 文档编号:543523398 上传时间:2023-10-07 格式:DOC 页数:6 大小:48.50KB
返回 下载 相关 举报
DS18B20与1602电路图与C语言编程.doc_第1页
第1页 / 共6页
DS18B20与1602电路图与C语言编程.doc_第2页
第2页 / 共6页
DS18B20与1602电路图与C语言编程.doc_第3页
第3页 / 共6页
DS18B20与1602电路图与C语言编程.doc_第4页
第4页 / 共6页
DS18B20与1602电路图与C语言编程.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《DS18B20与1602电路图与C语言编程.doc》由会员分享,可在线阅读,更多相关《DS18B20与1602电路图与C语言编程.doc(6页珍藏版)》请在金锄头文库上搜索。

1、本例中,1602LCD 显示 DS18B20 所测量的外部温度,调节 DS18B20 模拟改变外界温度时,新的温度将刷新显示在 LCD 上。C 程序如下: 由于本例仅保存一位小数, 温度小数位对照表 df_Table将 00001111 对应的 16 个不同的小数进行四舍五入,例如,当读取的温度低字节低 4 位为 0101 时,对应的温度应为2-2+2-4=0.31250.3, 因此数组第 5 个元素 (对应 0101) 的值为 3; 又如, 如果低 4 位为 0110,对应的温度为 2-2+2-3=0.3750.4,因此,数组第 6 个元素(对应 0110)取值为 4。 #include #

2、include #define uint unsigned int #define uchar unsigned char #define delay4us() _nop_();_nop_();_nop_();_nop_(); /12MHZ 系统频率下,延时 4us sbit DQ = P33; sbit LCD_RS = P20; sbit LCD_RW = P21; sbit LCD_EN = P22; uchar code Temp_Disp_Title=Current Temp : ; /1602 液晶第一行显示内容 uchar Current_Temp_Display_Buffer=

3、 TEMP: ; /1602 液晶第二行显示内容 uchar code df_Table= 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9 ; /温度小数位对照表 uchar CurrentT = 0; /当前读取的温度整数部分 uchar Temp_Value=0x00,0x00; /从 DS18B20 读取的温度值 uchar Display_Digit=0,0,0,0; /待显示的各温度数位 bit DS18B20_IS_OK = 1; /DS18B20 正常标志 void DelayXus(uint x) /延时 1 uchar i; while(x-) for(i=0

4、;i200;i+); bit LCD_Busy_Check() /LCD 忙标志,返回值为 1602LCD 的忙标志位,为 1 表示忙 bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delay4us(); result = (bit)(P0&0x80); LCD_EN=0; return result; void Write_LCD_Command(uchar cmd) /1602LCD 写指令函数 while(LCD_Busy_Check(); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop

5、_(); P0 = cmd; delay4us(); LCD_EN = 1; delay4us(); LCD_EN = 0; void Write_LCD_Data(uchar dat) /1602LCD 写数据函数 while(LCD_Busy_Check(); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delay4us(); LCD_EN = 1; delay4us(); LCD_EN = 0; void LCD_Initialise() /1602LCD 初始化 Write_LCD_Command(0x01); DelayXus(5);

6、Write_LCD_Command(0x38); DelayXus(5); Write_LCD_Command(0x0c); DelayXus(5); Write_LCD_Command(0x06); DelayXus(5); void Set_LCD_POS(uchar pos) /1602LCD 设置显示位置 Write_LCD_Command(pos|0x80); void Delay(uint x) /延时 2 while(x-); uchar Init_DS18B20() /初始化(或者说复位)DS18B20 uchar status; DQ = 1; Delay(8); DQ =

7、0; Delay(90); DQ = 1; Delay(8); status=DQ;Delay(100); DQ = 1; return status; uchar ReadOneByte() /从 DS18B20 读一字节数据 uchar i,dat=0; DQ = 1; _nop_(); for(i=0;i= 1; DQ = 1; _nop_(); _nop_(); if(DQ) dat |= 0X80; Delay(30); DQ = 1; return dat; void WriteOneByte(uchar dat) /从 DS18B20 写一字节数据 uchar i; for(i=

8、0;i= 1; void Read_Temperature() /从 DS18B20 读取温度值 if(Init_DS18B20()=1) /DS18B20 故障 DS18B20_IS_OK=0; else WriteOneByte(0xcc); /跳过序列号命令 WriteOneByte(0x44); /启动温度转换命令 Init_DS18B20(); /复位 DS18B20 (每一次读写之前都要对 DS18B20 进行复位操作) WriteOneByte(0xcc); /跳过序列号命令 WriteOneByte(0xbe); /读取温度寄存器 Temp_Value0 = ReadOneBy

9、te(); /读取温度低 8 位(先读低字节,再读高字节, ) Temp_Value1 = ReadOneByte();/读取温度高 8 位 (每次只能读一个字节) DS18B20_IS_OK=1; /DS18B20 正常 void Display_Temperature() /在 1602LCD 上显示当前温度 uchar i; uchar t = 150, ng = 0; /延时值与负数标志 if(Temp_Value1&0xf8)=0xf8) /高字节高 5 位如果全为 1, 则为负数, 为负数时取反 /加 1,并设置负数标志为 1 Temp_Value1 = Temp_Value1;

10、Temp_Value0 = Temp_Value0+1; if(Temp_Value0=0x00) /若低字节进位,则高字节加 1 Temp_Value1+; ng = 1; /设置负数标志为 1 Display_Digit0 = df_TableTemp_Value0&0x0f; /查表得到温度小数部分 /获取温度整数部分(低字节低 4 位清零,高 4 位右移 4 位)+(高字节高 5 位清零, /低三位左移 4 位) CurrentT = (Temp_Value0&0xf0)4) | (Temp_Value1&0x07)4); / /将温度整数部分分解为 3 位待显示数字 Display_

11、Digit3 = CurrentT/100; Display_Digit2 = CurrentT%100/10; Display_Digit1 = CurrentT%10; /刷新 LCD 缓冲 /加字符 0 是为了将待数字转化为字符显示 Current_Temp_Display_Buffer11 = Display_Digit0 + 0; Current_Temp_Display_Buffer10 = .; Current_Temp_Display_Buffer9 = Display_Digit1 + 0; Current_Temp_Display_Buffer8 = Display_Dig

12、it2 + 0; Current_Temp_Display_Buffer7 = Display_Digit3 + 0; if(Display_Digit3 = 0) /高位为 0 时不显示 Current_Temp_Display_Buffer7 = ; if(Display_Digit2 = 0&Display_Digit3=0) /高位为 0, 且次高位为 0, 则次高位不显示 Current_Temp_Display_Buffer8 = ; /负号显示在恰当位置 if(ng) if(Current_Temp_Display_Buffer8 = ) Current_Temp_Display_Buffer8 = -; else if(Current_Temp_Display_Buffer7 = ) Current_Temp_Display_Buffer7 = -; else Current_Temp_Display_Buffer6 = -; Set_LCD_POS(0x00); /第一行显示标题 for(i=0;i16;i+) Write_LCD_Data(Temp_Disp_Titlei); Set_LCD_POS(0x40); /第二行显示当前温度 for(i=0;i16;i+) Write_LCD_Data(Current_Temp_Display_Bufferi);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号