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

📄 main.c

📁 单片机与计算机的串口通信
💻 C
字号:
#include <msp430x16x.h>

#define uchar unsigned char 
#define uint  unsigned int

uchar UART1_RX_BUF[16]={0x00,0x00,0x00,0x00,0x00,0x00,};
uchar UART1_TX_BUF[16]={'1','2','3','4','5','6','7','8','0'};

void Init_UART1(void);
void Check(void);

/*------辅助时钟设置,传递分频系数------------*/
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_UART1(void)
{
  U1CTL = 0X00;//将寄存器的内容清零	
  U1CTL |= SWRST;//开始串口设置
  U1CTL += CHAR;//数据位为8bit
  U1TCTL = 0X00;//将寄存器的内容清零	
  U1TCTL |= SSEL1;//波特率发生器选择SMCLK			    
  U1BR0 = 0X41;	//波特率为9600		
  U1BR1 = 0X03;
  U1MCTL = 0X00;//调整寄存器
  U1CTL&=~SWRST;//设置串口完毕
  ME2 |= URXE1+UTXE1;//使能UART0的TXD和RXD 
  IE2 |= URXIE1+UTXIE1;	//使能UART0的RX和TX中断		
  P3SEL |= BIT6;//设置P3.4为UART0的TXD	
  P3SEL |= BIT7;//设置P3.5为UART0的RXD			    
  P3DIR |= BIT6;//P3.4为输出管脚
  return;
}
///////////////////////////////////////
// 处理来自串口0 的接收中断,响应后自动清除
//接收一帧数据,数据量由i来确定
#pragma  vector=UART1RX_VECTOR
__interrupt  void UART1_RX_ISR(void)
{
  uchar i;
  /*_DINT();
  for(i=0;i<3;i++)
  {
    UART1_RX_BUF[i] =U1RXBUF;//接收来自的数据
    while((IFG2 &URXIFG1)!=URXIFG1);
    IFG2 &=(~URXIFG1);
  }
  IFG2=0;
  _EINT();*/
 //while((IFG2&URXIFG1)==0);
 P4OUT=U1RXBUF;
 //while((U1TCTL&0x01)==0);
  // for(i=0;i<0x5f;i++);
 //IFG2 &=(~UTXIFG1);
}
/*-------------发送一个字符---------------*/
void send_char(uchar temp)
{
  _DINT();     //关闭中断
  U1TXBUF=temp;
  while((IFG2&UTXIFG1)!=UTXIFG1); // 等特数据传送
  IFG2&=(~UTXIFG1);    // 清除数据传送标志
  //IFG2=0;
  _EINT();     //开中断
}
/*************从串口发送i个字符*****************/
void send_string(void)
{
  uchar i ;
  _DINT();     //关闭中断
  for(i=0;i<8;i++)
  {
    U1TXBUF= UART1_TX_BUF[i];
    while((IFG2&UTXIFG1)!=UTXIFG1); // 等特数据传送
    IFG2&=(~UTXIFG1);    // 清除数据传送标志
  }
  //IFG2=0;
  _EINT();     //开中断
}
////////////////////////////////////////////
void main(void)
{
  //uchar i;
  WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
  ACLK(1);
  MCLK(1,1);
  SMCLK(1,1);
  Clock_ON();
  _DINT();       //关闭中断
  Init_UART1();
  IFG1=0;
  IFG2=0; 
  _EINT();      //打开中断
  //for(i=0;i<12;i++)
 // {
    //send_char(0x34);
    send_string();
  //}
    P4DIR|=0xff;
  
  while (1);
 /* {
    P4OUT=UART1_RX_BUF[0];
  };*/
}

⌨️ 快捷键说明

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