📄 main.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 + -