找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6560|回复: 14
收起左侧

GPRSA6-51单片机代码(拨号,短信控制led灯等试验程序)

  [复制链接]
ID:142988 发表于 2017-4-2 14:35 | 显示全部楼层 |阅读模式
GPRSA6-51代码(内有例程)
0.png
包含以下4个源码:
1.拨号实验
2.发送TEXT短信实验
3.发送PDU中文短信
4.短信控制led灯

完整源码下载:
GPRSA6-51代码.zip (385.87 KB, 下载次数: 112)






短信控制led灯的单片机源码(部分预览):
  1. /**************************************************************
  2.          果云科技  GPRS A6  模块      
  3.                                  
  4.           51 单片机例程       适用于 STC15F 系列
  5.                
  6.                 实验内容 :  短信控制LED 灯


  7. UART1 映射到 P36 P37口      用手机分别发送   ledaon 、 ledaoff  、 ledbon 、ledboff   四条短信 分别来控制两个LED亮灭   一定要区分大小写
  8.                
  9. PS: A6模块上电注册是要一定的时间的!


  10. 串口1全双工中断方式收发通讯程序。本例程使用11.0592MHZ时钟,如要改变,请修改下面的"定义主时钟"的值并重新编译。

  11. 串口设置为:115200,8,n,1.

  12. 通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.

  13. ******************************************/



  14. /*************        本地常量声明        **************/
  15. #define MAIN_Fosc                11059200L        //定义主时钟
  16. #define        BaudRate1                115200UL        //选择波特率


  17. #define        Timer1_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 1 重装值, 对应300KHZ
  18. #define        Timer2_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 2 重装值, 对应300KHZ

  19. #include "STC15Fxxxx.H"
  20. #include "delay.h"
  21. #include "string.h"
  22. #include "Exti.h"

  23. /*************        本地变量声明        **************/

  24. #define Automatic_Startup 1     //定义自启动 V1.2版本起有自启动功能
  25. #define Buf1_Max 60                                           //串口1缓存长度
  26. #define Buf2_Max 60                                           //串口2缓存长度
  27. //串口1发送回车换行
  28. #define UART1_SendLR() UART1_SendData(0X0D);\
  29.                                                                                          UART1_SendData(0X0A)


  30. /*************        本地常量声明        **************/
  31. //sbit RUNING_LED = P1^2;                                        //运行指示灯
  32. sbit LEDA                          = P1^3;                                        //测试用LED
  33. sbit LEDB       = P1^0;
  34. sbit LEDC       = P1^5;


  35. /*************  本地变量声明        **************/
  36. xdata u8 Uart1_Buf[Buf1_Max];
  37. u8 Register_Flag=0;  //A6  注册标志位  1 :注册成功  3:注册失败   5:注册成功,但处于漫游状态下,无法拨打电话发短信
  38. u8 Times=0,First_Int = 0,shijian=0;


  39. bdata u8 Flag;//定时器标志位
  40. sbit Timer0_start =Flag^0;        //定时器0延时启动计数器


  41. /*************        本地函数声明        **************/
  42. void USART1_Init(void);   //串口1初始化
  43. void Timer0Init(void);                //20毫秒@11.0592MHz
  44. void CLR_Buf1(void);      //清串口接收缓存
  45. u8 Find(u8 *a);           //查找字符串
  46. void Second_AT_Command(u8 *b,u8 *a,u8 wait_time) ;//a6 at命令发送
  47. void Set_TEXT_Mode(void);
  48. void Check_New_Message(void);
  49. void UART1_SendData(u8 dat);//串口1发送 1字节
  50. void UART1_SendString(char *s);//串口1发送 字符串
  51. void Wait_CREG(void);


  52. /**********************************************/
  53. void main(void)
  54. {
  55.   USART1_Init();//串口初始化
  56.         Timer0Init();//TIM0初始化
  57.         Wait_CREG();//等待GSM注册成功
  58.         Set_TEXT_Mode();//设置为TEXT模式
  59.   
  60.         while (1)
  61.         {
  62.     Check_New_Message();//短信检测
  63.                  
  64.         }
  65. }

  66. /********************* UART1中断函数************************/
  67. void UART1_int (void) interrupt UART1_VECTOR
  68. {
  69.         if (RI)
  70.     {
  71.       RI = 0;                           //清除RI位
  72.                         Uart1_Buf[First_Int] = SBUF;            //将接收到的字符串存到缓存中
  73.                         First_Int++;                                        //缓存指针向后移动
  74.                         if(First_Int > Buf1_Max)                       //如果缓存满,将缓存指针指向缓存的首地址
  75.                         {
  76.                                 First_Int = 0;
  77.                         }
  78.     }
  79.     if (TI)
  80.     {
  81.         TI = 0;                          //清除TI位
  82.     }
  83. }

  84. void USART1_Init(void)
  85. {
  86.         S1_8bit();                                //8位数据
  87.         //S1_USE_P30P31();                //UART1 使用P30 P31口        默认
  88.         S1_USE_P36P37();                //UART1 使用P36 P37口
  89.         //S1_USE_P16P17();                //UART1 使用P16 P17口
  90.         AUXR &= ~(1<<4);        //Timer stop                波特率使用Timer2产生
  91.         AUXR |= 0x01;                //S1 BRT Use Timer2;
  92.         AUXR |=  (1<<2);        //Timer2 set as 1T mode
  93.         TH2 = (u8)(Timer2_Reload >> 8);
  94.         TL2 = (u8)Timer2_Reload;
  95.         AUXR |=  (1<<4);        //Timer run enable

  96.         REN = 1;        //允许接收
  97.         ES  = 1;        //允许中断

  98.         EA = 1;                //允许全局中断
  99.        

  100. }


  101. /*******************************************************************************
  102. * 函数名 : Timer0Init
  103. * 描述   : 定时器0初始化,20ms定时
  104. * 输入   :
  105. * 输出   :
  106. * 返回   :
  107. * 注意   :
  108. *******************************************************************************/
  109. void Timer0Init(void)                //20毫秒@11.0592MHz
  110. {
  111.         AUXR &= 0x7F;                //定时器时钟12T模式
  112.         TMOD &= 0xF0;                //
  113.         TMOD |= 0x01;                //设置定时器模式,16位定时器
  114.         TL0 = 0x70;                  //设置定时器初值
  115.         TH0 = 0xFC;                  //设置定时器初值
  116.         TF0 = 0;                    //清TF0标志
  117.         TR0 = 1;                    //定时器0开始计时
  118.         ET0 = 1;              //使能定时器0中断
  119. }

  120. /*******************************************************************************
  121. * 函数名 : CLR_Buf1
  122. * 描述   : 清除串口2缓存数据
  123. * 输入   :
  124. * 输出   :
  125. * 返回   :
  126. * 注意   :
  127. *******************************************************************************/
  128. void CLR_Buf1(void)
  129. {
  130.         u16 k;
  131.         for(k=0;k<Buf1_Max;k++)      //将缓存内容清零
  132.         {
  133.                 Uart1_Buf[k] = 0x00;
  134.         }
  135.     First_Int = 0;              //接收字符串的起始存储位置
  136. }



  137. /*******************************************************************************
  138. * 函数名 : Find
  139. * 描述   : 判断缓存中是否含有指定的字符串
  140. * 输入   :
  141. * 输出   :
  142. * 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
  143. * 注意   :
  144. *******************************************************************************/

  145. u8 Find(u8 *a)
  146. {
  147.   if(strstr(Uart1_Buf,a)!=NULL)
  148.             return 1;
  149.         else
  150.                         return 0;
  151. }

  152. /*******************************************************************************
  153. * 函数名 : Second_AT_Command
  154. * 描述   : 发送AT指令函数
  155. * 输入   : 发送数据的指针、希望收到的应答、发送等待时间(单位:S)
  156. * 输出   :
  157. * 返回   :
  158. * 注意   :
  159. *******************************************************************************/

  160. void Second_AT_Command(u8 *b,u8 *a,u8 wait_time)         
  161. {
  162.         u8 i;
  163.         u8 *c;
  164.         c = b;                                                                                //保存字符串地址到c
  165.         CLR_Buf1();
  166.   i = 0;
  167.         while(i == 0)                    
  168.         {
  169.                
  170.                 if(!Find(a))            //查找需要应答的字符
  171.                 {
  172.                         if(Timer0_start == 0)
  173.                         {
  174.                                 b = c;                                                        //将字符串地址给b
  175.                                 for (b; *b!='\0';b++)
  176.                                 {
  177.                                         UART1_SendData(*b);
  178.                                 }
  179.                                 UART1_SendLR();       
  180.                                 Times = 0;
  181.                                 shijian = wait_time;
  182.                                 Timer0_start = 1;
  183.                    }
  184.     }
  185.           else
  186.                 {
  187.                         i = 1;
  188.                         Timer0_start = 0;
  189.                 }
  190.         }
  191.         CLR_Buf1();
  192. }
  193. /*******************************************************************************
  194. * 函数名 : Set_PDU_Mode
  195. * 描述   : 设置短信为PDU模式
  196. * 输入   :
  197. * 输出   :
  198. * 返回   :
  199. * 注意   :
  200. *******************************************************************************/
  201. void Set_TEXT_Mode(void)
  202. {
  203.         Second_AT_Command("ATE0","OK",3);                                                                                  //取消回显       
  204.         Second_AT_Command("AT+CNMI=3,2,0,0,0","OK",3);                                                        //新短信直接输出
  205.         Second_AT_Command("AT+CMGF=1","OK",3);                                                                //TEXT模式       
  206.         Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);                //所有操作都在SIM卡中进行       

  207. }

  208. /*******************************************************************************
  209. * 函数名 : Check_Message_rec
  210. * 描述   : 检查是否有新信息,并执行信息内容指令
  211. * 输入   :
  212. * 输出   :
  213. * 返回   :
  214. * 注意   :
  215. ******************************************************************************/

  216. void Check_New_Message(void)
  217. {
  218.         u8 temp=0;
  219.         if(strstr(Uart1_Buf,"+CMT")!=NULL)                   //若缓存字符串中含有"+CMT"就表示有新的短信
  220.         {
  221.                 delay_ms(5);//等待数据全部接收完成
  222.                 if(strstr(Uart1_Buf,"ledaon")!=NULL)
  223.                 {
  224.                         LEDA=0;
  225.                 }
  226.                 if(strstr(Uart1_Buf,"ledaoff")!=NULL)
  227.                 {
  228.                         LEDA=1;
  229.                 }       
  230.                 if(strstr(Uart1_Buf,"ledbon")!=NULL)
  231.                 {
  232.                         LEDB=0;
  233.                 }
  234.                 if(strstr(Uart1_Buf,"ledboff")!=NULL)
  235.                 {
  236.                         LEDB=1;
  237.                 }       
  238.                 CLR_Buf1();
  239.                 Second_AT_Command("AT+CMGD=1,4","OK",3);//删除短信
  240.         }
  241. }

  242. /*******************************************************************************
  243. * 函数名 : Wait_CREG
  244. * 描述   : 等待模块注册成功
  245. * 输入   :
  246. * 输出   :
  247. * 返回   :
  248. * 注意   :
  249. *******************************************************************************/
  250. void Wait_CREG(void)
  251. {
  252.         u8 i;
  253.         u8 k;
  254.         i = 0;
  255.         CLR_Buf1();
  256.   while(i == 0)                               
  257.         {
  258.    
  259.                 CLR_Buf1();        
  260.                 UART1_SendString("AT+CREG?");
  261.                 UART1_SendLR();
  262.                 delay_ms(100);
  263.                
  264.             for(k=0;k<Buf1_Max;k++)                             
  265.             {
  266.                         if((Uart1_Buf[k] == 'C')&&(Uart1_Buf[k+1] == 'R')&&(Uart1_Buf[k+2] == 'E')&&(Uart1_Buf[k+3] == 'G')&&(Uart1_Buf[k+4] == ':'))
  267.                         {
  268.                                          
  269.                                 if((Uart1_Buf[k+8] == '1')&&(Uart1_Buf[k+9] != '3'))
  270.                                 {
  271.                                         i = 1;
  272.                                         Register_Flag=1;
  273.                                         LEDB =0;
  274.                                   break;
  275.                                 }
  276.         if((Uart1_Buf[k+8] == '1')&&(Uart1_Buf[k+9] == '3'))
  277.                                 {
  278.                                         i = 1;
  279.                                         Register_Flag=3;
  280.                                         LEDA =0;
  281.                                   break;
  282.                                 }       
  283.                           if(Uart1_Buf[k+8] == '5')
  284.                                 {
  285.                                         i = 1;
  286.                                         Register_Flag=5;
  287.                                         LEDC =0;
  288.                                   break;
  289.                                 }       
  290.                                
  291.                         }
  292.                 }
  293.                
  294.         }
  295. }



  296. /*----------------------------
  297. UART1 发送串口数据
  298. -----------------------------*/
  299. void UART1_SendData(u8 dat)
  300. {
  301.         ES=0;                                        //关串口中断
  302.         SBUF=dat;                       
  303.         while(TI!=1);        //等待发送成功
  304.         TI=0;                                        //清除发送中断标志
  305.         ES=1;                                        //开串口中断
  306. }
  307. /*----------------------------
  308. UART1 发送字符串
  309. -----------------------------*/
  310. void UART1_SendString(char *s)
  311. {
  312.         while(*s)//检测字符串结束符
  313.         {
  314.                 UART1_SendData(*s++);//发送当前字符
  315.         }
  316. }



  317. /*******************************************************************************
  318. * 函数名 : Timer0_ISR
  319. * 描述   : 定时器0中断服务入口函数,1ms中断一次
  320. * 输入   :
  321. * 输出   :
  322. * 返回   :
  323. * 注意   :
  324. *******************************************************************************/
  325. void Timer0_ISR() interrupt 1
  326. {
  327.         static u8 Time_count=0;
  328.         TR0=0;//关定时器
  329.         TL0 = 0x70;                //重设定时器初值
  330.         TH0 = 0xFC;                //重设定时器初值
  331.        
  332.        
  333.        
  334.         Time_count++;
  335.         if(Time_count>=50)
  336.         {
  337.                 Time_count = 0;
  338.                 if(count_20ms) //20ms延时计数器
  339.                 count_20ms--;
  340.         }
  341.        
  342.         if(Timer0_start)
  343.           Times++;
  344.         if(Times > (50*shijian))
  345.         {
  346.                 Timer0_start = 0;
  347.                 Times = 0;
  348.         }
  349.         TR0=1;//开定时器
  350. }

