wulin 发表于 2026-5-5 20:04:12

tlxfif 发表于 2026-5-4 18:12
这个更没玩过了

模拟串口很占用CPU资源,还是考虑串口在不同的管脚上切换为宜。


tlxfif 发表于 2026-5-5 22:11:11

wulin 发表于 2026-5-5 20:04
模拟串口很占用CPU资源,还是考虑串口在不同的管脚上切换为宜。

我整个程序就是串口转发,不做其他的事情

wulin 发表于 2026-5-6 07:33:26

tlxfif 发表于 2026-5-5 22:11
我整个程序就是串口转发,不做其他的事情

如果转发的信息只发不收,上位机一个TxD可以接若干个下位机RxD。

clamb 发表于 2026-5-6 09:41:29

8H至少都有2个串口,加上引脚切换足够使用了,何必还要去模拟一个串口呢?

wulin 发表于 2026-5-6 13:36:05

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端口
                                }
                        }
                }
        }
}


tlxfif 发表于 2026-5-11 00:42:19

wulin 发表于 2026-5-6 13:36
模拟串口,可以根据实际需要定义端口。

非常感谢{:aixin:}
页: 1 [2]
查看完整版本: STC8H1K08 请问如何模拟一个串口呢?