51单片机温控系统添加独立按键启动和停止功能
#include <REGX52.H> #include <intrins.H> #include 'Delay.h' //延时 #include 'Timer0.h' //中断器 #include 'LCD1602.h' //LCD屏幕 #include 'DS18B20.h' // 温控
sbit power_down_wakeup_pin_int0=P3^2;//INT0上的断电唤醒销 sbit is_power_down_led_int0=P1^6;//指示灯指示系统已启动 大红 sbit normal_work_flashing_led=P1^5;//正常工作LED指示灯 小红 倒计时结束
sbit beep = P2^5; //蜂鸣器测试定时程序是否正常运转 sbit jidianqi = P1^7; //加热器 sbit start_key = P3^3; // 启动按键 sbit stop_key = P3^4; // 停止按键
unsigned int CountDown = 50; // 设定倒计时总秒数为 50 秒 unsigned int wendu = 28; // 设定倒计时总秒数为 50 秒 unsigned int flag =0,flag2=0 ; //开机是否启动过加热器 int T,temp; unsigned char is_power_down=0;//在进入断电模式之前设置此位
void int_system_init(void)//中断系统初始化 { IT0=0;//外部中断0,触发低电位 EX0=1;/启用外部中断0/ EA=1;/启用总中断/ } void power_down() { normal_work_flashing_led=1;
is_power_down=1;//在进入断电模式之前设置此位
PCON=0X02;//在此指令后,单片机将处于断电模式
_nop_();
_nop_();
_nop_();
_nop_(); //四个机器周期后外部时钟停止// 停止运行
} void main() { normal_work_flashing_led=0;
DS18B20_ConvertT(); //上电先转换一次温度,防止第一次读数据错误
Delay(1000); //等待转换完成
Timer0Init();
LCD_Init();
int_system_init();
LCD_ShowString(1, 1, 'CountDown:');
//T=40;
jidianqi=0;
while(1)
{
if(flag2==1)
{
T=temp;
LCD_ShowNum(2, 12, temp, 3); // 显示温度整数部分
LCD_ShowNum(2, 1, CountDown, 3); // 显示温度整数部分
if (CountDown == 0)
{
beep=0;
jidianqi=1;
LCD_ShowNum(2, 1, 0, 3); // 显示温度整数部分
power_down();
}
}
// 如果温度低于28度且加热器没有启动,则启动加热器
if (temp <= wendu && jidianqi == 1)
{
jidianqi = 1; // 开启加热器
LCD_ShowString(1, 12, 'Heat'); // 显示关闭
}
// 判断水温是否达到设置温度,达到设置温度,关闭加热器、启动 LED 定时器
else if (temp > wendu)
{
jidianqi=0; //关闭加热器
LCD_ShowString(1, 12, 'OK '); // 达到设置温度显示 ok
}
// 如果正在倒计时且温度低于28,则继续倒计时并加热
else if (temp <= wendu)
{
jidianqi = 1; // 启动加热器
LCD_ShowString(1, 12, 'Heat'); // 显示正在加热
}
// 如果按下了启动按键
if(start_key == 0)
{
CountDown = 50; // 重新设定倒计时总秒数为 50 秒
flag = 1; // 开始倒计时
beep = 1; // 关闭蜂鸣器
jidianqi = 1; // 启动加热器
LCD_ShowString(1, 12, 'Heat'); // 显示正在加热
}
// 如果按下了停止按键
if(stop_key == 0)
{
flag = 0; // 停止倒计时
beep = 0; // 关闭蜂鸣器
jidianqi = 0; // 关闭加热器
LCD_ShowString(1, 12, 'Stop '); // 显示停止
}
}
} //INT0上的断电唤醒 void int0_routine(void) interrupt 0 { if(is_power_down) { is_power_down=0;//掉电唤醒,将该位清零 is_power_down_led_int0=0;/打开外部中断0断电唤醒LED指示灯/ while(power_down_wakeup_pin_int0==0)//唤醒完成 {
}
is_power_down_led_int0=1;/*关闭外部中断0断电唤醒LED指示灯*/
normal_work_flashing_led=0;
}
} void T0INT() interrupt 1 { static unsigned char i=0,j=0; TH0 = (65536 - 50000) / 256; TL0 = (65536 - 50000) % 256; j++;
if(j == 20)
{
j=0;
DS18B20_ConvertT(); // 转换温度
temp = DS18B20_ReadT(); // 读取温度
flag2=1;
if(temp>wendu)
{
flag=1;
}
}
if (flag == 1)
{
i++;
if (i == 20)
{
i=0;
CountDown--;
if(CountDown < 11 && (CountDown%2)==0 && CountDown!=0)
{
beep=0;
}
else
{
beep=1;
}
}
if (CountDown == 0)
{
flag = 0; // 停止倒计时
beep = 0; // 关闭蜂鸣器
jidianqi = 0; // 关闭加热器
LCD_ShowString(1, 12, 'Stop '); // 显示停止
}
}
原文地址: https://www.cveoy.top/t/topic/lEBm 著作权归作者所有。请勿转载和采集!