复制代码


评分

参与人数 1黑币 +1 收起 理由
en_568 + 1 赞一个!

查看全部评分

回复

使用道具 举报

ID:47286 发表于 2017-4-2 19:02 | 显示全部楼层
太棒了 我刚买了个A6
回复

使用道具 举报

ID:194622 发表于 2017-5-6 01:16 | 显示全部楼层
好啊,雪中送炭
回复

使用道具 举报

ID:197367 发表于 2017-5-6 16:16 | 显示全部楼层
你们实现单片机控制了吗
回复

使用道具 举报

ID:202756 发表于 2017-5-20 08:46 | 显示全部楼层
你好请问一下:GPRS A6  如何验证  我用a6模块跟arduino连接    测试的时候没反应   接线也是正确的 不知道为什么  
回复

使用道具 举报

ID:212625 发表于 2017-6-22 10:34 | 显示全部楼层
太棒了   网上没有这方面的资料
回复

使用道具 举报

ID:231277 发表于 2017-9-5 22:58 | 显示全部楼层
证想做这个呢,先参考了谢谢,万分感谢,
回复

使用道具 举报

ID:231284 发表于 2017-9-5 23:21 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:82765 发表于 2017-9-6 07:49 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:239519 发表于 2017-10-14 22:28 | 显示全部楼层
谢谢楼主分享,刚好需要用到,太感谢了。
回复

使用道具 举报

ID:233225 发表于 2017-11-15 13:40 | 显示全部楼层
666,希望可以用下
回复

使用道具 举报

ID:270999 发表于 2018-1-3 19:42 | 显示全部楼层
很棒,谢谢分享
回复

使用道具 举报

ID:268524 发表于 2018-1-3 20:53 | 显示全部楼层
想做这个呢,先参考了谢谢,万分感谢,
回复

使用道具 举报

ID:165122 发表于 2018-2-17 22:30 | 显示全部楼层
太棒啦,正好可以学习一下!
回复

使用道具 举报

ID:165122 发表于 2018-2-17 22:30 | 显示全部楼层
太棒啦,正好可以学习一下。感谢分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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