标题:
MSP430单片机软件串口的例子 定时器TA串口
[打印本页]
作者:
51hei单片
时间:
2016-3-14 18:46
标题:
MSP430单片机软件串口的例子 定时器TA串口
本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,(包含工程文件 (例2.8.21)))完整例程下载:
http://www.51hei.com/bbs/dpj-46245-1.html
‘
关于本程序的详细解说大家可以下载电子书点击上图即可
// MSP430F413
// -----------------
// /|\| XIN|-
// | | | 32kHz
// --|RST XOUT|-
// | |
// | P1.0/CCI0A/TX|--------->
// | | 9600 8N1
// | P1.1/CCI0B/RX|<---------
//
//*****************************************************************************
#include <msp430x41x.h>
//波特率=9600 软件串口的例子
#define Bitime_5 0x47 // 大约0.5bit所需的时间(略作调整)
#define Bitime 0x6C // 9600波特率(实际9620),一比特所需时间
unsigned int RXTXData; // 软件模拟的串口收发缓存变量
unsigned char BitCnt; // 比特计数
void TX_Byte (void);
void RX_Ready (void);
void main (void)
{
WDTCTL = WDTPW + WDTHOLD; // 关狗
FLL_CTL0 |= XCAP18PF; // 晶振匹配电容
TACCTL0 = OUT; // TXD脚默认置高
TACTL = TASSEL_2 + MC_2; // TA时钟选用SMCLK, 连续模式
P1SEL = BIT0 + BIT1; // P1.0与P1.1分别作为TXD与RXD功能
P1DIR |= BIT0 ; // P1.0输出(TXD)
_EINT(); // 开启总中断
while(1)
{
RX_Ready(); // 接收一个字节
LPM0; // 休眠,等待接受完唤醒
TX_Byte(); // 将受到的数据原样发回
}
}
// 将RXTXData变量内的数据从软件串口中发出
void TX_Byte (void)
{
BitCnt = 10; // 8位数据+起始+结束共10比特
TACCR0 = TAR; // 得到当前TAR值
TACCR0 += Bitime; // 第一次中断设在1比特时间之后
RXTXData |= 0x100; // 最高位之后添加结束位(1)
RXTXData = RXTXData << 1; // 最低位之前添加起始位(0)
TACCTL0 = OUTMOD0 + CCIE; // TA0(P1.0)电平由OUT标志决定
while ( TACCTL0 & CCIE ); // 等待发送完成
}
// 开始接收字节,接收结果将存于RXTXData变量内
void RX_Ready (void)
{
BitCnt = 8; // 接收数据共8比特
CCTL0 = SCS + CCIS0 + OUTMOD0 + CM1 + CAP + CCIE; // 用捕获模式接收
// 同步模式, P1.1(RXD),下降沿捕获, 开中断
}
#pragma vector=TIMERA0_VECTOR // Timer_A的捕获比较模块0的中断
__interrupt void Timer_A (void)
{
TACCR0 += Bitime; // TACCR0偏移1比特时间,为下次中断做准备
// RX
if (TACCTL0 & CCIS0) // 如果是接收定/捕获时中断
{
if( TACCTL0 & CAP ) // 如果是第一个比特(起始位)
{
TACCTL0 &= ~ CAP; // 变成比较模式(定时中断)
CCR0 += Bitime_5; // 偏移半个比特,判断比特中间电平
}
else // 如果是之后的比特(数据位)
{
RXTXData = RXTXData >> 1; //接收缓存字节移位
if (TACCTL0 & SCCI) //根据RXD(P1.1)引脚电平获得当前比特位
RXTXData |= 0x80; //低位在先
BitCnt --; // 所有的8比特都接收完毕?
if ( BitCnt == 0)
//------------------------这里相当于接收1字节中断--------------------------
{
CCTL0 &= ~ CCIE; // 所有都接收完毕关闭比较/捕获模块1的中断
__low_power_mode_off_on_exit(); // 退出时唤醒CPU
}
//--------------------------------------------------------------------------
}
}
// TX
else // 如果是发送定/捕获时中断
{
if ( BitCnt == 0)
TACCTL0 &= ~ CCIE; // 所有比特都发送完毕,关闭比较/捕获模块1的中断
else //依次发送每个比特
{
TACCTL0 |= OUTMOD2; // 发送“1”
if (RXTXData & 0x01)
TACCTL0 &= ~ OUTMOD2; // 发送“0”
RXTXData = RXTXData >> 1; // 下一比特
BitCnt --; // 发送比特计数
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1