標題:
msp430單片機定時器模擬串口
[打印本頁]
作者:
hubaba
時間:
2016-3-30 19:00
標題:
msp430單片機定時器模擬串口
不知道怎么的,我的開發(fā)板沒有定串口,所以只好想法子看怎么才能實現(xiàn)定時器的功能,網(wǎng)上一搜還真的可以,所以分享給大家。我用的是msp430g2231.
部分源碼預覽(完整版本請下載附件)
#include <msp430G2231.h>
#include "uart.h"
static uchar bitcnt=0;
static uint uart_buf;
static uchar RXData0; //用來存儲接收的8位數(shù)據(jù)
static uchar RXBitCnt0;//接收數(shù)據(jù)位數(shù)
uchar rx_sign=0;
volatile int Send_flag=0;
void FaultRoutine(void)
{
while(1);// 異常掛起
}
void ConfigClocks()
{
uint i;
for(i = 0; i < 0xFFFF; i++){};
_BIS_SR(OSCOFF);
if(CALBC1_1MHZ==0xff||CALDCO_1MHZ==0xff)
{
while(1);
}
BCSCTL1 = CALBC1_1MHZ;// Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation
BCSCTL2 |=SELM_0+DIVS_0+DIVM_0;; // MCLK = DCO = SMCLK=1MHZ
}
void ConfigPins()
{
P1DIR |= TXD+LED+BIT6;
P1SEL |=RXD;
P1DIR &= ~RXD; // P1.2 input, other outputs
P1OUT |= TXD; // clear output pins
P1OUT &=~LED;
}
//----------發(fā)送一個字節(jié)------------------------------------------//
void send_char(uchar tchar)
{
TACTL = TACLR + TASSEL_2; //清零計數(shù)器 選擇SMCLK時鐘
CCR0 = BITTIME_1b; //crr0定時間隔為1bit時間寬度
CCTL0 |= CCIE; //打開CCR0中斷
bitcnt = 10; //待發(fā)送的位數(shù),1位開始位,8位數(shù)據(jù)位,1位停止位
uart_buf = 0x0100; //stop bit 停止位
uart_buf |= tchar; //data bit 數(shù)據(jù)位
uart_buf <<=1;//start bit.開始位
Send_flag = 0;
TACTL |= MC_1; //Start TA, Timer A mode control: 1 - Up to CCR0
_BIS_SR(GIE);
while(!Send_flag); //wait until send complete
Send_flag = 1;
}
//---------------------------------------------------------------------//
void RXReady(void)
{
// RXBitCnt0=0x08;//初始化接收數(shù)據(jù)計數(shù)器
TACTL=TASSEL_2+MC_2+TACLR;//SMCLK 連續(xù)記數(shù)模式 清零計數(shù)器
TACCTL1=CM_2+CAP+SCS+CCIE+CCIS_0;
//下降沿捕獲 同步捕獲源 捕獲模式 捕獲中斷使能 捕獲輸入為CCI1A
_EINT();
}
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void) //串口發(fā)送程序處理過程,位操作
{
if(bitcnt>0)
{
if(uart_buf & 0x01)
POUT |= TXD;//發(fā)送數(shù)據(jù)1
else
POUT &= ~TXD;//發(fā)送數(shù)據(jù)0
uart_buf >>= 1;
bitcnt--;
}
else
{
POUT|=TXD;//默認狀態(tài)置高
TACTL &= ~MC_3; //Close the TA when a Byte send over. 00 停止模式
CCTL0 &= ~CCIE; //關(guān)閉CCR0中斷
Send_flag = 1;
}
}
//---------------------------------------------------------------------//
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1 (void) //接收串口數(shù)據(jù)處理過程,利用串口協(xié)議的時間間隔來進行。
{
P1OUT ^= LED;
TACCR1+=BITTIME_1b;//增加一位定時間隔
if(TACCTL1&CAP) //判斷是否為捕獲模式
{
RXBitCnt0=0;
}
switch(RXBitCnt0)
{
case 0: //為捕獲模式
RXData0=0;//清空緩沖區(qū)
TACCR1+=BITTIME_1b5;
TACCTL1&=~CAP;//改為比較模式
RXBitCnt0++;
break;
case 9: //比較模式改為捕獲模式
TACCTL1|=CAP;
rx_sign=1; //作為接收完畢的信號
break;
default://1~8 有效數(shù)據(jù)位
RXData0=RXData0>>1;//右移一位,等待下一個數(shù)據(jù)進來
if(TACCTL1&SCCI)RXData0|=0x80;//輸入為1
RXBitCnt0++;
break;
}
}
復制代碼
全部源碼下載:
msp430G2231_uart.rar
(45.71 KB, 下載次數(shù): 53)
2016-3-30 18:59 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
msp430g2452.pdf
(266.87 KB, 下載次數(shù): 22)
2016-3-30 18:59 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
51hei電控2112311
時間:
2016-6-4 02:08
定時器模擬串口可行,但波特率要設置低點穩(wěn)定些
作者:
guichenyang
時間:
2017-2-26 13:09
非常感謝,但是我怎么下載不了啊
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1