基于51单片机的温度报警器

设计任务及要求

设计任务:

以51单片机为核心,设计和制作一个温度报警器,能在LCD上显示环境的温度与希望温度上下限阀值,并能设置希望温度上下限阀值,系统上电的时候显示的是当前环境温度和设定的温度阀值,通过按键来修改温度上下限阀值,再次上电时保持上一次的温度设置。根据温度传感器测得的温度做如下处理:温度当温度低于设定下限温度时,蜂鸣器发出报警声和绿光报警,并且通过继电器控制加热设备提升温度至正常温度,然后加热设备停止工作;当温度高于设定上限温度时,蜂鸣器发出报警声和红光报警,并且通过继电器控制散热设备降低温度至正常温度,然后散热设备停止工作。

设计要求:

(1)确定系统设计方案;
(2)进行系统的硬件设计;
(3)完成应用程序设计;
(4)应用系统的硬件和软件的调试;

硬件原理图

硬件原理图

部分程序代码

main.c

#include "public.h"
#include "lcd.h"
#include "temp.h"
#include "i2c.h"

sbit k3=P3^2;	//设置温度上下限   
sbit k1=P3^4;	//加			   
sbit k2=P3^5;	//减

sbit ledL=P1^0;
sbit ledH=P1^1;			  

sbit led=P2^4;     //电源指示灯

sbit beep=P1^5;	  //蜂鸣器报警
sbit relay=P1^4;  //加热或散热设备


char set_templ=22,set_temph=40;  //设定温度上下限默认值
u16 temp_val;  //检测的实际温度
u8 mode;  //温度模式

void Temp_DataPros()
{
	short temp;
	u8 temp_buf[5];
	temp=Ds18b20ReadTemp();
	temp_val=temp;	
	if(temp<0)
	{
		temp=-temp;
		LCD_Dispstring(2+5,0,"-");
	}
	else
	{
		LCD_Dispstring(2+5,0," ");
	}

	temp_buf[0]=temp/100+0x30;
	temp_buf[1]=temp%100/10+0x30;
	temp_buf[2]='.';
	temp_buf[3]=temp%100%10+0x30;
	temp_buf[4]='\0';
	LCD_Dispstring(2+6,0,temp_buf);		 //显示检测的温度xx.x

	temp_buf[0]=set_temph/10+0x30;
   	temp_buf[1]=set_temph%10+0x30;
	temp_buf[2]='\0';
	LCD_Dispstring(5,1,temp_buf);	  //显示设定的温度上限值xx

	temp_buf[0]=set_templ/10+0x30;
   	temp_buf[1]=set_templ%10+0x30;
	temp_buf[2]='\0';
	LCD_Dispstring(14,1,temp_buf);	 //显示设定的温度下限值xx
}



#define  K1_MODE  1
#define  K2_ADD  2
#define  K3_DEC  3

//mode:  0-单次扫描   1-连续扫描
u8 KEY_Scan(u8 mode)
{
	static u8 key=1;
	if(key&&(k1==0||k2==0||k3==0))
	{
		delay(1000);   //消抖
		key=0;
		if(k3==0)
		{
			return K1_MODE;
		}
		else if(k1==0)
		{
			return K2_ADD;
		}
		else if(k2==0)
		{
			return K3_DEC;	
		}
	}
	else if(k1==1&&k2==1&&k3==1)
	{
		key=1;	
	}
	if(mode)
	{
		key=1;
	}
	return 0;	
}

void KEY_Pros()
{
	u8 key;
	u8 temph_buf[3];

	key=KEY_Scan(0);
	
	if(key==K1_MODE)   //模式选择
	{
		mode++;
		LCD_Clear();

		if(mode==1)
		{
			LCD_Dispstring(0,0,"SETH:   C");		
		}
		else if(mode==2)
		{
			LCD_Dispstring(0,1,"SETL:   C");	
		}
		else 
		{
			mode=0;
			LCD_Dispstring(2,0,"Temp:     C");
			LCD_Dispstring(0,1,"SETH:  ");
			LCD_Dispstring(9,1,"SETL:  ");	
		}
	}
	if(mode==1)	 //温度上限设置
	{
		switch(key)	
		{
			case K2_ADD: 	   //加
						set_temph++;
						if(set_temph>=80)set_temph=80;
						break;
			case K3_DEC: 	 //减
						set_temph--;
						if(set_temph<=0)set_temph=0;
						break;
		}

		temph_buf[0]=set_temph/10+0x30;
		temph_buf[1]=set_temph%10+0x30;
		temph_buf[2]='\0';
	   	LCD_Dispstring(6,0,temph_buf);
		At24c02Write(0,set_temph);
	}

	else if(mode==2)  //温度下限设置
	{
		switch(key)	
		{
			case K2_ADD: 	   //加
						set_templ++;
						if(set_templ>=80)set_templ=80;
						break;
			case K3_DEC: 	 //减
						set_templ--;
						if(set_templ<=0)set_templ=0;
						break;
		}

		temph_buf[0]=set_templ/10+0x30;
		temph_buf[1]=set_templ%10+0x30;
		temph_buf[2]='\0';
	   	LCD_Dispstring(6,1,temph_buf);
		At24c02Write(2,set_templ);
	}
	


}



