1、
#include
2、ar data display[5] = {0x00,0x00,0x00,0x00,0x00}; unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04, 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; void beep(); sbit DIN = P0^7; //小数点 bit flash=0; //显示开关标记 /*********************
3、/ void Delay(unsigned int num)//延时函数 { while( --num ); } /**********************************************************/ Init_DS18B20(void)//初始化ds1820 { DQ = 1; //DQ复位 Delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 Delay(9
4、0); //精确延时 大于 480us DQ = 1; //拉高总线 Delay(8); presence = DQ; //如果=0则初始化成功 =1则初始化失败 Delay(100); DQ = 1; return(presence); //返回信号,0=presence,1= no presence } /**********************************************************/ ReadOneChar(void)//读一个
5、字节 { unsigned char i = 0; unsigned char dat = 0; for (i = 8; i > 0; i--) { DQ = 0; // 给脉冲信号 dat >>= 1; DQ = 1; // 给脉冲信号 if(DQ) dat |= 0x80; Delay(4); } return (dat); } /**********************************************************/ WriteOneChar(u
6、nsigned char dat)//写一个字节 { unsigned char i = 0; for (i = 8; i > 0; i--) { DQ = 0; DQ = dat&0x01; Delay(5); DQ = 1; dat>>=1; } } /*********************************************************/ Read_Temperature(void)//读取温度 { Init_DS18B20(); //初始化
7、 if(presence==1) { beep();flash=1;} //DS18B20不正常,蜂鸣器报警 else //初始化成功 { flash=0; //以下为DS18B20的基本操作时序 WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 Wr
8、iteOneChar(0xBE); //读取温度寄存器 temp_data[0] = ReadOneChar(); //温度低8位 temp_data[1] = ReadOneChar(); //温度高8位 } } /*********************************************************/ Disp_Temperature()//显示温度 { unsigned char n=0; display[4]=temp_data[0]&0x0f; display[0]=ditab
9、[display[4]]; //查表得小数位的值 display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4); //整数位的值 display[3]=display[4]/100; //百位值 display[1]=display[4]%100; //十位加个位值 display[2]=display[1]/10; //十位值 display[1]=display[1]%10; //个位值 if(!display[3])
10、 //高位为0,不显示 { display[3]=0x0a; if(!display[2]) //次高位为0,不显示 display[2]=0x0a; } P0 = 0xc6; //显示 C P2 = 0x7f; Delay(300); P0 = 0x9c; //显示 ° P2 = 0xbf; Delay(300); P0 =LEDData[display[0]] ; //显示小数位 P2 = 0xdf; Delay(300); P0 =LEDData[
11、display[1]]; //显示个位 DIN = 0; P2 = 0xef; Delay(300); P0 =LEDData[display[2]]; //显示十位 P2 = 0xf7; Delay(300); P0 =LEDData[display[3]]; //显示百位 P2 = 0xfb; Delay(300); P2 = 0xff; //关闭显示 } /*********************************************************/ void beep() {
12、 unsigned char i; for (i=0;i<100;i++) { Delay(60); BEEP=!BEEP; //BEEP取反 } BEEP=1; //关闭蜂鸣器 } /*********************************************************/ void main(void) { while(1) { Read_Temperature(); if(flash==0) {Disp_Temperature();} else P2 = 0xff ; //DS18B20不正常,关闭显示 } } /*********************************************************/






