找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3358|回复: 1
收起左侧

单片机GA6模块程序资料

[复制链接]
ID:610681 发表于 2019-9-27 10:35 | 显示全部楼层 |阅读模式
器件介绍
1、GPRS模块 GA6(网络、短信)
实物图2.jpg

实物图.jpg

引脚图.jpg

u GA6 尺寸 22.8mm x 16.8mm x 2.2 mm
u正常工作温度:-30°C ~ +80°C
u 受限工作温度:-40°C ~ -30°C +80°C ~+85°C*
u工作电压 3.5V-4.2V;
u开机电压>3.5V
uSLEEP 模式下的耗流为 0.9mA
u 四频:GSM850, EGSM 900 DCS 1800PCS1900 可以自动的搜寻 四个频段。 l 符合 GSM Phase 2 / 2+ l GPRS Class 10;
u灵敏度<-107;
u支持语音通话;
u支持 SMS 短信;
u支持移动和联通2G,以及全球的GSM网络
uGPRS 数据特性,最大数据速率,下载 85.6Kbps,上传 42.8Kbps
u支持符合 GSM 07.10 协议的串口复用功能
u支持 2 个串口,一个下载串口,一个 AT 命令口;
uAT 命令支持标准 AT TCP/IP 命令接口;
u支持数字音频和模拟音频,支持 HRFREFRAMR 语音编码;
u支持FCCCE认证;
uSMT 42PIN 封装;  

2、温湿度模块 DHT11
005.png

006.png

采用的传统的温湿度传感器

3、土壤传感器
007.png

土壤传感器数字量和模拟量输出,这个设计采用的是模拟量输出;
模拟量通过 AD采集(ADC0832)计算出土壤湿度。

制作完成是实物

1.如果有电话呼入,LED7就会亮起来。

2.按下KEY1键可以接听电话,电话接听成功就会点亮相应的LED。

3.按下KEY2键可以挂断电话,电话挂断成功就会点亮相应的LED。

