⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart_recv.c

📁 基于msp430的软件模拟串口接收程序(在MSP430F147型单片机上成功实现)
💻 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 + -