⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cms.lst

📁 一个用单片机实现gprs modem发送短信的程序.里面有详细的注释,不可多得的学习程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
CX51 COMPILER V7.20   CMS                                                                  09/22/2006 14:21:05 PAGE 1   


CX51 COMPILER V7.20, COMPILATION OF MODULE CMS
OBJECT MODULE PLACED IN cms.OBJ
COMPILER INVOKED BY: D:\program\keil\C51\BIN\CX51.EXE cms.c LARGE BROWSE DEBUG

line level    source

   1          #include <stdio.h>
   2          #include <string.h>
   3          #include <intrins.h>
   4          #include <stdlib.h>
   5          
   6          #include "REG669.H"
   7          #include "cmsdata.h"
   8          
   9          //串口0用于和CMS91通信,串口1用于和PC机进行通信
  10          
  11          #define GPRS_OK      0   // 正确
  12          #define GPRS_ERR      1   // 错误
  13          #define GPRS_PWR_ON  1
  14          #define GPRS_PWR_OFF 0
  15          
  16          
  17          
  18          #define GPRS_RECV_CMD_MAX_BUF 1024
  19          
  20          
  21          char Uart0_RX_buf[GPRS_RECV_CMD_MAX_BUF]; //串口0接收缓冲区
  22          char Uart1_RX_buf[GPRS_RECV_CMD_MAX_BUF]; //串口1接收缓冲区
  23          int  receiver0;           //串口0接收缓冲区中数据的长度
  24          int  receiver1;          //串口1接收缓冲区中数据的长度
  25          int  read0;
  26          int  read1;
  27          
  28          void Init_UART0()
  29          {
  30   1              //====设置波特率===================
  31   1      /*      tmod = 0x20;
  32   1              th1  = 0xfd;
  33   1              tl1  = 0xfd;
  34   1              pcon = 0x00;     
  35   1              scon=0x50;   //串口工作在方式1下,10位异步收发,允许接收
  36   1              tcon = 0x40; //启动定时器1
  37   1              ie=0x90;     //允许串口中断*/
  38   1      
  39   1        PCON=0x00;
  40   1      
  41   1        S0STAT=0x20;
  42   1        S0CON=0x50; /*设置Uart0工作模式为8位可变波特率(模式1)作DSP串口收发*/
  43   1        
  44   1        TMOD=0x20;  /*设置T1为8位重装定时器(模式2)*/
  45   1        
  46   1        TH1=0xfd;  /*设置Uart0波特率为9600Hz(时钟11.0592MHz)*/
  47   1        TL1=0xfd;
  48   1      
  49   1        TCON = 0x40; //启动定时器1
  50   1      
  51   1        ES0R=1;            //开放UART0接收中断
  52   1      
  53   1      }
  54          
  55          void Init_UART1()
