|
不好意思,看错.以下为参考例程,在32K晶振下波特率为2400,肯定可用,供楼主参考
- #include
-
- void Init_UART1(void); //声明UART初始化函数
- void Init_Timer_A(void); //初始化定时器模块
- #define INBUF_LEN 4 //数据长度
- unsigned char UART1_RXBUF1[INBUF_LEN];
- char checksum,count3;
- char TX_Flag;
- void send_string_com( unsigned char *str, unsigned int strlen);
- void main(void)
- {
- WDTCTL = WDTPW + WDTHOLD ; //关闭看门狗
-
- Init_UART1(); //UART初始化函数
- _EINT(); //通用中断允许
- while(1) //主循环
- {
- if( TX_Flag ==1) //如果取数标志已置位,就将读到的数从串口发出
- {
- TX_Flag = 0 ; //取数标志清0
- send_string_com(UART1_RXBUF1,INBUF_LEN);
- }
- }
- }
- void Init_UART1(void)
- {
- UCTL1 &=~ SWRST; // SWRST复位,USART允许
- UCTL1 = 0x10; // 8位数据位,1位停止位,无校验
- UBR01 = 0x0D;
- UBR11 = 0x00; // 使用32KHz晶振时波特率为2400bps
- UMCTL1 = 0x6B; // 位调整
- UTCTL1 = 0x10; // 选定ACLK(32KHz晶振)为时钟源
- ME2 |= 0x30; //UART发送及接收模块允许
- P3SEL = 0xC0; // P3.6 P3.7被USART1发送模块占用
- P3DIR = 0X40; // P3.6 输出,P3.7 输入
- IE2 |= URXIE1; //接收中断允许
-
-
- }
-
- //向串口发送一个字符
- void send_char_com( unsigned char ch)
- {
- TXBUF1=ch;
- while ((UTCTL1&0x01)==0 );
-
- }
-
- //向串口发送一个字符串,strlen为该字符串长度
-
- void send_string_com( unsigned char *str, unsigned int strlen)
- {
- unsigned int k= 0 ;
- do
- {
- send_char_com(*(str + k));
- k++;
- } while (k < strlen);
- }
- /*****************************************************************************
- USART1接收中断函数
- ******************************************************************************/
- #pragma vector=UART1RX_VECTOR
- __interrupt void UART1(void)
- {
- if (URXIFG1)
- {
- unsigned char ch;
- IFG2 &=~ URXIFG1 ;
- ch=RXBUF1;
- if (ch> 127 )
- {
- count3= 0 ;
- UART1_RXBUF1[count3]=ch;
- checksum= ch- 128 ;
- }
- else
- {
- count3++;
- UART1_RXBUF1[count3]=ch;
- checksum ^= ch;
- if ( (count3==(INBUF_LEN- 1 )) && (!checksum) )
- {
- TX_Flag = 1 ;
- //如果串口接收的数据达到INBUF_LEN个,且校验没错,
- //就置位取数标志
- }
- }
- }
- }
复制代码 |
|