我找到串口2了 但手里只有1个编程器,只能连1个串口,我写了1个同时自动向两个串口发送相同数据的程序,仅供参考。我的是STC15F2K60S2 应该和你的通用 主函数内屏蔽掉的程序是串口1接收部分,应该很好改成你要的方式,不知道你是要求1进2出,还是2进1出,还是双向都存在!
/*******************************************************************************************
* RS485通信试验(发送) *
* *
* CPU:STC15F2K60S2 115200,N,8,1 @11.0592M *
**
*接收信号并经过处理后反馈 *
*********************************************************************************************/
#include <REG52.H>
#include <STDIO.H>
#include <INTRINS.H>
#define U8 unsigned char
#define U16 unsigned int
#define U32 unsigned long
sfr AUXR = 0x8e; //辅助寄存器
sfr T2H = 0xd6; //定时器2高8位
sfr T2L = 0xd7; //定时器2低8位
sfr P5 = 0xC8;
sfr S2BUF = 0x9B;
sfr IE2 = 0xaf;
sfr S2CON = 0x9a;
sbit DIR = P3^2; //定义485的使能脚
sbit DIR2 = P3^3;
#define S2RI 0x01 //S2CON.0
#define S2TI 0x02 //S2CON.1
bit flagTxd = 0; //单字节发送完成标志,用来替代TXD中断标志位
bit flagTxd2 = 0;
U8 cntRxd = 0; //接收字节计数器
U8 cntRxd2 = 0;
U8 flagRxd = 0;//收到新字节标志
U8 flagRxd2 = 0;
U8 pdata bufRxd[64]; //接收字节缓冲区
U8 pdata bufRxd2[64];
/**************************************
延时程序
**************************************/
void Delay1ms()//@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void Delay(unsigned int i)
{
do
{
Delay1ms();
}while (--i);
}
/**************************************
串口初始化程序
**************************************/
void UartInit(void)//9600bps@11.0592MHz
{
SCON = 0x50;//8位数据,可变波特率
S2CON =0X50;
AUXR |= 0x01;//串口1选择定时器2为波特率发生器
AUXR |= 0x04;//定时器2时钟为Fosc,即1T
T2L = 0xE8;//设定定时初值
T2H = 0xFF;//设定定时初值
AUXR |= 0x10;//启动定时器2
ES = 1; //使能串口1中断
IE2 = 0x01; //使能串口2中断
EA = 1;
}
/* 串口数据写入,即串口发送函数,buf-待发送数据的指针,len-指定的发送长度 */
void UartWrite(U8 *buf, U8 len)
{
DIR = 1; //RS485设置为发送
while (len--) //循环发送所有字节
{
flagTxd = 0; //清零发送标志
SBUF = *buf++; //发送一个字节数据//S2BUF
while (!flagTxd); //等待该字节发送完成
}
Delay(1); //等待最后的停止位完成
DIR = 0; //RS485设置为接收
}
void UartWrite2(U8 *buf, U8 len)
{
DIR2 = 1; //RS485设置为发送
while (len--) //循环发送所有字节
{
flagTxd2 = 0; //清零发送标志
S2BUF = *buf++; //发送一个字节数据//S2BUF
while (!flagTxd2); //等待该字节发送完成
}
Delay(1); //等待最后的停止位完成
DIR2 = 0; //RS485设置为接收
}
void main (void) {
U8 pdata Data[64]; //接收字节缓冲区
//U8 i;
UartInit();
Data[0]=0;
while(1)
{ Data[0]++;
/* DIR = 0;
if (flagRxd==1)
{
Delay(5);
for (i=0;i<cntRxd;i++)
{
Data[i]=bufRxd[i];
}
UartWrite(Data,cntRxd);
cntRxd=0;
flagRxd=0;
} */
UartWrite(Data,1);
Delay(100);
UartWrite2(Data,1);
Delay(900);
}
}
/* 串口中断服务函数 */
void InterruptUART() interrupt 4
{
if (RI) //接收到新字节
{
RI = 0; //清零接收中断标志位
flagRxd=1;
if (cntRxd < sizeof(bufRxd)) //接收缓冲区尚未用完时,
{ //保存接收字节,并递增计数器
bufRxd[cntRxd++] = SBUF;
}
}
if (TI) //字节发送完毕
{
TI = 0; //清零发送中断标志位
flagTxd = 1; //设置字节发送完成标志
}
}
void InterruptUART2() interrupt 8
{
if (S2CON & S2RI) //接收到新字节
{
S2CON &= ~S2RI; //清零接收中断标志位
}
if (S2CON & S2TI) //字节发送完毕
{
S2CON &= ~S2TI; //清零发送中断标志位
flagTxd2 = 1; //设置字节发送完成标志
}
}