久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3649|回復: 0
收起左側

SIM900A簡易報警器程序(51單片機遠程控制LED)

[復制鏈接]
ID:501195 發表于 2019-4-1 10:46 | 顯示全部樓層 |閱讀模式
哈哈 51單片機的有點老  想要STM32的聯系我  遠程控制LED

1.上電后,進入等待接收短信模式,如果接收到的數據中包含 ledon 字符串就會點亮LED7,熄滅LE6
  如果不包含 ledon 字符串,就點亮LED6,熄滅LED7。

2.按鍵和LED對應的端口,請參考程序。

成品圖

成品圖

單片機源程序如下:
  1. /**************************************************************

  2. 51 單片機例程      

  3. 本例程使用11.0592MHZ時鐘---->必須為11.0592M

  4. 串口設置為:9600,8,n,1.


  5. ******************************************/
  6. #include <reg52.h>
  7. #include "string.h"
  8. #include "GA6_module_errors.h"


  9. typedef         unsigned char        u8;
  10. typedef         unsigned int        u16;
  11. typedef         unsigned long        u32;


  12. /*************        本地常量聲明        **************/

  13. #define Buf_Max                    70         //串口1緩存長度
  14. #define STABLE_TIMES          10        //等待上電后穩定

  15. /*************        本地變量聲明        **************/

  16. //串口1發送回車換行
  17. #define UART1_SendLR() UART1_SendData(0X0D);UART1_SendData(0X0A)

  18. /*LED端口定義*/

  19. sbit LED0 = P1^0;
  20. sbit LED1 = P1^1;
  21. sbit LED2 = P1^2;
  22. sbit LED3 = P1^3;
  23. sbit LED4 = P1^4;
  24. sbit LED5 = P1^5;
  25. sbit LED6 = P1^6;
  26. sbit LED7 = P1^7;

  27. /*KEY端口定義*/

  28. sbit KEY0 = P2^0;
  29. sbit KEY1 = P2^1;
  30. sbit KEY2 = P2^2;
  31. sbit KEY3 = P2^3;

  32. /*************  本地變量聲明        **************/
  33. xdata u8 Uart1_Buf[Buf_Max];
  34. u8 First_Int = 0;

  35. u16 count_20ms;
  36. u8  receive_mode     = 0;
  37. u8  find_string_flag = 0;
  38. idata char num_message[4];//暫時假設最多只能存999條短信
  39. idata char AT_CMGR[15];

  40. /*************        本地函數聲明        **************/
  41. void delay_ms(u16 ms);   //延時ms個20ms  ms*20ms
  42. void CLR_Buf(void);      //清串口接收緩存
  43. u8          Find(u8 *a);        //查找字符串
  44. void UART1_SendData(u8 dat);   //串口1發送 1字節
  45. void UART1_SendString(char *s);//串口1發送 字符串
  46. void UART1_Send_Command(char *s); //發送命令
  47. u8 UART1_Send_AT_Command(u8 *b,u8 *a,u8 wait_time,u16 interval_time);//發送AT指令集

  48. u8 Wait_CREG(u8 query_times);

  49. void Timer0Init(void)                //20毫秒@115200
  50. {
  51.         TMOD &= 0xF0;               
  52.         TMOD |= 0x01;                //
  53.         TL0 = (65536-20000)%256;                //
  54.         TH0 = (65536-20000)/256;                //
  55.         TF0 = 0;                //
  56.         ET0 = 1;              //
  57.         TR0 = 1;                //開始計時
  58. }

  59. void Uart1Init(void)                //9600bps@11.05926MHz
  60. {
  61.         PCON &= 0x7F;                //
  62.         SCON = 0x50;                //
  63.         TMOD &= 0x0F;                //
  64.         TMOD |= 0x20;                //
  65.         TL1 = 0xFD;                  //
  66.         TH1 = 0xFD;                  //
  67.         ET1 = 0;                  //
  68.         TR1 = 1;                    //
  69.         ES  = 1;                                        //
  70. }

  71. int check_status(void)//檢查狀態
  72. {
  73.         int ret;
  74.         
  75.         ret = UART1_Send_AT_Command("AT","OK",3,50);//測試通信是否成功
  76.         if(ret == 0)
  77.         {
  78.                 return COMMUNITE_ERROR;
  79.         }
  80.         
  81.         ret = UART1_Send_AT_Command("AT+CPIN?","READY",2,50);//查詢卡是否插上
  82.         if(ret == 0)
  83.         {
  84.                 return NO_SIM_CARD_ERROR;
  85.         }
  86.         
  87.         ret = Wait_CREG(3);//查詢卡是否注冊到網絡
  88.         if(ret == 0)
  89.         {
  90.                 return SIM_CARD_NO_REG_ERROR;
  91.         }
  92.         return 1;
  93. }

  94. /***************************************************************
  95. 注:當然你可以返回其他值,來確定到底是哪一步發送指令出現失敗了。
  96. ****************************************************************/
  97. int config_format(void)//配置格式
  98. {
  99.         u8 ret;
  100.         
  101.         //設置存儲位置
  102.         ret = UART1_Send_AT_Command("AT+CPMS=\"SM\",\"ME\",\"SM\"","OK",3,100);
  103.         if(ret == 0)
  104.         {
  105.                 return AT_CPMS_ERROR;
  106.         }
  107.         
  108.         ret = UART1_Send_AT_Command("AT+CMGF=1","OK",3,50);//配置為TEXT模式
  109.         if(ret == 0)
  110.         {
  111.                 return AT_CMGF_ERROR;
  112.         }
  113.         
  114.         ret = UART1_Send_AT_Command("AT+CSCS=\"GSM\"","OK",3,50);//設置字符格式
  115.         if(ret == 0)
  116.         {
  117.                 return AT_CSCS_ERROR;
  118.         }
  119.         return 1;
  120. }

  121. int read_message(void)//讀取消息
  122. {
  123.         char *buffer_ptr;
  124.         u8 i,len;
  125.         u8 ret;
  126.         
  127.         memset(num_message,'\0',4);
  128.         memset(AT_CMGR,'\0',15);
  129.         buffer_ptr = strstr(Uart1_Buf,"\"SM\",");
  130.         
  131.         len = strlen("\"SM\",");

  132.         i = len;
  133.         if(buffer_ptr != NULL)
  134.         {
  135.                 while(*(buffer_ptr + i) != 0x0D && i < (len+3))
  136.                 {
  137.                         num_message[i-len] = *(buffer_ptr + i);
  138.                         i++;
  139.                 }
  140.         }
  141.         else
  142.         {
  143.                 return NO_SMS_LEN_ERROR;
  144.         }
  145.         
  146.         memset(AT_CMGR,'\0',15);
  147.         strcpy(AT_CMGR,"AT+CMGR=");
  148.         strcat(AT_CMGR,num_message);
  149.         
  150.         ret = UART1_Send_AT_Command(AT_CMGR,"OK",3,50);

  151.         return ret;
  152. }
  153. /**********************************************/
  154. /*設計思路:
  155. (0)進行串口、定時器初始化工作。
  156. (1)開機等待22秒,等待模塊準備好。
  157. (2)發送相應的指令。
  158. ************************************************/
  159. void main(void)
  160. {
  161.         u8 i;
  162.         int ret;
  163.         
  164.         Uart1Init(); //串口初始化
  165.         Timer0Init();//TIM0初始化
  166.         EA = 1;      //開啟總中斷
  167.         
  168.         for(i = 0;i < STABLE_TIMES;i++)//等待網絡穩定
  169.         {
  170.                 delay_ms(50);
  171.         }
  172.         
  173.         ret = check_status();
  174.         if(ret == 1)
  175.         {
  176.                 ret = config_format();//配置
  177.                 if(ret == 1)
  178.                 {
  179.                         LED0 = 0;
  180.                 }
  181.                 else
  182.                 {
  183.                         LED0 = 1;
  184.                 }
  185.         }
  186.         
  187.         CLR_Buf();
  188.         receive_mode = 1;
  189.         while (1)                    
  190.         {
  191.                 delay_ms(50);
  192.                 LED1 = ~LED1;
  193.                 if(find_string_flag == 1)
  194.                 {
  195.                         delay_ms(5);//延時一點,讓串口把數據接收完成
  196.                         if(Find("+CMTI"))//說明接收到了短信
  197.                         {
  198.                                 ret = read_message(); //讀取信息
  199.                                 if(ret == 1)
  200.                                 {
  201.                                         if(Find("key1on"))
  202.                                         {
  203.                                                 KEY3=1;                                                                                                                                                                                                                                                                                                               
  204.                                                                                                                                                                                                                                                                
  205.                                                 CLR_Buf();//清除緩存
  206.                                                 find_string_flag = 0;
  207.                                         }
  208.                                        

  209.                                         if(Find("key1off"))
  210.                                         {
  211.                                        
  212.                                             KEY3=0;
  213.                                                 
  214.                                                 CLR_Buf();//清除緩存
  215.                                                 find_string_flag = 0;
  216.                                        
  217.                                         }

  218.                                 }
  219.                         }                        
  220.                 }        
  221.         }
  222. }

  223. /*******************************************************************************
  224. * 函數名 : Timer0_ISR
  225. * 描述   : 定時器0中斷服務入口函數,1ms中斷一次
  226. * 輸入   :
  227. * 輸出   :
  228. * 返回   :
  229. * 注意   :
  230. *******************************************************************************/
  231. void Timer0_ISR() interrupt 1
  232. {
  233.         TR0=0;//關定時器
  234.         TL0 = (65536-20000)%256;                //重設定時器初值
  235.         TH0 = (65536-20000)/256;                //
  236.         
  237.         if(count_20ms > 0) //20ms延時計數器
  238.         {
  239.                 count_20ms--;
  240.         }        
  241.         
  242.         TR0=1;//開定時器
  243. }


  244. /********************* UART1中斷函數************************/
  245. void UART1_ISR (void) interrupt 4
  246. {
  247.         if (RI)
  248.         {
  249.                 RI = 0;                           //清除RI位
  250.                 Uart1_Buf[First_Int] = SBUF;            //將接收到的字符串存到緩存中
  251.                 First_Int++;                          //緩存指針向后移動
  252.                 if(First_Int > Buf_Max)                 //如果緩存滿,將緩存指針指向緩存的首地址
  253.                 {
  254.                         First_Int = 0;
  255.                 }
  256.                
  257.                 if(receive_mode == 1)
  258.                 {
  259.                         if(First_Int > 6)
  260.                         {
  261.                                 find_string_flag = 1;
  262.                         }
  263.         
  264.                 }
  265.         }
  266.         if (TI)
  267.         {
  268.                 TI = 0;                          //清除TI位
  269.         }
  270. }


  271. /*******************************************************************************
  272. * 函數名 : CLR_Buf
  273. * 描述   : 清除串口2緩存數據
  274. * 輸入   :
  275. * 輸出   :
  276. * 返回   :
  277. * 注意   :
  278. *******************************************************************************/
  279. void CLR_Buf(void)
  280. {
  281.         u8 k;
  282.         for(k=0;k<Buf_Max;k++)      //將緩存內容清零
  283.         {
  284.                 Uart1_Buf[k] = 0x00;
  285.         }
  286.     First_Int = 0;              //接收字符串的起始存儲位置
  287. }


  288. /*******************************************************************************
  289. * 函數名 : Find
  290. * 描述   : 判斷緩存中是否含有指定的字符串
  291. * 輸入   :
  292. * 輸出   :
  293. * 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
  294. * 注意   :
  295. *******************************************************************************/

  296. u8 Find(u8 *a)
  297. {
  298.         ES = 0;  //改進程序
  299.         if(strstr(Uart1_Buf,a)!=NULL)
  300.         {
  301.                 ES = 1;
  302.                 return 1;
  303.         }        
  304.         else
  305.         {
  306.                 ES = 1;
  307.                 return 0;
  308.         }
  309.                
  310. }



  311. /*******************************************************************************
  312. * 函數名 : Wait_CREG
  313. * 描述   : 等待模塊注冊成功
  314. * 輸入   :
  315. * 輸出   :
  316. * 返回   :
  317. * 注意   :
  318. *******************************************************************************/
  319. u8 Wait_CREG(u8 query_times)
  320. {
  321.         u8 i;
  322.         u8 k;
  323.         u8 j;
  324.         i = 0;
  325.         CLR_Buf();
  326.         while(i == 0)                                
  327.         {

  328.                 UART1_Send_Command("AT+CREG?");
  329.                 delay_ms(100);
  330.                
  331.                 for(k=0;k<Buf_Max;k++)                              
  332.                 {
  333.                         if((Uart1_Buf[k] == '+')&&(Uart1_Buf[k+1] == 'C')&&(Uart1_Buf[k+2] == 'R')&&(Uart1_Buf[k+3] == 'E')&&(Uart1_Buf[k+4] == 'G')&&(Uart1_Buf[k+5] == ':'))
  334.                         {
  335.                                          
  336.                                 if((Uart1_Buf[k+7] == '1')&&((Uart1_Buf[k+9] == '1')||(Uart1_Buf[k+9] == '5')))
  337.                                 {
  338.                                         i = 1;
  339.                                         return 1;
  340.                                 }
  341.                                 
  342.                         }
  343.                 }
  344.                 j++;
  345.                 if(j > query_times)
  346.                 {
  347.                         return 0;
  348.                 }
  349.                
  350.         }
  351.         return 0;
  352. }




  353. /*----------------------------
  354. UART1 發送串口數據
  355. -----------------------------*/
  356. void UART1_SendData(u8 dat)
  357. {
  358.         ES=0;                        //關串口中斷
  359.         SBUF=dat;                        
  360.         while(TI!=1);        //等待發送成功
  361.         TI=0;                        //清除發送中斷標志
  362.         ES=1;                        //開串口中斷
  363. }
  364. ……………………

  365. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
