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

📄 msp430f149simulateuart.txt

📁 从网上下载例程不能用
💻 TXT
字号:
/***********************************************
软件模拟msp430串口,发送端
硬件资源:Timer_A,CCR0,UP Mode
时钟选择:MCLK=4.9MHz, ACLK32768Hz
数据发送端口:p1.3
发送数据帧:开始位(1b)+数据位(8b)+ 停止位(1b)
时间:2006.12.7
作者:BackerShu
*************************************************/
#include <msp430x14x.h>

typedef  unsigned char uchar;
typedef  unsigned int  uint;


void InitSys();
void SetClock();
void Delay(int i);
void SetBuff();

uint bitTime=27;//每一位数据时间 波特率600 bitTime=56   波特率2400 bitTime=12   波特率4800 bitTime=6  调此数值来确定每一位脉冲的宽度(高电平占多长时间ms)来调节波特率 
                //               波特率1200 bitTime=27                                                                                                                                        

//uint sendData[22]={0x2d,0x2d,0x2d,0x2d,0x2d,0x4d,0x4d,0x4d,0x20,0x30,0x30,0x30,0x30,0x31,0x4d,0x4d,0x20,0x31,0x30,0x30,0x4d,0x0a};
//uint sendData[9]={0xff,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37};
uint sendData[17]={0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x0d,0x0a};
uint sendBuff;//发送数据缓冲区,10位
uchar bitCnt=0;//正在发送的数据位标志
uchar i=0;//正在发送的数据的字节号
uchar stopFlag=0;//发送结束标志
void delay(unsigned int i)
{
  unsigned int j;
    for(;i>0;i--)
   for(j=0;j<5000;j++);
}
void main(void)
{
  InitSys();
  while(1)
  {
    //P1OUT |= BIT4;//红灯亮
    if(i<17)
    SetBuff();//设置发送缓冲区
    while(!stopFlag);
    stopFlag = 0;//一字节数据发送完成标志清零
    if(i==17) i=0;
  }
  
}
/*************中断服务程序*****************************/
#pragma  vector=TIMERA0_VECTOR
__interrupt void TA0_ISR(void)
{
   TACTL &= ~TACLR;//TAR清零,保证下一次来中断间隔时间正确
   if(bitCnt<10)//发送数据  串口通信格式:起始位(0)+8位有效字节+校验位(可选)+停止位(1)
   {
    // P3OUT = sendBuff<<1;
     if(sendBuff&0x01) 
     P1OUT |= 0x08;//发送数据1
     else   
     P1OUT &= 0xf7;//发送数据0
     sendBuff>>=1;
     //delay(5);
   }
   else
   {
    // TACTL &= ~MC_1;//停止定时器工作,也可以通过关中断来实现
     CCTL0 &= ~CCIE;
     P1OUT |= BIT3;//发送口置高,准备下一位数据的发送
     
     stopFlag = 1;//一字节数据发送完成标志,在主程序中置位
     i++;//已经发送数据的字节数
     bitCnt = 0;//数据位标志清零
     //delay(1);
   }
    bitCnt++;   //数据为标志加1,下次进中断发送下一位
}


/************子函数***********************/
//系统初始化
void InitSys()
{
            volatile unsigned int m,n;           
            WDTCTL = WDTPW+WDTHOLD ;//关闭看门狗
            SetClock();//设置时钟 
            for (m=0; m<2000; m++)                   // Delay for crystal stabilization
            {
              //for (n=0; n<800; n++);                //必须要延时20秒,模拟串口才稳定
            }
            
                       
            DCOCTL |= DCO0 + DCO1 + DCO2 ;
            BCSCTL1 |= RSEL0 + RSEL1 + RSEL2;//设置DCO为4.9MHz
           // BCSCTL1=0X04;                   //ACLK来源于LFXT1低频模式,其频率为32K,XT2开启
            //BCSCTL2=0X88;                   //MCLK与SMCLK均来源于XT2,分频系数为1,频率为8M
            
            TACTL = TASSEL_1 + MC_1 + TACLR;//选择Timer_A的时钟为ACLK,UP mode 计数,并清除TAR
            TACCR0 = bitTime;//隔一个数据位的时间进一次中断
            CCTL0 = CCIE;
            
            //P2DIR = 0x01;                             // P2.0-ACLK
            //P2SEL |= 0x01;                            //从P2.0脚输出晶振的波形
            
            
            P1DIR |= BIT3;//P3.7口作为发送数据的出口,初始化为低电平
            P1OUT |= BIT3;//不发送数据时,p3.7保持为高电平
            
                   
}

//选择时钟,LF1XT工作在低频状态
void SetClock()
{
     volatile unsigned int j;
      while(IFG1 & OFIFG) //上电后,寄存器IFG1的初值为0x82
      {
         IFG1 &= ~OFIFG;
         for (j=0xff;j>0;j--);
      }

}

//设置发送缓冲区
void SetBuff()
{
  bitCnt = 0;//数据位标志清零
  sendBuff = sendData[i];
  sendBuff <<=1;  
  sendBuff |= 0x200;  //加上开始位和停止位
  
  /*sendBuff = 0x200;//加上开始位和停止位
                   //430的编译器不支持位操作,涉及到位操作的尽量用其他方式代替
  sendData[i]<<=1;//
  sendBuff |= sendData[i];//组成要发送的帧*/
  stopFlag = 0;//清发送结束标志
  TACTL |= MC_1;//UP Mode
  CCTL0 |= CCIE;//开中断,开始比较模式发送数据
  _EINT();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -