#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 '); // 显示停止
		}
}
51单片机温控系统添加独立按键启动和停止功能

原文地址: https://www.cveoy.top/t/topic/lEBm 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录