4.按键和LED对应的端口,请参考程序。

  1. /**************************************************************
  2. GA6  模块      
  3. 51 单片机例程      
  4. 实验内容 :  接听和挂断电话实验  
  5. KEY1 : 接听    KEY2 :挂断

  6. 本例程使用11.0592MHZ时钟---->必须为11.0592M
  7. 串口设置为:9600,8,n,1.
  8. 技术支持: 杜工

  9. ******************************************/
  10. #include <reg52.h>
  11. #include "string.h"
  12. #include "GA6_module_errors.h"

  13. typedef         unsigned char        u8;
  14. typedef         unsigned int        u16;
  15. typedef         unsigned long        u32;


  16. /*************        本地常量声明        **************/

  17. #define Buf_Max                    70         //串口1缓存长度
  18. #define STABLE_TIMES          10        //等待AIR200上电后稳定  

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

  20. //串口1发送回车换行
  21. #define UART1_SendLR() UART1_SendData(0X0D);UART1_SendData(0X0A)

  22. /*LED端口定义*/

  23. sbit LED0 = P1^0;
  24. sbit LED1 = P1^1;
  25. sbit LED2 = P1^2;
  26. sbit LED3 = P1^3;
  27. sbit LED4 = P1^4;
  28. sbit LED5 = P1^5;
  29. sbit LED6 = P1^6;
  30. sbit LED7 = P1^7;

  31. /*KEY端口定义*/

  32. sbit KEY0 = P2^4;
  33. sbit KEY1 = P2^5;
  34. sbit KEY2 = P2^6;
  35. sbit KEY3 = P2^7;

  36. /*************  本地变量声明        **************/
  37. xdata u8 Uart1_Buf[Buf_Max];
  38. u8 First_Int = 0;


  39. u16 count_20ms;
  40. u8  find_string_flag = 0;
  41. u8  has_call_flag = 0;

  42. /*************        本地函数声明        **************/
  43. void delay_ms(u16 ms);   //延时ms个20ms  ms*20ms
  44. void CLR_Buf(void);      //清串口接收缓存
  45. u8          Find(u8 *a);        //查找字符串
  46. void UART1_SendData(u8 dat);   //串口1发送 1字节
  47. void UART1_Send_Command(char *s);
  48. u8   UART1_Send_AT_Command(u8 *b,u8 *a,u8 wait_time,u16 interval_time);//at命令发送
  49. u8 Wait_CREG(u8 query_times);

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

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

  72. int ack_call(void)
  73. {
  74.         int ret;
  75.        
  76.         ret = UART1_Send_AT_Command("AT","OK",3,50);//测试通信是否成功
  77.         if(ret == 0)
  78.         {
  79.                 return COMMUNITE_ERROR;
  80.         }
  81.        
  82.         ret = UART1_Send_AT_Command("AT+CPIN?","READY",2,50);//查询卡是否插上
  83.         if(ret == 0)
  84.         {
  85.                 return NO_SIM_CARD_ERROR;
  86.         }
  87.        
  88.         ret = Wait_CREG(3);//查询卡是否注册到网络
  89.         if(ret == 0)
  90.         {
  91.                 return SIM_CARD_NO_REG_ERROR;
  92.         }
  93.        
  94.        
  95.         ret = UART1_Send_AT_Command("ATA","OK",2,50);//接听电话
  96.         if(ret == 0)
  97.         {
  98.                 return ATA_ERROR;
  99.         }
  100.        
  101.         return 1;
  102. }

  103. int hang_call(void)
  104. {
  105.         int ret;
  106.        
  107.         ret = UART1_Send_AT_Command("ATH","OK",2,50);//挂断电话
  108.         if(ret == 0)
  109.         {
  110.                 return ATH_ERROR;
  111.         }
  112.        
  113.         return 1;
  114. }

  115. /**********************************************/
  116. /*设计思路:
  117. (0)进行串口、定时器初始化工作。
  118. (1)开机等待10秒,等待模块准备好。
  119. (2)发送相应的指令。
  120. ************************************************/
  121. void main(void)
  122. {
  123.         u8 i;
  124.         int ret;
  125.        
  126.         Uart1Init(); //串口初始化
  127.         Timer0Init();//TIM0初始化
  128.         EA = 1;      //开启总中断
  129.        
  130.         for(i = 0;i < STABLE_TIMES;i++)//等待网络稳定
  131.         {
  132.                 delay_ms(50);
  133.         }
  134.          
  135.         has_call_flag = 1;
  136.         while (1)                    
  137.         {
  138.                 delay_ms(25);
  139.                 LED0 = ~LED0;//进入主程序的指示灯
  140.                                
  141.                 if(find_string_flag == 1)
  142.                 {
  143.                         delay_ms(10);
  144.                         if(Find("RING"))
  145.                         {

  146.                                 LED7 = 0;
  147.                                 if(KEY1==0)
  148.                                 {       
  149.                                         delay_ms(1);

  150.                                         if(KEY1==0)
  151.                                         {                       
  152.                                                 while(!KEY1);
  153.                                                 ret = ack_call();//接听电话

  154.                                                 if(ret == 1)
  155.                                                 {
  156.                                                         LED1 = 0;
  157.                                                 }
  158.                                                 else
  159.                                                 {
  160.                                                         LED1 = 1;
  161.                                                 }
  162.                                         }
  163.                                         find_string_flag = 0;
  164.                                 }               
  165.                         }
  166.                         else
  167.                         {
  168.                                 LED7 = 1;
  169.                                 find_string_flag = 0;
  170.                         }
  171.                 }
  172.                
  173.                 if(KEY2==0)
  174.                 {       
  175.                         delay_ms(1);
  176.                        
  177.                         if(KEY2==0)
  178.                         {                       
  179.                                 while(!KEY2);
  180.                                 ret = hang_call();//挂断电话
  181.                                 if(ret == 1)
  182.                                 {
  183.                                         LED2 = 0;
  184.                                 }
  185.                                 else
  186.                                 {
  187.                                         LED2 = 1;
  188.                                 }
  189.                         }                       
  190.                 }
  191.                
  192.         }
  193. }

  194. /*******************************************************************************
  195. * 函数名 : Timer0_ISR
  196. * 描述   : 定时器0中断服务入口函数,1ms中断一次
  197. * 输入   :
  198. * 输出   :
  199. * 返回   :
  200. * 注意   :
  201. *******************************************************************************/
  202. void Timer0_ISR() interrupt 1
  203. {
  204.         TR0=0;//关定时器
  205.         TL0 = (65536-20000)%256;                //重设定时器初值
  206.         TH0 = (65536-20000)/256;                //
  207.        
  208.         if(count_20ms > 0) //20ms延时计数器
  209.         {
  210.                 count_20ms--;
  211.         }       
  212.        
  213.         TR0=1;//开定时器
  214. }


  215. /********************* UART1中断函数************************/
  216. void UART1_ISR (void) interrupt 4
  217. {
  218.         if (RI)
  219.         {
  220.                 RI = 0;                           //清除RI位
  221.                 Uart1_Buf[First_Int] = SBUF;            //将接收到的字符串存到缓存中
  222.                 First_Int++;                          //缓存指针向后移动
  223.                 if(First_Int > Buf_Max)                 //如果缓存满,将缓存指针指向缓存的首地址
  224.                 {
  225.                         First_Int = 0;
  226.                 }
  227.                
  228.                 if(has_call_flag == 1)
  229.                 {
  230.                         if(First_Int > 8)
  231.                         {
  232.                                 find_string_flag = 1;
  233.                         }
  234.                 }
  235.         }
  236.         if (TI)
  237.         {
  238.                 TI = 0;                          //清除TI位
  239.         }
  240. }


  241. /*******************************************************************************
  242. * 函数名 : CLR_Buf
  243. * 描述   : 清除串口2缓存数据
  244. * 输入   :
  245. * 输出   :
  246. * 返回   :
  247. * 注意   :
  248. *******************************************************************************/
  249. void CLR_Buf(void)
  250. {
  251.         u8 k;
  252.         for(k=0;k<Buf_Max;k++)      //将缓存内容清零
  253.         {
  254.                 Uart1_Buf[k] = 0x00;
  255.         }
  256.     First_Int = 0;              //接收字符串的起始存储位置
  257. }


  258. /*******************************************************************************
  259. * 函数名 : Find
  260. * 描述   : 判断缓存中是否含有指定的字符串
  261. * 输入   :
  262. * 输出   :
  263. * 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
  264. * 注意   :
  265. *******************************************************************************/

  266. u8 Find(u8 *a)
  267. {
  268.         ES = 0;  //改进程序
  269.         if(strstr(Uart1_Buf,a)!=NULL)
  270.         {
  271.                 ES = 1;
  272.                 return 1;
  273.         }       
  274.         else
  275.         {
  276.                 ES = 1;
  277.                 return 0;
  278.         }
  279.                
  280. }



  281. /*******************************************************************************
  282. * 函数名 : Wait_CREG
  283. * 描述   : 等待模块注册成功
  284. * 输入   :
  285. * 输出   :
  286. * 返回   :
  287. * 注意   :
  288. *******************************************************************************/
  289. u8 Wait_CREG(u8 query_times)
  290. {
  291.         u8 i;
  292.         u8 k;
  293.         u8 j;
  294.         i = 0;
  295.         CLR_Buf();
  296.         while(i == 0)                               
  297.         {

  298.                 UART1_Send_Command("AT+CREG?");
  299.                 delay_ms(100);
  300.                
  301.                 for(k=0;k<Buf_Max;k++)                             
  302.                 {
  303.                         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] == ':'))
  304.                         {
  305.                                          
  306.                                 if((Uart1_Buf[k+7] == '1')&&((Uart1_Buf[k+9] == '1')||(Uart1_Buf[k+9] == '5')))
  307.                                 {
  308.                                         i = 1;
  309.                                         return 1;
  310.                                 }
  311.                                
  312.                         }
  313.                 }
  314.                 j++;
  315.                 if(j > query_times)
  316.                 {
  317.                         return 0;
  318.                 }
  319.                
  320.         }
  321.         return 0;
  322. }



  323. /*----------------------------
  324. UART1 发送串口数据
  325. -----------------------------*/
  326. void UART1_SendData(u8 dat)
  327. {
  328.         ES=0;                        //关串口中断
  329.         SBUF=dat;                       
  330.         while(TI!=1);        //等待发送成功
  331.         TI=0;                        //清除发送中断标志
  332.         ES=1;                        //开串口中断
  333. }

  334. /**********************************
  335. 发送命令
  336. **********************************/
  337. void UART1_Send_Command(char *s)
  338. {
  339.         CLR_Buf();
  340.         while(*s)//检测字符串结束符
  341.         {
  342.                 UART1_SendData(*s++);//发送当前字符
  343.         }
  344.         UART1_SendLR();
  345. }

  346. /*******************************************************************************
  347. * 函数名 : Second_AT_Command
  348. * 描述   : 发送AT指令函数
  349. * 输入   : 发送数据的指针、希望收到的应答、发送等待时间(单位:interval_time*20 ms)
  350. * 输出   :
  351. * 返回   :
  352. * 注意   :
  353. *******************************************************************************/

  354. u8 UART1_Send_AT_Command(u8 *b,u8 *a,u8 wait_time,u16 interval_time)         
  355. {
  356.         u8 i;

  357.         CLR_Buf();
  358.         i = 0;
  359.         while(i < wait_time)                    
  360.         {
  361.                 UART1_Send_Command(b);
  362.                 delay_ms(interval_time);
  363.                 if(Find(a))            //查找需要应答的字符
  364.                 {
  365.                         return 1;
  366.                 }
  367.                 i++;
  368.         }
  369.        
  370.         return 0;
  371. }

  372. void delay_ms(u16 ms)
  373. {
  374.          count_20ms = ms;
  375.          while(count_20ms);
  376. }
复制代码


GA6资料下载
       GA6_硬件规格书_V1.04.pdf (1.19 MB, 下载次数: 18)
回复

使用道具 举报

ID:738184 发表于 2020-5-20 22:34 | 显示全部楼层
请问一下有代码吗?想学习一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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