各位高手,我想實現這樣一個功能:stc12c5a60s2具有兩個串口,叫做串口1和串口2。通過串口1接收任意字節的數據,并通過串口2發送到電腦的串口調試工具。程序思路是這樣:通過串口一接收數據,通過定時器中斷來判斷是否接收數據完畢,這里設置的時間大約為10ms。當數據發送完畢超過10ms后會觸發定時器中斷,定時器中斷函數會觸發發送標志位。主程序會把串口1接收到的數據從串口2發送出去。請各位指正一下代碼的錯誤,并提示如何編寫這段代碼 程序代碼如下: 這是主函數程序文件,即main.c #include "STC12C5A60S2.H" #include "Serial.h" unsigned int data p_send=0; void main() { Uart_Two_Init(); Uart_One_Init(); //判斷串口1發送標志位是否為1 while(1) { if(rec1_flag==1) //如果是1 { rec1_flag=0; while(p_send<=rec1_count)//判斷發送指針的值是否小于全局計數器 { //如果是 Uart_One_Send(rec1_data[p_send]);//開始發送數據 p_send=p_send+1; } ES=1; //如果不是 //停止發送數據 //開串口1中斷 } } 串口文件,serial.h #define uchar unsigned char #define uint unsigned int unsigned char data rec1_count=0;//串口1接收計數器 unsigned int data rec1_flag=0; //串口1接收標志位 unsigned char xdata rec1_data[100]={0};//串口1接收緩沖區 //定時器0初始化 void Timer0_Init() { TMOD=TMOD||0x02; TH0= 0xff; TL0= 0xff; } //=======baud 9600======================= void Uart_One_Init() //串口1初始化函數,波特率9600 { TMOD=0x22;//設置定時器1為工作方式2 TH1=0xfd; //設置波特率為9600 TL1=0xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; // AUXR|=0X40; //T1*12; } //======================================== void Uart_One_Send(char k) //串口1發送一個字符 { ES = 0 ; SBUF=k; while(TI!=1); TI = 0 ; ES = 1 ; } //=========baud 9600======================= void Uart_Two_Init() //串口2初始化函數,波特率9600 { S2CON= 0x50 ; //方式2,允許接收 // BRT = RELOAD_TWO ; BRT = 0xfd; //設置波特率9600 AUXR = AUXR |0X10 ; //允許獨立波特率發生器運行 // BRTx12_enable(); AUXR1 = AUXR1&0xef ; //S2_P4=0,將uart2切換到P1口 IE2 = IE2|0X01; //允許串口2中斷 } //========================================= void Uart_Two_Send(uchar k) //串口2發送一個字符 { ES = 0 ; S2BUF = k ; while((S2CON&0x02)!=0x02); S2CON &= ~0x02; ES = 1 ; } //============================================= void Uart_One_Receive() interrupt 4 { if(RI==1) { RI = 0; //定時器從0開始計數 TF0=0; //開定時器,定時器開始計數 TR0=1; if(SBUF!=0xff)//接收數據 { rec1_data[rec1_count++]=SBUF; } //全局計數器加1 TR0=0; TF0=0; //關定時器 } } //======================================== void Uart_Two_Receive() interrupt 8 { S2CON = S2CON & 0xfe;//清0 S2RI //S2CON = S2CON | 0x01; } //===================================== void Timer0() interrupt 3 { //發送標志位置1 rec1_flag=1; //關閉串口中斷 } |
歡迎光臨 (http://m.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |