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