各位高手,我想实现这样一个功能: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://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |