dat>>=1;
DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; Delay_DS18B20(4); }
return(dat); }
/*****写一个字节*****/ void WriteOneChar(uc dat) {
uc i=0;
for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; Delay_DS18B20(5); DQ = 1; dat>>=1; } }
/*****读取温度*****/ ui ReadTemperature(void) {
ui b=0;
ui t=0; ui a=0;
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换 Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 a=ReadOneChar(); //读低8位 b=ReadOneChar(); //读高8位 t=b; t<<=8; t=t|a; tt=t*0.0625;
t= tt*10+0.5; //放大10倍输出并四舍五入 return(t); }
/*****延时子程序*****/ void Delay(ui num) {
while( --num ); }
/*****初始化定时器0*****/ void InitTimer(void) {
TMOD=0x01; TH0=0x3c;
TL0=0xb0; //50ms(晶振12M)
}
/*****读取温度*****/ void check_wendu(void) { ui f;
f=ReadTemperature()-5;
误差 if(f<0)f=0; if(f>999)f=999; bai=f/100;
shi=(f0)/10; ge=(f0);
}
/*****显示开机初始化等待画面*****/ void Disp_init(void) { P0 = ~0x80; //显示---- P2 = 0x7F; Delay(200); P2 = 0xDF; Delay(200);
P2 = 0xF7;
//获取温度值并减去DS18B20的温漂
//计算得到十位数字 //计算得到个位数字
//计算得到整数位
}
Delay(200); P2 = 0xFD; Delay(200);
P2 = 0xFF; //关闭显示
/*****显示温度子程序*****/
void Disp_Temperature(void) //显示温度 { }
/*****显示报警温度子程序*****/ void Disp_alarm(uc baojing)
P0 = ~0x98; //显示C P2 = 0x7F; Delay(400);
P0=~LEDData[ge]; //显示个位 P2 = 0xDF; Delay(400);
P0 =~LEDData[shi]; //显示十位 DIAN = 0; //显示小数点 P2 = 0xF7; Delay(400);
P0 =~LEDData[bai]; //显示百位 P2 = 0xFD; Delay(400);
P2 = 0xff; //关闭显示
{ }
/*****报警子程序*****/ void Alarm() {
P0 =~0x98; //显示C Delay(200);
P0 =~LEDData[baojing]; //显示十位 P2 = 0xDF; Delay(200);
P0 =~LEDData[baojing/10]; //显示百位 P2 = 0xF7; Delay(200);
if(set_st==1)P0 =~0xCE;
else if(set_st==2)P0 =~0x1A; //上限H、下限L标示 P2 = 0xFD; Delay(200);
P2 = 0xff; //关闭显示
if(x>=10){beep_st=~beep_st;x=0;} if((bai*10+shi)>=shangxian&&beep_st==1) { }
else if((bai*10+shi)>=shangxian&&beep_st==0)
BEEP=0; ALAM1=0;