/*程序功能:接收PC机十六进制数据后传至pc机显示
数据格式:十六进制
帧头:FD
帧尾: FE*/
#include "msp430x14x.h"
#define uint unsigned int
#define uchar unsigned char
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
uchar RBuff[250]; // 接受缓冲区
uchar rindex;//接受计数
uchar tindex;//发送计数
//**********************函数声明****************************//
void int_clk();
void int_usart();
void UART0_TXISR(uchar *date,uchar i);
//**********************函数声明****************************//
int main(void)
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
int_clk();
int_usart();
_EINT();
while(1);
}
//*********************************************************//
void int_clk()
{
uchar i;
BCSCTL1&=~XT2OFF; //打开XT振荡器
BCSCTL2|=SELM1+SELS;//MCLK 8M and SMCLK 1M
do
{
IFG1 &= ~OFIFG; //清除振荡错误标志
for(i = 0; i < 100; i++)
_NOP(); //延时等待
}
while ((IFG1 & OFIFG) != 0); //如果标志为1继续循环等待
IFG1&=~OFIFG;
}
//**********************初始化串口****************************//
void int_usart()
{
U0CTL|=SWRST;//复位串口
U0CTL|=CHAR; //8位数据
U0TCTL|=SSEL1;//select SMCLK AS CLK
U0BR0=0X03;
U0BR1=0X69;
UMCTL0=0Xff;//1200
ME1|=UTXE0+URXE0;//使能接收和发送
U0CTL&=~SWRST;//清除串口复位信号
IE1|=URXIE0+UTXIE0;//使能接收发送中断
P3SEL|=BIT4;
P3SEL|=BIT5;//选择I/O口使用扩展功能和方向
P3DIR|=BIT4;
}
//**********************接受函数****************************//
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR()
{
RBuff[rindex++] = RXBUF0;
if(RBuff[0]==0xFD&RBuff[rindex-1]==0xFE) //接收完毕
{
tindex = rindex;
rindex=0;
UART0_TXISR(RBuff,tindex);
}
}
//**********************************************************//
void UART0_TXISR(uchar *date,uchar i)
{
uint v=0;
uchar *tend_date;
tend_date=date;
delay_us(10);
for(v=0;v<i;v++)
{
U0TXBUF=*tend_date;
while((IFG1&UTXIFG0)==0);//等待发送完成
tend_date++;
}
delay_ms(10);
}
此帖出自
小平头技术问答
用5系列的很容易实现串口通信的,放弃一系列,直接学5系列的吧
(其实也没这么容易,5系列把收发都放在一个中断向量了,这点很不习惯)
一周热门 更多>