《基于单片机的数字温度计c程序》由会员分享,可在线阅读,更多相关《基于单片机的数字温度计c程序(9页珍藏版)》请在金锄头文库上搜索。
1、基于单片机的数字温度计基于单片机的数字温度计 C C 程序程序#include #include #define uchar unsigned char#define uint unsigned int#define delayNOP() _nop_();_nop_();_nop_();_nop_();sbit DQ=P22;sbit dula=P26; /定义锁存器锁存端sbit wela=P27;sbit rs=P35; /定义 1602 液晶 RS 端sbit lcden=P34;/定义 1602 液晶 LCDEN 端sbit s1=P30; /定义按键-功能键sbit s2=P31;/
2、定义按键-增加键sbit s3=P32;/定义按键-减小键sbit s4=P36;/闹钟查看键sbit rd=P37;sbit beep=P23; /定义蜂鸣器端uchar code Temp_Disp_Title=“ Current Temp : “;uchar Current_Temp_Display_Buffer=“ TEMP: “;uchar code Alarm_Temp=“ALARM TEMP Hi Lo“;uchar Alarm_HI_LO_STR=“Hi: Lo: “;uchar temp_data2=0x00,0x00;uchar temp_alarm2=0x00,0x00;
3、uchar display5=0x00,0x00,0x00,0x00,0x00;uchar display13=0x00,0x00,0x00;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;/传感器正常标志/-/延时 1/-void delay1(uint x)uchar i;w
4、hile(x-) for(i=0;i=1;_nop_(); /等待一个机器周期DQ=1; /将数据线“人为“拉高,为单片机检测 DS18B20 的输出电平作准备_nop_();_nop_(); /延时约 6us,使主机在 15us 内采样if (DQ) dat|=0x80; /如果读到的数据是 1,则将 1 存入 dat,如果是 0 则保持原值不变Delay(30); /延时 3us,两个读时序之间必须有大于 1us的恢复期DQ=1; / 将数据线拉高,为读下一位数据做准备 return dat; /-/函数功能:写一字节/入口参数:dat-待写入的数据/-void WriteOneByte(
5、uchar dat)uchar i;for (i=0;i=1; /将 dat 中的各二进制位数据右移 1 位 /-/函数功能:读取温度值/出入口参数:无/-void Read_Temperature()if(Init_DS18B20() = 1) /DS18B20 故障DS18B20_IS_OK=0;else WriteOneByte(0xCC); / 跳过读序号列号的操作WriteOneByte(0x44); / 启动温度转换 Init_DS18B20(); /将 DS18B20 初始化WriteOneByte(0xCC); /跳过读序号列号的操作WriteOneByte(0xBE); /读
6、取温度寄存器,前两个分别是温度的低位和高位Temp_Value0=ReadOneByte(); /温度低 8 位Temp_Value1=ReadOneByte(); /温度高 8 位DS18B20_IS_OK=1;/-/函数功能:在 LCD 上显示当前温度/入口参数:/-void Display_Temperature()uchar i;/延时值与负数标识uchar t=150,ng=0;/高 5 位全为 1(0xF8)则为负数,为负数时取反加 1,并设置负数标示if (Temp_Value1 Temp_Value0=Temp_Value0+1;if(Temp_Value0=0x00) Tem
7、p_Value1+; /加 1 后如果低字节为 00 表示有进位,进位位再加到高字节上ng=1; /负数标示置 1Display_Digit0=df_TableTemp_Value0 /查表得到温度小数部分/获取温度整数部分(高字节的低 3 位与低字节中的高 4 位,无符号)CurrentT=(Temp_Value0 /将整数部分分解为 3 位待显示数字Display_Digit3=CurrentT/100;/百位 digitCurrentT/100;Display_Digit2=CurrentT%100/10;/十位Display_Digit1=CurrentT%10;/个位/刷新 LCD
8、显示缓冲Current_Temp_Display_Buffer11=Display_Digit0+0;/先将0转换成整数 48,然后与前面数字相加,得到相应数字的ASCII 字符Current_Temp_Display_Buffer10=.;Current_Temp_Display_Buffer9=Display_Digit1+0; /个位Current_Temp_Display_Buffer8=Display_Digit2+0; /十位Current_Temp_Display_Buffer7=Display_Digit3+0; /百位/高位为 0 时不显示if(Display_Digit3=
9、0) Current_Temp_Display_Buffer7= ;/高位为 0 且次高位为 0 时,次高位不显示if(Display_Digit2=0 /负数符号显示在恰当位置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_Disp_Pos(0x00);for(i
10、=0;i16;i+)Write_LCD_Data(Temp_Disp_Titlei);Set_Disp_Pos(0x40); /在第二行显示当前温度for(i=0;i16;i+)Write_LCD_Data(Current_Temp_Display_Bufferi);/显示温度符号/ Set_Disp_Pos(0x4D);Write_LCD_Data(0x00);Set_Disp_Pos(0x4D);Write_LCD_Data(0xdf);Set_Disp_Pos(0x4E);Write_LCD_Data(C);/-/函数功能:主函数/入口参数:/- void main()Initialize_LCD();Read_Temperature();Delay(50000);Delay(50000);while (1)Read_Temperature();if (DS18B20_IS_OK) Display_Temperature();delay1(100);