陈家乐 发表于 2025-12-16 20:29:40

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

【项目名称】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日


【项目作者】陈家乐

神农鼎 发表于 2025-12-16 22:49:58

注册坛友福利【免费+包邮 送】擎天柱:Ai8051U转89C52核心板 | 强大的视频学习资源 - ISP下载/做自己的ISP 国芯人工智能技术交流网站 - AI32位8051交流社区







陈家乐 发表于 2025-12-16 23:08:06

神农鼎 发表于 2025-12-16 20:49
注册坛友福利【免费+包邮 送】擎天柱:Ai8051U转89C52核心板 | 强大的视频学习资源 - ISP下载/做自己的ISP...

哦原来是姚总啊,失礼了

猫虎的 发表于 2025-12-17 08:24:02

我是这么做的接收超时,不知道合不合适,
声明一个变量
uint_8 TimeOut = 0;
然后做一个1ms的定时器,定时器中断里
if(TimeOut<200) TimeOut++;
然后在串口接收中断里让
TimeOut=0;
在main函数中,当检测到TimeOut==200时,开始处理接收到的数据。
不知道这么做有没有啥问题

陈家乐 发表于 2025-12-17 09:20:07

猫虎的 发表于 2025-12-17 06:24
我是这么做的接收超时,不知道合不合适,
声明一个变量
uint_8 TimeOut = 0;


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

陈家乐 发表于 2025-12-18 09:30:00

猫虎的 发表于 2025-12-17 06:24
我是这么做的接收超时,不知道合不合适,
声明一个变量
uint_8 TimeOut = 0;


{:4_165:}可加可不加吧,这可能跟我程序的逻辑有关,因为我是串口接收缓冲区有数据,非空情况下,这个超时计时变量才有效

猫虎的 发表于 2025-12-18 11:48:34

陈家乐 发表于 2025-12-18 09:30
可加可不加吧,这可能跟我程序的逻辑有关,因为我是串口接收缓冲区有数据,非空情况下,这个超时计时变量 ...

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

陈家乐 发表于 2025-12-19 09:14:36

猫虎的 发表于 2025-12-18 09:48
可能跟我的应用场景不一样,我的必须要加,否则会溢出从头开始计数

{:4_197:}那就加吧,防御性编程
页: [1]
查看完整版本: 【天王归来】STC89C52RC使用专用定时器2做波特率发生器,定时器0做串口接收超时检测!