|
各位高手,我想實現這樣一個功能: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;
//關閉串口中斷
} |
|
|