求模拟串口程序

2019-07-22 13:05发布

求模拟串口程序:MSP430F149,波特率9600,晶振32.768K
需要3个串口,只能模拟一个了,请大家帮忙
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
jiajs
1楼-- · 2019-07-22 17:26

我用I/O口模拟过串口,只做过发送,接收没做过。
liliang9554
2楼-- · 2019-07-22 21:10
可以用定时器控制每位的时间
lizye
3楼-- · 2019-07-22 22:15
 精彩回答 2  元偷偷看……
午夜粪车
4楼-- · 2019-07-22 22:53

#include <msp430x44x.h>


//********************变量声明*****************************

#define TXD 0x01 //P1.0=TXD --->87

#define RXD 0x02 //P1.1=RXD --->86

#define OneBit 0x1A1

#define HalfBit 0xD0

unsigned int TxDate=0;

unsigned int RxDate=0;

unsigned char Count_R;

unsigned char Count_T;

unsigned char ParityBit=0;

unsigned char Movebit=0x01;

unsigned char verify_fault;

//*******************函数声明******************************

void init_DCO(void);

void init_TimerA(void);

void init_TXD(unsigned int);

void init_RXD(void);


//************************************************************

//---------------------主函数-------------------------------

//************************************************************

void main(void)

{

WDTCTL = WDTPW + WDTHOLD;

init_DCO();

init_TimerA();

_EINT();

while(1)

{

init_RXD();

LPM0;

if(verify_fault)

{

init_TXD(0xAA);

init_TXD(0xBB);

init_TXD(0xCC);

verify_fault=0;

}

else

{

RxDate = (RxDate & 0xff); //只取8位数据位

init_TXD(RxDate);

}

}

}



/*************************************************

函数(模块)名称:init_TimerA

功能:        初始化TA

输入参数: 无

输出参数: 无

函数返回值说明:无

使用的资源:

它说明: 无

*************************************************/

void init_TimerA(void)

{

TACTL |= TASSEL1+MC1+TACLR; //SMCLK ,连续记数,请TAR

CCTL0 |= OUT; //默认比较输出为1

P1DIR |= TXD;

P1SEL |= RXD+TXD;

}

/*************************************************

函数(模块)名称:init_TXD

功能:        初始化发送

输入参数: 无

输出参数: 无

函数返回值说明:无

使用的资源:

它说明: 无

*************************************************/

void init_TXD(unsigned int Byte)

{

Count_T = 11; //起始位,8位数据位,奇偶校验位,停止位

CCR0 = TAR + OneBit;

//-----------------------------------------------------

for(char i=0;i<8;i++)

{

if(Movebit & Byte)

{

ParityBit++;

}

Movebit <<= 1;

}

Movebit = 0x01;

if(ParityBit%2 == 0)

{

TxDate |=0x0200+Byte; //0010 xxxx xxxx

}

else

{

TxDate |=0x0300+Byte; //0011 xxxx xxxx

}

ParityBit = 0;

//--------------------------------------------------------


TxDate=TxDate<<1; //往左移1位,产生起始位


CCTL0 = OUTMOD0 + CCIE; //置位,比较中断允许

//while ( CCTL0 & CCIE ); //等待发送完毕

LPM0;


}

/*************************************************

函数(模块)名称:init_RXD

功能:        初始化接收

输入参数: 无

输出参数: 无

函数返回值说明:无

使用的资源:

它说明: 无

*************************************************/

void init_RXD(void)

{

Count_R=10; //8位数据+1位偶校验+停止位

//置位,中断允许,下降沿捕获,同步捕获,选择CCI0B作输入源

CCTL0 = OUTMOD0+CCIE+CM1+CAP+SCS+CCIS0;


}


/*************************************************

函数(模块)名称:TA中断函数

功能:        捕获,定时

输入参数: 无

输出参数: 无

函数返回值说明:无

使用的资源:

它说明: 无

*************************************************/


#pragma vector=TIMERA0_VECTOR

__interrupt void TimerA(void)

{

CCR0 += OneBit;

if(CCTL0 & CCIS0) //接收状态

{

if(CCTL0 & CAP) //处于捕获状态,开始接收数据

{

CCTL0 &= ~CAP; //转变比较方式

CCR0 += HalfBit; //再加半位的时间

}

else //正在接收数据

{

if(Count_R!=0) //8个数据,1个奇偶校验,1个停止位 没有接收完毕

{

RxDate=RxDate>>1;

if(CCTL0 & SCCI) //接收到的是1

{

RxDate |= 0x0200; //共接收10位

ParityBit ++;

}

if(Count_R==1) //接收到的最后一位是停止位

{

if( !(RxDate & 0x0200))//最后一位不是1(停止位出错)

{

verify_fault = 1;

}

}

Count_R--;

}

else //数据接收完毕

{

CCTL0 &= ~CCIE;

if( !(ParityBit&0x01) ) //9位数据里 1的个数是偶数(因为包括了停止位)

{

verify_fault = 1; //偶校验失败

}

ParityBit = 0;

LPM0_EXIT; //退出LPM3,CPU开始处理要发送的数据

} //数据接收完毕


}//正在接收数据

} //接收状态

else //处于发送状态

{

if(Count_T!=0) //8位数据+1位偶校验+停止位 没有发送完毕

{

if(TxDate & 0x0001) //发送的是1

{

CCTL0 &= ~OUTMOD2; //OUTMOD0是置位

}

else //发送的是0

{

CCTL0 |= OUTMOD2; //OUTMOD0+OUTMOD2是复位

}


TxDate=TxDate>>1;

Count_T--;

}

else //8位数据+1位偶校验+停止位 发送完毕

{

CCTL0 &= ~CCIE;

LPM0_EXIT;

}


}

}


/*************************************************

函数(模块)名称:init_DCO

功能:        初始化_DCO

输入参数: 无

输出参数: 无

函数返回值说明:无

使用的资源:

它说明: 设置XT2的各个参数

*************************************************/

void init_DCO(void)

{

SCFI0 |= FN_2;

SCFQCTL = 121; //(121+1)*32768=7.99MHz

FLL_CTL0 |= XCAP14PF;

FLL_CTL1 = 0;

}

可以参考下
zhaoxqi
5楼-- · 2019-07-23 03:19
mark 真给力
jiaxw
6楼-- · 2019-07-23 09:10
利用定时器的比较捕获功能来模拟串口是完全可以的

一周热门 更多>