完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
430的串口和定时器模拟的串口为什么只能用一个啊? (程序附在下面,大侠帮忙看一下) #include "msp430x15x.h" #include #include #include "BoardConfig.h" #include "UART.h" #include "12864.h" #define LED_H P2OUT |= BIT7 #define LED_L P2OUT &=~BIT7 #define uchar unsigned char #define uint unsigned int #define TBIT1 2; //TBIT为1位时间 #define TBIT_5 1; //TBIT_5为半位时间 #define TXD 0x0002 #define RXD 0x0004 #define TEN 0x0001 //发送允许位 uchar GBIT=0x00; //通用位区 uint TR_COUNT; //发收计数器 uint T_DATA; //发送缓冲器 uint R_DATA; //接收缓冲器 void delay_t(uint t) { uint i; for(i=0;i } void delay_N(uchar i) { uchar t; for(t=0;t delay_t(50000); } /**********选择系统主时钟为8MHz********/ void clock_init() { unsigned int i; BCSCTL1 &= ~XT2OFF; // 打开XT2高频晶体振荡器 do { IFG1 &= ~OFIFG; //清除晶振失败标志 for (i = 0xFF; i > 0; i--); // 等待8MHz晶体起振 } while ((IFG1 & OFIFG)); // 晶振失效标志仍然存在? BCSCTL2 |= SELM_2+SELS; //主时钟选择高频晶振 } /**********定时器A模拟串口初始化**************/ void timerA_UART_init() { P1DIR |= BIT0; P1OUT &=~BIT0; //设DE485=0;-接收允许 P1DIR |= TXD; //P1.1设位输出—TXD P1SEL |= TXD; //P1.1设为使用外围模块 P2DIR &=~RXD; //P2.2设为输入—RXD P2SEL |= RXD; //P2.2设为使用外围模块 CCTL0 |= OUT; //CCR0的OUT设1(OUT定义为0x0004) TACTL |= TASSEL0 + MC0; //设定时器为连续模式,同时启动计时 _EINT(); //开启总中断允许 } /**********发送一个字节函数*************/ void TXD_Byte(uchar byte) { T_DATA = byte; CCR0 = TAR; //将TAR时间存入CCR0,确定第一位的长度 CCR0 = CCR0 + TBIT1; //将每1位时间周期加入CCR0 T_DATA = T_DATA<<1; //将字节数据向左移一位,构造最低位为起始位 T_DATA = T_DATA|0x0200; //将字节的第10位设为1,以作停止位使用 TR_COUNT = 10; //发送计数器 CCTL0 = OUTMOD0 + CCIE; //重新设置CCTL0(CCIS1-0=00) //捕获/比较模块输出模式1,允许模块中断 while(CCIE & CCTL0); //等待CCIE是否为0?为真,则表示发送完数据 } /**********接收数据函数**************/ void RXD_data(void) { TR_COUNT = 8; //接收数据位的位数 //设置比较捕获控制寄存器0的设置 //比较捕获为输出模式+比较捕获模块为中断允许+下降沿捕获+设置为捕获模式 //+选择CCI0B为捕获源+同步捕获 CCTL0 = OUTMOD0 + CCIE + CM1 + CAP + CCIS0 + SCS; } void IO_init() { P2DIR |= BIT7; P2OUT |= BIT7; } void Test() { if(R_DATA == 0x89 || R_DATA == 0xC9 || R_DATA == 0x91 || R_DATA == 0xD1|| R_DATA == 0x99 || R_DATA == 0xD9 || R_DATA == 0xA1 || R_DATA == 0xE0) { LED_L; } else if(R_DATA == 0x88 || R_DATA == 0xC8 || R_DATA == 0x90 || R_DATA == 0xD0|| R_DATA == 0x98 || R_DATA == 0xD8 || R_DATA == 0xA0 || R_DATA == 0xC0) { LED_H; } } /****************发送单个数据函数************************/ void Send_data(uchar da) { //while (!(IFG1 & UTXIFG0)); //等待以前的字符发送完毕 TXBUF0=da; //while (!(IFG1 & UTXIFG0)); delay_t(100); //延时数据发送(大约延时2s) } // 发送温度数据 void Send_Temp(unsigned char *ZJ) { uint i; while(!(IFG1 & UTXIFG0)); for(i=0;i<2;i++) { TXBUF0=ZJ; while(!(IFG1 & UTXIFG0)); } delay_t(100); //延时控制发送一个字节 } // 发送烟雾数据 void Send_Smoke(unsigned char *ZJ) { uint i; while(!(IFG1 & UTXIFG0)); for(i=0;i<2;i++) { TXBUF0=ZJ; while(!(IFG1 & UTXIFG0)); } delay_t(100); //延时控制发送一个字节 } /****************接收数据函数***********************/ void Receive_data() { uchar RX_buf; uchar RX[2]; uint ptr[3], aa[2]; uint count1, count2; uchar TT[2], SS[2]; RX_buf=U0RXBUF; //接收缓存器 while(!(IFG1&UTXIFG0)); delay_t(500); RX[0]=RX[1]; RX[1]=RX_buf; if(RX[0]=='T') { count1=(uint)RX[1]; if(count1 <= 80) { Send_data('T'); ptr[0]=count1/10; ptr[1]=count1%10; TT[0] = ptr[0]+48; TT[1] = ptr[1]+48; Send_Temp(TT); write_cmd(0x95); write_dat(0x30+ ptr[0]); write_dat(0x30+ptr[1]); } } else if(RX[0]=='S') { count2=(uint)RX[1]; if(count2 <= 80) { Send_data('S'); aa[0]=count2/10; aa[1]=count2%10; SS[0] = aa[0]+48; SS[1] = aa[1]+48; Send_Smoke(SS); write_cmd(0x85); write_dat(0x30+aa[0]); write_dat(0x30+aa[1]); } } } void display_12864() { uchar i; write_cmd(0x80); //设定首次显示位置 for(i=0;table1!=' |