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

📄 main.c

📁 TC35i与430单片机的串口通信,实现了单片机利用AT指令对TC35i的控制!
💻 C
字号:

#include <msp430x16x.h>

#define uchar unsigned char 
#define uint  unsigned int

uchar UART0_RX_BUF[16]={0,0,0,0,0,0,0,0,0,};
uchar UART0_TX_BUF[16]={'A','T',0x0d,};

void Init_UART0(void);
void Check(void);
uchar RX=0;
/*------辅助时钟设置,传递分频系数------------*/
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(void)
{
  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();
//  }
  while (1);
}

⌨️ 快捷键说明

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