IO模拟串口,程序运行有些不稳定,希望高手指点一下
[复制链接]
/*************************************************** 程序功能:IO口模拟串口 时钟是30K的,波特率9600 工作起来有时候稳定,有时候全是乱码,麻烦各位高手了。 --------------------------------------------------- 测试说明:在串口助手中看到输出的数组。 ***************************************************/ #include <msp430x14x.h> //#include "BoardConfig.h" int byte; int TX_Data; /****************主函数****************/
void senddata(unsigned char); void send(unsigned char*); void delay(void); void main(void) { WDTCTL = WDTPW + WDTHOLD;
// // 开启XT2振荡器 // BCSCTL1 &= ~XT2OFF; unsigned int i; do { IFG1 &=~OFIFG; for(i=0xff;i>0;i--); } while(IFG1 & OFIFG == OFIFG); // // MCLK,SMCLK选择XT2 // BCSCTL2 |= SELM_2+SELS;
int j=2000; while(j--);
_EINT(); //使能全局中断 for(int i=0;i<10;i++) send("abcdef\n"); LPM3; //CPU进入LPM3模式 }
void delay(void) { for(int i=0;i<20;i++) { } }
void send(unsigned char *ptr) { unsigned char nChar=0; while(ptr[nChar]!='\0') { byte=9; senddata(ptr[nChar++]); delay(); } byte=9; }
void senddata(unsigned char send) { TX_Data=0x200; int TX_temp=0x00; TX_temp|=send; TX_temp<<=1; TX_Data|=TX_temp; TX_temp=TX_Data; WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 P3DIR = 0x10; P3OUT = 0x10; // BoardConfig(0xf0); //关闭数码管和电平转换,打开流水灯 TBCCTL0 = CCIE; //使能CCR0中断 TBCCR0 = 2;
// TBCCR0 = 4094; //设定周期0.5S TBCTL = TBSSEL_1 + MC_1 + TBCLR; //定时器A的时钟源选择ACLK,增计数模式 //设置P2口方向为输出
}
/******************************************* 函数名称:Timer_B 功 能:定时器B的中断服务函数 参 数:无 返回值 :无 ********************************************/ #pragma vector = TIMERB0_VECTOR __interrupt void Timer_B (void) { int con=TX_Data&1; for(int i=0;i<=4;i++); if(con==0) P3OUT &= 0xEF; else P3OUT |= 0x10; TX_Data>>=1;
if(--byte==0) TBCTL &=~MC_3; }
不好意思了
|