5.短信控制led.zip (75.6 KB, 下載次數: 76)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 毛片入口 | 国产日韩欧美一区二区 | 欧美视频在线播放 | 亚洲日本乱码在线观看 | 一区二区三区四区在线 | 国产精品久久久久一区二区 | 国产综合久久久久久鬼色 | 日韩欧美在线观看视频 | 欧美午夜激情在线 | 亚洲手机在线 | 激情av在线 | 国产精品99久久久久久人 | 放个毛片看看 | 日本黄色大片免费 | 国产精品亚洲精品日韩已方 | av色站| 久久99这里只有精品 | 91精品国产综合久久香蕉922 | 中文久久 | 黄免费观看视频 | 日本一区二区三区四区 | 中文字幕免费在线观看 | 蜜桃特黄a∨片免费观看 | 91欧美激情一区二区三区成人 | 欧美日韩国产在线 | 亚洲国产一区二区视频 | 欧美精品福利视频 | 国产精品九九 | 91中文在线观看 | 欧美黄色免费网站 | 成人在线观看免费视频 | 成人在线亚洲 | 亚洲色在线视频 | 亚洲视频欧美视频 | 欧美一区二区久久 | 先锋影音资源网站 | 亚洲视频免费 | 亚洲欧美成人 | 欧美三级电影在线播放 | 青青草亚洲 | 久久精品|