基于51单片机的温度上下限报警设计—数码管显示

基于51单片机的温度上下限报警设计

(仿真+程序+原理图+PCB+设计报告)

功能介绍

具体功能:

1.对室温进行检测和控制,温度显示范围:-55—125度,精度0.1度。

2.能够设置并保存温度上下限值,并可以随时修改。

3.LED数码管直读显示实时温度,温度上下限值用按键设定。

4.温度超出上下限时,蜂鸣器报警。


#include <reg51.h>			     	 //宏定义
#include <intrins.h>			 	 //宏定义
#include <DS18B20.h>			 	 //宏定义
#define uchar unsigned char			 //无符号字符数据8位
#define uint unsigned int			 //无符号整数
#define SMGIO P0					 //定义数码管io口为P0

sbit SET=P1^0;		   //定义设定上下限键
sbit ADD=P1^1;		   //定义增加键
sbit DEC=P1^2;		   //定义减小限键	   
sbit SMG1=P2^0;		   //定义数码管第一位
sbit SMG2=P2^1;		   //定义数码管第二位
sbit SMG3=P2^2;		   //定义数码管第三位
sbit SMG4=P2^3;		   //定义数码管第四位
sbit BEEP=P1^7;		   //定义蜂鸣器报警
uint tempValue;		   //变量 存储当前温度值
uint HI_Alarm=40;	   //初始上限
uint LO_Alarm=20;	   //初始下限
uchar SMG_CC[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};		  //共阴极数码管0-9编码
uchar SMG_CC_DOT[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};	  //共阴极数码管0-9编码 带小数点
/********************************************************************/
/*						1ms延时										*/
/********************************************************************/
void delayms(uint x)		//延时函数
{
uchar i;					//定义循环变量
while(x--)					//开始循环
 {
  for(i=150;i>0;i--);		//循环150次
 }
}

