MSP430_串口控制的流水灯代码

//串口控制的流水灯实验

//编写一个流水灯程序,利用串口调试助手向单片机发送字符,
//发送不同的字符时,两个LED灯轮流闪烁效果不同,至少做出两种及以上效果。


#include
#include

#define uint unsigned int
#define uchar unsigned char

void Delay_ms(uint);
void InitIO(void);

//UART理解:两个对象:电脑行为(串口+键盘)和单片机行为(代码);两个数据:单片机发的数据T+弹片机收的数据R

void Delay_ms(uint cnt)
{
uint i,j;
for(j=0;j{
i=1000/6;
while(i--);
}
}

void InitIO(void){
P1SEL &= ~(BIT0 + BIT6); //设置P1.0, P1.6为IO口

P1DIR |= ( BIT0 + BIT6); // 设置P1.0, P1.6为输出


//P1OUT |= BIT0; //初始化灯亮
//P1OUT |= BIT6;

P1OUT &= ~BIT0; //初始化灯灭
P1OUT &= ~BIT6;
}

char uart_data = '\n';

int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 喂狗,关闭看门狗,系统不复位

/* ---------------都是这个套路配置系统时钟的------------- */
// 配置系统时钟
DCOCTL = 0; // 选择内部时钟源为DCO
BCSCTL1 = CALBC1_1MHZ; // 校正频率
DCOCTL = CALDCO_1MHZ; // 设置 DCO为1M
/* ------------------------------------------------------ */

InitIO();//初始化IO


//功能配置
P1SEL |= BIT1 + BIT2 ; // 置1,设置引脚 P1_1和P1_2为外设功能
P1SEL2 |= BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD

//配置UART
UCA0CTL1 |= UCSSEL_2; // 模块时钟选择为SMCLK,(0x80) USCI 0 Clock Source: 2
UCA0BR0 = 104; // 设置波特率
UCA0BR1 = 0; // 1MHz/104=9600bps
UCA0MCTL = UCBRS0; // 调整波特率,(0x02)USCI Second Stage Modulation Select 0
UCA0CTL1 &= ~UCSWRST; // 使能系统复位 (0x01) /* USCI Software Reset */

IE2 |= UCA0RXIE; // 使能 USCI_A0 接收中断

__bis_SR_register(GIE); // 使能 全局中断

while(1)
{
}

}

// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
while ( !( IFG2 & UCA0TXIFG ) ); // 检测发送是否准备好,也就是发送buf为空时表明准备好发送了,此时IFG2的Bit1会置1,即IFG2等于0x02;此时有发送中断未决,所以跳出循环

//串口回显功能
// UCA0TXBUF = UCA0RXBUF; // 将串口接收到的数据 再通过串口发送给PC


//接受一个数据,回显一个OK
uart_data = UCA0RXBUF;

if (uart_data == 'a'){
P1OUT |= BIT0;
// Delay_ms(1000);
P1OUT |= BIT6;
// Delay_ms(1000);
}

else if(uart_data == 'b'){
P1OUT &= ~BIT6;
// Delay_ms(1000)

;
P1OUT &= ~BIT0;
// Delay_ms(1000);
}

// UCA0TXBUF = 'O';
// UCA0TXBUF = 'K';
}

相关文档
最新文档