单片机如何向手机报警_51单片机报警 - CSDN
  • 通过这些传感器和芯片,当环境中有火焰或温度等发生变化时系统会发出相应的灯光报警信号和声音报警信号,及发送到安卓手机,以此来实现防火报警,智能化提示。 关键词:火焰传感器;防火报警单片机;DS18B20 ...

    摘要

    随着现代家庭用火、用电量的增加,家庭火灾发生的频率越来越高。防火报警器也随之被广泛应用于各种场合。
    本文章所研究的无线多功能防火报警系统采用STC12C5A60S2为核心控制器,利用火焰传感器YL-38、蓝牙模块HC-05、DS18B20温度传感器等实现基本功能。通过这些传感器和芯片,当环境中有火焰或温度等发生变化时系统会发出相应的灯光报警信号和声音报警信号,及发送到安卓手机,以此来实现防火报警,智能化提示。
    关键词:火焰传感器;防火报警;单片机;DS18B20

    Abstract

    With the increase in fire and electricity consumption in modern homes, the frequency of home fires is increasing. The fire alarm is also widely used in various occasions.
    The wireless multi-function fire alarm system studied in this article uses STC12C5A60S2 as the core controller, and uses flame sensor YL-38, Bluetooth module HC-05, DS18B20 temperature sensor to achieve basic functions. Through these sensors and chips, the system will send out corresponding light alarm signals and sound alarm signals when the flame or temperature changes in the environment, and send them to the Android mobile phone, so as to realize the fire alarm and intelligent prompt.

    Key words: flame sensor; fire alarm; Single chip microcomputer;DS18B20
    目录
    摘要 1
    Abstract 2
    1 绪论 4
    1.1 相关背景 4
    1.2 目的与意义 4
    1.3研究内容 5
    2 防火报警的总体方案设计 5
    2.1系统的功能要求 5
    2.2 系统的技术要求 6
    2.3 系统的组成及方案设计 6
    3 系统的硬件设计 6
    3.1 主控电路 7
    3.2 火焰传感器电路的设计 10
    3.3 温度检测电路的设计 11
    3.4 LCD1602显示电路设计 13
    3.5 报警电路设计 15
    3.6 HC-05蓝牙模块设计 16
    4 实训的软件设计 17
    4.1 软件介绍 17
    4.2 实训程序流程图 18
    5 防火报警的调试及结论 18
    5.1 调试 18
    5.2 结论 19
    致谢 20
    参考文献 21
    附录 24

    1 绪论

    1.1 相关背景
    火灾作为一种在时空上失去控制的燃烧所引发的灾害,对人类生命财产和社会安全构成了极大的威胁。由此引发的重大安全事故比皆是,所以人类一直也未停止过对它的研究。
    火灾早已成为我国常发性和破坏性以及影响力最强的灾害之一。随着经济和城市建设的快速发展,城市高层、地下建筑以及大型综合性建筑日益增多,火灾隐患也大大增加,火灾发生的数量及其造成的损失呈逐年上升趋势。
    在过去的很长一段时间,人类不得不进行专题研究火灾过程中爆发,截至目前,已形成一个较为成熟的概念。火灾的发生和发展过程是一个复杂的物理和化学过程,但也与环境很强的相关性。正常情况下,发生火警,伴随着温度,光照等信号产生的过程。产生不同的环境和不同的光强,温度分布是不同的,所以火燃烧过程中涉及多个物理和化学参数,特点是强大的,一般的骚乱有着本质的不同。基于上述特点,早起的火灾探测技术应运而生,特别是多的火灾探测技术被广泛采用在火灾探测领域,如复合材料的物理参数复合温度探测器,使用不同的带光传感器的复合双波段火焰探测器。
    在我国,随着经济的发展和生活水平的提高,工业与民用建设日趋增多,火灾发生的可能性也随之大幅提高。另外,现代建筑物中塑料制品和玻璃的大量应用使火场内外部的求援行为困难重重。现代建筑,尤其是在大型酒店,宾馆,商场,图书馆,博物馆,档案馆和办公楼及其他公共场所,对于火灾报警系统也提出了更高的要求。一旦发生火灾将很难及时救助,势必要给国家和个人带来不可估量的损失。
    基于上述情况,防火报警技术便应运而生,防火报警系统是始终警惕火灾报警和输出联动忠实的哨兵火灾信号的有力手段,是一种早期预警。
    1.2 目的与意义
    目的:随着现代家庭用火,用电增加,家庭火灾发生的频率越来越高。家庭火灾,很容易扑灭不及时,有着缺乏消防设备和在场的人战斗惊慌失措逃离缓慢的不利因素,最终导致的生命和财产的重大损失。消防部门的统计数据显示,所有的火灾比例中,家庭火灾占全国火灾的30%。家庭火灾的原因是多方面的,可能把我们的注意力,也可能隐藏在我们没有注意到的地方。
    意义:在中国的一些大、中型城市,几乎每一天发生家庭火灾,所以每一个家庭必须始终关注防火。如果能根据你家的实际情况,提前采取简单的防火措施,有些悲剧是完全可以避免的。声音和视觉的报警,对减少火灾损失具有现实意义。
    1.3研究内容
    基于安卓的防火报警系统,主要检测温度和火焰,再通过单片机控制相应的报警和驱动负载。通过液晶显示当前的是否有火焰和温度值,通过LED和蜂鸣器做相应的提示,并通过蓝牙串口发送到app显示。
    该项目主要是为了完成任务,包括:
    (1)硬件部分:包括传感器的选择,显示模块的选择,温度转换电路的设计,火焰感应电路的设计。
    (2)软件部分:包括微处理器控制程序的编制和原理图的绘制。
    (3)系统的综合调试与分析:在软硬件完成以后,要对系统进行综合的测试与实验,分析系统的可靠性与实用性,调整系统的不足。

    2 防火报警的总体方案设计
    本题目主要是实现火焰报警和火灾发生时的报警及温度控制,下面分别对系统功能要求、系统技术要求及系统实现方案总体阐述。
    2.1系统的功能要求
    本系统的研制主要包括以下几项功能:
    (1)火情探测功能:为了提高火灾报警的准确性和及时性,火灾报警系统需要使用各种方法进行火灾探测。在实际使用中,根据不同的防火场所,用户可以选用温度探测法、可燃气体检测法及光照探测法等合适的火灾探测方法,来有效的探测火灾;
    (2)温度报警功能:当室内温度过大、有火情产生、故障等异常情况发生时,报警器要进行灯光报警。当温度超过最大设定值时,可以蜂鸣器报警。
    2.2 系统的技术要求
    在了解这个系统的工作原理以及功能之后,我们就可以基本确定系统的技术要求。系统采用的单片机处理器成本都比较低,可以满足批量生产和各类工程的需求。对于完整的一个系统而言,为提高市场的竞争力,这个系统应符合体积小、功耗低、数传性能可靠和成本低廉等技术要求。具体指标和参数如下:
    (1)体积小:探测器的体积要尽可能的小,这样占用的空间才能减少,使用和更换才会方便;
    (2)功耗低:系统可以采用三节5号干电池供电或5v电源供电。
    (3)可靠性高:由于不确定的电磁干扰可能存在在系统工作环境中,为了保证系统长时间的可靠工作,以及减少误报次数,所以选择多指示灯,指示不同的状态。
    2.3 系统的组成及方案设计
    本设计主要由火焰传感器电路、单片机、灯光报警电路、负载驱动电路、温度检测电路、控制程序和编解码程序等组成。
    系统的组成结构如下:

    图 2. 1
    3 系统的硬件设计
    原理图

    图 3. 1
    上图3.1是由AD19所画的。
    实时显示是否有火焰与温度,共有三个报警值。检测到火焰则LED1警告,低温LED2警告,高温先是LED3警告,超过最大值则蜂鸣器报警。
    3.1 主控电路
    C51单片机是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89C51 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。本次使用的STC12C5A60S2继承C51的全部功能,完美兼容C51单片机的所有程序。主要功能如表3.1所示,其DIP封装如图3.2所示

    表3.1:STC89C51主要功能
    主要功能特性
    兼容MCS51指令系统 4K可反复擦写Flash ROM
    32个双向I/O口 256x8bit内部RAM
    3个16位可编程定时/计数器中断 时钟频率0-24MHz
    2个串行中断 可编程UART串行通道
    2个外部中断源 共6个中断源
    2个读写中断口线 3级加密位
    低功耗空闲和掉电模式 软件设置睡眠和唤醒功能

    STC89C52引脚介绍
    ① 主电源引脚(2根)
    VCC(Pin40):电源输入,接+5V电源
    GND(Pin20):接地线
    ②外接晶振引脚(2根)
    XTAL1(Pin19):片内振荡电路的输入端
    XTAL2(Pin20):片内振荡电路的输出端
    ③控制引脚(4根)
    RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
    ALE/PROG(Pin30):地址锁存允许信号
    PSEN(Pin29):外部存储器读选通信号
    EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
    ④可编程输入/输出引脚(32根)
    STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
    P0口(Pin39~Pin32):8位双向I/O口线,名称为P0.0~P0.7
    P1口(Pin1~Pin8):8位准双向I/O口线,名称为P1.0~P1.7
    P2口(Pin21~Pin28):8位准双向I/O口线,名称为P2.0~P2.7
    P3口(Pin10~Pin17):8位准双向I/O口线,名称为P3.0~P3.7
    作频率35Mhz,6T/12T可选。

    图 3. 2 单片机DIP封装图

    最小系统包括单片机及其所需的必要的电源、时钟、复位等部件,能使单片机始终处于正常的运行状态。电源、时钟等电路是使单片机能运行的必备条件,可以将最小系统作为应用系统的核心部分,通过对其进行存储器扩展、A/D扩展等,使单片机完成较复杂的功能。
    STC12C5A60S2是片内有ROM/EPROM的单片机,因此,这种芯片构成的最小系统简单﹑可靠。用STC12C5A60S2单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,结构如图2-3所示,由于集成度的限制,最小应用系统只能用作一些小型的控制单元。

    图 3. 3 最小系统原理框图
    (1) 时钟电路
    STC12C5A60S2单片机的时钟信号通常有两种方式产生:一是内部时钟方式,二是外部时钟方式。内部时钟方式如图2-4所示。在STC12C5A60S2单片机内部有一振荡电路,只要在单片机的XTAL1(18)和XTAL2(19)引脚外接石英晶体(简称晶振),就构成了自激振荡器并在单片机内部产生时钟脉冲信号。图中电容C1和C2的作用是稳定频率和快速起振,电容值在530pF,典型值为30pF。晶振CYS的振荡频率范围在1.212MHz间选择,典型值为12MHz和6MHz。

    图 3. 4 内部时钟电路
    (2) 复位电路
    当在STC12C5A60S2单片机的RST引脚引入高电平并保持2个机器周期时,单片机内部就执行复位操作(若该引脚持续保持高电平,单片机就处于循环复位状态)。
    最简单的上电自动复位电路中上电自动复位是通过外部复位电路的电容充放电来实现的。只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。
    除了上电复位外,有时还需要按键手动复位。本设计就是用的按键手动复位。按键手动复位有电平方式和脉冲方式两种。其中电平复位是通过RST(9)端与电源Vcc接通而实现的。

    图 3. 5 复位电路图

    (3) STC89C51中断技术概述
    中断技术主要用于实时监测与控制,要求单片机能及时地响应中断请求源提出的服务请求,并作出快速响应、及时处理。这是由片内的中断系统来实现的。当中断请求源发出中断请求时,如果中断请求被允许,单片机暂时中止当前正在执行的主程序,转到中断服务处理程序处理中断服务请求。中断服务处理程序处理完中断服务请求后,再回到原来被中止的程序之处(断点),继续执行被中断的主程序。
    图3.6为整个中断响应和处理过程。

    图 3. 6中断响应和处理过程
    如果单片机没有中断系统,单片机的大量时间可能会浪费在查询是否有服务请求发生的定时查询操作上。采用中断技术完全消除了单片机在查询方式中的等待现象,大大地提高了单片机的工作效率和实时性。
    3.2 火焰传感器电路的设计

    图 3. 7 火焰传感器
    如图3.7所示,通电之后,把数据口接到单片机,单片机判断火焰传感器的数据传输电平高低来实现对火焰的感应。
    3.2.1 火焰传感器的介绍
    1、可以检测火焰或者波长在760纳米心1100纳米范围内的光源;
    2、探测角度60度左右,对火焰光谱特别灵敏3灵敏度可调(图中蓝色数字电位器调节);
    3、对火焰的探测距离:跟灵敏度和火焰强度有关,一般1m以内适用(以打火机火焰测试,半米内能够触发传感器);
    4、工作电压3.3V-5V;
    5、输出形式:
    a模拟量电压输出
    b数字开关量输出(0和1)。
    3.2.2 火感原理

    图 3. 8 火感原理图
    火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号,输入到中央处理器,中央处理器根据信号的变化做出相应的程序处理。
    3.3 温度检测电路的设计

    图 3. 9 DS18B20
    3.3.1 DS18B20概述
    美国DALLAS公司生产的 DS18B20可组网数字温度传感器芯片外加不锈钢保护管封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。有独特的单线接口方式,DS1820在与微处理器连接时仅需要一条口线即可实现微处理器与DS1820的双向通讯;其测温范围 -55℃~+125℃,固有测温分辨率0.5℃;支持多点组网功能;多个DS1820可以并联在唯一的三线上,实现多点测温;工作电源为3~5V/DC;在使用中不需要任何外围元件。
    DS18B20的性能特点如下:
    (1) 采用DALLAS公司独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯;
    (2)在使用中不需要任何外围元件;
    (3)可用数据线供电,供电电压范围:+3.0V~+5.5V;
    (4)测温范围:-55~+125℃。固有测温分辨率为0.5℃。当在-10℃~+85℃范围内,可确保测量误差不超过0.5℃,在-55~+125℃范围内,测量误差也不超过2℃;
    (5)通过编程可实现9~12位的数字读数方式;
    (6)支持多点的组网功能,多个DS18B20可以并联在唯一的三线上,实现多点测温
    (7)负压特性,即具有电源反接保护电路。当电源电压的极性反接时,能保护DS18B20不会因发热而烧毁,但此时芯片无法正常工作;
    (8)DS18B20的转换速率比较高,进行9位的温度值转换只需93.75ms;
    (9)适配各种单片机或系统;
    (10)内含64位激光修正的只读存储ROM,扣除8位产品系列号和8位循环冗余校验码(CRC)之后,产品序号占48位。出厂前产品序号存入其ROM中。在构成大型温控系统时,允许在单线总线上挂接多片DS18B20。
    3.3.2 DS18B20实现流程图

    3.4 LCD1602显示电路设计

    图 3. 10 LCD显示电路
    LCD1602A 是一种工业字符型液晶,能够同时显示16x02 即32个字符。(16列2行)。在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单。
    在单片机系统中应用晶液显示器作为输出器件有以下几个优点:
    由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。
    液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
    液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
    相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
    (1)引脚说明:
    第1脚:VSS为地电源。
    第2脚:VDD接5V正电源。
    第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
    第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
    第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平
    R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
    第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
    第7~14脚:D0~D7为8位双向数据线。
    第15脚:背光源正极。
    第16脚:背光源负极。
    (2)1602LCD的RAM地址映射以及标准字库表
    LCD1602液晶模块内部的字符发生存储器已经存储了160个不同的点阵字符图形,这些字符图有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母。
    它的读写操作、屏幕和光标的操作都是通过指令编程来实现的(说明:1为高电平,0为低电平)。
    指令1:清显示,指令码01H,光标复位到地址00H位置。
    指令2:光标复位,光标返回到地址00H 。
    指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 。S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效 。
    指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示。 C:控制光标的开与关,高电平表示有光标,低电平表示无光标。 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁 。
    指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标 。
    指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线。 N:低电平时为单行显示,高电平时双行显示。 F:低电平时显示5X7的点阵字符,高电平时显示5x10的点阵字符 (有些模块是 DL:高电平时为8位总线,低电平时为4位总线)。
    指令7:字符发生器RAM地址设置 。
    指令8:DDRAM地址设置 。
    指令9:读出忙信号和光标地址。 BF为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙,模块就能接收相应的命令或者数据。
    指令10:写数据 。
    指令11:读数据 。
    液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。

    图 3. 11 LCD1602内部显示地址
    液晶显示的原理是利用液晶的物理特性, 通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
    3.5 报警电路设计

    图 3. 12 蜂鸣器报警电路

    图 3. 13 LED报警电路
    蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。三极管Q1起开关作用,其基极的低电平使三极管饱和导通,使蜂鸣器发声;而基极高电平则使三极管关闭,蜂鸣器停止发声。
    LED英文单词的缩写,主要含义:LED = Light Emitting Diode,发光二极管,是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光;它改变了白炽灯钨丝发光与节能灯三基色粉发光的原理,而采用电场发光。据分析,LED的特点非常明显,寿命长、光效高、辐射低与功耗低。
    本次实训通过这两个模块实现报警功能。
    3.6 HC-05蓝牙模块设计

    图 3. 14 蓝牙模块
    基本实现过程概述,用USB转TTL的CH340模块连接HC-05,通过电脑配置波特率、从机模式、蓝牙连接密码、用户名称等。将配置好的HC-05连接单片机,TXD与RXD跟单片机的交叉相连,实现通信。再由安卓手机蓝牙配对,实现实时防火报警功能。
    3.6.1 HC-05介绍
    ATK-HC05V1l是一款高性能的主从一体蓝牙串口模块,可以同各种带蓝牙功能的电脑、蓝牙主机、手机、PDA、PSP等智能终端配对,该模块支持非常宽的波特率范围:4800~-1382400,并且模块兼容5V或3.3V单片机系统。
    若使用HC-05与手机配对通信,需进行以下设置:
    (1)、AT+NAME=
    (2)、AT+CMODE=1
    (3)、AT+UART=9600,0,0
    (4)、AT+PSWD=<1234>
    经过配置,即可实现蓝牙模块与单片机之间的通信。便于实时监控温度、火情等,从而实现基于安卓的防火报警。
    3.6.2 HC-05与手机通信
    经配置好的内容,如下图

    图 3. 15 HC-05配置
    经上图的相关配置,用手机安卓串口助手,实现实时通信

    图 3. 16 手机显示数据

    4 实训的软件设计
    4.1 软件介绍
    Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。KeilC51如下如所示

    图 4. 1 keilC51界面
    4.2 实训程序流程图

    5 防火报警的调试及结论
    5.1 调试
    首先,检验程序与电路的相关接口是否相符,电路是否能实现预期的效果,不能实现的原因是什么等等。期间,所遇到的最大的难题就是DS18B20温度的获取及LCD1602的显示问题。结果是没有添加中断,使得内存出现混乱的缘故。除此之外也没什么问题,起初得到题目的时候,先等待所需的元器件。设计思路就是,把各个模块都分别实现,然后进行整体的整合。我主要负责这个,原理图跟流程图由另外两个同学完成。我则负责补充。
    5.2 结论
    本实训中设计的防火报警由传感器电路与无线通信电路两大部分构成。控制处理器是以管脚资源丰富的STC12C5A60S2为核心,实现对探测器写入信号和对信号进行编译等人机交互功能。应用程序以C语言编写,充分利用芯片的内部资源,提高了代码执行效率,减小了代码的容量。但是,由于本人在各方面的知识不够全面,再加上时间紧迫以及实验条件的限制,该报警器还有较多需要提高的地方。比如:自行调节报警值,烟雾传感探测,蓝牙的局限性等。作品是不断完善的,想要做得更好,就应该根据不同的场景设计不同模块的功能,对防火报警进行更好的监控,防患于未然。
    致谢

    这次毕业设计得到了很多人的帮助,其中**老师对我的关心和支持尤为重要,每次遇到难题,我首先就是向老师寻求帮助。另外,她细心的指导使我在完成作品的路上走得更好。
    感谢在整个实训设计期间和我密切合作的同学,和曾经在各个方面给予过我帮助的伙伴们,正是因为有了你们的帮助,才让我不仅学到了本次实训所涉及的新知识,更让我感觉到了知识以外的东西,那就是团结的力量。

    参考文献

    [1]陈权昌,李兴富.单片机原理及应用[M].广州:华南理工大学出版社,2007.8
    [2]李庆亮.C语言程序设计实用教程[M].北京:机械工业出版社,2005.3
    [3]杨志忠.数字电子技术[M].北京:高等教育出版社,2003.12.
    [4]及力.Protel 99 SE原理图与PCB设计教程[M].北京:电子工业出版社,2007.8.
    [5]徐江海.单片机实用教程[M].北京:机械工业出版社,2006.12
    [6]胡宴如.模拟电子技术[M].北京:高等教育出版社,2008.6
    [7] 刘宁.单片机多功能时钟的设计[M].浙江:浙江海洋学院,2009.
    [8] 汪文,陈林.单片机原理及应用[M].湖北:华中科技大学出版社,2007.
    [9] 康华光.电子技术基础数字部分[M].北京:高等教育出版社,2008.

    附录:
    实物图

    代码:
    //******************************************************************//
    // main.c的代码
    //******************************************************************//
    #include <string.h>
    #include “Lcd1602.h”
    #include “config.h”
    #include “Time.h”
    #include “uart.h”
    bit flag500ms = 0;
    unsigned char str[30];

    void InitTimer1(void)
    {
    TMOD&= 0x0F;
    TMOD|= 0x10;
    TH1 = 0xD4;
    TL1 = 0xCD;
    EA = 1;
    ET1 = 1;
    TR1 = 1;
    }
    void Sys_Init()
    {
    InitTimer1();
    InitLcd1602();
    Uart1Init(0,1,220);

    }
    void main(void)
    {
    EA=1;
    Sys_Init();
    while(1)
    {
    if(flag500ms==1)
    {
    flag500ms=0;
    fireAction();
    refreshTemp();
    }
    }
    }
    void InterruptTimer1() interrupt 3
    {
    static unsigned int cnt=0;
    TL1=0X67;
    TH1=0XFC;
    cnt++;
    ​ if(cnt>=500)
    ​ {
    ​ flag500ms=1;
    ​ cnt=0;//
    ​ }
    }

    //******************************************************************//
    // Time.c的代码
    //******************************************************************//
    #include “time.h”
    #include <string.h>
    #include “Lcd1602.h”
    #include “config.h”
    #include “ad.h”
    #include “time.h”
    #include <ds18b20.h>
    #include “uart.h”
    #include “Hc05.h”
    extern unsigned char str[];
    sbit Fire_P=P0^0;
    sbit LED1=P1^3;
    sbit LED2=P1^5;
    sbit LED3=P1^7;
    sbit BEEP=P3^6;

    void delay_Nms(unsigned int Ncount)
    {
    unsigned char a,b;
    Ncount=Ncount2;
    while(Ncount–)
    {
    for(b=4;b>0;b–)
    for(a=79;a>0;a–);
    }
    }
    void fireAction(void)
    {
    if(Fire_P1)
    {
    delay_Nms(25);
    if(Fire_P
    1)
    {
    LED1=0;
    str[0] = ‘S’;
    str[1] = ‘a’;
    str[2] = ‘f’;
    str[3] = ‘e’;
    str[4] = ‘?’;
    str[5] = ’ ';
    str[6] = ’ ';
    str[7] = ’ ';
    str[8] = ‘F’;
    str[9] = ‘i’;
    str[10] = ‘r’;
    str[11] = ‘e’;
    str[12] = ’ ';
    str[13] = ’ ';
    str[14] = ‘\0’;
    Lcd1602ShowStr(0, 0, str);
    Uart1Sends(str);
    Uart2Action();
    }
    }
    else
    {
    LED1=1;
    str[0] = ‘S’;
    str[1] = ‘a’;
    str[2] = ‘f’;
    str[3] = ‘e’;
    str[4] = ‘?’;
    str[5] = ’ ';
    str[6] = ’ ';
    str[7] = ’ ';
    str[8] = ‘Y’;
    str[9] = ‘E’;
    str[10] = ‘S’;
    str[11] = ‘!’;
    str[12] = ’ ';
    str[13] = ’ ';
    str[14] = ‘\0’;
    Lcd1602ShowStr(0, 0, str);
    Uart1Sends(str);
    ​ }
    }
    nt intT,decT,temp;
    int tem;
    bit res=0;
    void refreshTemp()
    {
    ​ res = Get18B20Temp(&temp);
    ​ Start18B20();
    ​ LED2=1;
    ​ LED3=1;
    ​ BEEP=1;
    ​ if (res)
    ​ {
    ​ intT = temp >> 4;
    ​ decT = temp & 0xF;
    ​ decT = (decT
    100) / 16;
    ​ tem = intT;
    ​ }
    ​ str[0] = ’ ';
    ​ str[1] = ’ ';
    ​ str[2] = ’ ';
    ​ str[3] = intT % 100 / 10+ 0x30;
    ​ str[4] = intT % 10+0x30;
    ​ str[5] = ‘.’;
    ​ str[6] = decT % 100/10+0x30;
    ​ str[7] = ‘C’;
    ​ str[8] = ’ ';
    ​ str[9] = ‘\0’;
    ​ str[10] = ‘\n’;
    Lcd1602ShowStr(0, 1, str);
    ​ Uart1Sends(str);
    ​ delay_Nms(100);
    if(tem<=40&&tem>=20)
    {
    delay_Nms(50);

    }
    else if(tem<20)		
    {
    	LED2=0;	
        BEEP=0;
    	}
    	else if(tem>40)	
    	{
    		LED3=0;
    		BEEP=0;
    		delay_Nms(1000);
    		BEEP=1;
    	}
    }
    

    //******************************************************************//
    // DS18B20.c的代码
    //******************************************************************//
    #include “config.h”
    #include <intrins.h>
    sbit IO_18B20 = P3^7;

    void Delay_us(unsigned char us)
    {
    do {
    nop();
    nop();
    nop();
    nop();
    nop();
    nop();
    nop();
    nop();
    } while (–us);
    }
    bit Get18B20Ack()
    {
    bit ack;
    EA = 0;
    IO_18B20 = 0;
    Delay_us(250);
    Delay_us(250);
    IO_18B20 = 1;
    Delay_us(60);
    ack = IO_18B20;
    while(!IO_18B20);
    EA = 1;
    return ack;
    }
    void Write18B20(unsigned char dat)
    {
    unsigned char mask;
    EA = 0;
    for (mask=0x01; mask!=0; mask<<=1)
    {
    IO_18B20 = 0;
    Delay_us(2);
    if ((mask&dat) == 0)
    IO_18B20 = 0;
    else
    IO_18B20 = 1;
    Delay_us(60);
    IO_18B20 = 1;
    }
    EA = 1;
    }
    unsigned char Read18B20()
    {
    unsigned char dat;
    unsigned char mask;
    EA = 0;
    for (mask=0x01; mask!=0; mask<<=1)
    {
    IO_18B20 = 0;
    Delay_us(2);
    IO_18B20 = 1;
    Delay_us(2);
    if (!IO_18B20)
    dat &= ~mask;
    else
    dat |= mask;
    Delay_us(60);
    }
    EA = 1;
    return dat;
    }
    bit Start18B20()
    {
    bit ack;
    ack = Get18B20Ack();
    if (ack == 0)
    {
    Write18B20(0xCC);
    Write18B20(0x44);
    }
    return ~ack;
    }
    bit Get18B20Temp(int *temp)
    {
    bit ack;
    unsigned char LSB, MSB;
    ack = Get18B20Ack();
    if (ack == 0)
    {
    Write18B20(0xCC);
    Write18B20(0xBE);
    LSB = Read18B20();
    MSB = Read18B20();
    *temp = ((int)MSB << 8) + LSB;
    }
    return ~ack;
    }

    //******************************************************************//
    // LCD1602.c的代码
    //******************************************************************//
    #include “config.h”
    #include “Lcd1602.h”
    void Lcd1602WaitReady()
    {
    unsigned char sta;
    LCD1602_DB = 0xFF;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do {
    LCD1602_EN = 1;
    sta = LCD1602_DB;
    LCD1602_EN = 0;
    } while (sta & 0x80);
    }
    void Lcd1602WriteCmd(unsigned char cmd)
    {
    Lcd1602WaitReady();
    LCD1602_RS = 0;
    LCD1602_RW = 0;
    LCD1602_DB = cmd;
    LCD1602_EN = 1;
    LCD1602_EN = 0;
    }
    void Lcd1602WriteDat(unsigned char dat)
    {
    Lcd1602WaitReady();
    LCD1602_RS = 1;
    LCD1602_RW = 0;
    LCD1602_DB = dat;
    LCD1602_EN = 1;
    LCD1602_EN = 0;
    }
    void Lcd1602SetCursor(unsigned char x, unsigned char y)
    {
    unsigned char addr;
    if (y == 0)
    addr = 0x00 + x;
    else
    addr = 0x40 + x;
    Lcd1602WriteCmd(addr | 0x80);
    }
    void Lcd1602ShowStr(unsigned char x, unsigned char y, unsigned char *str)
    {
    Lcd1602SetCursor(x, y);
    while (*str != ‘\0’)
    {
    Lcd1602WriteDat(*str++);
    }
    }
    void InitLcd1602()
    {
    Lcd1602WriteCmd(0x38);
    Lcd1602WriteCmd(0x0C);
    Lcd1602WriteCmd(0x06);
    Lcd1602WriteCmd(0x01);
    }

    //******************************************************************//
    // HC-05.c的代码
    //******************************************************************//
    #include “Hc05.h”
    #include “config.h”
    #include “Lcd1602.h”
    bit flagTxd = 0;
    bit flagUart2Frame = 0;
    extern bit Page;
    unsigned char cntRxd2 = 0;
    unsigned char pdata bufRxd2[30];
    void Uart2Action(unsigned char *buf, unsigned char len);

    char Uart2Init(char s2smod,char brtx12,unsigned char reload)
    {
    S2CON = 0X50;
    BRT = reload;
    if(s2smod == 1)
    {
    AUXR |= S2SMOD;
    }
    else if(s2smod == 0)
    {
    AUXR &= (~S2SMOD);
    }
    else
    {
    return -1;
    }

    if(brtx12 == 1)
    {
    	AUXR |= BRTx12;
    }
    else if(brtx12 == 0)
    {
    	AUXR &= (~BRTx12);	
    }
    else
    {
    	return -2;
    }
    	
    AUXR |= BRTR;																		
    IE2 |= ES2; 
    EA = 1;	  
    return 0;	
    

    }
    void InterruptUart2() interrupt 8
    {
    unsigned char temp = 0;
    IE2 = 0;
    if(S2CON & S2RI)
    {
    }
    IE2 |= ES2;
    if(S2CON & S2TI)
    {
    S2CON &= (~S2TI);
    }
    }
    void Uart2RxMonitor(unsigned char ms)
    {
    static unsigned char cntbkp = 0;
    static unsigned char idletmr = 0;

    if (cntRxd2 > 0)  
    {
        if (cntbkp != cntRxd2)  
        {
            cntbkp = cntRxd2;
            idletmr = 0;
        }
        else                  
        {
            if (idletmr < 30)  
            {
                idletmr += ms;
                if (idletmr >= 30) 
                {
                    flagUart2Frame = 1; 
                }
            }
        }
    }
    else
    {
        cntbkp = 0;
    }
    

    }
    unsigned char Uart2Read(unsigned char *buf, unsigned char len)
    {
    unsigned char i;
    if (len > cntRxd2)
    {
    len = cntRxd2;
    }
    for (i=0; i<len; i++)
    {
    *buf++ = bufRxd2[i];
    }
    cntRxd2 = 0;

    return len; 
    

    }
    void Uart2Action(unsigned char *buf, unsigned char len)
    {
    unsigned char i;
    unsigned char code cmd2[] = "showstr ";
    unsigned char code cmdLen[] = {
    sizeof(cmd2)-1,
    };

    	unsigned char code *cmdPtr[] = {        
         &cmd2[0],
    };
    
    for (i=0; i<sizeof(cmdLen); i++)  
    {
        if (len >= cmdLen[i]) 
        {
            if (CmpMemory(buf, cmdPtr[i], cmdLen[i])) 
            {
                break;
            }
        }
    }
    

    }
    void Uart2Driver()
    {
    unsigned char len;
    unsigned char pdata buf[40];

    if(flagUart2Frame)
    {
    	flagUart2Frame = 0;
    	len = Uart2Read(buf, sizeof(buf));
    	Uart2Action(buf, len);	
    }
    

    }

    bit CmpMemory(unsigned char *ptr1, unsigned char *ptr2, unsigned char len)
    {
    while (len–)
    {
    if (*ptr1++ != *ptr2++)
    {
    return 0;
    }
    }
    return 1;
    }

    展开全文
  • 单片机之烟雾报警

    千次阅读 2018-12-02 14:57:26
    单片机之烟雾报警器(MQ-2) 转载https://blog.csdn.net/qq_21792169/article/details/51236071 适用于初学者。高手不要忘下看了 要求:液晶屏显示.四个按键分别控制选择设定值位数,加一,减一。报警功能开关键 ...

    单片机之烟雾报警器(MQ-2)

    转载https://blog.csdn.net/qq_21792169/article/details/51236071

    适用于初学者。高手不要忘下看了

    要求:液晶屏显示.四个按键分别控制选择设定值位数,加一,减一。报警功能开关键

    lcd.c文件

    #include<reg51.h>
    #define LCD1602_4PINS
    #define LCD1602_DATAPINS P0
    sbit LCD1602_E=P2^7;
    sbit LCD1602_RW=P2^5;
    sbit LCD1602_RS=P2^6;


    #define uchar unsigned char
    #define uint unsigned int


    void Lcd1602_Delay1ms(uint c)   //误差 0us
    {
        uchar a,b;
    for (; c>0; c--)
    {
    for (b=199;b>0;b--)
    {
      for(a=1;a>0;a--);
    }      
    }
        
    }


    void LcdWriteCom(uchar com)  //写入命令
    {
    LCD1602_E = 0;//使能清零
    LCD1602_RS = 0;//选择写入命令
    LCD1602_RW = 0;//选择写入


    LCD1602_DATAPINS = com;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
    Lcd1602_Delay1ms(1);


    LCD1602_E = 1;//写入时序
    Lcd1602_Delay1ms(5);
    LCD1602_E = 0;


    // Lcd1602_Delay1ms(1);
    LCD1602_DATAPINS = com << 4; //发送低四位
    Lcd1602_Delay1ms(1);


    LCD1602_E = 1;//写入时序
    Lcd1602_Delay1ms(5);
    LCD1602_E = 0;
    }


    void LcdWriteData(uchar dat) //写入数据
    {
    LCD1602_E = 0; //使能清零
    LCD1602_RS = 1; //选择写入数据
    LCD1602_RW = 0; //选择写入


    LCD1602_DATAPINS = dat;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
    Lcd1602_Delay1ms(1);


    LCD1602_E = 1; //写入时序
    Lcd1602_Delay1ms(5);
    LCD1602_E = 0;


    LCD1602_DATAPINS = dat << 4; //写入低四位
    Lcd1602_Delay1ms(1);


    LCD1602_E = 1; //写入时序
    Lcd1602_Delay1ms(5);
    LCD1602_E = 0;
    }


    void LcdInit()  //LCD初始化子程序
    {
    LcdWriteCom(0x32);//将8位总线转为4位总线
    LcdWriteCom(0x28);//在四位线下的初始化
    LcdWriteCom(0x0c);  //开显示不显示光标
    LcdWriteCom(0x06);  //写一个指针加1
    LcdWriteCom(0x01);  //清屏
    LcdWriteCom(0x80);  //设置数据指针起点
    }

     

    main.c文件:

    /*
    *CS_ :片选使能,低电平芯片使能。 
    *CH0 :模拟输入通道 0,或作为 IN+/-使用。 
    *CH1 :模拟输入通道 1,或作为 IN+/-使用。 
    *GND :芯片参考 0 电位(地)。 
    *DI  :数据信号输入,选择通道控制。 
    *DO  :数据信号输出,转换数据输出。 
    *CLK :芯片时钟输入。 
    *Vcc/REF :电源输入及参考电压输入(复用)。 
    */




    #include<reg51.h>


    #define uchar unsigned char
    #define uint unsigned int


    sbit key1=P1^4;  /* 报警值设定位选择器 */
    sbit key2=P1^5; /* 报警值加一 */
    sbit key3=P1^6;  /* 报警值减一*/
    sbit key4=P1^7;  /* 报警功能开关键*/


    sbit LED1=P2^0;  /* 报警指示灯LED1*/
    sbit LED2=P2^1;  /* 报警指示灯LED2*/
    sbit beep=P2^2;  /* 蜂鸣器报警*/


    sbit ADC_CS=P1^0;   /* ADC使能管脚 */
    sbit ADC_CLK=P1^1;  /* ADC时钟信号管脚 */
    sbit ADC_IO=P1^2;   /* ADC输入输出管脚*/


    void Lcd1602_Delay1ms(uint c);   //误差 0us
    void LcdWriteCom(uchar com);  /*LCD1602写入8位命令子函数*/
    void LcdWriteData(uchar dat); /*LCD1602写入8位数据子函数*/ 
    void LcdInit(); /*LCD1602初始化子程序*/


    unsigned char *buff=" max value :";
    unsigned int set_value=100;     /* 报警值默认设置为100 ,三位数字*/
    unsigned int adc_value=0;


    unsigned char Key_Scan()   /* 按键扫描函数 */
    {
    unsigned char key_num = 0 ; 


    /* check key if press */
    if ((key1 ==0)||(key2 ==0)||(key3 ==0)||(key4 ==0))
    {
    Delay10ms(1); //消除抖动
    if ((key1 ==0)||(key2 ==0)||(key3 ==0)||(key4 ==0))
    {
    if(key1==0)  key_num=1;
    if(key2==0)  key_num=2;
    if(key3==0)  key_num=3;
    if(key4==0)  key_num=4;
    }
    }

    while((key1 ==0)||(key2 ==0)||(key3 ==0)||(key4 ==0));
    return key_num;   //将读取到键值的值返回
    }


    void all_init(void)
    {
       unsigned char i;
       LcdInit();/* 初始化LCD显示 */
       LED1=0;   /* 熄灭报警灯 */
       LED2=0;   /* 熄灭报警灯 */   
       beep=0;   /* 关闭蜂鸣器 */
       ADC_CS=1; /* 使能为1 */
      LcdWriteCom(0x80);
      for(i=0;i<sizeof(buff),i++)
      LcdWriteData(buff[i]);
    }
       
    unsigned int get_adc_value()
    {
      
    }  
     
    void main()
    {
      unsigned char key_num;
      unsigned char beep_on_off=0;    /* 默认为关闭状态 */
      unsigned char set_value_ hundreds; /* 百位 */
      unsigned char set_value_ decade;   /* 十位 */
      unsigned char set_value_ single;   /* 个位 */
      unsigned char set_value_bit_select=0;
      
      all_init();
      
      while(1)
      {
        adc_value=get_adc_value();
    key_num=Key_Scan();
    set_value_ hundreds=set_value/100;
    set_value_ decade  =(set_value%100)/10;
    set_value_ single  =set_value%10;

    switch(key_num)
    {
     case 1:
     {
    set_value_bit_select++;
    if(set_value_bit_select>=3)  
    set_value_bit_select=0;
    key_num=0;
    break;
         
     }
     case 2:
     {
       switch(set_value_bit_select)
    {
      case 0:
    {
    set_value_ single++;
    if(set_value_ single>9)
    set_value_ single=0;
    }
      case 1:
    {
    set_value_ decade++;
    if(set_value_ decade>9)
    set_value_ decade=0;
    }
      case 2:
    {
    set_value_ hundreds++;
    if(set_value_ hundreds>9)
    set_value_ hundreds=0;

    default:break;

    key_num=0;
    break;
     }
     
     case 3:
     {
       switch(set_value_bit_select)
    {
      case 0:
    {
    set_value_ single--;
    if(set_value_ single<0)
    set_value_ single=9;
    }
      case 1:
    {
    set_value_ decade--;
    if(set_value_ decade<0)
    set_value_ decade=9;
    }
      case 2:
    {
    set_value_ hundreds--;
    if(set_value_ hundreds<0)
    set_value_ hundreds=9;

    default:break;
    }
     key_num=0;
    break;
     }
     case 4:
     {
    beep_on_off=~beep_on_off;
    key_num=0;
    break;
     }
     default:break;
    }


    set_value=set_value_ hundreds*100+set_value_ decade*10+set_value_ single;
    LcdWriteCom(0x80+sizeof(buff));
    LcdWriteData(set_value/100);        /* 写入百位 */
    LcdWriteData((set_value%100)/10);   /* 写入十位 */
    LcdWriteData(set_value%10);/* 写入个位 */
    if(beep_on_off==1)
    {
    if(adc_value>=set_value)    /* 判断气体浓度是否大于设定值 */
    {
    LED1=1;   /* 点亮报警灯 */
    LED2=1;   /* 点亮报警灯 */   
    beep=1;   /* 打开蜂鸣器 */
    }
    else
    {
    LED1=0;   /* 熄灭报警灯 */
    LED2=0;   /* 熄灭报警灯 */   
    beep=0;   /* 关闭蜂鸣器 */
    }
    }
        else
    {
    LED1=0;   /* 熄灭报警灯 */
    LED2=0;   /* 熄灭报警灯 */   
    beep=0;   /* 关闭蜂鸣器 */

      }
      
    }

    展开全文
  • 安防报警:在单片机开发板上实现智能温度、热释电,烟雾报警系统的设计。要求利用温度传感器DS18b20采集温度信号,并将采集温度用LCD12864B显示出来,当温度超过设置的上限温度时、或热释电感应到有人接近、或烟雾...
  • 帮室友做的一个简单的单片机实验: 使用热敏电阻测温,当温度超过34摄氏度之后就会指定手机拨打报警电话。 硬件要求: STC89C52单片机,SIM900A GSM模块,价格都在60元左右;另外还需要3根杜邦线,一个SIM卡...

    帮室友做的一个简单的单片机实验: 使用热敏电阻测温,当温度超过34摄氏度之后就会向指定手机拨打报警电话。

    硬件要求: STC89C52单片机,SIM900A GSM模块,价格都在60元左右;另外还需要3根杜邦线,一个SIM卡(移动/联通)

    仔细查看用户手册,按照下图连线:


    另外我们使用TTL电平,注意以下问题:



    好了,硬件连接完毕。

    单片机的代码没啥好说的,以前做过一个温度计的实验,可以参考我的博客  http://blog.csdn.net/nk_test/article/details/50375196

    然后再结合上SIM900A就可以了。

    #include <reg52.h>
    
    #define uchar unsigned char
    #define uint unsigned int
    
    
    #define  PCF8591 0x90
    sbit SCL=P2^0;
    sbit SDA=P2^1; 
    sbit spk=P1^4;
    sbit WEI=P2^7;  //wei
    sbit DUAN=P2^6; //duan
    
    unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};// 显示段码值0~9
    unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
    
    
    //以下是你的51单片机的晶振大小
    #define FOSC_110592M
    //#define FOSC_12M
    
    //以下是开机后拨打的手机号,改成自己想要打的号码即可。
    uchar num[] = "ATD15700085721;\r";
    
    void delay(int z)
    {
    	while(z--);
    }
    
    
    void Screen(int i,int n)
    {
    
         P0=0;
         DUAN=1;
    	 DUAN=0;
         
         P0=dofly_WeiMa[i];
         WEI=1;
    	 WEI=0;
        
         P0=dofly_DuanMa[n]; 
         DUAN=1;  
         DUAN=0;
    
    	 delay(250);
    
    }
    void Get_out_print(uchar temperatureNum)
    {
        if(temperatureNum/100>0)
    	{
    	   Screen(3,temperatureNum/100);
    	   temperatureNum%=100;
    	}
    
    	if(temperatureNum/10>0)
    	 {
    	     Screen(4,temperatureNum/10);
            
    	 }
          
    	 Screen(5,temperatureNum%10);
    	 Screen(7,12); //显示c
    
    }
    
    //注意,无论接收到信号还是发送完信号,都会进中断服务程序的
    /*初始化程序(必须使用,否则无法收发),次程序将会使用定时器1*/
    void SerialInti()//初始化程序(必须使用,否则无法收发)
    {
    	TMOD=0x20;//定时器1操作模式2:8位自动重载定时器
    
    #ifdef FOSC_12M		   //在这里根据晶振大小设置不同的数值初始化串口
    	TH1=0xf3;//装入初值,波特率2400
    	TL1=0xf3;	
    #else 	
    	TH1=0xfd;//装入初值,波特率9600
    	TL1=0xfd;
    #endif //end of SOC_12M
    	
    	TR1=1;//打开定时器
    	SM0=0;//设置串行通讯工作模式,(10为一部发送,波特率可变,由定时器1的溢出率控制)
    	SM1=1;//(同上)在此模式下,定时器溢出一次就发送一个位的数据
    	REN=1;//串行接收允许位(要先设置sm0sm1再开串行允许)
    	EA=1;//开总中断
    	ES=1;//开串行口中断	
    }
    
    
    /*串行通讯中断,收发完成将进入该中断*/
    void Serial_interrupt() interrupt 4 
    {
    //	a=SBUF;
    	P2=SBUF;
    	RI=0;//接收中断信号清零,表示将继续接收
    //	flag=1;//进入中断的标志符号
    }
    
    //串行口连续发送char型数组,遇到终止号/0将停止
    void Uart1Sends(uchar *str)
    {
    	while(*str!='\0')
    	{
    		SBUF=*str;
    		while(!TI);//等待发送完成信号(TI=1)出现
    		TI=0;
    		str++;
    	}
    }
    
    //延时函数大概是1s钟,不过延时大的话不准...
    void DelaySec(int sec)
    {
    	uint i , j= 0;
    
    	for(i=0; i<sec; i++)
    	{
    		for(j=0; j<65535; j++)
    		{	
    		}
    	}
    }
    
    void delay()   //延时4-5个微秒
    {;;}
    
    void delay_1ms(uint z)
    {
     uint x,y;
     for(x=z;x>0;x--)
               for(y=110;y>0;y--)
                     ;
    }
    
    void start()
    {
      SDA=1;
        delay();
      SCL=1;
        delay();
      SDA=0;
        delay();
    }
    
    void stop()
    {
      SDA=0;
        delay();
      SCL=1;
        delay();
      SDA=1;
        delay();
    }
    
    
    void respons()
    {
      uchar i;
      SCL=1;
        delay();
      while((SDA==1)&&(i<250))
               i++;
          SCL=0;
        delay();
    }
    
    void init() 
    {
      SDA=1;
        delay();
      SCL=1;
        delay();    
    }
    
    uchar read_byte()  //总线上读取一个字节
    {
        uchar i,k;
        SCL=0;
        delay();
        SDA=1;
        delay();
       for(i=0;i<8;i++)
       {
             SCL=1;
                delay();
              k=(k<<1)|SDA;
                 SCL=0;
                delay();
       }
      return k;
    
    }
    
    void write_byte(uchar date)
    {
         uchar i,temp;
         temp=date;
         for(i=0;i<8;i++)
         {
             temp=temp<<1;
              SCL=0; 
              delay();
              SDA=CY;
              delay();
              SCL=1;
              delay();            
         }   
         SCL=0;
           delay();
         SDA=1;
           delay();
    }
    
    
    
    void write_address(uchar control,uchar date)
    {
            start();
            write_byte(PCF8591);  //发送地址字节,选择器件     
            respons();
            write_byte(control);  //发送控制字节,选择通道
            respons();
            write_byte(date);    //重新发送地址字节,选择器件
            respons();           //接受数据
            stop();
    
    }
    
    uchar read_address(uchar control)
    {
           uchar date;
           start();
           write_byte(PCF8591);
           respons();
           write_byte(control);
           respons();
           start();
           write_byte(PCF8591+1);
           respons();
           date=read_byte();
           stop();
           return date;
    
    }
    uchar temperatureNum=0;
    int flagg=0;
    void main()
    {
    	uchar i = 0;
    	WEI=0;
    	DUAN=0;
    
        TMOD= 0x01;		     
        EA=1;
        ET0=1; 
        TR0=1;              
        init();
    	SerialInti();
       while(1)
       {
       	temperatureNum=read_address(0x41);  //确定路
    	Get_out_print(151-temperatureNum);
    
    	if(flagg) 
        { 
    	
    	while(1)
    	{
    		Uart1Sends(num);
    
    		DelaySec(30);//打通后延时30秒
    		Uart1Sends("ATH\r");   //挂断电话
    
    		DelaySec(3);//延时3秒
    	}
    	}
    	}
    
    
    }
    
    void Timer0_isr(void) interrupt 1 
    {
       TH0=0xfe;
       TL0=0;
       if(temperatureNum<118)
     	flagg=1;
    
    }



    展开全文
  • 本设计将通信技术与防盗系统紧密结合,为一款便敏小巧,低成本,适合普通室内报警的智能报警系统。本系统通过传感器获取室内人员信息,并将信号发送到单片机微处理器。系统收到报警信息后通过辨认密码的方式确定目标...
  • 基于单片机的烟雾监测报警与控制系统 (给手机打电话或发短信报警) 现在有很多场所对烟雾浓度的要求很严格,比如在电梯里烟雾浓度超过一定的阈值就要求报警并采取一系列的控制措施。又比如目前大部分学校,普遍都...

    基于单片机的烟雾监测报警与控制系统

    (给手机打电话或发短信报警)
    现在有很多场所对烟雾浓度的要求很严格,比如在电梯里烟雾浓度超过一定的阈值就要求报警并采取一系列的控制措施。又比如目前大部分学校,普遍都有几千甚至几万的住宿学生,安全防范压力极大,现在学生宿舍普遍六至八人一间,有些学校甚至更多。而且随着经济条件的改善,和生活水平提高,学生们使用各种电器设备数量日益增长。虽然各个学校都出各种规章制度,严禁学生私自搭线或使用大功率电器,但仍然防不胜防。在学生宿舍人员密集的地方,部分人员安全意识淡薄,上述行为可能会导致群死群伤的事情发生,因此电梯、学生宿舍等公共场所进行烟雾监测监控也是一个必然的趋势。
    我本文介绍的是基于单片机技术,利用sim900a(GSM模块),烟雾传感器MQ-2等模块制作一个烟雾监测报警与控制系统,此系统主要分为三个部分

    1、烟雾监测:我选用的烟雾传感器是MQ-2

    MQ-2电路图:
    在这里插入图片描述
    MQ-2实物图: 在这里插入图片描述在这里插入图片描述
    MQ-2烟雾传感器存在两种输出模式AO(模拟量输出),DO(数字量输出);若用DO(数字量输出)则可通过如图的电位器调节来控制输出电压大小从而控制单片机对信号的反馈来影响阈值,若用AO(模拟量输出)可通过单片机的内部程序代码来设置烟雾阈值。

    如需程序代码等资料可联系我。本人QQ:1163845390

    **
    MQ-2烟雾传感器的应用领域很广,可用于家庭和工厂的气体泄漏监测装置,适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此,MQ-2可以准确来说是一个多种气体探测器。MQ-2的探测范围极其的广泛。它的优点:灵敏度高、响应快、稳定性好、寿命长、驱动电路简单。
    MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。MQ-2型传感器对天然气、液化石油气等烟雾有很高的灵敏度,尤其对烷类烟雾更为敏感。也具有良好的抗干扰性,可准确排除有刺激性非可燃性烟雾的干扰信息。
    (经过测试:对烷类的感应度比纸张木材燃烧产生的烟雾要好的多,输出的电压升高的比较快)。
    MQ-2型传感器具有良好的重复性和长期的稳定性。初始稳定,响应时间短,长时间工作性能好。需要注意的是:在使用之前必须加热一段时间,否则其输出的电阻和电压不准确。
    其检测可燃气体与烟雾的范围是100~10000ppm(ppm为体积浓度。 1ppm=1立方厘米/1立方米)
    电路设计电压范围宽,24V以下均可,加热电压5±0.2V
    需要注意:加热电压。如果过高,会导致内部的信号线熔断,从而器件报废。
    *

    2、报警系统:我采用①蜂鸣器报警和②通过sim900a模块(GSM模块)给手机打电话报警

    ①蜂鸣器分为有源蜂鸣器和无源蜂鸣器
    有源蜂鸣器和无源蜂鸣器的差别主要差别为:
    1、有源蜂鸣器和无源蜂鸣器的根本区别是产品对输入信号的要求不一样。
    2、有源蜂鸣器工作的理想信号是直流电,通常标示为VCC、VDD等。因为蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号,从面实出磁场交变,带动钼片振动发音。
    3、但是在某些有源蜂鸣器在特定的交流信号下也可以工作,只是对交流信号的电压和频率要求很高,此种工作方式一般不采用。
    4、而无源蜂鸣器没有内部驱动电路,有些公司和工厂称为讯响器,国标中称为声响器。无源蜂鸣器工作的理想信号方波。如果给预直流信号蜂鸣器是不响应的,因为磁路恒定,钼片不能振动发音。

    我采用的是有源蜂鸣器与PNP三极管结合的电路,通过控制PNP的导通和截止来控制蜂鸣器的开启和关闭
    电路图如下:
    在这里插入图片描述
    PE5引脚输出为高电平时,pnp截止,蜂鸣器两端都为低电平,蜂鸣器关闭;PE5引脚输出为低电平时,pnp导通,蜂鸣器开启;当烟雾传感器检测到烟雾浓度超过阈值时,输出信号给单片机,当单片机收到烟雾浓度过高的信号时,控制PE5引脚的高低电平,来控制蜂鸣器的开启和关闭(实现报警)。

    ②通过sim900a模块(GSM模块)给手机打电话报警
    sim900a实物图:
    在这里插入图片描述sim900a与单片机连接,当烟雾传感器检测到烟雾浓度超过阈值时,输出信号给单片机,当单片机收到烟雾浓度过高的信号时,发送一系列指令给sim900a,来控制sim900a给手机打电话或者发短信(报警)

    如需sim900a的详细资料及指令代码可联系我 ,本人QQ:1163845390

    3、控制系统:我采用的是L298N模块和电机来模拟开关门窗

    L298N是专用驱动集成电路,属于H桥集成电路,与L293D的差别是其输出电流增大,功率增强。其输出电流为2A,最高电流4A,最高工作电压50V,可以驱动感性负载,如大功率直流电机,步进电机,电磁阀等,特别是其输入端可以与单片机直接相联,从而很方便地受单片机控制。当驱动直流电机时,可以直接控制步进电机,并可以实现电机正转与反转,实现此功能只需改变输入端的逻辑电平。
      L298N芯片可以驱动两个二相电机,也可以驱动一个四相电机,输出电压最高可达50V,可以直接通过电源来调节输出电压;可以直接用单片机的IO口提供信号;而且电路简单,使用比较方便。
      L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7V电压。4脚VS接电源电压,VS电压范围VIH为+2.5~46V。输出电流可达2A,可驱动电感性负载。1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机。5,7,10,12脚接输入控制电平,控制电机的正反转。EnA,EnB接控制使能端,控制电机的停转。下图是L298N内部原理图:
    在这里插入图片描述

    总之,三个部分(烟雾检测、报警、模拟控制)与单片机连接,烟雾传感器MQ-2检测到烟雾浓度超过阈值就发送一个信号给单片机,单片机接收到信号后控制蜂鸣器和sim900a报警并控制L298N模拟开窗或开门。本次设计很好的运用了单片机和传感器、GSM模块等结合的知识,提高了一系列公共场所的安全保障。

    实物图(制作的比较简易,但功能都完全具备):
    在这里插入图片描述

    展开全文
  • 基于51单片机的智能检测雨滴报警

    千次阅读 2019-07-22 13:32:49
    下雨关窗报警器 问题咨询及项目源码下载请加群: 群名:IT项目交流群 群号:245022761 一、学习目的 1. 了解霍尔传感器工作原理 2. 了解雨滴传感器工作原理 3. 学会使用霍尔传感器检测门窗是否关好 4. ...
  • 当烟雾报警系统处于正常环境中,系统会主动向手机终端发送实时温度,和当前环境中的可燃气体数值。当烟雾报警系统处于达到可燃气体检测设定值时或当温度达到预设定值时,单片机控制端会自动启动继电器进行断气和...
  • 改革开放后,随着我国生活水平的快速提高,人们对...主要是利用AT89C51单片机的串口PC进行通信控制。达到网络远程接受报警系统。在有人闯入等情况下,AT89C51单片机可以通过PC发送报警信息,达到远程及时报警的功能。
  • 045【毕设课设】基于单片机仓库温湿度监测报警系统仿真设计,温湿度监测报警系统,可以通过按键设定温度和湿度的上下限,超过范围则LED报警。此设计应用场景不仅可以仓库,其它场景只要关于温湿度检测控制的地方都...
  • 2.开机按下“布防”按键,20s(绿灯闪亮20下)后进入布防状态,当有人闯入或者烟雾浓度超标时,LED灯亮(红色)蜂鸣器报警,同时黄灯闪亮一下GSM模块 向手机发送短信提醒注意; 3.按下“撤防”取消报警; 4.有“紧急...
  • 本课题是设计一款无线超声波测量距离的系统,设计内容包括: ...4. 使用ESP8266WIFI模块实现单片机超声波测量数据向手机无线传输,让手机实时显示测量结果。 5. 对超声波测距系统进行软硬件联调,并且做出实物。
  • 2、采用GSM模块实现短信的发送,只要老人跌倒了(且没有按下解除误报警操作按钮),设备将会设定的手机号码发送求救短信“help me!”! 3、板子正常情况下是竖直装在口袋里的(adxl345模块在下角竖直立着),一旦...
  • 51单片机DHT11温湿度检测手机蓝牙APP显示设计

    万次阅读 多人点赞 2019-05-27 20:56:05
    今天给大家介绍的是一个温湿度检测设计,基于...先来看一下整体的架构图:硬件部分由STC89C52单片机、DHT11温湿度传感器、BT08蓝牙串口模块和Android手机组成。传感器将采集到的温湿度数据传送给单片机,然后单片机...
  • 本设计由STC89C52单片机电路+ADXL345加速度传感器电路+按键电路+蜂鸣器报警电路+DS18B20温度传感器电路+LED灯电路+GSM模块电路+电源电路组成。 1、板子竖直放置的时候,蜂鸣器不报警,板子歪倒一定角度,则蜂鸣器...
  • 本系统主要由ARM微处理器、MQ-2烟雾传感器、TC35GSM通信模块、电机和蜂鸣器组成,把ARM微处理器作为智能烟雾报警器设计的控制核心,MQ-2烟雾传感器作为数据采集模块,再结合电机、蜂鸣器和TC35通信模块实现了声光...
  • #include <REGX52.H> sbit keyu=P3^1;//加按键 sbit keyl=P3^0;//减按键 sbit keyh=P3^2;//调节尺度 sbit keym=P3^3; //转换模式 sbit RS=P2^6;//数据/命令选择端(H/L) sbit RW=P2^5;... /
  • 036【毕设课设】基于单片机温湿度PM2.5报警设置系统,实时检测温湿度传感器的值,通过LCD液晶作为显示,可以设置温湿度上下限范围,通过LED显示温度和湿度过高过低等状态,同时也可以显示PM2.5当前状态。 下载链接...
  • 基于51单片机, 太阳能板和220v电源都能给蓄电池供电; 手机充电时,若光照不够,太阳能板充电可自动切换成蓄电池; 整个工作过程有液晶屏显示输入电压、时长等信息。
  • 基于P89LPC932单片机与gpsOne的车辆移动定位报警系统 摘要:介绍了一种以P89LPC932单片机为控制核心、结合CDMA业务和gpsOne而开发的车辆移动定位报警系统,结合GIS技术,与控制中心配合,可实现对车辆的报警,定位,和...
1 2 3 4 5 ... 20
收藏数 722
精华内容 288
关键字:

单片机如何向手机报警