这个更没玩过了
模拟串口很占用CPU资源,还是考虑串口在不同的管脚上切换为宜。
wulin 发表于 2026-5-5 20:04
模拟串口很占用CPU资源,还是考虑串口在不同的管脚上切换为宜。
我整个程序就是串口转发,不做其他的事情 tlxfif 发表于 2026-5-5 22:11
我整个程序就是串口转发,不做其他的事情
如果转发的信息只发不收,上位机一个TxD可以接若干个下位机RxD。 8H至少都有2个串口,加上引脚切换足够使用了,何必还要去模拟一个串口呢? tlxfif 发表于 2026-5-5 22:11
我整个程序就是串口转发,不做其他的事情
模拟串口,可以根据实际需要定义端口。
#include "STC8H.h"
typedef unsigned char uchar;
typedef unsigned int uint;
sbit RXB = P3^0; //定义UART TX/RX端口
sbit TXB = P3^1;
uchar TBUF,RBUF;
uchar TDAT,RDAT;
uchar TCNT,RCNT;
uchar TBIT,RBIT;
bit TING,RING;
bit TEND,REND;
uchar t, r;
uchar buf;
//初始UART模块
void UART_INIT()
{
TING = 0;
RING = 0;
TEND = 1;
REND = 0;
TCNT = 0;
RCNT = 0;
TMOD = 0x02; //8位自动重载12T模式
TL1 = 0xE8; //设定定时初值(波特率1200)
TH1 = 0xE8; //设定定时器重装值
// TMOD = 0x00; // 16位自动重载模式中的Time0
// AUXR = 0x80; // 1T工作模式
// TL0 = BAUD;
// TH0 = BAUD>>8; // 初始Time0和设置重载值
TR0= 1; // tiemr0开始运行
ET0= 1; // 启用Time0中断
PT0= 1; // 提高定时中断优先级
EA = 1; // 打开全局中断开关
}
//
void main()
{
P0M0 = 0x00;P0M1 = 0x00;
P1M0 = 0x00;P1M1 = 0x00;
P2M0 = 0x00;P2M1 = 0x00;
P3M0 = 0x00;P3M1 = 0x00;
P4M0 = 0x00;P4M1 = 0x00;
P5M0 = 0x00;P5M1 = 0x00;
P6M0 = 0x00;P6M1 = 0x00;
P7M0 = 0x00;P7M1 = 0x00;
UART_INIT(); //初始UART模块
while (1)
{ //用户功能
if (REND) //接收完成标志为真
{
REND = 0;//接收完成标志清0
buf = RBUF;//保存在缓存中
}
if (TEND)
{
if (t != r)
{
TEND = 0;
TBUF = buf;//发送缓存中数据
TING = 1;
}
}
}
}
//UART定时器中断例程
void tm0() interrupt 1 using 1
{
if (RING)
{
if (--RCNT == 0)
{
RCNT = 3; //重置发送波特率计数器
if (--RBIT == 0)
{
RBUF = RDAT; //将数据保存到RBUF
RING = 0; //停止接收
REND = 1; //设置接收完成标志
}
else
{
RDAT >>= 1;
if (RXB) RDAT |= 0x80;//将RX数据转换为RX缓冲区
}
}
}
else if (!RXB)
{
RING = 1; //设置开始接收标志
RCNT = 4; //初始接收波特率计数器
RBIT = 9; //initial receive bit number (8 data bits + 1 stop bit)
} //初始接收比特数(8个数据位+ 1个停止位)
if (--TCNT == 0)
{
TCNT = 3; //重置发送波特率计数器
if (TING) //判断是否发送
{
if (TBIT == 0)
{
TXB = 0; //发送起始位
TDAT = TBUF; //加载数据 TBUF 到 TDAT
TBIT = 9; //initial send bit number (8 data bits + 1 stop bit)
} //初始发送比特数(8个数据位+ 1个停止位)
else
{
TDAT >>= 1; //将数据转换到CY
if (--TBIT == 0)
{
TXB = 1;
TING = 0; //停止发送
TEND = 1; //设置发送完成标志
}
else
{
TXB = CY; //将CY写入TX端口
}
}
}
}
}
wulin 发表于 2026-5-6 13:36
模拟串口,可以根据实际需要定义端口。
非常感谢{:aixin:}
页:
1
[2]