CX51 COMPILER V7.20   CMS                                                                  09/22/2006 14:21:05 PAGE 2   

  56          {
  57   1           S1STAT=0X20;    //区分接受和发送中断.S1STAT.5=1
  58   1           S1CON=0X00;        //串口控制寄存器清零
  59   1           
  60   1           REN_1=1;            //允许接收中断
  61   1         //  TI_1=1;
  62   1           
  63   1           SM0_1=0;
  64   1           SM1_1=1;            //串口通讯方式为1//S1CON=0x52;
  65   1       
  66   1           BRGCON=0X00;        //关闭波特率发生器,设置波特率9600
  67   1           BRGR1=0X04;
  68   1           BRGR0=0X70;
  69   1           BRGCON=0X01;        //开启波特率发生器
  70   1           
  71   1           ES1R=1;            //开放UART1接收中断
  72   1         
  73   1      
  74   1      }
  75          
  76          void IntUart0Rx(void) interrupt 6    //串口0接收中断函数
  77          {
  78   1          
  79   1              Uart0_RX_buf[receiver0++]=S0BUF;
  80   1              if(receiver0>=GPRS_RECV_CMD_MAX_BUF)
  81   1                  receiver0=0;
  82   1                      
  83   1                      RI_0=0;
  84   1      }
  85          
  86          void IntUart1Rx(void) interrupt 10    //串口1接收中断函数
  87          {
  88   1          
  89   1              Uart1_RX_buf[receiver1++]=S1BUF;
  90   1              if(receiver1>=GPRS_RECV_CMD_MAX_BUF)
  91   1                  receiver1=0;
  92   1                      
  93   1                      RI_1=0;
  94   1      }
  95          
  96          void Uart1SendCrt(unsigned char crt)    //串口1发送函数
  97          {
  98   1          S1BUF=crt;
  99   1          while(TI_1==0);
 100   1          TI_1=0;
 101   1      }
 102          
 103          void Uart0SendCrt(unsigned char crt)    //串口0发送函数
 104          {
 105   1          S0BUF=crt;
 106   1          while(TI_0==0);
 107   1          TI_0=0;
 108   1      }
 109          
 110          void Uart0_SendString(char *pt)         //发送字符串到串口0
 111          {
 112   1          while(*pt)
 113   1              Uart0SendCrt(*pt++);
 114   1      }
 115          
 116          void Uart1_SendString(char *pt)         //发送字符串到串口1
 117          {
CX51 COMPILER V7.20   CMS                                                                  09/22/2006 14:21:05 PAGE 3   

 118   1          while(*pt)
 119   1              Uart1SendCrt(*pt++);
 120   1      }
 121          
 122          int IntUart0Rx_cmd(char *cmd)          //串口0接收cms91发来的数据
 123          {
 124   1              int loopcnt = 0;
 125   1              int ncount = 0;
 126   1              
 127   1              while(1)
 128   1              {       
 129   2                      if(read0 == receiver0)
 130   2                      {
 131   3                              ncount ++;
 132   3                              if(ncount >= 10000)
 133   3                              {
 134   4                                      cmd[loopcnt++] = 0;
 135   4                                      return GPRS_ERR;
 136   4                              }
 137   3                              continue;
 138   3                      }
 139   2                      ncount = 0;
 140   2                      if( (Uart0_RX_buf[read0] == '\r') || (Uart0_RX_buf[read0] == '\n'))
 141   2                      {
 142   3                              cmd[loopcnt ++] = 0;
 143   3                              read0 ++;
 144   3                              if(read0 >= GPRS_RECV_CMD_MAX_BUF)
 145   3                                      read0 = 0;
 146   3                              
 147   3                              if(strlen(cmd))
 148   3                              {
 149   4                                      Uart1_SendString("\nRecv <- ");
 150   4                                      Uart1_SendString(cmd);
 151   4                                      Uart1_SendString("\n");
 152   4                              }
 153   3                              return GPRS_OK;
 154   3                      }else
 155   2                      {
 156   3                              cmd[loopcnt ++] = Uart0_RX_buf[read0];
 157   3                              read0 ++;
 158   3                              if(read0 >= GPRS_RECV_CMD_MAX_BUF)
 159   3                                      read0 = 0;
 160   3                      }
 161   2              }
 162   1      }
 163          
 164           void delay_1mS(void)
 165          {
 166   1         unsigned char i;
 167   1         _nop_();
 168   1         _nop_();
 169   1      for(i=248;i>0;i--)
 170   1             {
 171   2      
 172   2            _nop_();
 173   2            _nop_();
 174   2             }
 175   1      }
 176          
 177           void Delay(int time)
 178          {
 179   1        unsigned char i;
CX51 COMPILER V7.20   CMS                                                                  09/22/2006 14:21:05 PAGE 4   

 180   1        for(i=0;i<time;i++)
 181   1           delay_1mS();
 182   1      }
 183          
 184           int gprsSendMessage(const SM_PARAM* pSrc)
 185          {
 186   1               int nPduLength;                // PDU串长度
 187   1               unsigned char nSmscLength;     // SMSC串长度
 188   1               int nResult;           // 
 189   1               char cmd[16];          // 命令串
 190   1               //char temp[16];
 191   1               char pdu[512];         // PDU串
 192   1               char ans[128];         // 应答串
 193   1      
 194   1              nPduLength = gprsEncodePdu(pSrc, pdu);  // 根据PDU参数,编码PDU串
 195   1              pdu[nPduLength] = 0;
 196   1      
 197   1              gprsString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度
 198   1              nSmscLength++;          // 加上长度字节本身
 199   1      
 200   1              // 命令中的长度,不包括SMSC信息长度,以数据字节计
 201   1              sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength);     // 生成命令
 202   1      
 203   1              Uart0_SendString(cmd);  // 先输出命令串
 204   1      
 205   1              Delay(500);
 206   1              
 207   1              nResult = IntUart0Rx_cmd(ans);  // 读应答数据
 208   1              nResult = IntUart0Rx_cmd(ans);
 209   1      
 210   1              // 根据能否找到"\r\n> "决定成功与否
 211   1              if(nResult == GPRS_OK)
 212   1              {
 213   2                      int loopcnt = 40;
 214   2                      nResult = IntUart0Rx_cmd(ans);
 215   2                      Uart0_SendString(pdu);  // 得到肯定回答,继续输出PDU串
 216   2      
 217   2                      pdu[0] = 0x1a; // CTRL + Z = 0x1a
 218   2                      pdu[1] = 0x0;
 219   2                      Uart0_SendString(pdu);
 220   2                      
 221   2                      while(1)
 222   2                      {
 223   3                              Delay(1000);
 224   3                              IntUart0Rx_cmd(ans);    // 读应答数据
 225   3      
 226   3                              // 根据能否找到"+CMS ERROR"决定成功与否
 227   3                              if(strncmp(ans, "+CMS ERROR", 10) == 0)
 228   3                              {
 229   4                                      Uart1_SendString("发送失败\n");
 230   4                                      return 0;
 231   4                              }else if (strncmp(ans, "OK", 2) == 0)
 232   3                              {
 233   4                                      Uart1_SendString("发送成功\n");
 234   4                                      return 1;
 235   4                              }
 236   3                              
 237   3                              if(loopcnt-- == 0)
 238   3                                      return 0;
 239   3                      }
 240   2              }
 241   1              Uart1_SendString("发送失败\n");
