找回密码
 立即注册
查看: 46|回复: 7

【天王归来】STC89C52RC使用专用定时器2做波特率发生器,定时器0做串口接收超时检测!

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:622
  • 最近打卡:2025-12-18 09:28:18
已绑定手机

62

主题

204

回帖

1682

积分

金牌会员

积分
1682
发表于 前天 20:29 | 显示全部楼层 |阅读模式
【项目名称】STC89C52RC串口接收超时实验(软件模拟)


【项目配置】所有的STC89/90系列单片机可以直接使用这个代码,其他型号的单片机请自行修改头文件与波特率发生器
           的头文件,保证适配性;
           串口:串口1
           串口波特率:9600(因为传统8051单片机不允许太高的波特率,所以为了适配,本实验采用9600)
           串口波特率发生器:定时器2(STC89/90专用定时器2)
           串口数据编码格式:GB2312,串口数据不能有中文,中文打印请自行修改为UTF-8格式


【项目描述】使用STC89C52RC单片机核心板,用CH340转串口模块,或者使用STC官方的一箭双雕/双串口工具
           接到计算机,打开串口,单片机上电时会用串口1打印"System OK\r\n"的上电成功信息,并且需
           要注意!因为串口1的发送和接收均采用中断形式进行收发,所以在初始化时需要开启EA,否则设备
           就会卡死在串口1发送代码上,【注意】需要在STC-ISP勾选“使用片内拓展RAM可用”打开访问拓展
           寄存器XSFR;然后在串口工具上发送小于接收缓冲区和发送缓冲区的字符串(代码中默认缓冲区均
           为64个字节),会发现一收一发,不会丢包,这就是串口超时接收的好处,不定长接收,而且基本
           不会丢包,并且程序采用定时器0当作串口1超时计数定时器,和任务调度系统一起,不占用额外
           的硬件定时器资源!


【项目日期】2025年12月16日


【项目作者】陈家乐

STC89.zip

61.2 KB, 下载次数: 2

用尽STC单片机的资源是我的梦想
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-12-18 08:51:37

814

主题

1万

回帖

2万

积分

管理员

积分
21314
发表于 前天 22:49 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:622
  • 最近打卡:2025-12-18 09:28:18
已绑定手机

62

主题

204

回帖

1682

积分

金牌会员

积分
1682
发表于 前天 23:08 | 显示全部楼层
神*** 发表于 2025-12-16 20:49
注册坛友福利【免费+包邮 送】擎天柱:Ai8051U转89C52核心板 | 强大的视频学习资源 - ISP下载/做自己的ISP  ...

哦原来是姚总啊,失礼了
用尽STC单片机的资源是我的梦想
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2025-12-18 08:38:15

12

主题

181

回帖

766

积分

高级会员

积分
766
发表于 昨天 08:24 | 显示全部楼层
我是这么做的接收超时,不知道合不合适,
声明一个变量
uint_8 TimeOut = 0;
然后做一个1ms的定时器,定时器中断里
if(TimeOut<200) TimeOut++;
然后在串口接收中断里让
TimeOut=0;
在main函数中,当检测到TimeOut==200时,开始处理接收到的数据。
不知道这么做有没有啥问题
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:622
  • 最近打卡:2025-12-18 09:28:18
已绑定手机

62

主题

204

回帖

1682

积分

金牌会员

积分
1682
发表于 昨天 09:20 | 显示全部楼层
猫*** 发表于 2025-12-17 06:24
我是这么做的接收超时,不知道合不合适,
声明一个变量
uint_8 TimeOut = 0;

哦,你的思路跟我差不多,我是直接让计数变量累加了,因为你不用考虑是否需要做临界保护,因为我串口打印回显的逻辑是,串口缓冲区有数据,接收长度≠0,串口才去判断超时变量是否为某一个周期值(5ms啊,100ms之类的),这样就行了,你这样子的话其实也没啥问题的,只不过if(TimeOut<200)这个可以不用,单纯的在接收到数据时,重置TimeOut变量,就行了

点评

if(TimeOut<200)还是要的,不然万一加到256,那不是又从零开始了 再if(TimerOut==200)的处理程序中,还有个TimeOut=201;  发表于 昨天 20:48
用尽STC单片机的资源是我的梦想
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:622
  • 最近打卡:2025-12-18 09:28:18
已绑定手机

62

主题

204

回帖

1682

积分

金牌会员

积分
1682
发表于 4 小时前 | 显示全部楼层
猫*** 发表于 2025-12-17 06:24
我是这么做的接收超时,不知道合不合适,
声明一个变量
uint_8 TimeOut = 0;

可加可不加吧,这可能跟我程序的逻辑有关,因为我是串口接收缓冲区有数据,非空情况下,这个超时计时变量才有效
用尽STC单片机的资源是我的梦想
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2025-12-18 08:38:15

12

主题

181

回帖

766

积分

高级会员

积分
766
发表于 2 小时前 | 显示全部楼层
陈*** 发表于 2025-12-18 09:30
可加可不加吧,这可能跟我程序的逻辑有关,因为我是串口接收缓冲区有数据,非空情况下,这个超时计时变量 ...

可能跟我的应用场景不一样,我的必须要加,否则会溢出从头开始计数
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-12-18 13:56 , Processed in 0.107725 second(s), 80 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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