基于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_wendu10; //温度预设值 uchar yushe_wenduH50; //温度预设值 uint wendu; //温度值全局变量 //运行模式 uchar Mode0; //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(i0;iq;i) for(j0;j110;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(xz;x0;x--) for(y10;y0;y--); } void LCD_WriteData(u8 dat) { if(dat0x01)D01;else D00; if(dat0x02)D11;else D10; if(dat0x04)D21;else D20; if(dat0x08)D31;else D30; if(dat0x10)D41;else D40; if(dat0x20)D51;else D50; if(dat0x40)D61;else D60; if(dat0x80)D71;else D70; } //写命令 void write_com(uchar com) { LCDRS0; LCD_WriteData(com); // DATcom; LCDdelay(5); LCDEN1; LCDdelay(5); LCDEN0; } //写数据 void write_data(uchar date) { LCDRS1; LCD_WriteData(date); // DATdate; LCDdelay(5); LCDEN1; LCDdelay(5); LCDEN0; } /*------------------------------------------------ 选择写入位置 ------------------------------------------------*/ 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(l5) write_data(0x30s/10000%10); //万位 if(l4) write_data(0x30s/1000%10); //千位 if(l3) write_data(0x30s/100%10); //百位 if(l2) write_data(0x30s/10%10); //十位 if(l1) write_data(0x30s%10); //个位 } //1602初始化 void Init1602() { uchar i0; 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 x0; DQ 1; //DQ复位 Delay_DS18B20(8); //稍做延时 DQ 0; //单片机将DQ拉低 Delay_DS18B20(80); //精确延时大于480us DQ 1; //拉高总线 Delay_DS18B20(14); x DQ; //稍做延时后如果x0则初始化成功x1则初始化失败 Delay_DS18B20(20); return x; } /*****读一个字节*****/ unsigned char ReadOneChar(void) { unsigned char i0; unsigned char dat 0; for (i8;i0;i--) { DQ 0; // 给脉冲信号 dat1; DQ 1; // 给脉冲信号 if(DQ) dat|0x80; Delay_DS18B20(4); } return(dat); } /*****写一个字节*****/ void WriteOneChar(unsigned char dat) { unsigned char i0; for (i8; i0; i--) { DQ 0; DQ dat0x01; Delay_DS18B20(5); DQ 1; dat1; } } u8 tempflag0; //负号显示 /*****读取温度*****/ unsigned int ReadTemperature(void) { unsigned char c0; unsigned char a0; unsigned char b0; unsigned int t0; u8 tt0; u8 ttt0; Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 aReadOneChar(); //读低8位 bReadOneChar(); //读高8位 tb; t8; tt|a; tt(u8)(t4); //得到整数位 ttt(u8)((t%16)*0.0625*10); //得到小数位;乘以10代表保留一位小数; if(tt0x80) { tempflag1; //负号显示 tt~tt1; //实际温度值为读取值的补码 } else tempflag0; //正号显示 t tt*10ttt; //放大10倍 return(t); } // // // /*****校准温度*****/ u16 check_wendu(void) { u16 c; cReadTemperature(); //获取温度值并减去DS18B20的温漂误差 return c; } /*********************************************************************************************************** 按键检测相关函数 ***********************************************************************************************************/ //按键 sbit Key1P1^6; //设置键 sbit Key2P1^7; //加按键 sbit Key3P3^2; //减按键 #define KEY_SET 1 //设置 #define KEY_ADD 2 //加 #define KEY_MINUS 3 //减 ****//完整资料 ***//***微信公众号木子单片机********/ // // 函数: u8 Key_Scan() // 应用: tempu8 Key_Scan(); // 描述: 按键扫描并返回按下的键值 // 参数: NONE // 返回: 按下的键值 // 版本: VER1.0 // 日期: 2015-05-29 // 备注: 该函数带松手检测,按下键返回一次键值后返回0,直至第二次按键按下 // u8 Key_Scan() { static u8 key_up1;//按键按松开标志 if(key_up(Key10||Key20||Key30)) { delay_ms(10);//去抖动 key_up0; if(Key10) return 1; else if(Key20)return 2; else if(Key30)return 3; } else if(Key11Key21Key31) key_up1; 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原理图、任务书、开题报告、结构框图、设计报告、流程图、实物图、元件清单等。具体内容如下全网最全! 点赞分享一起学习成长。