找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机控制SIM900A带检测GSM模块返回数据的源码

[复制链接]
跳转到指定楼层
楼主
ID:320302 发表于 2018-5-2 11:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求大神解释

单片机源程序如下:
  1. /************************************************************
  2. 程序说明:
  3. 首先要确定模块已经注册到网络
  4. 然后正确的硬件连接   P3.0-----STXD或者5VT   P3.1-----SRXD或者5VR   GND---GND(只要保证公地即可,没必要单独接一次)
  5. 然后确认你单片机上的晶振,根据晶振修改自己的程序。
  6. 推荐先将单片机与电脑相连,确定单片机发送的数据是正确的。如果发送的是乱码,请检查晶振与单片机的串口波特率。
  7. 如果通过以上几条还解决不了问题,请看群共享文件 AN0004 。

  8. *************************************************************/
  9. #include <REG51.H>
  10. #include <string.H>
  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. //以下是板子上LED的配置,把Px_x改成自己对应的脚。LED 只是用来提示,非必须。
  14. //以下是你的51单片机的晶振大小

  15. sbit P10=P1^0;
  16. sbit P11=P1^1;
  17. sbit P12=P1^2;
  18. sbit P13=P1^3;
  19. sbit P14=P1^4;
  20. sbit P15=P1^5;

  21. #define FOSC_110592M
  22. //#define FOSC_12M
  23. //以下是开机后拨打的手机号,改成自己想要打的号码即可。
  24. uchar num[] = "ATD10086;\r\n";
  25. //以下是GSM模块返回数据
  26. uchar rec_data[50];
  27. uchar rec_num;
  28. //注意,无论接收到信号还是发送完信号,都会进中断服务程序的
  29. /*初始化程序(必须使用,否则无法收发),次程序将会使用定时器1*/
  30. void SerialInti()//初始化程序(必须使用,否则无法收发)
  31. {
  32.         TMOD=0x20;//定时器1操作模式2:8位自动重载定时器

  33. #ifdef FOSC_12M                   //在这里根据晶振大小设置不同的数值初始化串口
  34.         TH1=0xf3;//装入初值,波特率2400
  35.         TL1=0xf3;       
  36. #else        
  37.         TH1=0xfd;//装入初值,波特率9600
  38.         TL1=0xfd;
  39. #endif //end of SOC_12M
  40.        
  41.         TR1=1;//打开定时器
  42.         SM0=0;//设置串行通讯工作模式,(10为一部发送,波特率可变,由定时器1的溢出率控制)
  43.         SM1=1;//(同上)在此模式下,定时器溢出一次就发送一个位的数据
  44.         REN=1;//串行接收允许位(要先设置sm0sm1再开串行允许)
  45.         EA=1;//开总中断
  46.         ES=1;//开串行口中断       
  47. }

  48. /*串行通讯中断,收发完成将进入该中断*///如:+CMTI:"SM",2
  49. void Serial_interrupt() interrupt 4
  50. {

  51.         uchar temp;
  52.         temp=SBUF;
  53.         rec_data[rec_num++]=temp;
  54.         if(rec_num>=50)
  55.                 rec_num=0;
  56.         else
  57.                 ;
  58.         RI=0;//接收中断信号清零,表示将继续接收

  59. }

  60. //串行口连续发送char型数组,遇到终止号/0将停止
  61. void Uart1Sends(uchar *str)
  62. {
  63.         while(*str!='\0')
  64.         {
  65.                 SBUF=*str;
  66.                 while(!TI);//等待发送完成信号(TI=1)出现
  67.                 TI=0;
  68.                 str++;
  69.         }
  70. }
  71. void Uart1BYTE(uchar temp)
  72. {
  73.                 SBUF=temp;
  74.                 while(!TI);//等待发送完成信号(TI=1)出现
  75.                 TI=0;

  76. }

  77. uchar hand(uchar *ptr)
  78. {
  79.         if(strstr(rec_data,ptr)!=NULL)
  80.                 return 1;
  81.         else
  82.                 return 0;
  83. }

  84. void clear_rec_data()
  85. {
  86.         uchar i;
  87.         for(i=0;i<strlen(rec_data);i++)
  88.         {
  89.                 rec_data[i]='0';
  90.        
  91.         }
  92.         rec_num=0;


  93. }
  94. //延时函数大概是1s钟,不过延时大的话不准...
  95. void DelaySec(int sec)
  96. {
  97.         uint i , j= 0;

  98.         for(i=0; i<sec; i++)
  99.         {
  100.                 for(j=0; j<65535; j++)
  101.                 {       
  102.                 }
  103.         }
  104. }

  105. void main()
  106. {
  107.         uchar i = 0;
  108.         SerialInti();
  109.         Uart1Sends("AT\r\n"); //同步波特率,如果将模块配置固定波特率,此条指令就不需要发了
  110.         while(!hand("OK"))
  111.         {
  112.                 clear_rec_data();
  113.                 i++;
  114.                 Uart1Sends("AT\r\n");//
  115.                 DelaySec(1);//延时
  116.                 if(i>=5)
  117.                 {
  118.                         break;
  119.                         //return;
  120.                 }
  121.                 else
  122.                         ;
  123.         }
  124.         Uart1Sends("AT\r\n"); //同步波特率,如果将模块配置固定波特率,此条指令就不需要发了
  125.         while(!hand("OK"))
  126.         {
  127.                 clear_rec_data();
  128.                 i++;
  129.                 Uart1Sends("AT\r\n");//
  130.                 DelaySec(1);//延时
  131.                 if(i>=5)
  132.                 {
  133.                         break;
  134.                         //return;
  135.                 }
  136.                 else
  137.                         ;
  138.         }
  139.         Uart1Sends("ATI\r\n"); //握手
  140.         while(!hand("OK"))
  141.         {
  142.                 clear_rec_data();
  143.                 i++;
  144.                 Uart1Sends("ATI\r\n");//
  145.                 DelaySec(1);//延时
  146.                 if(i>=5)
  147.                 {
  148.                         break;
  149.                         //return;
  150.                 }
  151.                 else
  152.                         ;
  153.         }
  154.         P10=0;
  155.         clear_rec_data();//删除存储的GSM模块返回的数据,以便于以后继续判断
  156.         DelaySec(1);//延时
  157.         Uart1Sends("AT+CSQ\r\n");//信号质量
  158.         DelaySec(1);//延时
  159.         i=0;
  160.         while(!hand("OK")) //检测此条指令GSM模块是否执行OK
  161.         {
  162.                 clear_rec_data();
  163.                 i++;
  164.                 Uart1Sends("AT+CSQ\r\n");//
  165.                 DelaySec(1);//延时
  166.                 if(i>=5)
  167.                 {
  168.                         break;
  169.                         //return;
  170.                 }
  171.         }
  172.         P11=0;
  173.         clear_rec_data();
  174.         DelaySec(1);//延时
  175.         Uart1Sends("AT+CPIN?\r\n");//查看是否读到手机卡
  176.         DelaySec(1);//延时
  177.         i=0;
  178.         while(!hand("READY")) //检测SIM模块是否收到SIM卡READY
  179.         {
  180.                 clear_rec_data();
  181.                 i++;
  182.                 Uart1Sends("AT+CPIN?\r\n");//是否注册到网络
  183.                 DelaySec(1);//延时
  184.                 if(i>=5)
  185.                 {
  186.                         break;
  187.                         //return;
  188.                 }
  189.                 else
  190.                         ;               
  191.         }
  192.         P12=0;
  193.         Uart1Sends("AT+COPS?\r\n");//是否注册到网络
  194.         DelaySec(1);//延时
  195.         i=0;
  196.         while(!hand("CHINA")) //检测是否收到模块返回的CHINA
  197.         {
  198.                 clear_rec_data();
  199.                 i++;
  200.                 Uart1Sends("AT+COPS?\r\n");//是否注册到网络
  201.                 DelaySec(1);//延时
  202.                 if(i>=5)
  203.                 {
  204.                         break;
  205.                         //return;
  206.                 }
  207.                 else
  208.                         ;               
  209.         }
  210.         P13=0;
  211.         clear_rec_data();
  212.         DelaySec(1);//延时
  213. //以下是发送英文短信短信
  214.         Uart1Sends("AT+CSCS=\"GSM\"\r\n"); //
  215.         DelaySec(1);//延时
  216.         Uart1Sends("AT+CSCA?\r\n"); //短信中心号码
  217.         DelaySec(1);//延时
  218.         Uart1Sends("AT+CMGF=1\r\n");  //方式1
  219.         DelaySec(1);//延时
  220.         Uart1Sends("AT+CMGS=\"10086\"\r\n");  //此处修改短信接收方电话号
  221.         DelaySec(1);//延时
  222.         Uart1Sends("ye");  //此处修改短信内容
  223.         DelaySec(1);//延时
  224.         Uart1BYTE(0X1A);
  225.         DelaySec(1);//延时
  226.         DelaySec(1);//延时
  227.         DelaySec(1);//延时
  228.         DelaySec(1);//延时
  229.         P14=0;
  230. //发送英文短信结束
  231.         Uart1Sends("AT+CMGD=1,4\r\n");//删除SIM卡中的内容
  232.         DelaySec(1);//延时
  233.         //以下是拨打10086代码
  234.         Uart1Sends(num);  //拨打10086
  235.         DelaySec(1);//延时
  236.         DelaySec(1);//延时
  237.         DelaySec(1);//延时
  238.         DelaySec(1);//延时
  239.         //拨打电话代码结束
  240.         //以下内容没有实际测试,仅供参考
  241.         while(1)
  242.         {
  243.                 if(hand("CMTI"))
  244.                 {
  245.                         P13=0;
  246.                         clear_rec_data();
  247.                         DelaySec(1);//延时
  248.                         Uart1Sends("AT+CMGR=1\r\n");//
  249.                         DelaySec(1);//延时
  250.                         i=0;
  251.                         while(!hand("OK"))
  252.                         {
  253.                                 clear_rec_data();
  254.                                 i++;
  255.                                 Uart1Sends("AT+CMGR=1,4\r\n");//
  256.                                 DelaySec(1);//延时
  257.                                 if(i>=2)   //chucuo
  258.                                 {
  259.                                         break;
  260.                                         //return;
  261.                                 }
  262.                                 else
  263.                                         ;               
  264.                         }
  265.                         clear_rec_data();
  266.                         DelaySec(1);//延时
  267.                         if(hand("relay on"))
  268.                         {
  269.                                 P14=0;
  270.                                 //break;
  271.                         }
  272.                         else if(hand("relay off"))
  273.                         {
  274.                                
  275.                                 P15=0;
  276.                                 //break;
  277.                         }
  278.                         else
  279.                         {
  280.                                 //break;
  281.                         }
  282.                         Uart1Sends("AT+CMGD=1,4\r\n");//
  283.                         DelaySec(1);//延时

  284.                
  285.                 }
  286.                 else if(hand("ring")) //电话进来 挂断电话
  287.                 {
  288.                        
  289.                         Uart1Sends("ATH\r\n");//
  290.                         DelaySec(1);//延时
  291.                         i=0;
  292.                         while(!hand("OK"))
  293.                         {
  294.                                 clear_rec_data();
  295.                                 i++;
  296.                                 Uart1Sends("ATH\r\n");//
  297.                                 DelaySec(1);//延时
  298.                                 if(i>=2)
  299.                                 {
  300.                                         break;
  301.                                         //return;
  302.                                 }
  303.                                 else
  304.                                         ;               
  305.                         }
  306.                         clear_rec_data();
  307.                         DelaySec(1);//延时               
  308.        
  309.                 }
  310.                 else
  311.                 {
  312.                         ;
  313.                 }
  314.         }

  315.        


  316. }
复制代码

所有资料51hei提供下载:
51控制SIM900A带检测GSM模块返回数据.rar (2.51 KB, 下载次数: 47)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:58591 发表于 2018-8-3 10:31 | 只看该作者
感谢分享,支持下
回复

使用道具 举报

板凳
ID:383337 发表于 2018-8-6 10:23 | 只看该作者
可以反馈实测的数据吗?不是固定的短信
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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