CX51 COMPILER V7.20   CMS                                                                  09/22/2006 14:21:05 PAGE 5   

 242   1              IntUart0Rx_cmd(ans);
 243   1              IntUart0Rx_cmd(ans);
 244   1              return 0;
 245   1      }
 246          
 247          /********************************************************************
 248          // Function name        : gprs_print_msg
 249          // Description      : 打印短消息
 250          // Return type          : void
 251          // Argument         : SM_PARAM* pMsg
 252          *********************************************************************/
 253          void gprs_print_msg(SM_PARAM* pMsg)
 254          {
 255   1              char tmp[100];
 256   1              
 257   1              Uart1_SendString("\n服务中心:");
 258   1              Uart1_SendString(pMsg->SCA);
 259   1              Uart1_SendString("\n来自:");
 260   1              Uart1_SendString(pMsg->TPA);
 261   1              Uart1_SendString("\n时间:");
 262   1              sprintf(tmp, "20%c%c年%c%c月%c%c日%c%c时%c%c分%c%c秒", pMsg->TP_SCTS[0], pMsg->TP_SCTS[1], \
 263   1                                             pMsg->TP_SCTS[2], pMsg->TP_SCTS[3], \
 264   1                                             pMsg->TP_SCTS[4], pMsg->TP_SCTS[5], \
 265   1                                             pMsg->TP_SCTS[6], pMsg->TP_SCTS[7], \
 266   1                                             pMsg->TP_SCTS[8], pMsg->TP_SCTS[9], \
 267   1                                             pMsg->TP_SCTS[10], pMsg->TP_SCTS[11]);
 268   1              Uart1_SendString(tmp);
 269   1              Uart1_SendString("\n内容:");
 270   1              Uart1_SendString(pMsg->TP_UD);
 271   1              Uart1_SendString("\n");
 272   1      }
 273          
 274          void gprs_pwr_on_off(int bon)
 275          {
 276   1              static status_pwr = GPRS_PWR_OFF;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -