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