功能:
0.本系统采用STC89C52作为单片机
1.系统实时监测并显示当前温度,并通过四位数码管显示
2.超过设定阈值,蜂鸣器将报警,同时控制相应继电器实现降温或者加热
3.系统具备三个功能按键,可更改温度上限和下限
4.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:

PCB :

主程序:


#include <reg52.h>            // 包含头文件
#include <intrins.h>#define uchar unsigned char       // 以后unsigned char就可以用uchar代替
#define uint  unsigned int      // 以后unsigned int 就可以用uint 代替sbit DQ = P1^1;                       // DS18B20传感器的引脚定义
sbit w1 = P2^4;                    // 数码管第1位的控制引脚
sbit w2 = P2^5;                        // 数码管第2位的控制引脚
sbit w3 = P2^6;                        // 数码管第3位的控制引脚
sbit w4 = P2^7;                        // 数码管第4位的控制引脚
sbit Buzzer  = P1^0;           // 蜂鸣器引脚
sbit JdqLow  = P2^0;           // 温度过低继电器控制(加热)
sbit JdqHig  = P2^1;           // 温度过高继电器控制(降温)
sbit LedLow  = P2^2;           // 温度低指示灯
sbit LedHig  = P2^3;           // 温度高指示灯
sbit KeySet  = P3^2;           // 设置按键
sbit KeyDown = P3^3;           // 减按键
sbit KeyUp   = P3^4;           // 加按键/*   数码管的显示值:  0    1    2    3    4    5     6   7    8    9    -   */
uchar code Array1[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 };/*                     0.   1.   2.   3.   4.   5.    6.  7.   8.   9.  */
uchar code Array2[]={ 0xBf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef };uchar Buff[4];                   // 显示缓冲区
uchar ShowID=1;                    // 当前显示的是哪一个数码管int AlarmLow=150;               // 默认报警的温度下限值是15度
int AlarmHig=300;              // 默认报警的温度上限值是30度/*********************************************************/
// 毫秒级的延时函数,time是要延时的毫秒数
/*********************************************************/
void DelayMs(uint time)
{uint i,j;for(i=0;i<time;i++)for(j=0;j<112;j++);
}/*********************************************************/
// 延时15微秒
/*********************************************************/
void Delay15us(void)
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}/*********************************************************/
// 复位DS18B20(初始化)
/*********************************************************/
void DS18B20_ReSet(void)
{uchar i;DQ=0;i=240;while(--i);DQ=1;i=30;while(--i);while(~DQ);i=4;while(--i);
}/*********************************************************/
// 向DS18B20写入一个字节
/*********************************************************/
void DS18B20_WriteByte(uchar dat)
{uchar j;uchar btmp;for(j=0;j<8;j++){btmp=0x01;btmp=btmp<<j;btmp=btmp&dat;if(btmp>0)      // 写1{DQ=0;Delay15us();DQ=1;Delay15us();Delay15us();Delay15us();Delay15us();}else         // 写0{DQ=0;Delay15us();Delay15us();Delay15us();Delay15us();DQ=1;Delay15us();}}
}/*********************************************************/
// 读取温度值
/*********************************************************/
int DS18B20_ReadTemp(void)
{uchar j;int b,temp=0; DS18B20_ReSet();                            // 产生复位脉DS18B20_WriteByte(0xcc);            // 忽略ROM指令DS18B20_WriteByte(0x44);          // 启动温度转换指令DS18B20_ReSet();                         // 产生复位脉DS18B20_WriteByte(0xcc);            // 忽略ROM指令DS18B20_WriteByte(0xbe);          // 读取温度指令for(j=0;j<16;j++)                            // 读取温度数量{                      DQ=0;_nop_();_nop_();DQ=1;    Delay15us();b=DQ;Delay15us();Delay15us();Delay15us();b=b<<j;temp=temp|b;}temp=temp*0.0625*10;                 // 合成温度值并放大10倍                  return (temp);                              // 返回检测到的温度值
}/*********************************************************/
// 定时器初始化
/*********************************************************/
void TimerInit()
{TMOD = 0x01;                  // 使用定时器0,工作方式1   TH0  = 248;                       // 给定时器0的TH0装初值TL0  = 48;                      // 给定时器0的TL0装初值ET0  = 1;                           // 定时器0中断使能EA   = 1;                           // 打开总中断TR0  = 1;                          // 启动定时器0
}/*********************************************************/
// 显示温度值
/*********************************************************/
void ShowTemp(int dat)
{if(dat<0)                                               // 负号{Buff[0]=Array1[10];dat=0-dat;}else                                                      // 百位{Buff[0]=Array1[dat/1000];}Buff[1]=Array1[dat%1000/100];     // 十位Buff[2]=Array2[dat%100/10];           // 个位Buff[3]=Array1[dat%10];                   // 小数后一位
}/*********************************************************/
// 报警判断
/*********************************************************/
void AlarmJudge(int dat)
{if(dat<AlarmLow)                // 判断温度是否过低{LedLow=0;                          // 温度低指示灯亮LedHig=1;                            // 温度高指示灯灭JdqLow=0;                            // 温度过低的继电器闭合(开始加热)JdqHig=1;                           // 温度过高的继电器断开(停止降温)Buzzer=0;                           // 蜂鸣器报警}else if(dat>AlarmHig)       // 判断温度是否过高{LedLow=1;                          // 温度低指示灯灭LedHig=0;                            // 温度高指示灯亮JdqLow=1;                            // 温度过低的继电器断开(停止加热)JdqHig=0;                           // 温度过高的继电器闭合(开始降温)Buzzer=0;                           // 蜂鸣器报警}else                                       // 温度正常{LedLow=1;                          // 温度低指示灯灭LedHig=1;                            // 温度高指示灯灭JdqLow=1;                            // 温度过低的继电器断开(停止加热)JdqHig=1;                           // 温度过高的继电器断开(停止降温)Buzzer=1;                           // 蜂鸣器停止报警}
}/*********************************************************/
// 按键扫描
/*********************************************************/
void KeyScanf()
{if(KeySet==0)                                    // 如果设置按键被按下{/* 设置温度下限 */LedLow=0;                                     // 点亮绿色灯(代表当前正在设置温度下限)LedHig=1;                                      // 熄灭红色灯Buzzer=1;                                      // 关闭蜂鸣器ShowTemp(AlarmLow);                 // 显示温度下限值DelayMs(10);                              // 延时去抖while(!KeySet);                          // 等待按键释放DelayMs(10);                               // 延时去抖while(1){if(KeyDown==0)                                // 如果“减”按键被按下{if(AlarmLow>-550)                      // 判断当前温度下限是否大于-55度{AlarmLow--;                             // 温度下限值减去0.1度ShowTemp(AlarmLow);               // 刷新显示改变后的温度下限值DelayMs(200);                           // 延时}}if(KeyUp==0)                                   // 如果“加”按键被按下                   {if(AlarmLow<1250)                       // 判断当前温度下限是否小于125度{AlarmLow++;                               // 温度下限值加上0.1度ShowTemp(AlarmLow);               // 刷新显示改变后的温度下限值DelayMs(200);                           // 延时}}if(KeySet==0)                                  // 如果“设置”按键被按下{break;                                           // 退出温度下限值的设置,准备进入上限值的设置}}/* 设置温度上限 */LedLow=1;                                     // 熄灭绿色灯LedHig=0;                                      // 点亮红色灯(代表当前正在设置温度上限)ShowTemp(AlarmHig);                 // 显示温度上限值DelayMs(10);                              // 延时去抖while(!KeySet);                          // 等待按键释放DelayMs(10);                               // 延时去抖while(1){if(KeyDown==0)                            // 如果“减”按键被按下                           {if(AlarmHig>-550)                   // 判断当前温度上限是否大于-55度{AlarmHig--;                         // 温度上限值减去0.1度ShowTemp(AlarmHig);           // 刷新显示改变后的温度上限值DelayMs(200);                       // 延时}}if(KeyUp==0)                               // 如果“加”按键被按下                   {if(AlarmHig<1250)                   // 判断当前温度上限是否小于125度{AlarmHig++;                           // 温度上限值加上0.1度ShowTemp(AlarmHig);           // 刷新显示改变后的温度上限值DelayMs(200);}}if(KeySet==0)                              // 如果“设置”按键被按下{break;                                       // 准备退出设置模式}}/* 退出设置模式 */LedLow=1;                                 // 熄灭绿灯LedHig=1;                                   // 熄灭红灯DelayMs(10);                         // 延时去抖while(!KeySet);                      // 等待按键释放DelayMs(10);                           // 延时去抖}
}/*********************************************************/
// 主函数
/*********************************************************/
void main()
{int temp;uchar i;TimerInit();                                      // 定时器0的初始化(数码管的动态扫描)Buff[0]=Array1[0];                          // 刚上电显示4个0Buff[1]=Array1[0];Buff[2]=Array1[0];Buff[3]=Array1[0];for(i=0;i<8;i++)                              // 由于传感器刚上电读出的温度不稳定,因此先进行几次温度的读取并丢弃{DS18B20_ReadTemp();DelayMs(120);}while(1){EA=0;                                                 // 屏蔽中断temp=DS18B20_ReadTemp();            // 读取温度值EA=1;                                                  // 恢复中断ShowTemp(temp);                              // 显示温度值AlarmJudge(temp);                           // 判断是否需要报警for(i=0;i<100;i++)                     // 延时并进行按键扫描{KeyScanf();                    DelayMs(5);                             }}
}/*********************************************************/
// 定时器0服务程序
/*********************************************************/
void Timer0(void) interrupt 1
{TH0  = 248;               // 给定时器0的TH0装初值TL0  = 48;              // 给定时器0的TL0装初值P0=0x00;                    // 先关闭所有显示w1=1;w2=1;w3=1;w4=1;if(ShowID==1)           // 判断是否显示第1位数码管{w1=0;                      // 打开第1位数码管的控制开关P0=Buff[0];            // 第1位数码管显示内容   }if(ShowID==2)            // 判断是否显示第2位数码管{w2=0;                      // 打开第2位数码管的控制开关P0=Buff[1];            // 第2位数码管显示内容   }if(ShowID==3)            // 判断是否显示第3位数码管{w3=0;                      // 打开第3位数码管的控制开关P0=Buff[2];            // 第3位数码管显示内容   }if(ShowID==4)            // 判断是否显示第4位数码管{w4=0;                      // 打开第4位数码管的控制开关P0=Buff[3];            // 第4位数码管显示内容   }   ShowID++;                 // 切换到下一个数码管的显示if(ShowID==5)ShowID=1;
}

仿真演示视频:
https://www.bilibili.com/video/BV1MG4y1p74C/

实物演示视频:
https://www.bilibili.com/video/BV1Cd4y1i7Ja/

基于51单片机的温度控制系统数码管显示蜂鸣器报警proteus仿真原理图PCB相关推荐

  1. 基于51单片机煤气天然气有毒气体检测系统蓝牙手机通信proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.系统采用LCD1602作为显示液晶,可以实时显示气体的检测情况以及其他功能设置信息 2.检测有毒气体传感器用的是MQ-4系列传感器 3.蜂鸣器和L ...

  2. 基于51单片机的智能环境监测光强火焰有害气体检测proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.系统实时监测当前的有害气体状态/光强信息/火焰状态 2.当有害气体浓度超过阈值或检测到火焰时,蜂鸣器报警,并启动风扇进行通风 3.按键可设定阈 ...

  3. 基于51单片机的智能太阳能充电器带自动断开功能proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前检测的充电电压 2.当电压超过设定阈值时,继电器断开,停止充电,同时蜂鸣器报警,提醒充电完成 3.按键可切换界面 ...

  4. 基于51单片机的智能护眼台灯带闹钟功能proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前时间/工作模式/灯光亮度 2.具备闹钟功能,到达闹钟时间,蜂鸣器报警 3.自动模式下,有人灯亮,人离开后15s, ...

  5. 基于51单片机心率计脉搏体温测量仪WIFI无线通信proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.系统实时监测当前佩戴者的心率和体温,通过LCD1602显示相关数据 2.定时通过WIFI串口发送佩戴者的心率和体温 3.系统预留出串口接口,需要注 ...

  6. 基于51单片机的宠物自动猫粮狗粮喂养机proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 功能简介: 1.LCD1602实时显示当前时间/温湿度/食物重量 2.当时间到达设定喂食时间,启动步进电机进行投喂,投喂量达到预先设定好的重量后停 ...

  7. 基于51单片机的太阳能板追光控制串口上报系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.支持手动/自动两种模式 2.自动模式下,系统实时监测当前各个方位的光强信息,并通过串口上报 3.自动模式下,通过判断各方位的光强,转动步进电机 ...

  8. 51单片机DS18B20测温数码管显示例程(Proteus仿真+程序)

    编号:19 51单片机DS18B20测温数码管显示例程 功能描述: 本设计由STM32单片机+DS18B20温度传感器+四段数码管显示模块组成. 1.主控制器是51单片机 2.DS18B20温度传感器 ...

  9. 74hc164驱动数码管c语言程序,基于51单片机的74HC164驱动数码管显示程序与仿真

    基于51单片机的74HC164驱动数码管显示程序与仿真 基于51单片机的74HC164驱动一位数码管显示程序与仿真 #include #include #define uchar unsigned c ...

最新文章

  1. 遭遇“生活天花板”,如何用 OKR 弯道超车?
  2. 提高ASP.NET应用程序性能的几招方法
  3. 7.3 数字类型及内置方法
  4. ES6标准入门(第二版)pdf
  5. 嵌入式linux 零基础-实践起步 --- 001 --- linux的版本
  6. chajian8.com谈:SyntaxHighlighter 代码高亮
  7. Google 重磅发布 Flutter 2 !一套代码横扫 5 大系统
  8. 2012.4.16总结(二)
  9. 使用数据集(DataSet)、数据表(DataTable)、集合(Collection)传递数据
  10. C语言实现扫雷游戏(详解)
  11. Unity下载安装及许可证获取教程
  12. 善领dsa android正式版,善领DSA Android(安卓)正式版
  13. 天正电气html帮助,T20天正电气使用技巧
  14. 《自拍教程74》Python 假装企业微信电脑在线并定时关机,骗老板的好方法!
  15. 一个文科毕业生在德国 IT 行业的漫漫求职路
  16. 【牛客网】C/C++牛客网专项刷题(04)
  17. Ubuntu大于2T硬盘,分区并挂载
  18. 记录自定义维护视图的修改日志
  19. LaTex练习日记02 —— 字体设置
  20. 人、狼、羊、白菜过河问题(广度搜索)

热门文章

  1. 春哥博客 - 基金初识
  2. ADS-B及其GPS数据异常分析
  3. 轻知识库︱apple.Turicreate数据结构SGraph以及关系网络SNA分析(三)
  4. CD4046应用之倍频
  5. 再下一城,万元奖金!玻色量子荣获“创客北京”二等奖
  6. python打地鼠代码_vue实现打地鼠小游戏
  7. BP世界能源统计年鉴2022excel:全球世界各国能源消耗CO2碳排放石油天然气煤炭可再生能源储量发电量
  8. matlab卡农解析
  9. 【二】2D测量 Metrology——set_metrology_object_fuzzy_param()算子
  10. 专精特新、高端领航 中交华安核心技术及产品介绍第1期:单侧型桥墩防护解决方案——SA级高强型低变形量护栏...