打印
[51单片机]

C51单片机定时器赋初值问题

[复制链接]
1837|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shaorc|  楼主 | 2019-3-4 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
【不懂就问】
用89C52单片机,做一个LED灯闪烁的效果,亮一秒灭一秒
现在在给定时器的TH0和TL0赋初值上卡住了
看教程说,TL0初值为0,TH0初值为0xB8,
一个机器周期等于12个时钟周期,晶振为11.0592MHz
用20ms当做一个循环,循环50次,就是一秒
那么计算初值x*(12/11.0592MHz)=20ms,x=0xB8,
计算出x的值为什么要赋给TH0呢?
评论
ningling_21 2019-3-4 23:04 回复TA
如果不赋值,TH0,TL0 的初始值都是0 

相关帖子

沙发
ningling_21| | 2019-3-4 11:05 | 只看该作者
要理解初值的含义,单片机复位后的TH,TL初值都是0,只有通过程序赋值(初始化值)后定时器才按预定义功能进行定时

使用特权

评论回复
板凳
shaorc|  楼主 | 2019-3-4 22:30 | 只看该作者
ningling_21 发表于 2019-3-4 11:05
要理解初值的含义,单片机复位后的TH,TL初值都是0,只有通过程序赋值(初始化值)后定时器才按预定义功能进 ...

你好,谢谢
还是没懂我问题的答案。能再说说吗?

使用特权

评论回复
地板
ningling_21| | 2019-3-4 23:03 | 只看该作者
shaorc 发表于 2019-3-4 22:30
你好,谢谢
还是没懂我问题的答案。能再说说吗?

计算出x的值为什么要赋给TH0呢?

就像,设定了烧水壶的开水温度(100)之后,烧水壶才开始烧水直到把水烧开。

计算出的定时器的初始值是十六位最大为65535,再分成高低字节赋值给TH0和TL0

使用特权

评论回复
5
xuyaqi| | 2019-3-5 15:36 | 只看该作者
一个机器周期=1/11.0592/12=1.08507us
20毫秒需要周期数=20*1000/1.08507=18432
所以初值为65536-18432=47104D=B800H

使用特权

评论回复
6
rankey| | 2019-3-6 08:07 | 只看该作者
    朋友,请叫我雷锋

MCUsuperhelperV1.7.zip

434.03 KB

使用特权

评论回复
7
shaorc|  楼主 | 2019-3-6 09:27 | 只看该作者
xuyaqi 发表于 2019-3-5 15:36
一个机器周期=1/11.0592/12=1.08507us
20毫秒需要周期数=20*1000/1.08507=18432
所以初值为65536-18432=471 ...

谢谢,计算过程明白了,但是计算出来的值,为什么直接付给了TH0,而把TL0付给了0呢?我的TMOD=0x01

使用特权

评论回复
8
xuyaqi| | 2019-3-6 14:13 | 只看该作者
shaorc 发表于 2019-3-6 09:27
谢谢,计算过程明白了,但是计算出来的值,为什么直接付给了TH0,而把TL0付给了0呢?我的TMOD=0x01 ...

计算出的16位计数器初值是0xB800,但51单片机16位计数器是由2个8位计数器组成,分高位TH0,低位TL0,因此要把初值高8位0xB8赋给TH0,低位TL0上电就是0x00。

使用特权

评论回复
9
shaorc|  楼主 | 2019-3-6 22:52 | 只看该作者
xuyaqi 发表于 2019-3-6 14:13
计算出的16位计数器初值是0xB800,但51单片机16位计数器是由2个8位计数器组成,分高位TH0,低位TL0,因此 ...

明白了,原来算出来的0xB800才是最终的数值,高八位,低八位这样分开来,明白了,谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

199

主题

610

帖子

5

粉丝