当前位置: 首页 > news >正文

基于51单片机的温度上下限报警—LCD1602显示

基于51单片机的温度报警

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

功能介绍

具体功能:

本产品采用51单片机+DS18B20温度传感器+LCD1602显示器+三极管设计而成。

1.DS18B20采集温度,LCD1602显示温度;

2.温度测量范围:-55-125度;

3.当温度低于下限或高于上限温度时,蜂鸣器和LED声光报警;

4.三个按键可以设置温度上下限;

添加图片注释,不超过 140 字(可选)

#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include "intrins.h" /***微信公众号:木子单片机********/ #define u8 unsigned char #define u16 unsigned int #define uchar unsigned char #define uint unsigned int uchar yushe_wendu=10; //温度预设值 uchar yushe_wenduH=50; //温度预设值 uint wendu; //温度值全局变量 //运行模式 uchar Mode=0; //=1是设置温度阀值 =0是正常监控模式 //管脚声明 sbit Led_Reg =P2^2; //红灯 sbit Buzzer =P2^0; //蜂鸣器 sbit Fan =P3^3; // /******************************************************************** * 名称 : delay_1ms() * 功能 : 延时1ms函数 * 输入 : q * 输出 : 无 ***********************************************************************/ void delay_ms(uint q) { uint i,j; for(i=0;i<q;i++) for(j=0;j<110;j++); } /*********************************************************************************************************** LCD1602相关函数 ***********************************************************************************************************/ //LCD管脚声明 (RW引脚实物直接接地,因为本设计只用到液晶的写操作,RW引脚一直是低电平) sbit LCDRS = P2^7; sbit LCDEN = P2^6; sbit D0 = P0^0; sbit D1 = P0^1; sbit D2 = P0^2; sbit D3 = P0^3; sbit D4 = P0^4; sbit D5 = P0^5; sbit D6 = P0^6; sbit D7 = P0^7; //LCD延时 void LCDdelay(uint z) //该延时大约100us(不精确,液晶操作的延时不要求很精确) { uint x,y; for(x=z;x>0;x--) for(y=10;y>0;y--); } void LCD_WriteData(u8 dat) { if(dat&0x01)D0=1;else D0=0; if(dat&0x02)D1=1;else D1=0; if(dat&0x04)D2=1;else D2=0; if(dat&0x08)D3=1;else D3=0; if(dat&0x10)D4=1;else D4=0; if(dat&0x20)D5=1;else D5=0; if(dat&0x40)D6=1;else D6=0; if(dat&0x80)D7=1;else D7=0; } //写命令 void write_com(uchar com) { LCDRS=0; LCD_WriteData(com); // DAT=com; LCDdelay(5); LCDEN=1; LCDdelay(5); LCDEN=0; } //写数据 void write_data(uchar date) { LCDRS=1; LCD_WriteData(date); // DAT=date; LCDdelay(5); LCDEN=1; LCDdelay(5); LCDEN=0; } /*------------------------------------------------ 选择写入位置 ------------------------------------------------*/ void SelectPosition(unsigned char x,unsigned char y) { if (x == 0) { write_com(0x80 + y); //表示第一行 } else { write_com(0xC0 + y); //表示第二行 } } /*------------------------------------------------ 写入字符串函数 ------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { SelectPosition(x,y) ; while (*s) { write_data( *s); s ++; } } //======================================================================== // 函数: void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l) // 应用: LCD_Write_Char(0,1,366,4) ; // 描述: 在第0行第一个字节位置显示366的后4位,显示结果为 0366 // 参数: x:行,y:列,s:要显示的字,l:显示的位数 // 返回: none. // 版本: VER1.0 // 日期: 2013-4-1 // 备注: 最大显示65535 //======================================================================== void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l) { SelectPosition(x,y) ; if(l>=5) write_data(0x30+s/10000%10); //万位 if(l>=4) write_data(0x30+s/1000%10); //千位 if(l>=3) write_data(0x30+s/100%10); //百位 if(l>=2) write_data(0x30+s/10%10); //十位 if(l>=1) write_data(0x30+s%10); //个位 } //1602初始化 void Init1602() { uchar i=0; write_com(0x38);//屏幕初始化 write_com(0x0c);//打开显示 无光标 无光标闪烁 write_com(0x06);//当读或写一个字符是指针后一一位 write_com(0x01);//清屏 } /*********************************************************************************************************** DS18B20相关函数 ***********************************************************************************************************/ sbit DQ = P1^0; //ds18b20的数据引脚 /*****延时子程序:该延时主要用于ds18b20延时*****/ void Delay_DS18B20(int num) { while(num--) ; } /*****初始化DS18B20*****/ u8 Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 Delay_DS18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 Delay_DS18B20(80); //精确延时,大于480us DQ = 1; //拉高总线 Delay_DS18B20(14); x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay_DS18B20(20); return x; } /*****读一个字节*****/ unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; Delay_DS18B20(4); } return(dat); } /*****写一个字节*****/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; Delay_DS18B20(5); DQ = 1; dat>>=1; } } u8 tempflag=0; //负号显示 /*****读取温度*****/ unsigned int ReadTemperature(void) { unsigned char c=0; unsigned char a=0; unsigned char b=0; unsigned int t=0; u8 tt=0; u8 ttt=0; Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 a=ReadOneChar(); //读低8位 b=ReadOneChar(); //读高8位 t=b; t<<=8; t=t|a; tt=(u8)(t>>4); //得到整数位 ttt=(u8)((t%16)*0.0625*10); //得到小数位;乘以10代表保留一位小数; if(tt&0x80) { tempflag=1; //负号显示 tt=~tt+1; //实际温度值为读取值的补码 } else tempflag=0; //正号显示 t= tt*10+ttt; //放大10倍 return(t); } //===================================================================================== //===================================================================================== //===================================================================================== /*****校准温度*****/ u16 check_wendu(void) { u16 c; c=ReadTemperature(); //获取温度值并减去DS18B20的温漂误差 return c; } /*********************************************************************************************************** 按键检测相关函数 ***********************************************************************************************************/ //按键 sbit Key1=P1^6; //设置键 sbit Key2=P1^7; //加按键 sbit Key3=P3^2; //减按键 #define KEY_SET 1 //设置 #define KEY_ADD 2 //加 #define KEY_MINUS 3 //减 ****//完整资料 ***//***微信公众号:木子单片机********/ //======================================================================== // 函数: u8 Key_Scan() // 应用: temp=u8 Key_Scan(); // 描述: 按键扫描并返回按下的键值 // 参数: NONE // 返回: 按下的键值 // 版本: VER1.0 // 日期: 2015-05-29 // 备注: 该函数带松手检测,按下键返回一次键值后返回0,直至第二次按键按下 //======================================================================== u8 Key_Scan() { static u8 key_up=1;//按键按松开标志 if(key_up&&(Key1==0||Key2==0||Key3==0)) { delay_ms(10);//去抖动 key_up=0; if(Key1==0) return 1; else if(Key2==0)return 2; else if(Key3==0)return 3; } else if(Key1==1&&Key2==1&&Key3==1) key_up=1; return 0;// 无按键按下 }

