51单片机短信远程报警器程序设计 源码 pcb 原理图 proteus仿真

[复制链接]
查看1 | 回复0 | 2021-6-20 04:10:15 | 显示全部楼层 |阅读模式
使用了GSM短信收发模块,用户只需要在代码中更改报警对象手机号码,报警器超过一定阈值可发送短信至手机,播报相关参数,并且本地蜂鸣器报警。短信模块收发指令回复判断改成延时判断,可适当更改延时值。上电等待初始化也为延时,可更改为接收到回复指令后初始化完成(噪声,烟雾等模拟量或者数字量传感器模块可通用)
代码、PCB、原理图、BOM表、proteus仿真文件已上传,请到本文尾部下载附件。
制作出来的实物图如下:
1.png

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
烟雾传感器仿真中没有,其实就是传感器检测时相应的电阻值会变化,用滑动电位器代替就ok
2.png

Altium Designer画的原理图和PCB图如下:(附件中可下载工程文件)
5.png 4.png 3.png
原理图.png

部分单片机源码 完整源码在本文尾部附件里
  1. #include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. #include "intrins.h"                                                                                          
  3. #include "uart.h"
  4. #define     u8                          unsigned char
  5. #define     u16                   unsigned int
  6. #define     uchar                          unsigned char
  7. #define     uint                   unsigned int


  8. //常量
  9. #define Success 1U
  10. #define Failure 0U

  11. //定义变量
  12. unsigned long  Time_Cont = 0;       //定时器计数器

  13. char phoneNumber[] = "158888";                //替换成jls的电话号码
  14. //char phoneNumber[] = "158888";                //替换成lyg的电话号码
  15. //char phoneNumber[] = "1738888";                //替换成wc的电话号码
  16. char msg[] = "HELP!t:  .  n:    ";                //短信内容        
  17. //char text_send[] = "AT+CMGS="17347070063"\r\n";                //替换成需要被拨打电话的号码
  18. //函数或者变量声明
  19. extern void delay_ms(unsigned int n);
  20. extern unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry);
  21. extern void errorLog();
  22. extern void soft_reset(void);
  23. extern void phone(char *number);
  24. extern void sendMessage(char *number,char *msg);
  25. void sendCommand_AT(char *Command,unsigned char times);

  26. uchar yushe_wendu=50;                                //温度预设值
  27. uchar yushe_yanwu=140;                                //烟雾预设值
  28. uint wendu;                                                                 //温度值全局变量
  29. uchar yanwu;                                                                 //用于读取ADC数据
  30. u16 xianshiyanwu_flag=0;
  31. //运行模式  
  32. uchar Mode=0;                                                                 //=1是设置温度阀值  =2是设置烟雾阀值        =0是正常监控模式
  33. //管脚声明
  34. sbit Led_Reg                 =P2^2;                                 //红灯
  35. sbit Led_Yellow  =P2^4;                                 //黄灯
  36. sbit Buzzer             =P2^0;                                 //蜂鸣器
  37. sbit Fan                      =P3^3;                                 //


  38. /********************************************************************
  39. * 名称 : delay_1ms()
  40. * 功能 : 延时1ms函数
  41. * 输入 : q
  42. * 输出 : 无
  43. ***********************************************************************/
  44. void delay_ms(uint q)
  45. {
  46.         uint i,j;
  47.         for(i=0;i<q;i++)
  48.                 for(j=0;j<110;j++);
  49. }
  50. /***********************************************************************************************************
  51. LCD1602相关函数
  52. ***********************************************************************************************************/

  53. //LCD管脚声明 (RW引脚实物直接接地,因为本设计只用到液晶的写操作,RW引脚一直是低电平)
  54. sbit LCDRS = P2^7;
  55. sbit LCDEN = P2^6;
  56. sbit D0                 = P0^0;
  57. sbit D1                 = P0^1;
  58. sbit D2                 = P0^2;
  59. sbit D3                 = P0^3;
  60. sbit D4                 = P0^4;
  61. sbit D5                 = P0^5;
  62. sbit D6                 = P0^6;
  63. sbit D7                 = P0^7;



  64. //LCD延时
  65. void LCDdelay(uint z)                  //该延时大约100us(不精确,液晶操作的延时不要求很精确)
  66. {
  67.   uint x,y;
  68.   for(x=z;x>0;x--)
  69.     for(y=10;y>0;y--);
  70. }
  71. void LCD_WriteData(u8 dat)         
  72. {
  73.         if(dat&0x01)D0=1;else D0=0;
  74.         if(dat&0x02)D1=1;else D1=0;
  75.         if(dat&0x04)D2=1;else D2=0;
  76.         if(dat&0x08)D3=1;else D3=0;
  77.         if(dat&0x10)D4=1;else D4=0;
  78.         if(dat&0x20)D5=1;else D5=0;
  79.         if(dat&0x40)D6=1;else D6=0;
  80.         if(dat&0x80)D7=1;else D7=0;
  81. }
  82. //写命令
  83. void write_com(uchar com)
  84. {
  85.   LCDRS=0;                                 
  86.         LCD_WriteData(com);
  87. //  DAT=com;
  88.   LCDdelay(5);
  89.   LCDEN=1;
  90.   LCDdelay(5);
  91.   LCDEN=0;
  92. }
  93. //写数据
  94. void write_data(uchar date)
  95. {
  96.   LCDRS=1;
  97.         LCD_WriteData(date);
  98. //  DAT=date;
  99.   LCDdelay(5);
  100.   LCDEN=1;
  101.   LCDdelay(5);
  102.   LCDEN=0;
  103. }

  104. /*------------------------------------------------
  105.               选择写入位置
  106. ------------------------------------------------*/
  107. void SelectPosition(unsigned char x,unsigned char y)
  108. {     
  109.         if (x == 0)
  110.         {     
  111.                 write_com(0x80 + y);     //表示第一行
  112.         }
  113.         else
  114.         {      
  115.                 write_com(0xC0 + y);      //表示第二行
  116.         }        
  117. }
  118. /*------------------------------------------------
  119.               写入字符串函数
  120. ------------------------------------------------*/
  121. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  122. {     
  123.         SelectPosition(x,y) ;
  124.         while (*s)
  125.         {     
  126.                 write_data( *s);     
  127.                 s ++;     
  128.         }
  129. }
  130. //========================================================================
  131. // 函数: void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
  132. // 应用: LCD_Write_Char(0,1,366,4) ;
  133. // 描述: 在第0行第一个字节位置显示366的后4位,显示结果为 0366
  134. // 参数: x:行,y:列,s:要显示的字,l:显示的位数
  135. // 返回: none.
  136. // 版本: VER1.0
  137. // 日期: 2013-4-1
  138. // 备注: 最大显示65535
  139. //========================================================================
  140. void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
  141. {     
  142.         SelectPosition(x,y) ;

  143.         if(l>=5)
  144.                 write_data(0x30+s/10000%10);        //万位
  145.         if(l>=4)
  146.                 write_data(0x30+s/1000%10);                //千位
  147.         if(l>=3)
  148.                 write_data(0x30+s/100%10);                //百位
  149.         if(l>=2)
  150.                 write_data(0x30+s/10%10);                        //十位
  151.         if(l>=1)
  152.                 write_data(0x30+s%10);                //个位

  153. }
  154. /*1602指令简介
  155.   write_com(0x38);//屏幕初始化
  156.   write_com(0x0c);//打开显示 无光标 无光标闪烁
  157.   write_com(0x0d);//打开显示 阴影闪烁
  158.   write_com(0x0d);//打开显示 阴影闪烁
  159. */
  160. //1602初始化
  161. void Init1602()
  162. {
  163.   uchar i=0;
  164.   write_com(0x38);//屏幕初始化
  165.   write_com(0x0c);//打开显示 无光标 无光标闪烁
  166.   write_com(0x06);//当读或写一个字符是指针后一一位
  167.   write_com(0x01);//清屏
  168.         
  169. }

  170. void Display_1602(yushe_wendu,yushe_yanwu,c,temp)
  171. {
  172.         //显示预设温度
  173.         LCD_Write_Char(0,6,yushe_wendu,2) ;
  174.         
  175.         //显示预设烟雾
  176.         LCD_Write_Char(0,13,yushe_yanwu,3) ;
  177.         
  178.         //时时温度
  179.         LCD_Write_Char(1,6,c/10,2) ;
  180.         write_data('.');
  181.         LCD_Write_Char(1,9,c%10,1) ;
  182.         
  183.         //实时烟雾
  184.         LCD_Write_Char(1,13,temp,3) ;
  185. }
复制代码
1 单片机c程序源码.zip (147.8 KB, 售价: 3 工控币)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则