下面格式有点乱,但确实已验证过的例子。感谢~~~
复制代码 - include <msp430x44x.h>
- #include "xs.h"
- #include "GSM.h"
- void main(void)
- {
- WDTCTL = WDTPW+WDTHOLD;
- FLL_CTL0 |= XCAP14PF; // 设定负载电容值
- SCFQCTL |= SCFQ_4M; // 设定主时钟为4MHz
- init_LCD(); //初始化点阵LCD
- init_serialcom(); //初始化串口
- init_tc35_data();
- AT_RST(); AT_RST();AT_RST();
- ATE0();
- _EINT();
- while(1)
- {
- //GSM_RX();
- SEND_MESSAGE();
- _NOP();
- }
- }
- GSM子程序:
- #define RST 0X01
- #define CMGF 0X02
- #define CMGD 0X03
- #define CREG 0X04
- #define CMGR 0X05
- #define CMGS 0X06
- #define CSCA 0X07
- #define ATDAT 0X08
- #define ATE 0X01
- #define TC35RET 0X00
- uchar i_tmp,j_tmp;
- uchar TC35_CON,ch;
- uchar read_flag;
- uchar i_TC35_RECE;
- uchar i_receive,
- TC35_RE[80],
- TC35_MAX,
- i_TC35;
- uint delete;//设置一变量控制删除次数
- uchar TC_MDSJ[]={"AT+CMGS=159432142XX"}; //目的手机地址,
- uchar TC_ZXH[]={"AT+CSCA=+8613800432500"}; //本地中心号。
- uchar TC_FSNR[]={"I AM OK"}; //发送短信内容。
- uchar TC_WLZT[]={"AT+CREG?"}; //网络状态查询
- uchar TC_MSXZ[]={"AT+CMGF=1"}; //发送模式选择。
- uchar TC_DQML[]={"AT+CMGR=1"}; //短信读取命令。
- uchar TC_SCML[]={"AT+CMGD=1"}; //短信删除命令。
- uchar TC_ATF[]={"AT&F"}; //格式化命令。
- uchar TC_ATE0[]={"ATE0"}; //清除回显命令
- uchar TC_ATE1[]={"ATE1"}; //回复回显命令
- void delay(uint i)
- {unsigned int i_delay,j_delay;
- for(i_delay=0;i_delay<i;i_delay++)
- {for(j_delay=0;j_delay<100;j_delay++)
- {;}}
- }
- void init_tc35_data( void )
- {
- for(i_TC35=0;i_TC35<=TC35_MAX;i_TC35++)
- {TC35_RE[i_TC35]=0;}
- i_TC35_RECE=0;
- TC35_MAX=0;
- i_receive=0;
- TC35_CON=TC35RET;
- }
- void init_serialcom( void )
- {
- UTCTL0 = SSEL0; // UCLK = ACLK
- UBR00 = 0x0D; // 32k/2400 - 13.65
- UBR10 = 0x00;
- UMCTL0 = 0x6D; // 调制
- UCTL0 = CHAR; // 8位字符*SWRST*
- ME1 |= UTXE0 + URXE0; // 使能 USART0 TXD/RXD
- IE1 |= URXIE0; // 使能 USART0 RX 中断
- P2SEL |= 0x30; // P2.4,5 = USART0 TXD/RXD
- P2DIR |= 0x10; // P2.4 输出方向
- }
- //向串口发送一个字符
- void send_uart( unsigned char ch)
- {
- // while ((IFG1 & UTXIFG0) == 0); // USART0 TX 缓存器准备好?
- TXBUF0=ch;
- delay(200);
- }
- void ATE0()
- {//I AM OK
- uchar i;
- for(i=0;i<sizeof(TC_ATE0)-1;i++)
- { send_uart(TC_ATE0);}
- send_uart(0X0D);
- send_uart(0X0A);
- TC35_CON=ATE;
- //TC35_CON=ATDAT;
- }
- void ATNAME()
- { //I AM OK
- uchar i;
- for(i=0;i<sizeof(TC_FSNR)-1;i++)
- { send_uart(TC_FSNR);}
- delay(500);delay(500);
- send_uart(0X1A);
- send_uart(0X0D);
- send_uart(0X0A);
- TC35_CON=ATDAT;
- }
- //写目的手机的
- void AT_CMGS()
- {
- uchar i;
- for(i=0;i<sizeof(TC_MDSJ)-1;i++)
- {send_uart(TC_MDSJ);}
- send_uart(0X0D);
- send_uart(0X0A);
- TC35_CON=CMGS;
- }
- //写信息中心号
- void AT_CSCA()
- {//AT+CSCA=+86`````
- uchar i;
- for(i=0;i<sizeof(TC_ZXH)-1;i++)
- {send_uart(TC_ZXH);}
- send_uart(0X0D);
- send_uart(0X0A);
- TC35_CON=CSCA;
- }
- //AT复位指令
- void AT_RST()
- {
- uchar i;
- for(i=0;i<sizeof(TC_ATF)-1;i++)
- {send_uart(TC_ATF);}
- send_uart(0X0D);
- send_uart(0X0A);
- TC35_CON=RST;
- }
- //AT网络状态查询指令
- void AT_CREG()
- {
- uchar i;
- for(i=0;i<sizeof(TC_WLZT)-1;i++)
- {send_uart(TC_WLZT);}
- send_uart(0X0D);
- send_uart(0X0A);
- TC35_CON=CREG;
- }
- //AT接收格式指令
- void AT_CMGF()
- {//AT+CMGF=1
- uchar i;
- for(i=0;i<sizeof(TC_MSXZ)-1;i++)
- {send_uart(TC_MSXZ);}
- send_uart(0X0D);
- send_uart(0X0A);
- TC35_CON=CMGF;
- }
- //AT短消息读取指令
- void AT_CMGR()
- {//AT+CMGR=1
- uchar i;
- for(i=0;i<sizeof(TC_DQML)-1;i++)
- {send_uart(TC_DQML);}
- send_uart(0X0D);
- send_uart(0X0A);
- TC35_CON=CMGR;
- }
- //AT短消息删除指令
- void AT_CMGD()
- {//AT+CMGD=1
- uchar i;
- for(i=0;i<sizeof(TC_SCML)-1;i++)
- {send_uart(TC_SCML);}
- send_uart(0X0D);
- send_uart(0X0A);
- TC35_CON=CMGD;
- }
- //串口接收中断函数
- #pragma vector=USART0RX_VECTOR
- __interrupt void usart0_rx (void)
- {
- _NOP();
- i_receive=RXBUF0;
- TC35_RE[i_TC35_RECE++]=i_receive;
- if(i_TC35_RECE>TC35_MAX){TC35_MAX=i_TC35_RECE;}
- }
- void GSM_RX()
- {
- delay(100); //此处最好加延时
- if(TC35_MAX>0)
- {
- if(TC35_CON==ATE)
- {
- if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))
- {
- init_tc35_data();
- AT_CMGF();}
- else{init_LCD(); px=20; py=16; width=96; drawStr2(px,py);init_tc35_data(); ATE0();}
- }
- else if(TC35_CON==CMGF)
- {
- if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))
- {
- init_tc35_data();
- AT_CMGR();}
- else{init_LCD(); px=20; py=16; width=96; drawStr3(px,py);init_tc35_data();AT_CMGF();}
- }
- else if(TC35_CON==CMGR)
- {
- {
- if((TC35_RE[62]=='O')&&(TC35_RE[63]=='N'))
- {init_LCD(); px=20; py=24; width=80; drawStr6(px,py);
- init_tc35_data();delay(100);AT_CMGD();
- }
- else if((TC35_RE[62]=='O')&&(TC35_RE[64]=='F'))
- {init_LCD();px=20; py=20; width=88;drawStr7(px,py);
- init_tc35_data();delay(100);AT_CMGD();
- }
- else
- {init_LCD();
- px=20; py=0; width=128; drawStr4(px,py);
- init_tc35_data();delay(100);AT_CMGR();}
- }
- }
- else if(TC35_CON==CMGD)
- {
- if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))
- {AT_CMGR();
- }
- else{init_LCD();px=20; py=16; width=96; drawStr5(px,py);
- delay(100);
- delete+=1;
- AT_CMGD();
- if(10==delete){delete=0;init_LCD();
- px=20; py=0; width=128; drawStr4(px,py);
- init_tc35_data();delay(100);AT_CMGR();}
- }
- }
- }
- }
- void SEND_MESSAGE()
- { delay(100);
- if(TC35_MAX>0)
- {
- if(TC35_CON==ATE){
- if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))
- {
- init_tc35_data();
- AT_CMGF();}
- //如果不成功则重新关闭回显
- else{ init_LCD(); px=20; py=16; width=96; drawStr2(px,py);init_tc35_data();
- ATE0();
- }
- }
- else if(TC35_CON==CMGF){ //设置短信收发方式
- if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))
- {init_tc35_data();
- delay(100);
- AT_CSCA();}
- else{init_LCD(); px=20; py=16; width=96; drawStr3(px,py);init_tc35_data();AT_CMGF();}
- }
- //填写信息中心号
- else if(TC35_CON==CSCA)
- {
- delay(100);
- if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))
- { init_LCD();
- px=20; py=0; width=128; GSM_TX4(px,py);
- init_tc35_data();
- delay(100);init_tc35_data();AT_CMGS();
- }
- else{init_tc35_data();AT_CSCA();}
- }
- //填写目的手机
- else if(TC35_CON==CMGS){
- delay(100);
- if((TC35_RE[2]==0X3E)&&(TC35_RE[3]==0X20))
- {
- init_tc35_data();
- delay(100);init_tc35_data();ATNAME();
- init_LCD();
- px=20; py=0; width=128; GSM_TX3(px,py);}
- else{init_LCD();
- px=20; py=0; width=128; GSM_TX1(px,py);init_tc35_data(); AT_CMGS();}
- }
- //发送完毕返回继续扫描接收
- else if(TC35_CON==ATDAT){
- delay(10);
- if(TC35_RE[2]=='+')
- { init_LCD(); px=20; py=20; width=80; GSM_TX2(px,py);
- init_tc35_data();
- }
- else{init_LCD(); px=20; py=20; width=80; GSM_TX5(px,py);}
- }
- }
- }
其中类似 px=20; py=20; width=80; GSM_TX5(px,py); 为12864显示函数 在此就不要列出了。
由于是测试程序 需手动在主程序循环中分别屏蔽GSM_RX();SEND_MESSAGE();分别测试接收短信和发送短信,其中接收短信 只编辑了 接收到ON和OFF |