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

📄 main.c

📁 利用单片机实现对TC35i的控制并利用其发送短信
💻 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 + -