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:33 编辑
波特率发生器,重点:
1、uart单元支持哪些内部时钟来源;
2、上面支持的定时器支持重载(不能重载的定时器,uart也不会给出寄存器进行配置) 自己查stc手册,写的还是比较详细的,只是逻辑性不太好,uart相关寄存器跨越好几大章 换个晶振,波特率误差可以到0,最好买最常用的11.0592 stc支持不用tim1产生波特率 首先,标准的51单片机12M晶振产生9600波特率误差2‰,不够用?UART倍速,自动重装值243,你算算。其次,不自动重装得自己写定时中断服务函数,而且得补偿,很麻烦。第三,可以选T2的16位自动重装模式。第四,STC有很多波特率产生的专用模式。 takashiki 发表于 2020-4-30 05:16
首先,标准的51单片机12M晶振产生9600波特率误差2‰,不够用?UART倍速,自动重装值243,你算算。其次,不 ...
试过了,12M晶振,2400波特率误差0,24,可以用,9600就不正常了,常出错,我用的STC89C52,不支持16位重装 这个论坛还是很不错,记得上学时常逛,那会网站还不是这个名,老莫常在里面回答问题,十年没来逛过了,还是这么热闹。谢谢大家的回答,我已经重新买了晶振在路上,我觉得结论就是该型号单片机产生波特率用定时器1的方式1是不可以用的 arvindu 发表于 2020-4-30 06:03
试过了,12M晶振,2400波特率误差0,24,可以用,9600就不正常了,常出错,我用的STC89C52,不支持16位重 ...
好像我算错了,是除以32,我除成16了,好久没用过了忘了。
我特意去下载了这个STC89C52这个老古董手册:
STC89C52,T2支持16位重装的,12M时钟产生9600没有问题。直接用STC软件产生的代码不对,还得按照手册手写
LZ实在搞不懂,其实我建议一个最简单的方法就是讲SMOD=1
TH1和TL1的初值设置为 0F3
STC89C52RC单片机使用6T模式
这个时候产生的波特率是9615.38462b/s
误差率0.16%
用这个方法你也不用去研究什么定时器2的16位自动重装了
不过要记得自己修改延时程序,因为单片机已经加速到6T模式了
标准51得串口波特率只能是定时器1工作在 8位自动重装。建议换11.0592把
页:
[1]