附上我的代码,主要实现短信发送功能。如有错误,请斧正。
#include<msp430x14x.h>
#include"BoardConfig.h"
unsigned char AT[]="AT\n"; //握手信号//3Chars
unsigned char ATCMGF[]="AT+CMGF=1\n"; //text格式//10Chars
//unsigned char ATCMGS[]="AT+CMGS=\"18758363061\"\n";
//双引号是十进制34,22H,0x22.
unsigned char ATCMGS[]="AT+CMGS=";
unsigned char PHIONN[]="18758363061";
//
unsigned char ATIPR[]="AT+IPR=11059200\n";
void GsmSend(void);
void UART0_Init (void);
void DelayNS (unsigned int dly);
void Delay(unsigned long t);
unsigned char Data[]="kiss";
//0x1A
//主程序
void main()
{
BoardConfig(0xb8);
WDTCTL = WDTPW +WDTHOLD;//关闭 看门狗
UART0_Init();//UART初始化
DelayNS(50);//等待
GsmSend();//发送
}
//uart初始化
void UART0_Init(void)
{
ME1 |= UTXE0 +URXE0; //使能UART0的发送和接收
//IE1 |= URXIE0; //使能接收中断
//IE1 |= UTXIE0; //使能发送中断
UCTL0 = CHAR; //UCTL寄存器控制UASRT的通信协议、通信模式、校验位。CHAR=1表示发送数据为8位
UTCTL0 = SSEL0; //UTCTL寄存器控制模块发送操作。SSEL1=0,SSEL0=1;则选择了ACLK时钟。
/*UBR0,UBR1,UMCTL三个控制波特率*/
UBR00 = 0X03;
UBR10 = 0X00; //UBR10高8位,UBR00低8位,加起来16位。波特率整数部分
UMCTL0 =0X4A; //控制波特率小数部分。0100 1010,
/* 公式 波特率=( BRCLK /(UBR+(M6+M3+M1)/8) */
UCTL0 &= ~SWRST; //软件复位使能位 =0时表示UASRT被允许
IE1 |= URXIE0; //USART接收中断使能
P3SEL = 0X30; //P3.4/P3.5功能为外围模块,即,UTXE0,URXE0为控制外围模块。
P3DIR = 0x10; //控制P3.4为发送,输出
}
//时间延迟
void DelayNS(unsigned int dly)
{
unsigned int i;
for(;dly>0;dly--)
for(i=0;i<2000;i++);
}
//消息发送
void GsmSend(void)
{
unsigned char i;
////////////////////////////////////////////////////////////////
for(i=0;i<17;i++)
{
TXBUF0 = ATIPR[i]; //设置波特率11059200\n
while((IFG1 & UTXIFG0)==0);//判断发送结束没???
}
DelayNS(200);
//////////////////////////////////////////////////////////////////
for(i=0;i<4;i++)
{
TXBUF0 = AT[i]; //AT[]="AT\n";
while((IFG1 & UTXIFG0)==0);//判断发送结束没???
}
DelayNS(200);
/////////////////////////////////
for(i=0;i<11;i++)
{
TXBUF0 = ATCMGF[i]; //ATCMGF[]="AT+CMGF=1\n"
while((IFG1 & UTXIFG0)==0);
}
DelayNS(200);
/*for(i=0;i<9;i++)
{
TXBUF0 = ATCMGS[i]; //ATCMGS[]="AT+CMGS=\"15922041115\"\r"
while((IFG1 & UTXIFG0)==0);
}*/
/////////////////////////////////
for(i=0;i<8;i++)//表示AT+CMGS=
{
TXBUF0 = ATCMGS[i];
while((IFG1 & UTXIFG0)==0);
}
TXBUF0 = 0x22;//ASCii码表示引号
for(i=0;i<11;i++)//电话号码
{
TXBUF0 = PHIONN[i];
while((IFG1 & UTXIFG0)==0);
}
TXBUF0 = 0x22;//ASCii码表示引号
TXBUF0 = 0x0D;//ASCii码表示换行\n
///////////////////////////////
while(!(IFG1 & UTXIFG0));
DelayNS(200);
for(i=0;i<11;i++)
{
TXBUF0 = Data[i];
while(!(IFG1 & UTXIFG0));
}
TXBUF0 = 0x1a; //结束ASCii码中0x1a表示结束
while(!(IFG1 & UTXIFG0));
}
|