找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3156|回复: 0
打印 上一主题 下一主题
收起左侧

SIM900A简易报警器程序(51单片机远程控制LED)

[复制链接]
跳转到指定楼层
楼主
哈哈 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, 下载次数: 75)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表