#include"msp430.h"
/**************宏定义***********************/#define uchar unsigned char #define uint unsigned int
uchar Buffer_Rx[40];uchar Buffer_TX[40]="串口程序调试"; //定义发送缓冲区uchar Rx_long;uchar Flag=0; //一旦我们进入中断,就改变此标志位,控制灯闪烁
/**************串口初始化,采用查询方式***********************//*************注意:串口初始化完成后,是处于复位状态**********************/void Init_usart(void){ P3SEL|=0XC0; //串口1的I/O口选择位外围模块功能 P3DIR|=0X40; //P3.6为输出,P3.7为输入 U1TCTL=SSEL1+SSEL0; //选择SMCLK U1CTL=SWRST+CHAR; //先将串口处于复位状态,8位数据,无校验,停止位1位 // U1RCTL|=URXEIE; //接收出错中断允许位 U1TXBUF=0x00; //先将发送缓冲区和接收缓冲区清0 // U1RXBUF=0x00; U1BR1=0; U1BR0=208; //波特率为38400 U1MCTL=0x89; ME2|=UTXE1+URXE1; //允许发送和接收 IE2|=URXIE1; //接收中断使能}void main(){ volatile unsigned int i=0; // volatile to prevent optimization WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P4DIR |= 0x04; // Set P4.3 当接收完成后置位 BCSCTL1&=~XT2OFF; //开启XT2 BCSCTL2|=SELM1+SELS; //选择XT2CLK为MCLK和SMCLK时钟源 do { IFG1&=~OFIFG; //清除振荡器失效标志 for(i=255;i>0;i--); }while(IFG1&OFIFG);//判断XT2是否起振 Init_usart(); //SR|=GIE; //开总中断 U1CTL&=~SWRST; //关闭串口的复位 _BIS_SR(GIE); //开总中断 // _EINT(); while(Buffer_TX
!=' ') { while((IFG2&UTXIFG1)==0); U1TXBUF=Buffer_TX; // UTXIFG1=0; i++; } while(1) { if(Rx_long==8) { i=0; while(Rx_long!=i) { while((IFG2&UTXIFG1)==0); U1TXBUF=Buffer_TX; i++; } Rx_long=0; } if(Flag==1) { P4OUT ^= 0x04; // Toggle P4.2 using exclusive-OR
i = 5000; // SW Delay do i--; while (i != 0); P4OUT ^= 0x04; // Toggle P4.2 using exclusive-OR
i = 5000; // SW Delay do i--; while (i != 0); } }}/************串口接收中断服务子程序**********************/#pragma vector=USART1RX_VECTOR__interrupt void UART1RXINT(void){ _DINT(); //关闭全局中断 Flag=1; if((IFG2&URXIFG1)!=0) { Buffer_Rx[Rx_long]=U1RXBUF; Rx_long++; } _EINT(); //恢复全局中断}
上面的是我的程序源码,应该是很简单的 但就是进不了 麻烦给位大虾帮我检查一下 万分感激啊 前面有个发送给PC 的部分,能够正确接收到“串口程序调试”记个字 我参照了网上的记个串口接收初始化的代码 都没得问题 我确实没辙了 麻烦各位了
此帖出自小平头技术问答
一周热门 更多>