硬件设计

使用元器件:

单片机:STC89C52;

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

蜂鸣器;电容:30p;

直插电解电容:10uf;

报警指示灯;9脚排阻:10K;

LCD1602液晶显示器;

DC电源座;PNP三极管;

排针4-Pin;排针2-Pin;

色环电阻:10K、1k、2.2K;

烟雾传感器:MQ-2;

按键6X6X5MM;

数字温度管:DS18B20;

晶振:12MHZ;SWITCH;

导线:若干;

添加图片注释,不超过 140 字(可选)

流程图:

添加图片注释,不超过 140 字(可选)

设计资料

01仿真图

本设计使用proteus7.8和proteus8.9两个版本设计!具体如图!

添加图片注释,不超过 140 字(可选)

02原理图

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

添加图片注释,不超过 140 字(可选)

03程序

本设计使用软件keil5版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

04设计报告

一万三千字设计报告,具体如下!

添加图片注释,不超过 140 字(可选)

05设计资料

全部资料包括程序(含注释)、仿真源文件 、AD原理图、任务书、开题报告、结构框图、设计报告、流程图、实物图、元件清单等。具体内容如下,全网最全! !

点赞分享一起学习成长。

http://www.jsqmd.com/news/1001627/

相关文章:

  • 5分钟快速上手:asmr-downloader让你的ASMR音频下载效率提升10倍
  • 2026年职场进阶提升路径:避坑指南好找工作的证考试难度与系统方法解析
  • 10分钟搭建一个AI Skill,新手也能学会
  • 淘宝自动化脚本终极指南:如何每天自动赚取淘金币,节省30分钟宝贵时间
  • 2026汕头房产中介公司如何选?看完这5个秘诀再决定! - 企业品牌
  • 收藏!小白程序员必看:如何抓住AI大模型红利,轻松入局高薪赛道?
  • “[13-1]PWR电源控制
  • 2026年 餐饮手套/一次性食品手套/生鲜手套/烘焙手套/外卖打包手套厂家推荐:安全耐用与卫生标准之选 - 品牌发掘
  • 2026年TOP5专业GEO服务公司排行,谁将引领行业新趋势? - 轩铭卿
  • AI Agent工具链生态全景图:2026年核心组件与集成方案
  • 大模型加Excel:自动分析表格数据
  • 2026汕头房产中介租售市场:这些中介公司最值得信赖! - 企业品牌
  • 3个设计突破:为什么Bebas Neue正在重新定义免费字体体验?
  • 3分钟解锁网易云音乐NCM格式:ncmdump让你的音乐重获自由
  • 别再只盯着Clock Gating了:聊聊IC后端设计中那些更‘聪明’的低功耗策略(附UPF脚本思路)
  • i.MX25 ARM9车机芯片:入门级车载信息娱乐系统硬件设计与Linux开发实战
  • 代码随想录笔记 学习记录 - Ref
  • Python 高手编程系列六十六:ctypes
  • 向量空间 JBoltAI:Skill 构建与智能体开发解析
  • 硬件安全处理器MPC184架构解析与嵌入式系统集成实战
  • Claude手搓的IntelliJ Git扩展插件上线
  • 2026年大学规划:在校生可以考的证书有哪些?系统提升职业能力的进阶路径与系统方法全解析
  • ops-transformer算子库——Transformer架构在昇腾NPU上的深度优化实现
  • WaveTools:全面解锁《鸣潮》游戏潜能的专业工具箱
  • Unity游戏马赛克移除技术深度解析:基于BepInEx插件框架的视觉优化方案
  • 四川华锐净化工程有限公司简介及企业资质证书展示|成都本地17年的老牌洁净室工程公司 - 哈尺大哥
  • 艾尔登法环存档救星:EldenRingSaveCopier终极角色迁移指南
  • 顺序表详解
  • UltraStar Deluxe免费K歌软件完整指南:3步打造专业家庭KTV系统
  • 2026年 筷子套厂家推荐排行榜:一次性、淋膜、牛皮纸、彩印定制筷子套源头厂家专业实力与品质之选 - 品牌发掘