📄 uart_recv.c
字号:
#include <msp430x14x.h>
typedef unsigned char uchar;
typedef unsigned int uint;
void InitSys();
void SetClock();
uint bitTime=64;//每一位数据时间
uint hBitTime=32;//半位数据的时间
uchar recvData[8]={0};//接收数据存放数组
uchar recvBuff;//接收数据缓冲区,8位,开始位结束位不接收
uchar bitCnt=0;//正在接收的数据位标志
uchar i=0;//正在接收的数据的字节号
uchar stopFlag=0;//接收结束标志
void main()
{
InitSys();
while(1)
{
while (!stopFlag);//接收完8字节数据后出循环
uchar j =0xff;
for(;j>0;j--)
{
P1OUT |= BIT5;//绿灯亮
}
P1OUT &= ~BIT5;//绿灯灭
stopFlag =0 ;//准备下一次接收
i = 0;//准备接第一个字节
}
}
/*************中断服务程序*****************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void TA0_ISR(void)
{
TACCR0 += bitTime;
switch(bitCnt)
{
case 0:
recvBuff = 0;//清空缓冲区
TACCR0 += hBitTime ;//
TACCTL0 &= ~CAP;
bitCnt++;
break;
case 8:
if(P1IN&BIT1) recvBuff |= BIT7;
else recvBuff &= ~BIT7;
recvData[i] = recvBuff;
bitCnt++;
break;
case 9:
TACCTL0 |= CAP;
i++;
bitCnt = 0;
if(i==8) stopFlag =1;
break;
default:
if(P1IN&BIT1) recvBuff |= BIT7;
else recvBuff &= ~BIT7;
recvBuff>>=1;
bitCnt++;
break;
}
}
/***********子函数***************/
void InitSys()
{
WDTCTL = WDTPW+WDTHOLD ;//关闭看门狗
volatile unsigned int m;
for (m=0; m<2000; m++) // Delay for crystal stabilization
{
}
SetClock();//设置时钟
DCOCTL |= DCO0 + DCO1 + DCO2 ;
BCSCTL1 |= RSEL0 + RSEL1 + RSEL2;//设置DCO为4.9MHz
TACTL = TASSEL_1 + MC_2;//选择Timer_A的时钟为ACLK,continous mode 计数
P1SEL = 0x02; // Set P1.1 to TA0,P1.1 是TA0 捕获比较模式的外部输入口
CCTL0 |= CM_2 + SCS + CCIS_0 + CAP + CCIE; // falling edge + CCI0A (P1.1)
// + Capture Mode + Interrupt
P1DIR = 0x30; //将p1.4和p1.5置为输出
P1OUT &= ~BIT5; //绿灯灭
_EINT();
}
void SetClock()
{
uchar j=0xff;
while(IFG1 & OFIFG) //上电后,寄存器IFG1的初值为0x82
{
IFG1 &= ~OFIFG;
for (;j>0;j--);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -