stc12c5a16s2 双串口通信无法完成

我试写 串口一接受PC的数据,经过串口一发送给串口2接收端,串口2接受后,送到P0口,程序不报错,结果不对,求大神知道,纠结好久了
代码如下:
/***********************************************************************

芯片:STC12C5A60S2
晶振:22.1184MHz 波特率:9600bps
引脚定义:串行口1: 发送————TxD/P3.1; 接收————RxD/P3.0
串行口2: 发送————TxD2/P1.3;接收————RxD2/P1.2

***********************************************************************/
#include<stc12c5a16s2.h>
#define S2RI 0x01 //串口2接收中断请求标志位
#define S2TI 0x02 //串口2发送中断请求标志位
unsigned char flag1,flag2,temp1,temp2;
/****************串行口初始化函数****************/
void InitUART(void)
{
TMOD = 0x21; //定时器1工作在方式2 8位自动重装
SCON = 0x50; //串口1工作在方式1 10位异步收发 REN=1允许接收
TH1 = 0xFD; //定时器1初值
TL1 = TH1;
TR1 = 1; //定时器1开始计数
EA =1; //开总中断
ES =1; //开串口1中断

S2CON = 0x50; //串口2工作在方式1 10位异步收发 S2REN=1允许接收
BRT = 0xFD; //独立波特率发生器初值
AUXR = 0x10; //BRTR=1 独立波特率发生器开始计数
AUXR1=0x10;//S2_P4=0 将uart2切换到p1口;
IE2 =0x01; //开串口2中断 ES2=1
}
/****************串行口1发送****************/
void UART_1SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI); //若TI=0,在此等待
TI = 0;
// P0=0;
}
/****************串行口2发送****************/
void UART_2SendOneByte(unsigned char c)
{
S2BUF = c;
while(!(S2CON&S2TI)); //若S2TI=0,在此等待
S2CON&=~S2TI; //S2TI=0
}
/*****************主函数******************/
void main(void)
{
InitUART(); //串行口初始化
while(1)
{
//如果串口1接收到数据,将此数据由串口2发送
if(flag1==1)
{
flag1=0;
UART_1SendOneByte(temp1);
}
//如果串口2接收到数据,将此数据由串口1发送
/*if(flag2==1)
{
flag2=0;
UART_2SendOneByte(temp2);
}*/
}
}
/************串行口1中断处理函数*************/
void UART_1Interrupt(void) interrupt 4
{
if(RI==1)
{
RI=0;
flag1=1;
temp1=SBUF;
//P0=temp1;

}
}
/************串行口2中断处理函数*************/
void UART_2Interrupt(void) interrupt 8
{
if(S2CON&S2RI)
{
S2CON&=~S2RI;
flag2=1;
temp2=S2BUF;
P0=temp2;
}
}

第1个回答  2014-05-02
1、有中断的话,建议收和发都使用中断的。
2、程序配制,双串口时,不建议使用T1作波特率定时用,容易搞混。
void Uart1_Inti(void)
{
SCON=0x50; //设置串口以方式1,允许接收数据,
BRT=0xfd; //波特率9600,晶振11.0592MHz.
AUXR = 0x11; //
ES =1 ;//关串口中断.
}
void Uart2_Inti(void)
{
S2CON = 0x50; //设置串口2以方式1,允许接收数据
BRT = 0xfd; //波特率设为9600
AUXR = 0x11; //
IE2 = 0x01; //允许串2中断
}
3、建议串口单独先调试正确。
void UART1_Int_Service() interrupt 4
{
uint8 ch;
if(RI)
{
RI=0;
ch=SBUF;
SBUF=ch;
}
if(TI)
{
TI=0;
}
}

/*****************************************
*串口2中断
*****************************************/
#define S2RI 0x01
#define S2TI 0x02
void UART2_Int_Service() interrupt 8
{
uint8 ch;
if (S2CON & S2RI) //接收中断。
{
S2CON &= ~S2RI; //RI=0
ch=S2BUF;
S2BUF=ch;
}
if(S2CON&S2TI)
{
S2CON&=(~S2TI);//TI=0;
}
}