void sound()
{
	u8 i=50;
	while(i--)
	{
		beep=!beep;
		delay(10);
	}
}
void TempData_Compare()
{
	if(temp_val>set_temph*10)	//实际温度高于上限值   报警  
	{

		relay=0;
		ledH=0;
		ledL=1;
		sound();		
	}
	else if(temp_val<set_templ*10)	 //实际温度低于下限值   报警
	{

		relay=0;
		ledH=1;
		ledL=0;
		sound();		
	}
	else		      //实际温度在下限值和上限值之间   取消报警  取消加热  取消散热
	{
		ledH=1;
		ledL=1;
		relay=1;
	}
}

void kai_display()
{
	if(At24c02Read(255)!=18)
	{
		At24c02Write(0,set_temph);
		At24c02Write(2,set_templ);
		At24c02Write(255,18);	
	}
	else
	{
		set_temph=At24c02Read(0);
		set_templ=At24c02Read(2);	
	}

	LCD_Dispstring(2,0,"Temp:     C");
	LCD_Dispstring(0,1,"SETH:  ");
	LCD_Dispstring(9,1,"SETL:  ");
}

void main()
{
	ledH=1;
	ledL=1;
	relay=1;
	led=0;
	LCD_Init();
	kai_display();
	while(1)
	{
		if(mode==0)
			Temp_DataPros();
		KEY_Pros();	
		TempData_Compare();				
	}
}

如需具体工程代码可评论区留言

  • 33
    点赞
  • 171
    收藏
    觉得还不错? 一键收藏
  • 108
    评论
基于C51单片机设计温度报警器的代码主要包括两个模块:温度传感器模块和报警模块。 温度传感器模块的代码如下: ```C #include <regx51.h> // 包含C51单片机头文件 sbit tempSensor = P2^1; // 温度传感器连接P2.1引脚 void delay(unsigned int time) // 延时函数 { unsigned int i, j; for (i = time; i > 0; i--) for(j = 110; j > 0; j--); } unsigned int getTemperature() // 获取温度函数 { unsigned int temperature = 0; while(tempSensor); // 等待温度传感器准备就绪 EA = 0; tempSensor = 0; // 向温度传感器发送请求信号 delay(18); // 等待温度传感器响应 tempSensor = 1; // 停止发送请求信号 delay(20); // 等待温度传感器发送温度数据 if(tempSensor) // 检查温度传感器是否发送完整温度数据 { temperature = 127; // 温度传感器数据错误,设置温度为最大值 } else { int i; for(i = 0; i < 8; i++) { temperature >>= 1; // 温度数据从最高位开始存储 tempSensor = 1; // 等待温度传感器发送下一位数据 delay(2); if(tempSensor) // 检查温度传感器发送的位是否为高电平 { temperature |= 0x80; // 若为高电平,则将对应位设置为1 } delay(2); tempSensor = 0; // 温度传感器发送下一位 } } EA = 1; return temperature; // 返回温度数据 } ``` 报警模块的代码如下: ```C #include <regx51.h> // 包含C51单片机头文件 sbit buzzer = P3^5; // 警报器连接P3.5引脚 void checkTemperature() // 检查温度函数 { unsigned int temperature = getTemperature(); // 获取温度数据 if(temperature > 30) // 判断温度是否超过阈值 { buzzer = 1; // 警报器鸣响 } else { buzzer = 0; // 关闭警报器 } } void main() // 主函数 { while(1) { checkTemperature(); // 检查温度 } } ``` 以上代码实现了基于C51单片机温度报警器功能,通过温度传感器模块获取温度数据,并采用报警模块对温度进行实时监测和判断,若温度超过指定阈值则触发报警器。在主函数中,通过循环不断调用检查温度函数实现持续报警器监测温度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 108
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值