arvindu 发表于 2020-4-29 20:42:24

51单片机串口通信,定时器1只能选定时方式2吗?

咨询大家个问题51单片机做串口通信时,串口选方式1,定时器1的溢出率就是波特率,看了很多例子都是使用定时器1的定时方式2,即8位自动重装初值的方式,我的问题是,可不可以使用定时器的定时方式1,即16位计数,如果可以,程序中怎么为其重装初值?

很多年没写过了单片机程序了,最近和同事一起做个小东西,需要用到433M无线模块,买了两个是串口通信的,需要用到9600波特率的串口通信,但是买的51板晶振是个12M的,STC-ISP检测MCU出来是11.952M,用STC-ISP上的计算波特率小程序,算了下,9600波特率在定时方式2时8.07%,使用方式定时方式1误差0.24%,但是发现好像行不通

但手册只说了定时器1的溢出率就是波特率,没说不能用定时方式1呀,熟悉51的大神,能给我解释下吗,谢谢了

loggerjy 发表于 2020-4-29 23:32:14

本帖最后由 loggerjy 于 2020-4-29 23:33 编辑

波特率发生器,重点:
1、uart单元支持哪些内部时钟来源;
2、上面支持的定时器支持重载(不能重载的定时器,uart也不会给出寄存器进行配置)

wye11083 发表于 2020-4-30 00:11:07

自己查stc手册,写的还是比较详细的,只是逻辑性不太好,uart相关寄存器跨越好几大章

JY-MCU 发表于 2020-4-30 00:47:53

换个晶振,波特率误差可以到0,最好买最常用的11.0592

t3486784401 发表于 2020-4-30 01:58:54

stc支持不用tim1产生波特率

takashiki 发表于 2020-4-30 05:16:26

首先,标准的51单片机12M晶振产生9600波特率误差2‰,不够用?UART倍速,自动重装值243,你算算。其次,不自动重装得自己写定时中断服务函数,而且得补偿,很麻烦。第三,可以选T2的16位自动重装模式。第四,STC有很多波特率产生的专用模式。

arvindu 发表于 2020-4-30 06:03:08

takashiki 发表于 2020-4-30 05:16
首先,标准的51单片机12M晶振产生9600波特率误差2‰,不够用?UART倍速,自动重装值243,你算算。其次,不 ...

试过了,12M晶振,2400波特率误差0,24,可以用,9600就不正常了,常出错,我用的STC89C52,不支持16位重装

arvindu 发表于 2020-4-30 06:09:55

这个论坛还是很不错,记得上学时常逛,那会网站还不是这个名,老莫常在里面回答问题,十年没来逛过了,还是这么热闹。谢谢大家的回答,我已经重新买了晶振在路上,我觉得结论就是该型号单片机产生波特率用定时器1的方式1是不可以用的

takashiki 发表于 2020-4-30 06:42:27

arvindu 发表于 2020-4-30 06:03
试过了,12M晶振,2400波特率误差0,24,可以用,9600就不正常了,常出错,我用的STC89C52,不支持16位重 ...
好像我算错了,是除以32,我除成16了,好久没用过了忘了。
我特意去下载了这个STC89C52这个老古董手册:
STC89C52,T2支持16位重装的,12M时钟产生9600没有问题。直接用STC软件产生的代码不对,还得按照手册手写


wszyjsw2 发表于 2020-5-1 13:33:41

LZ实在搞不懂,其实我建议一个最简单的方法就是讲SMOD=1
TH1和TL1的初值设置为 0F3
STC89C52RC单片机使用6T模式
这个时候产生的波特率是9615.38462b/s
误差率0.16%


用这个方法你也不用去研究什么定时器2的16位自动重装了

不过要记得自己修改延时程序,因为单片机已经加速到6T模式了

dz20062008 发表于 2020-5-3 20:11:37

标准51得串口波特率只能是定时器1工作在 8位自动重装。建议换11.0592把
页: [1]
查看完整版本: 51单片机串口通信,定时器1只能选定时方式2吗?