国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

51單片機短信遠程報警器程序設計 源碼 pcb 原理圖 proteus仿真

[復制鏈接]
樓主
eng 發表于 2021-6-20 04:10:15 | 只看該作者 |只看大圖 |倒序瀏覽 |閱讀模式
使用了GSM短信收發模塊,用戶只需要在代碼中更改報警對象手機號碼,報警器超過一定閾值可發送短信至手機,播報相關參數,并且本地蜂鳴器報警。短信模塊收發指令回復判斷改成延時判斷,可適當更改延時值。上電等待初始化也為延時,可更改為接收到回復指令后初始化完成(噪聲,煙霧等模擬量或者數字量傳感器模塊可通用)
代碼、PCB、原理圖、BOM表、proteus仿真文件已上傳,請到本文尾部下載附件。
制作出來的實物圖如下:
51單片機短信遠程報警器程序設計 源碼 pcb 原理圖 proteus仿真 1.png

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
煙霧傳感器仿真中沒有,其實就是傳感器檢測時相應的電阻值會變化,用滑動電位器代替就ok
51單片機短信遠程報警器程序設計 源碼 pcb 原理圖 proteus仿真 2.png

Altium Designer畫的原理圖和PCB圖如下:(附件中可下載工程文件)
51單片機短信遠程報警器程序設計 源碼 pcb 原理圖 proteus仿真 5.png 51單片機短信遠程報警器程序設計 源碼 pcb 原理圖 proteus仿真 4.png 51單片機短信遠程報警器程序設計 源碼 pcb 原理圖 proteus仿真 3.png
51單片機短信遠程報警器程序設計 源碼 pcb 原理圖 proteus仿真 原理圖.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 E幣)
2 原理圖 PCB文件 BOM表.zip (5.3 MB, 售價: 3 E幣)
3 設計流程圖.zip (346.88 KB)
4 protus仿真文件.zip (125.29 KB, 售價: 3 E幣)

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

手機版|小黑屋|ELEOK |網站地圖

GMT+8, 2026-5-26 02:08

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表