找回密码
 立即注册
楼主: tlxfif

STC8H1K08 请问如何模拟一个串口呢?

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:67
  • 最近打卡:2026-05-08 06:02:18
已绑定手机

3

主题

115

回帖

561

积分

高级会员

积分
561
发表于 4 天前 | 显示全部楼层
tlx*** 发表于 2026-5-4 18:12
这个更没玩过了

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

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-05-05 16:29:36
已绑定手机

3

主题

9

回帖

65

积分

注册会员

积分
65
发表于 4 天前 | 显示全部楼层
wul*** 发表于 2026-5-5 20:04
模拟串口很占用CPU资源,还是考虑串口在不同的管脚上切换为宜。

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

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:67
  • 最近打卡:2026-05-08 06:02:18
已绑定手机

3

主题

115

回帖

561

积分

高级会员

积分
561
发表于 3 天前 | 显示全部楼层
tlx*** 发表于 2026-5-5 22:11
我整个程序就是串口转发,不做其他的事情

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2026-05-06 09:41:29

3

主题

26

回帖

231

积分

中级会员

积分
231
发表于 3 天前 | 显示全部楼层
8H至少都有2个串口,加上引脚切换足够使用了,何必还要去模拟一个串口呢?
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:67
  • 最近打卡:2026-05-08 06:02:18
已绑定手机

3

主题

115

回帖

561

积分

高级会员

积分
561
发表于 3 天前 | 显示全部楼层
tlx*** 发表于 2026-5-5 22:11
我整个程序就是串口转发,不做其他的事情

模拟串口,可以根据实际需要定义端口。

  1. #include "STC8H.h"
  2. typedef unsigned char uchar;
  3. typedef unsigned int uint;
  4. sbit RXB = P3^0;         //定义UART TX/RX端口
  5. sbit TXB = P3^1;
  6. uchar TBUF,RBUF;
  7. uchar TDAT,RDAT;
  8. uchar TCNT,RCNT;
  9. uchar TBIT,RBIT;
  10. bit TING,RING;
  11. bit TEND,REND;
  12. uchar t, r;
  13. uchar buf[16];
  14. //初始UART模块
  15. void UART_INIT()
  16. {
  17.         TING = 0;
  18.         RING = 0;
  19.         TEND = 1;
  20.         REND = 0;
  21.         TCNT = 0;
  22.         RCNT = 0;
  23.         TMOD = 0x02;   //8位自动重载12T模式
  24.         TL1 = 0xE8;                //设定定时初值(波特率1200)
  25.         TH1 = 0xE8;                //设定定时器重装值
  26. //        TMOD = 0x00;   // 16位自动重载模式中的Time0
  27. //        AUXR = 0x80;   // 1T工作模式
  28. //        TL0 = BAUD;
  29. //        TH0 = BAUD>>8; // 初始Time0和设置重载值
  30.         TR0  = 1;      // tiemr0开始运行
  31.         ET0  = 1;      // 启用Time0中断
  32.         PT0  = 1;      // 提高定时中断优先级
  33.         EA   = 1;      // 打开全局中断开关
  34. }
  35. //
  36. void main()
  37. {
  38.         P0M0 = 0x00;P0M1 = 0x00;
  39.         P1M0 = 0x00;P1M1 = 0x00;
  40.         P2M0 = 0x00;P2M1 = 0x00;
  41.         P3M0 = 0x00;P3M1 = 0x00;
  42.         P4M0 = 0x00;P4M1 = 0x00;
  43.         P5M0 = 0x00;P5M1 = 0x00;
  44.         P6M0 = 0x00;P6M1 = 0x00;
  45.         P7M0 = 0x00;P7M1 = 0x00;
  46.         UART_INIT();   //初始UART模块
  47.         while (1)
  48.         {              //用户功能
  49.                 if (REND)   //接收完成标志为真
  50.                 {
  51.                         REND = 0;//接收完成标志清0
  52.                         buf[r++ & 0x0f] = RBUF;//保存在缓存中
  53.                 }
  54.                 if (TEND)
  55.                 {
  56.                         if (t != r)
  57.                         {
  58.                                 TEND = 0;
  59.                                 TBUF = buf[t++ & 0x0f];//发送缓存中数据
  60.                                 TING = 1;
  61.                         }
  62.                 }
  63.         }
  64. }
  65. //UART定时器中断例程
  66. void tm0() interrupt 1 using 1
  67. {
  68.         if (RING)
  69.         {
  70.                 if (--RCNT == 0)
  71.                 {
  72.                         RCNT = 3;                   //重置发送波特率计数器
  73.                         if (--RBIT == 0)
  74.                         {
  75.                                 RBUF = RDAT;            //将数据保存到RBUF
  76.                                 RING = 0;               //停止接收
  77.                                 REND = 1;               //设置接收完成标志
  78.                         }
  79.                         else
  80.                         {
  81.                                 RDAT >>= 1;
  82.                                 if (RXB) RDAT |= 0x80;  //将RX数据转换为RX缓冲区
  83.                         }
  84.                 }
  85.         }
  86.         else if (!RXB)
  87.         {
  88.                 RING = 1;                       //设置开始接收标志
  89.                 RCNT = 4;                       //初始接收波特率计数器
  90.                 RBIT = 9;                       //initial receive bit number (8 data bits + 1 stop bit)
  91.         }                                                                                          //初始接收比特数(8个数据位+ 1个停止位)
  92.         if (--TCNT == 0)
  93.         {
  94.                 TCNT = 3;                       //重置发送波特率计数器
  95.                 if (TING)                       //判断是否发送
  96.                 {
  97.                         if (TBIT == 0)
  98.                         {
  99.                                 TXB = 0;                //发送起始位
  100.                                 TDAT = TBUF;            //加载数据 TBUF 到 TDAT
  101.                                 TBIT = 9;               //initial send bit number (8 data bits + 1 stop bit)
  102.                         }                                                                        //初始发送比特数(8个数据位+ 1个停止位)
  103.                         else
  104.                         {
  105.                                 TDAT >>= 1;             //将数据转换到CY
  106.                                 if (--TBIT == 0)
  107.                                 {
  108.                                         TXB = 1;
  109.                                         TING = 0;           //停止发送
  110.                                         TEND = 1;           //设置发送完成标志
  111.                                 }
  112.                                 else
  113.                                 {
  114.                                         TXB = CY;           //将CY写入TX端口
  115.                                 }
  116.                         }
  117.                 }
  118.         }
  119. }
复制代码


回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-9 05:41 , Processed in 0.140756 second(s), 71 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表