?? msp430f149simulateuart.txt
字號:
/***********************************************
軟件模擬msp430串口,發(fā)送端
硬件資源:Timer_A,CCR0,UP Mode
時鐘選擇:MCLK=4.9MHz, ACLK32768Hz
數(shù)據(jù)發(fā)送端口:p1.3
發(fā)送數(shù)據(jù)幀:開始位(1b)+數(shù)據(jù)位(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;//每一位數(shù)據(jù)時間 波特率600 bitTime=56 波特率2400 bitTime=12 波特率4800 bitTime=6 調(diào)此數(shù)值來確定每一位脈沖的寬度(高電平占多長時間ms)來調(diào)節(jié)波特率
// 波特率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;//發(fā)送數(shù)據(jù)緩沖區(qū),10位
uchar bitCnt=0;//正在發(fā)送的數(shù)據(jù)位標(biāo)志
uchar i=0;//正在發(fā)送的數(shù)據(jù)的字節(jié)號
uchar stopFlag=0;//發(fā)送結(jié)束標(biāo)志
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();//設(shè)置發(fā)送緩沖區(qū)
while(!stopFlag);
stopFlag = 0;//一字節(jié)數(shù)據(jù)發(fā)送完成標(biāo)志清零
if(i==17) i=0;
}
}
/*************中斷服務(wù)程序*****************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void TA0_ISR(void)
{
TACTL &= ~TACLR;//TAR清零,保證下一次來中斷間隔時間正確
if(bitCnt<10)//發(fā)送數(shù)據(jù) 串口通信格式:起始位(0)+8位有效字節(jié)+校驗位(可選)+停止位(1)
{
// P3OUT = sendBuff<<1;
if(sendBuff&0x01)
P1OUT |= 0x08;//發(fā)送數(shù)據(jù)1
else
P1OUT &= 0xf7;//發(fā)送數(shù)據(jù)0
sendBuff>>=1;
//delay(5);
}
else
{
// TACTL &= ~MC_1;//停止定時器工作,也可以通過關(guān)中斷來實現(xiàn)
CCTL0 &= ~CCIE;
P1OUT |= BIT3;//發(fā)送口置高,準(zhǔn)備下一位數(shù)據(jù)的發(fā)送
stopFlag = 1;//一字節(jié)數(shù)據(jù)發(fā)送完成標(biāo)志,在主程序中置位
i++;//已經(jīng)發(fā)送數(shù)據(jù)的字節(jié)數(shù)
bitCnt = 0;//數(shù)據(jù)位標(biāo)志清零
//delay(1);
}
bitCnt++; //數(shù)據(jù)為標(biāo)志加1,下次進中斷發(fā)送下一位
}
/************子函數(shù)***********************/
//系統(tǒng)初始化
void InitSys()
{
volatile unsigned int m,n;
WDTCTL = WDTPW+WDTHOLD ;//關(guān)閉看門狗
SetClock();//設(shè)置時鐘
for (m=0; m<2000; m++) // Delay for crystal stabilization
{
//for (n=0; n<800; n++); //必須要延時20秒,模擬串口才穩(wěn)定
}
DCOCTL |= DCO0 + DCO1 + DCO2 ;
BCSCTL1 |= RSEL0 + RSEL1 + RSEL2;//設(shè)置DCO為4.9MHz
// BCSCTL1=0X04; //ACLK來源于LFXT1低頻模式,其頻率為32K,XT2開啟
//BCSCTL2=0X88; //MCLK與SMCLK均來源于XT2,分頻系數(shù)為1,頻率為8M
TACTL = TASSEL_1 + MC_1 + TACLR;//選擇Timer_A的時鐘為ACLK,UP mode 計數(shù),并清除TAR
TACCR0 = bitTime;//隔一個數(shù)據(jù)位的時間進一次中斷
CCTL0 = CCIE;
//P2DIR = 0x01; // P2.0-ACLK
//P2SEL |= 0x01; //從P2.0腳輸出晶振的波形
P1DIR |= BIT3;//P3.7口作為發(fā)送數(shù)據(jù)的出口,初始化為低電平
P1OUT |= BIT3;//不發(fā)送數(shù)據(jù)時,p3.7保持為高電平
}
//選擇時鐘,LF1XT工作在低頻狀態(tài)
void SetClock()
{
volatile unsigned int j;
while(IFG1 & OFIFG) //上電后,寄存器IFG1的初值為0x82
{
IFG1 &= ~OFIFG;
for (j=0xff;j>0;j--);
}
}
//設(shè)置發(fā)送緩沖區(qū)
void SetBuff()
{
bitCnt = 0;//數(shù)據(jù)位標(biāo)志清零
sendBuff = sendData[i];
sendBuff <<=1;
sendBuff |= 0x200; //加上開始位和停止位
/*sendBuff = 0x200;//加上開始位和停止位
//430的編譯器不支持位操作,涉及到位操作的盡量用其他方式代替
sendData[i]<<=1;//
sendBuff |= sendData[i];//組成要發(fā)送的幀*/
stopFlag = 0;//清發(fā)送結(jié)束標(biāo)志
TACTL |= MC_1;//UP Mode
CCTL0 |= CCIE;//開中斷,開始比較模式發(fā)送數(shù)據(jù)
_EINT();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -