差
a=c/100; //计算得到十位数字 b=c/10-a*10; //计算得到个位数字 m=c/10; //计算得到整数位 n=c-a*100-b*10; //计算得到小数位 if(m<0){m=0;n=0;} //设置温度显示上限
if(m>99){m=99;n=9;} //设置温度显示上限 }
/*****显示开机初始化等待画面*****/ void Disp_init(void) {
P0 = ~0x80; //显示---- P2 = 0x7F; //依次打开各位 Delay(200); //延时 P2 = 0xDF; Delay(200); P2 = 0xF7; Delay(200); P2 = 0xFD; Delay(200);
P2 = 0xFF; //关闭显示 }
/*****显示温度子程序*****/
void Disp_Temperature(void) //显示温度 {
P0 = ~0x98; //显示C P2 = 0x7F; //打开位 Delay(400); //延时
P2 = 0xff; //关闭显示 P0=~LEDData[n]; //显示个位 P2 = 0xDF; Delay(400);
P2 = 0xff; //关闭显示 P0 =~LEDData[m]; //显示十位 DIAN = 0; //显示小数点 P2 = 0xF7; Delay(400);
P2 = 0xff; //关闭显示 P0 =~LEDData[m/10]; //显示百位 P2 = 0xFD; Delay(400);
P2 = 0xff; //关闭显示 }
/*****显示报警温度子程序*****/
void Disp_alarm(uchar baojing) {
P0 =~0x98; //显示C P2 = 0x7F; //选中位 Delay(200);
P2 = 0xff; //关闭显示
P0 =~LEDData[baojing]; //显示十位 P2 = 0xDF; Delay(200);
P2 = 0xff; //关闭显示
P0 =~LEDData[baojing/10]; //显示百位 P2 = 0xF7; Delay(200);
P2 = 0xff; //关闭显示
if(set_st==1)P0 =~0xCE; //设置上限时显示H else if(set_st==2)P0 =~0x1A; //设置下限时显示L P2 = 0xFD; Delay(200);
P2 = 0xff; //关闭显示 }
/*****报警子程序*****/ void Alarm() {
if(x>=10){beep_st=~beep_st;x=0;} //控制闪烁(x随定时器每50ms加1,10次时500ms,这里闪烁就是500ms亮500ms灭) if(m>=shangxian) //温度大于上限时 {
ALAM=0; //制冷继电器吸合 ALAM1=1;
if(beep_st==1)//控制蜂鸣器闪烁变量为1时 BEEP=0; //蜂鸣器响
else //控制蜂鸣器闪烁变量为0时 BEEP=1; //蜂鸣器停止 }
else if(m ALAM1=0; //升温继电器吸合 ALAM=1; if(beep_st==1)//控制蜂鸣器闪烁 BEEP=0; else BEEP=1; } else //水温在上下限范围内时 { BEEP=1; //关闭蜂鸣器 ALAM=1; //关闭加热和制冷继电器 ALAM1=1; } } /*****主函数*****/ void main(void) { uint z; InitTimer(); //初始化定时器 EA=1; //全局中断开关 TR0=1; //打开定时器定时开关 ET0=1; //开启定时器0 IT0=1; //外部中断下降沿有效 IT1=1; check_wendu(); check_wendu(); //读取两次温度,防止开机读取到85°C,使继电器误操作 for(z=0;z<300;z++) //开机画面 { Disp_init(); } while(1) //while循环 { if(SET==0) //判断设置键是否按下 { Delay(2000); //延时去抖 do{}while(SET==0); //执行空语句,判断按键是否松开,松开向下执行,否则重新执行空语句 set_st++;x=0;shanshuo_st=1; //设置键松开后将设置变量加1,闪烁标志位置1 if(set_st>2)set_st=0; //当设置完成时,退出设置 } if(set_st==0) //正常工作时 { EX0=0; //关闭外部中断0 EX1=0; //关闭外部中断1 check_wendu(); Disp_Temperature(); //检测温度 Alarm(); //报警检测 } else if(set_st==1) //设置上限时 { BEEP=1; //关闭蜂鸣器 ALAM=1; ALAM1=1; //继电器关闭 EX0=1; //开启外部中断0 EX1=1; //开启外部中断1 if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(shangxian);} //闪烁 } else if(set_st==2) //设置下限时 { BEEP=1; //关闭蜂鸣器 ALAM=1; ALAM1=1; //关闭继电器 EX0=1; //开启外部中断0 EX1=1; //开启外部中断1 if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(xiaxian);} //闪烁 } } } /*****定时器0中断服务程序*****/ void timer0(void) interrupt 1 { TH0=0x3c; TL0=0xb0; //12MHz晶振时定时50ms x++; } /*****外部中断0服务程序*****/ void int0(void) interrupt 0 { EX0=0; //关外部中断0 if(DEC==0&&set_st==1) //设置上限时按下减按键 { do { Disp_alarm(shangxian); //显示设置 } while(DEC==0); shangxian--; //将上限值减1 if(shangxian<=xiaxian)shangxian=xiaxian+1; //上限值最小比下限值大1 } else if(DEC==0&&set_st==2) //设置下限时按下减按键 { do { Disp_alarm(xiaxian); } while(DEC==0); xiaxian--; //下限减1 if(xiaxian<0)xiaxian=0; //减到0时停止 } } /*****外部中断1服务程序*****/ void int1(void) interrupt 2 { EX1=0; //关外部中断1 if(ADD==0&&set_st==1) //设置上限时按下加按键 { do { Disp_alarm(shangxian); } while(ADD==0); shangxian++; //上限值加1 if(shangxian>99)shangxian=99;//最大加到99 } else if(ADD==0&&set_st==2) //设置下限时按下加按键 { do { Disp_alarm(xiaxian); } while(ADD==0); xiaxian++; //下限加 if(xiaxian>=shangxian)xiaxian=shangxian-1; //下限最大加到上限值减1 } }