📄 msp430f149simulateuart.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 + -