📄 main.c
字号:
#include <msp430x16x.h>
#define uchar unsigned char
#define uint unsigned int
uchar UART0_RX_BUF[32]={0,0,0,0,0,0,0,0,0,};//接收数据
uchar AT[]={'A','T',0x0d,0x00};//AT开启
uchar BOTELV[]={'A','T','+','I','P','R','=','9','6','0','0',0x0d,0x00};//设置波特率
uchar FSPDU[]={'A','T','+','C','M','G','F','=','0',0x0d,0x00};//发送模式为PDU
uchar FSTEXT[]={'A','T','+','C','M','G','F','=','1',0x0d,0x00};//发送模式为text
uchar DXDUQU[11]={'A','T','+','C','M','G','R','=','1',0X0d,0x00};//读取第X条短信
uchar DXSHANCHU[11]={'A','T','+','C','M','G','D','=','1',0X0d,0x00};//删除第X条短信
uchar DXFASONG[21]={'A','T','+','C','M','G','S','=','1','5','0','4','5','0','8','8','3','2','1',0X0d,0x00};//发送短信
uchar DXDUQV[11]={'A','T','+','C','M','G','D','=','1',0X0d,0x00};//读取第X条短信
uchar FSNEIRONG[32]={'H','e','l','l','o','!',0x1A,0x00};//短信发送的内容
uchar JIESHU[]={0x0a,0x00};//发送结束
void Init_UART0(void);
void Check(void);
uchar RX=0;
/*--------延时函数-------------------*/
void delay(uint i)
{
uint j;
while(i--)
{for(j=0;j<1000;j++);}
}
/*------辅助时钟设置,传递分频系数------------*/
void ACLK(uchar Division)
{
switch(Division)
{
case 1: BCSCTL1=(BCSCTL1&0xcf|DIVA_0);break;
case 2: BCSCTL1=(BCSCTL1&0xcf|DIVA_1);break;
case 4: BCSCTL1=(BCSCTL1&0xcf|DIVA_2);break;
case 8: BCSCTL1=(BCSCTL1&0xcf|DIVA_3);break;
default:break;
}
}
/*------系统主时钟设置,传递时钟源和分频系数------------*/
void MCLK(uchar Source,uchar Division)
{
switch(Source)
{
case 0: BCSCTL2=(BCSCTL2|SELM0|SELM1);break;//LFXT1CLK
case 1: Check();BCSCTL2=(BCSCTL2&(~SELM0)|SELM1);break;//XT2CLK
case 2: BCSCTL2=(BCSCTL2&(~SELM0)&&(~SELM0));break;//DCO
default:break;
}
switch(Division)
{
case 1: BCSCTL2=(BCSCTL2&0xcf|DIVM_0);break;
case 2: BCSCTL2=(BCSCTL2&0xcf|DIVM_1);break;
case 4: BCSCTL2=(BCSCTL2&0xcf|DIVM_2);break;
case 8: BCSCTL2=(BCSCTL2&0xcf|DIVM_3);break;
default:break;
}
}
/*------系统子时钟设置,传递时钟源和分频系数------------*/
void SMCLK(uchar Source,uchar Division)
{
switch(Source)
{
case 1: Check();BCSCTL2|=SELS;break;//XT2CLK
case 2: BCSCTL2&=(~SELS);break;//DCO
default:break;
}
switch(Division)
{
case 1: BCSCTL2=(BCSCTL2&0xF9|DIVS_0);break;
case 2: BCSCTL2=(BCSCTL2&0xF9|DIVS_1);break;
case 4: BCSCTL2=(BCSCTL2&0xF9|DIVS_2);break;
case 8: BCSCTL2=(BCSCTL2&0xF9|DIVS_3);break;
default:break;
}
}
/*-----------在P5.4、P5.5、P5.6引脚上输出时钟------*/
void Clock_ON(void)
{
P5SEL |= BIT4;
P5SEL |= BIT5;
P5SEL |= BIT6;
P5DIR |= BIT4;
P5DIR |= BIT5;
P5DIR |= BIT6;
return;
}
/*------------振荡器失效检测----------*/
void Check(void)
{
uchar i;
BCSCTL1 &= (~XT2OFF);
do
{
IFG1 &= ~OFIFG; // 清除OSCFault标志
for (i = 0xff; i > 0; i--); //稳定时间
}
while ((IFG1 & OFIFG) != 0);// 如果OSCFault =1
}
/*---------------串口初始化---------------*/
void Init_UART0(void)
{
U0CTL = 0X00;//将寄存器的内容清零
U0CTL |= SWRST;//开始串口设置
U0CTL += CHAR;//数据位为8bit
U0TCTL = 0X00;//将寄存器的内容清零
U0TCTL |= SSEL1;//波特率发生器选择SMCLK
U0BR0 = 0X69; //波特率为9600
U0BR1 = 0X03;
U0MCTL = 0X00;//调整寄存器
U0CTL&=~SWRST;//设置串口完毕
ME1 |= URXE0+UTXE0;//使能UART0的TXD和RXD
IE1 |= URXIE0+UTXIE0; //使能UART0的RX和TX中断
P3SEL |= BIT4;//设置P3.4为UART0的TXD
P3SEL |= BIT5;//设置P3.5为UART0的RXD
P3DIR |= BIT4;//P3.4为输出管脚
return;
}
///////////////////////////////////////
// 处理来自串口0 的接收中断,响应后自动清除
//接收一帧数据,数据量由i来确定
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX_ISR(void)
{
// uchar i;
_DINT();
// for(i=0;i<4;i++)
// {
UART0_RX_BUF[RX] =U0RXBUF;//接收来自的数据
// P4OUT=UART0_RX_BUF[i];
// while((IFG1 &URXIFG0)!=URXIFG0);
// IFG1 &=(~URXIFG0);
//}
RX++;
if(RX==16)
RX=0;
_EINT();
}
/*************从串口发送i个字符*****************/
void send_string(uchar *p)
{
//uchar i=0;
_DINT(); //关闭中断
while(*p!=0x00)
{
U0TXBUF=*p;
while((IFG1&UTXIFG0)!=UTXIFG0); // 等特数据传送
IFG1&=(~UTXIFG0); // 清除数据传送标志
p++;
}
/* uchar i ;
_DINT(); //关闭中断
for(i=0;i<3;i++)
{
U0TXBUF= UART0_TX_BUF[i];
while((IFG1&UTXIFG0)!=UTXIFG0); // 等特数据传送
IFG1&=(~UTXIFG0); // 清除数据传送标志
}*/
_EINT(); //开中断
}
////////////////////////////////////////////
void main(void)
{
//uchar i;
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
ACLK(1);
MCLK(1,1);
SMCLK(1,1);
Clock_ON();
P2SEL=0x00;
P2DIR=0x40;
P2OUT=0x00;
//P4SEL=0x00;
P4DIR=0xff;
//P4OUT=0x00;
_DINT(); //关闭中断
Init_UART0();
IFG1=0;
IFG2=0;
_EINT(); //打开中断
// for(i=0;i<1;i++)
// {
// send_char(0x34);
send_string(AT);
//
send_string(BOTELV);
delay(1000);
send_string(FSTEXT);
delay(1000);
send_string(DXFASONG);
delay(1000);
send_string(FSNEIRONG);
//delay(1000);
//send_string(JIESHU);
// }
while (1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -