基于51单片机的水温控制器设计(8)

2019-05-17 18:21

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 } }


基于51单片机的水温控制器设计(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:让我自己来吧

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: