使用了GSM短信收发模块,用户只需要在代码中更改报警对象手机号码,报警器超过一定阈值可发送短信至手机,播报相关参数,并且本地蜂鸣器报警。短信模块收发指令回复判断改成延时判断,可适当更改延时值。上电等待初始化也为延时,可更改为接收到回复指令后初始化完成(噪声,烟雾等模拟量或者数字量传感器模块可通用) 
代码、PCB、原理图、BOM表、proteus仿真文件已上传,请到本文尾部下载附件。 
制作出来的实物图如下: 
 
 
 
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载) 
烟雾传感器仿真中没有,其实就是传感器检测时相应的电阻值会变化,用滑动电位器代替就ok 
 
 
 
Altium Designer画的原理图和PCB图如下:(附件中可下载工程文件) 
 
 
 
 
 
 
 
部分单片机源码 完整源码在本文尾部附件里 
- #include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
 
 - #include "intrins.h"                                                                                          
 
 - #include "uart.h"
 
 - #define     u8                          unsigned char
 
 - #define     u16                   unsigned int
 
 - #define     uchar                          unsigned char
 
 - #define     uint                   unsigned int
 
  
 
- //常量
 
 - #define Success 1U
 
 - #define Failure 0U
 
  
- //定义变量
 
 - unsigned long  Time_Cont = 0;       //定时器计数器
 
  
- char phoneNumber[] = "158888";                //替换成jls的电话号码
 
 - //char phoneNumber[] = "158888";                //替换成lyg的电话号码
 
 - //char phoneNumber[] = "1738888";                //替换成wc的电话号码
 
 - char msg[] = "HELP!t:  .  n:    ";                //短信内容        
 
 - //char text_send[] = "AT+CMGS="17347070063"\r\n";                //替换成需要被拨打电话的号码
 
 - //函数或者变量声明
 
 - extern void delay_ms(unsigned int n);
 
 - extern unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry);
 
 - extern void errorLog();
 
 - extern void soft_reset(void);
 
 - extern void phone(char *number);
 
 - extern void sendMessage(char *number,char *msg);
 
 - void sendCommand_AT(char *Command,unsigned char times);
 
  
- uchar yushe_wendu=50;                                //温度预设值
 
 - uchar yushe_yanwu=140;                                //烟雾预设值
 
 - uint wendu;                                                                 //温度值全局变量
 
 - uchar yanwu;                                                                 //用于读取ADC数据
 
 - u16 xianshiyanwu_flag=0;
 
 - //运行模式  
 
 - 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<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指令简介
 
 -   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) ;
 
 - }
 
  复制代码 
 
1 单片机c程序源码.zip
(147.8 KB, 售价: 3 E币)
 
 
2 原理图 PCB文件 BOM表.zip
(5.3 MB, 售价: 3 E币)
 
 
3 设计流程图.zip
(346.88 KB)
 
 
4 protus仿真文件.zip
(125.29 KB, 售价: 3 E币)
 
 
    【必读】版权免责声明
    
        1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
     
 
 |   
 
 
 
 |