欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
MSP430單片機(jī)軟件串口的例子 定時器TA串口
[打印本頁]
作者:
51hei單片
時間:
2016-3-14 18:46
標(biāo)題:
MSP430單片機(jī)軟件串口的例子 定時器TA串口
本程序是《MSP430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐》書里面的源碼,(包含工程文件 (例2.8.21)))完整例程下載:
http://m.raoushi.com/bbs/dpj-46245-1.html
‘
關(guān)于本程序的詳細(xì)解說大家可以下載電子書點(diǎn)擊上圖即可
// 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所需的時間(略作調(diào)整)
#define Bitime 0x6C // 9600波特率(實(shí)際9620),一比特所需時間
unsigned int RXTXData; // 軟件模擬的串口收發(fā)緩存變量
unsigned char BitCnt; // 比特計(jì)數(shù)
void TX_Byte (void);
void RX_Ready (void);
void main (void)
{
WDTCTL = WDTPW + WDTHOLD; // 關(guān)狗
FLL_CTL0 |= XCAP18PF; // 晶振匹配電容
TACCTL0 = OUT; // TXD腳默認(rèn)置高
TACTL = TASSEL_2 + MC_2; // TA時鐘選用SMCLK, 連續(xù)模式
P1SEL = BIT0 + BIT1; // P1.0與P1.1分別作為TXD與RXD功能
P1DIR |= BIT0 ; // P1.0輸出(TXD)
_EINT(); // 開啟總中斷
while(1)
{
RX_Ready(); // 接收一個字節(jié)
LPM0; // 休眠,等待接受完喚醒
TX_Byte(); // 將受到的數(shù)據(jù)原樣發(fā)回
}
}
// 將RXTXData變量內(nèi)的數(shù)據(jù)從軟件串口中發(fā)出
void TX_Byte (void)
{
BitCnt = 10; // 8位數(shù)據(jù)+起始+結(jié)束共10比特
TACCR0 = TAR; // 得到當(dāng)前TAR值
TACCR0 += Bitime; // 第一次中斷設(shè)在1比特時間之后
RXTXData |= 0x100; // 最高位之后添加結(jié)束位(1)
RXTXData = RXTXData << 1; // 最低位之前添加起始位(0)
TACCTL0 = OUTMOD0 + CCIE; // TA0(P1.0)電平由OUT標(biāo)志決定
while ( TACCTL0 & CCIE ); // 等待發(fā)送完成
}
// 開始接收字節(jié),接收結(jié)果將存于RXTXData變量內(nèi)
void RX_Ready (void)
{
BitCnt = 8; // 接收數(shù)據(jù)共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比特時間,為下次中斷做準(zhǔn)備
// RX
if (TACCTL0 & CCIS0) // 如果是接收定/捕獲時中斷
{
if( TACCTL0 & CAP ) // 如果是第一個比特(起始位)
{
TACCTL0 &= ~ CAP; // 變成比較模式(定時中斷)
CCR0 += Bitime_5; // 偏移半個比特,判斷比特中間電平
}
else // 如果是之后的比特(數(shù)據(jù)位)
{
RXTXData = RXTXData >> 1; //接收緩存字節(jié)移位
if (TACCTL0 & SCCI) //根據(jù)RXD(P1.1)引腳電平獲得當(dāng)前比特位
RXTXData |= 0x80; //低位在先
BitCnt --; // 所有的8比特都接收完畢?
if ( BitCnt == 0)
//------------------------這里相當(dāng)于接收1字節(jié)中斷--------------------------
{
CCTL0 &= ~ CCIE; // 所有都接收完畢關(guān)閉比較/捕獲模塊1的中斷
__low_power_mode_off_on_exit(); // 退出時喚醒CPU
}
//--------------------------------------------------------------------------
}
}
// TX
else // 如果是發(fā)送定/捕獲時中斷
{
if ( BitCnt == 0)
TACCTL0 &= ~ CCIE; // 所有比特都發(fā)送完畢,關(guān)閉比較/捕獲模塊1的中斷
else //依次發(fā)送每個比特
{
TACCTL0 |= OUTMOD2; // 發(fā)送“1”
if (RXTXData & 0x01)
TACCTL0 &= ~ OUTMOD2; // 發(fā)送“0”
RXTXData = RXTXData >> 1; // 下一比特
BitCnt --; // 發(fā)送比特計(jì)數(shù)
}
}
}
復(fù)制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1