历史上的今天
今天是:2024年11月09日(星期六)
2020年11月09日 | 基于51单片机的温度火灾烟雾报警器
2020-11-09 来源:51hei
这个温度火灾烟雾报警器设计的51单片机程序及注释和protus仿真都有,非常好用.
烟雾传感器仿真中没有,其实就是传感器检测时相应的电阻值会变化,用滑动电位器代替就ok

单片机源程序:
#include #include "intrins.h" #define u8 unsigned char #define u16 unsigned int #define uchar unsigned char #define uint unsigned int uchar yushe_wendu=50; //温度预设值 uchar yushe_yanwu=45; //烟雾预设值 uint wendu; //温度值全局变量 uchar yanwu; //用于读取ADC数据 //运行模式 uchar Mode=0; //=1是设置温度阀值 =2是设置烟雾阀值 =0是正常监控模式 //管脚声明 sbit Led_Reg =P2^2; //红灯 sbit Led_Yellow =P2^4; //黄灯 sbit Buzzer =P2^0; //蜂鸣器 sbit Fan =P3^3; // /******************************************************************** * 名称 : delay_1ms() * 功能 : 延时1ms函数 * 输入 : q * 输出 : 无 ***********************************************************************/ void delay_ms(uint q) { uint i,j; for(i=0;i } /*********************************************************************************************************** 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指令简介 write_com(0x38);//屏幕初始化 write_com(0x0c);//打开显示 无光标 无光标闪烁 write_com(0x0d);//打开显示 阴影闪烁 write_com(0x0d);//打开显示 阴影闪烁 */ //1602初始化 void Init1602() { uchar i=0; write_com(0x38);//屏幕初始化 write_com(0x0c);//打开显示 无光标 无光标闪烁 write_com(0x06);//当读或写一个字符是指针后一一位 write_com(0x01);//清屏 } void Display_1602(yushe_wendu,yushe_yanwu,c,temp) { //显示预设温度 LCD_Write_Char(0,6,yushe_wendu,2) ; //显示预设烟雾 LCD_Write_Char(0,13,yushe_yanwu,3) ; //时时温度 LCD_Write_Char(1,6,c/10,2) ; write_data('.'); LCD_Write_Char(1,9,c%10,1) ; //时时烟雾 LCD_Write_Char(1,13,temp,3) ; } /*********************************************************************************************************** ADC0832相关函数 ***********************************************************************************************************/ sbit ADCS =P1^5; //ADC0832 片选 sbit ADCLK =P1^2; //ADC0832 时钟 sbit ADDI =P1^3; //ADC0832 数据输入 /*因为单片机的管脚是双向的,且ADC0832的数据输入输出不同时进行, sbit ADDO =P1^3; //ADC0832 数据输出 /*为节省单片机引脚,简化电路所以输入输出连接在同一个引脚上 //======================================================================== // 函数: unsigned int Adc0832(unsigned char channel) // 应用: temp=Adc0832(0); // 描述: 读取0通道的AD值 // 参数: channel:通道0和通道1选择 // 返回: 选取通道的AD值 // 版本: VER1.0 // 日期: 2015-05-29 // 备注: //======================================================================== for(j=0;j<110;j++);
史海拾趣
|
急需,ADC0832 DIP8的资料!!急需,ADC0832 DIP8的资料!!急需,ADC0832 DIP8的资料!!急需,ADC0832 DIP8的资料!!急需,ADC0832 DIP8的资料!!急需,ADC0832 DIP8的资料!!急需,ADC0832 DIP8的资料!!急需,ADC0832 DIP8的资料!!… 查看全部问答> |
|
呵呵,我们的Freescale。终于有Freescale的版块了,现在把以前写的一些东西转过来,希望能有更多人的关注Freescale。 MCF52233_GPT—General Purpose Time Module 今天嘛——给介绍下Coldfire的GPT这个模块.在调这块的时候碰到 ...… 查看全部问答> |
|
请在CE下用过SQLite的兄弟们看一下.关于发布SQLite的问题.都要做哪些准备工作啊? 小弟是第一次接触CE的东西.请大家帮帮忙. 程序代码如下,在WinForm的工程下可以运行.我就把代码复制到WINCE下的项目里了. 也添加了引用. 编译成功后,我将exe文件 数据库 和SQLite3.dll 一起复制到了PDA上. SQLite3.dll 放到了Windows下了. 运行e ...… 查看全部问答> |
|
大家好,小弟想向各位有经验的高手们请教一下,在嵌入式系统的软件工程中都需要学习哪些内容?比如开发语言是C,那么嵌入式开发应该是针对哪一层的呢,是应用层,还是驱动层的呢,应用层和驱动层有什么区别呢.现在的企业的需求是什么样的呢,因为小弟对这方 ...… 查看全部问答> |
|
请教在一款智能卡芯片是FLASH存储介质上实现FAT系统要怎么实现掉电保护? 如题 最近在一款智能卡芯片上设计一个FAT系统,要如何实现掉电保护,导致系统数据丢失以保证系统完整性? 具体情况是:FLASH的擦除块是512B,我设计的蔟大小是64B。 请教各位了,谢谢了!… 查看全部问答> |




