#include "STC12C5A.h"
#include "intrins.h"
#include "string.h"
#define uchar unsigned char
#define uint unsigned int
#define S2RI 0x01 //串口2接收中断请求标志位
#define S2TI 0x02 //串口2发送中断请求标志位
uchar xdata Data1_BUF[32],Data2_BUF[32];
uchar flag1,flag2,temp1,temp2;
uint m=0,n=0;
void delay(void)
{ uint j,g;
for(j=0;j<500;j++)
for(g=0;g<500;g++);
}
void Uart_Init (void)
{
SCON=0x50; //串口1工作方式1,
TMOD=0x20; //定时器1为工作方式2
TH1=0xFD; //产生9600bps
TL1=0xFD;
TR1=1;
S2CON=0x50; //工作方式一,允许接收
BRT=0xFD;
AUXR1=0x10;
AUXR=0x10;
IE2=0x01;
flag1=flag2=0;
ES=1;
EA=1;
}
void UART1_SendOneByte(uchar c)
{
SBUF = c;
while(!TI);
TI = 0;
}
void UART2_SendOneByte(uchar c)
{ S2BUF = c;
while(!(S2CON&S2TI));
S2CON&=~S2TI;
}
void UART1_SendString(char *p)
{ while(* p)
UART1_SendOneByte(*p++);
}
void UART2_SendString(char *p)
{
while(* p)
UART2_SendOneByte(*p++);
}
void UART_1Interrupt(void) interrupt 4
{ if(RI==1)
{ RI=0;
if(SBUF!='\0')
{ Data1_BUF[m++]=SBUF;}
else
{ flag1=1;
Data1_BUF[m]='\0';
m=0;
}
}
}
}
void UART_2Interrupt(void) interrupt 8
{
if(!(S2CON&S2RI))
{ S2CON&=~S2RI;
if(S2BUF!='\0')
{ Data2_BUF[n++]=S2BUF;}
else
{ flag2=1;
Data2_BUF[n]='\0';
n=0;
}
}
}
void main(void)
{ Uart_Init();
while(1);
{ if(flag1==1)
{ flag1=0;
UART2_SendString(Data1_BUF);
}
if(flag2==1)
{ flag2=0;
UART1_SendString(Data2_BUF);
}
}
}
STC12C5A单片机串口2接收数据给数组后,由串口1发送,反之也可以,求大神帮忙看看程序为啥不行?
答案:2 悬赏:50
解决时间 2021-03-06 08:47
- 提问者网友:温柔又任性
- 2021-03-05 11:36
最佳答案
- 二级知识专家网友:都不是誰的誰
- 2021-03-05 12:27
先确定2个串口独立发送都能接到数据
然后在其中一个串口接到数据的时候 在接收中断里开启另外一个串口的发送
这样是最直接的转发模式
如果先接收一个字符串 再启用发送 有可能会造成冲突的情况
如果有显示设备的话
可以写一个检测程序 显示单片机的运行状况
然后在其中一个串口接到数据的时候 在接收中断里开启另外一个串口的发送
这样是最直接的转发模式
如果先接收一个字符串 再启用发送 有可能会造成冲突的情况
如果有显示设备的话
可以写一个检测程序 显示单片机的运行状况
全部回答
- 1楼网友:安稳不如野
- 2021-03-05 12:43
#include "include.h" uchar databuff[20]; uint pin,pout; //串口1用于将系统采集到的信息发送给pc或路由 void uart1_init() { scon=0x50;//串口方式1,允许接收 tmod=0x21;//定时器1的方式2,定时器0的方式1 th1=0xfd;//gps接受信号波特率4800 //9600 tl1=0xfd;// pcon|=0x00; tr1=1;//启动定时器1 ren=1; // 允许接收 es=1; //允许串口中断 ea=1; // 开总中断 } void uart1_sendbyte(uchar i) { es=0;//发送数据时关中断 ti=0; sbuf=i; while(ti==0); ti=0; es=1; } void uart1_receive(void) interrupt 4 { uchar uc; if(ri) { ri=0; es=0;//接收数据时关闭串口中断 uc=sbuf; uart1_sendbyte(uc);//串口1将数据发给串口2 databuff[pin]=uc; pin++; if(pin>20) pin=0; } // ri=1; // es=1; //开串口中断 } //串口2用于接收gps信号 void uart2_init() { s2con=0x50;//方式2 允许接受 brt=0xfd;// 设置波特率9600 auxr|=0x10;//允许波特率发生器运行 auxr1&=0xef;//s2_p4=0 将uart2切换到p1口 ie2|=0x01;// 允许串口2中断 } void uart2_sendbyte(uchar i) { es=0; s2buf=i;// uart2发送数据 while((s2con&0x02)!=0x02); // s2con&=~0x02; // es=1; } void uart2_receive(void) interrupt 8 { uchar a; uint k=0; a=s2con&0x01; if(a==1) { k=s2buf; s2con&=0xfe; uart1_sendbyte(k); // gps(k);//将串口接收到的信息交给gps处理程序 s2con&=0xfd; } // else // s2con&=0xfd; // 清0 s2ri } void uart_printf(char a,uchar *p) { if(a==1) { while(*p!='\0') uart1_sendbyte(*p++); } if(a==2) { while(*p!='\0') uart2_sendbyte(*p++); } } 你好,你看一下这一个,我改的,正在用。。。希望对你有帮助
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