// ===============================================================================================
// 文件名称:uart.c
// 芯片类型: MSP430F148
// 开发软件: IAR Embedded Workbench V3.2 , Windows XP
// 开发时间:2007年01月21日
// 程序功能:使用MSP430F148的 UART0 对应的P3.4--UTXD0;P3.5--URXD0;
// 实现与PC机进行串口通信,PC机发来的数据单片机原数送回。
// 编写人员:吕云曾
// 联系方式:13845052176 lvyunzeng@163.com
// ================================================================================================
//========================================= 头文件 ================================================
#include <msp430x14x.h>
//========================================== 宏定义 ===============================================
#define uchar unsigned char
//======================================== 函数声明 ================================================
void delayX10ms(int count); //=== 延时 ===
void Send(uchar ch); //=== 向串口发送数据子函数===
void Uart_int(); //===UART初始化配置===
//=================================================================================================
//========================================== 主函数 ==============================================
//=================================================================================================
void main(void)
{
unsigned int iq0;
WDTCTL = WDTPW + WDTHOLD; //=== Stop watchdog timer ===
//--- 使用XT2振荡器 ---
BCSCTL1&=~XT2OFF; //=== 打开XT2振荡器 ===
do
{
IFG1 &= ~OFIFG; //=== 清除振荡器失效标志 ===
for (iq0 = 0xFF; iq0 > 0; iq0--); //=== 延时,等待XT2起振 ===
}
while ((IFG1 & OFIFG) != 0); //=== 判断XT2是否起振 ===
BCSCTL2 =SELM_2+SELS; //=== 选择MCLK、SMCLK为XT2 ===
P3SEL |= 0x30; // Function select, P3.4,5 = USART0 TXD/RXD,
P4DIR |= 0x01; //===Set P4.0 to output direction===
Uart_int();
while (1)
{
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interrupt
}
}
//=============================/;.=====================================================
//==================== 向串口发送数据子函数 =======================================
//==================================================================================
void Send(uchar ch)
{
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
TXBUF0 = ch; // char to TXBUF0
}
//==================================================================================
//========================= UART初始化配置 =========================================
//==================================================================================
void Uart_int()
{
ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD, ref.Page 17
UCTL0 |= CHAR; // 8-bit character
UTCTL0 |= SSEL0; // UCLK = SMCLK
UBR00 = 0x03; // Baudrate registor, UART0= 32k/9600 - 3.41
UBR10 = 0x00; // UART1 OFF
UMCTL0 = 0x4A; // Modulation:01001010 '1'->3/8=.375
UCTL0 &= ~SWRST; // Initialize USART state machine
IE1 |= URXIE0; // Enable USART0 RX interrupt, ref.Page 16
}
//==================================================================================
//=========================子函数delayX10ms=========================================
//==================================================================================
void delayX10ms(int count) //===延迟===
{
unsigned int i,j,k;
for (i=0; i<count; i++)
for(j=0; j<10; j++)
for(k=0; k<120; k++);
}
//==================================================================================
//===================== UART0 RX 中断服务子程序 ==================================
//==================================================================================
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)
Send(RXBUF0); // Send RXBUF0
P4OUT ^= 0x01; //===P4.0取反输出
}
|