void delay(uint i);
sbit DQ =P0^0; //DS18B20端口 sbit RS=P2^0; //LCD端口 sbit RW=P2^1; sbit E=P2^2;
sbit buzzer=P2^7; //定义蜂鸣器端口
union{ uchar c[2]; uint x; }temp; //联合体
uchar flag; //定义温度正负值标志变量,正为'0',负为'1' int cc,xs;
/***************************************************************/ /*延时函数 */
/***************************************************************/
void delay(uint i) { for(;i>0;i--); }
/***************************************************************/ /*复位函数 */
/***************************************************************/
uchar ow_reset(void) { uchar reset; DQ=0; delay(50); DQ=1; delay(3); reset=DQ; delay(25); return(reset); }
/***************************************************************/ /*初始化DS18B20 */
17
/***************************************************************/
void initds18b20(void) {
ow_reset(); // write_byte(0xCC); write_byte(0x4E); write_byte(0x00); write_byte(0x00); write_byte(0x7F); }
/***************************************************************/ /*从单总线读取一个字节 */ /***************************************************************/ uchar read_byte(void) { uchar i; uchar value=0; for (i=8;i>0;i--) { value>>=1; DQ=0; DQ=1; delay(1); if(DQ)value|=0x80; delay(6); } return(value); }
/***************************************************************/ /**向单总线上写一个字节 */
/***************************************************************/
void write_byte(uchar val) { uchar i; for(i=8;i>0;i--) { DQ=0; DQ=val&0x01; delay(5); DQ=1; val=val/2;
18
} delay(5); }
/***************************************************************/ /**读取温度 */
/***************************************************************/ void Read_Temperature(void) { ow_reset(); write_byte(0xCC); write_byte(0x44); ow_reset(); write_byte(0xCC); write_byte(0xBE); temp.c[1]=read_byte(); temp.c[0]=read_byte(); }
/***************************************************************/ /**温度转换 */
/***************************************************************/
void temperature_cov(void) {
if (temp.c[0]>0xF8) //判断温度是正数还是负数 { flag=1; //温度为负数flag置1 temp.x=~temp.x+1; } xs=temp.x&0x0F; xs=xs*10; cc=temp.c[0]*256.0+temp.c[1]; //将温度从两个八位数表示成一个十六位数 cc=cc*0.0625; xs=xs*0.0625; }
/***************************************************************/ /**显示 */
/***************************************************************/ void display()
19
{ int i; // SP=0x50; // lcd_init(); lcd_wcmd(0x80); //写入缓冲区起始地址为第一行第一列 lcd_wdat(0x54); //显示TEMPERATURE lcd_wdat(0x45); lcd_wdat(0x4d); lcd_wdat(0x50); lcd_wdat(0x45); lcd_wdat(0x52); lcd_wdat(0x41); lcd_wdat(0x54); lcd_wdat(0x55); lcd_wdat(0x52); lcd_wdat(0x45); lcd_wcmd(0xc0); lcd_wdat(0x44);lcd_wdat(0x51);lcd_wdat(0x59); lcd_wdat(0x20); buzzer=1; lcd_wcmd(0x8C); lcd_wdat(0x20); lcd_wdat(0x20); lcd_wdat(0x20); lcd_wdat(0x20); lcd_wcmd(0xc4); if(flag == 1) { lcd_wdat(0x2d); //如果flag为1表示温度为负值,显示‘-’符号 if(cc>=4) { buzzer = 0; lcd_wcmd(0x8C); lcd_wdat(0x4C); lcd_wdat(0x4F); lcd_wdat(0x57); lcd_wdat(0x21); lcd_wcmd(0xc4); } } if(cc>=29) { buzzer=0;
20