void Display_Temperature()	   	    //显示温度
{
	char smg1,smg2,smg3,smg4;		 //定义4个数码管变量,以下表示将温度值拆分开
	smg1=tempValue/1000;			 //第一位
	smg2=(tempValue-smg1*1000)/100;	 //第二位
	smg3=(tempValue%100)/10;		 //第三位
	smg4=tempValue%10;				 //第四位
	if(tflag==1)	 				//负数显示
		{
			SMGIO=SMG_CC[smg4];		//显示小数位
			SMG4=0;					//位选
			delayms(1);				//延时
			SMG4=1;					//消隐
			SMGIO=SMG_CC_DOT[smg3];	 //显示个数位
			SMG3=0;					 //位选
			delayms(1);				 //延时
			SMG3=1;					 //消隐
			if(smg2==0)
			{
				SMGIO=0x40;	 		//显示十数位
				SMG2=0;				//位选
				delayms(1);			//延时
				SMG2=1;				//消隐
				SMGIO=0x00;			 //显示百数位
				SMG1=0;				 //位选
				delayms(1);			 //延时
				SMG1=1;				 //消隐
			}
			else
			{
				SMGIO=SMG_CC[smg2];	 //显示十数位
				SMG2=0;				 //位选
				delayms(1);			 //延时
				SMG2=1;				 //消隐
				SMGIO=0x40;	 		//显示十数位
				SMG1=0;				//位选
				delayms(1);			//延时
				SMG1=1;				//消隐	
			}
		}
	else	                        //正数显示
		{
			SMGIO=SMG_CC[smg4];	 //显示小数位
			SMG4=0;				 //位选
			delayms(1);			 //延时
			SMG4=1;				 //消隐
			SMGIO=SMG_CC_DOT[smg3];	 //显示个数位
			SMG3=0;					 //位选
			delayms(1);				 //延时
			SMG3=1;					 //消隐
			if(smg1==0)				 //第一位为0 
			{
				SMGIO=0x00;	 		 //不显示
				SMG1=0;				 //位选
				delayms(1);			 //延时
				SMG1=1;				 //消隐
				if(smg2==0)			 //第二位为0
				{
					SMGIO=0x00;	 	  //不显示
					SMG1=0;			  //位选
					delayms(1);		  //延时
					SMG1=1;	 		  //消隐
				}
				else
				{
					SMGIO=SMG_CC[smg2];	 //显示0 
					SMG2=0;				 //位选
					delayms(1);			 //延时
					SMG2=1;				 //消隐
				}
			}
			else
			{
				SMGIO=SMG_CC[smg1];		 //正常显示第一个数码管
				SMG1=0;					 //位选
				delayms(1);				 //延时
				SMG1=1;					 //消隐
				SMGIO=SMG_CC[smg2];		 //正常显示第二个数码管
				SMG2=0;					 //位选
				delayms(1);				 //延时
				SMG2=1;					 //消隐
			}
			
		}
}
void Display_HI_Alarm()			//显示上限前缀
{
	SMGIO=0x76;		//显示H
	SMG1=0;			//位选
	delayms(1);		//延时
	SMG1=1;			//消隐
	SMGIO=0x40;		//显示-
	SMG2=0;			//位选
	delayms(1);		//延时
	SMG2=1;			//消隐

	SMGIO=SMG_CC[HI_Alarm/10];	//显示报警高值十位
	SMG3=0;			//位选
	delayms(1);		//延时
	SMG3=1;			//消隐
	SMGIO=SMG_CC[HI_Alarm%10];	//显示报警高值个数位
	SMG4=0;			 //位选
	delayms(1);		 //延时
	SMG4=1;			 //消隐
}
void Display_LO_Alarm()		   //显示下限前缀
{
	SMGIO=0x38;		//显示L
	SMG1=0;			//位选
	delayms(1);		//延时
	SMG1=1;			//消隐
	SMGIO=0x40;		//显示-
	SMG2=0;			//位选
	delayms(1);		//延时
	SMG2=1;			//消隐

	SMGIO=SMG_CC[LO_Alarm/10];	//显示报警高值十位
	SMG3=0;			//位选
	delayms(1);		//延时
	SMG3=1;			//消隐
	SMGIO=SMG_CC[LO_Alarm%10];	//显示报警高值个数位
	SMG4=0;			//位选
	delayms(1);		//延时
	SMG4=1;			//消隐
}
void SET_KEY()		//按键设置
{  	bit SET_FLAG=1;		 //按下标志位
	if(SET==0)					 //设定按键按下
		{
		delayms(40);			 //延时去除抖动
		if(SET==1)				 //再次判断是否按下按键
 		{ 
			while(SET_FLAG==1) 	 //有按键按下
			{
				Display_HI_Alarm();	   //设定上限温度值
				if(ADD==0)				//增加按键
					{
						delayms(40);	  //延时去除抖动再次判断是否按下按键
						if(ADD==1)		  //如果按下
							HI_Alarm++;	 //温度值加一
					}
				if(DEC==0)				  //减小按键
					{
						delayms(40);	   //延时去除抖动
						if(DEC==1)		   //再次判断是否按下按键
							HI_Alarm--;	   //温度值减一
					}
				if(SET==0)				 //以下表示 再次按下设定按键 进入设定下限程序	
					{
						delayms(40);						   //延时去除抖动
						if(SET==1) 							   //再次判断是否按下按键
							{
								while(1) 
								{
									Display_LO_Alarm();		   //设定下限温度值
									if(ADD==0)				   //增加按键 
										{
											delayms(40);		 //延时去除抖动
											if(ADD==1)		    //再次判断是否按下按键
												LO_Alarm++;		//温度值加一
										}
									if(DEC==0)					//减小按键
										{
											delayms(40);		//延时去除抖动
											if(DEC==1)		    //再次判断是否按下按键
												LO_Alarm--;		//温度值减一
										}
									if(SET==0)					//设定按键按下
										{
											delayms(40);
											if(SET==1) 			 //延时去除抖动
												{				 
													SET_FLAG=0;	  //再次判断是否按下按键
													break;		 //上下限设定完成 退出
												}
										}					
								}								
							}
					}						
			}
 		}
}	
}
void BJ_LED()											//报警程序
{	
	if(tempValue>=HI_Alarm*10||tempValue<=LO_Alarm*10)	 //如果温度超过上下限 
		BEEP=0;											 //蜂鸣器报警
	else BEEP=1;										 //否则不报警

}


硬件设计

使用元器件:

单片机:STC89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

IC座:DIP40; 万能板:9*15/7*9;

数码管:MT03641AR; 排阻:1K*8;

温度传感器:DS18B20; 蜂鸣器:5V 有源;

三极管:9012; 晶振:11.0592;

电容:22pF; 电容:10uF/16V;

电阻:1K ; 电阻:4.7K ;

按键:6*6*5 ; 自锁开关:8*8 ;

接线端子:5.08*2P ;

导线:若干;

流程图:

设计资料

01 仿真图

本设计使用proteus7.8和proteus8.7两个版本设计,向下兼容,无需担心!具体如图!

温度监控

设定上限

设定下限

02 原理图

本系统原理图采用Altium Designer19设计,具体如图!

03 程序

本设计使用软件keil4和keil5两个版本编程设计,无需担心!具体如图!

04 设计报告

九千字设计报告,具体如下!

05 设计资料

全部资料包括仿真源文件 、程序(含注释)、AD原理图、开题报告、参考论文、流程图、任务书等。具体内容如下,全网最全! !

下面是开源51单片机设计资料

​大家共同学习进步:

链接:百度网盘 请输入提取码

提取码:57kf

点赞分享,一起学习进步!一起成长。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值