社区导航

 

搜索
楼主: QWE4562009

[求助] 求余数不是%才对吗?还有TH0和TL0寄存器设置怎么都是256-t

  [复制链接]

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-6-28 19:37 | 显示全部楼层
QWE4562009 发表于 2020-6-28 18:56 是在TL0计数发生溢出时,自动把TH0寄存器中的内容装入TL0寄存器。-----把TH0寄存器中的内容装入TL0寄存器 ...

TH0和TL0,两个寄存器一样大。

再重复一次:千万别以为什么 “高位” 和 “低位”。把你所认为的 “高位” 和 “低位” 忘掉!

点评

那TH0是一直给TL0赋值吗?为什么不TL0直接赋初值?  详情 回复 发表于 2020-6-29 10:17

回复

使用道具 举报

1799

TA的帖子

8

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2020-6-28 19:38 | 显示全部楼层
QWE4562009 发表于 2020-6-28 18:53 既然是两个不同的寄存器  为何TH0要和TL0扯上关系呢

你最好看一下芯片的手册,或者单片机的教材,把所有的寄存器都看一下,看一下含义,

 

TH0,TL0是两个寄存器,但是不同的模式设定,这两个寄存器的意义是不一样的

有16bit的定时器,这时候TH0是装高8位,TL0装低8位,有13bit定时器模式,高5位在TH0放,低8位在TL0放,他还有自动装载模式,但是是8bit,自动装载,定时器要知道装什么值,需要有个地方存放这个数值,等到他计数到0之后,才能去把备份的数值再拷贝回来,这就是TH0的作用。。。

 

 

点评

这就是TH0装TL0的值才对啊  详情 回复 发表于 2020-6-29 10:15
坐而言不如起而行

回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-6-28 19:40 | 显示全部楼层
QWE4562009 发表于 2020-6-28 18:56 是在TL0计数发生溢出时,自动把TH0寄存器中的内容装入TL0寄存器。-----把TH0寄存器中的内容装入TL0寄存器 ...

“把TH0寄存器中的内容装入TL0寄存器-----------再王TL0装数那不是更加的溢出了?”

把TH0寄存器内容装入TL0,TL0中原来的内容就消失了,或者说被掩盖掉了,变成了TH0当中的内容。

点评

TH0都没参与计数,那TH0的值哪里来的呢?TH0的值给到TL0目的是为了什么  详情 回复 发表于 2020-6-29 10:08

回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-6-28 19:43 | 显示全部楼层
QWE4562009 发表于 2020-6-28 18:56 是在TL0计数发生溢出时,自动把TH0寄存器中的内容装入TL0寄存器。-----把TH0寄存器中的内容装入TL0寄存器 ...

模式2,TL0是计数器,其工作是每次计数时内容加1。这和TH0内容装入TL0完全是两回事。TH0内容装入TL0,并不做加法(更不做减法),当然也就没有什么溢出。

点评

TH0内容装入TL0到底是啥?TL0内容装入TH0,就相当于TL0放不下了放入TH0(更大的容器)这个可以理解。。。  详情 回复 发表于 2020-6-29 10:06

回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-6-28 19:48 | 显示全部楼层
QWE4562009 发表于 2020-6-28 18:53 既然是两个不同的寄存器  为何TH0要和TL0扯上关系呢

模式0和模式1,TL0计数(每次加1)。当TL0溢出(FFH再加1,成为00H)时,向TH0进位,即TH0加1。

TH0和TL0的关系,就在于此——TL0溢出时TH0加1。注意只有模式0和模式1才是这样,其它模式没有这个关系。

 


回复

使用道具 举报

3678

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2020-6-28 21:48 | 显示全部楼层
本帖最后由 huo_hu 于 2020-6-28 22:23 编辑

其实51定时器的硬件结构非常简单,这些所谓的模式区别不大。定时器就是围绕着一个计数器展开,这个计数器就是TH和TL联合构成的,模式2时切断TL到TH的进位就独立成两个寄存器,TH用来在溢出后重新给TL赋值。

计数器每一位都是一个二进制加法器,每个加法器都有一个进位位,从哪里引出进位位做溢出位就构成了各种模式的计数范围,模式2的计数溢出位就是TL的最高位也就是第7位,模式0为第12位,模式1为第15位。

所谓的自动重装也很简单,就是溢出信号触发赋值操作让TL=TH就行,所谓软件重装其实就是没有任何硬件操作,任由接下来的事情发生,模式1不重装就做65536分频。

硬件上面做信号触发赋值操作说起来简单但是电路上需要8个触发器和8条TH到TL的连接线才行,所以51定时器能做自动重装的就只有模式2一种。

点评

第一种模式,是16位的,TH0 TL0 是8位,两个组成一个16位的数,最大值是65535. 所以这种模式可以计数一个长时间的。有时如果只需要一个很短时间的计数,可以用第二种模式,就是TL0 8位计数,计数最大值为256,如果计  详情 回复 发表于 2020-6-29 10:03

回复

使用道具 举报

1026

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2020-6-29 10:03 | 显示全部楼层
huo_hu 发表于 2020-6-28 21:48 其实51定时器的硬件结构非常简单,这些所谓的模式区别不大。定时器就是围绕着一个计数器展开,这个计数器就 ...

第一种模式,是16位的,TH0 TL0 是8位,两个组成一个16位的数,最大值是65535. 所以这种模式可以计数一个长时间的。有时如果只需要一个很短时间的计数,可以用第二种模式,就是TL0 8位计数,计数最大值为256,如果计数达到256就溢出了,这时硬件会自动把TH0的值赋给TL0

---就是TL0 8位计数,计数最大值为256,如果计数达到256就溢出了,这时硬件会自动把TH0的值赋给TL0------------TLO都满了  TH0再赋值给TL0那岂不是更加溢出了吗?TH0赋值给TL0这句话始终没搞通透。。。


回复

使用道具 举报

1026

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2020-6-29 10:06 | 显示全部楼层
maychang 发表于 2020-6-28 19:43 模式2,TL0是计数器,其工作是每次计数时内容加1。这和TH0内容装入TL0完全是两回事。TH0内容装入TL0,并 ...

TH0内容装入TL0到底是啥?TL0内容装入TH0,就相当于TL0放不下了放入TH0(更大的容器)这个可以理解。。。

点评

“TL0内容装入TH0,就相当于TL0放不下了放入TH0(更大的容器)这个可以理解” 没有这回事。从来没有TL0内容装入TH0。你的理解完全错误。  详情 回复 发表于 2020-6-29 10:21
“TH0内容装入TL0到底是啥?” 这个动作,就是无论TL0原来内容是什么(其实,因为TL0溢出,该寄存器内容为00H),装入后变成与TH0内容相同。  详情 回复 发表于 2020-6-29 10:19

回复

使用道具 举报

1026

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2020-6-29 10:08 | 显示全部楼层
maychang 发表于 2020-6-28 19:40 “把TH0寄存器中的内容装入TL0寄存器-----------再王TL0装数那不是更加的溢出了?” 把TH0 ...

TH0都没参与计数,那TH0的值哪里来的呢?TH0的值给到TL0目的是为了什么

点评

别再问 “为什么是每4次触发产生一次中断”。你如果愿意,8次也行,11次也行,100次也行,就是不能超过255次。  详情 回复 发表于 2020-6-29 10:46
“TH0的值给到TL0目的是为了什么” 假定我们希望计数器每4次触发加1计数发生一次定时中断,那么TH0事先赋值FCH,TL0也赋值FCH。确定使用模式2。 一次触发,TL0变成FDH。二次触发,TL0变成FEH。三次  详情 回复 发表于 2020-6-29 10:43
“TH0都没参与计数,那TH0的值哪里来的呢?” 在使用模式2,定时器开始工作之前,由程序为TH0赋值。其值为多少,由编写程序的人决定。  详情 回复 发表于 2020-6-29 10:23

回复

使用道具 举报

1026

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2020-6-29 10:15 | 显示全部楼层
wsmysyn 发表于 2020-6-28 19:38 你最好看一下芯片的手册,或者单片机的教材,把所有的寄存器都看一下,看一下含义,   TH0,T ...

这就是TH0装TL0的值才对啊

点评

感觉你数字电路的基础知识太欠缺了,所以好多不理解,即便跟你解释的很清楚,可能还是不理解。 不能一上来就去看那么复杂的东西,还是需要先去把数电看一遍,从基础的来,然后再去理解更高的,   我估  详情 回复 发表于 2020-6-29 10:40

回复

使用道具 举报

1026

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2020-6-29 10:17 | 显示全部楼层
maychang 发表于 2020-6-28 19:37 TH0和TL0,两个寄存器一样大。 再重复一次:千万别以为什么 “高位” 和 “低位&rdquo ...

那TH0是一直给TL0赋值吗?为什么不TL0直接赋初值?

点评

为什么不TL0直接赋初值? 你如果愿意,TL0赋初值也可以。这是随你高兴的事。  详情 回复 发表于 2020-6-29 10:31
在1楼你贴出的图片中说得很清楚:“模式2……当TL0计数溢出时,不仅使溢出标志TF0置1,而且还自动把TH0中的内容重装载到TL0中”。 很怀疑你看到这句话没有。估计是看到了,但并未经过头脑  详情 回复 发表于 2020-6-29 10:28

回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-6-29 10:19 | 显示全部楼层
QWE4562009 发表于 2020-6-29 10:06 TH0内容装入TL0到底是啥?TL0内容装入TH0,就相当于TL0放不下了放入TH0(更大的容器)这个可以理解。。。 ...

“TH0内容装入TL0到底是啥?”

这个动作,就是无论TL0原来内容是什么(其实,因为TL0溢出,该寄存器内容为00H),装入后变成与TH0内容相同。

点评

可以用其他的变量给TL0赋值吗?TH0为什么一定要和TL0扯上关系呢?既然两个都是8位寄存器  详情 回复 发表于 2020-6-29 10:30

回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-6-29 10:21 | 显示全部楼层
QWE4562009 发表于 2020-6-29 10:06 TH0内容装入TL0到底是啥?TL0内容装入TH0,就相当于TL0放不下了放入TH0(更大的容器)这个可以理解。。。 ...

“TL0内容装入TH0,就相当于TL0放不下了放入TH0(更大的容器)这个可以理解”

没有这回事。从来没有TL0内容装入TH0。你的理解完全错误。


回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-6-29 10:23 | 显示全部楼层
QWE4562009 发表于 2020-6-29 10:08 TH0都没参与计数,那TH0的值哪里来的呢?TH0的值给到TL0目的是为了什么

“TH0都没参与计数,那TH0的值哪里来的呢?”

在使用模式2,定时器开始工作之前,由程序为TH0赋值。其值为多少,由编写程序的人决定。

点评

TH0是一直给TL0赋值吗?还是是一个常量?  详情 回复 发表于 2020-6-29 10:31

回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-6-29 10:28 | 显示全部楼层
QWE4562009 发表于 2020-6-29 10:17 那TH0是一直给TL0赋值吗?为什么不TL0直接赋初值?

在1楼你贴出的图片中说得很清楚:“模式2……当TL0计数溢出时,不仅使溢出标志TF0置1,而且还自动把TH0中的内容重装载到TL0中”。

很怀疑你看到这句话没有。估计是看到了,但并未经过头脑。


回复

使用道具 举报

1026

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2020-6-29 10:30 | 显示全部楼层
maychang 发表于 2020-6-29 10:19 “TH0内容装入TL0到底是啥?” 这个动作,就是无论TL0原来内容是什么(其实,因为TL0溢出, ...

可以用其他的变量给TL0赋值吗?TH0为什么一定要和TL0扯上关系呢?既然两个都是8位寄存器

点评

你这个逻辑有问题,凭什么不同的寄存器不能有关系?   那是你没看到DPTR指针,DPH 和DPL两个8位寄存器,组成了16位数据指针,通过汇编指令movx 来寻址超过8bit的地址范围,实现寻址16bit,最大65536字节  详情 回复 发表于 2020-6-29 10:49
TH0为TL0赋值是自动的,不必用指令干预。 你如果愿意,当然可以用一条指令为TL0赋值,只要你高兴。  详情 回复 发表于 2020-6-29 10:48

回复

使用道具 举报

1026

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2020-6-29 10:31 | 显示全部楼层
maychang 发表于 2020-6-29 10:23 “TH0都没参与计数,那TH0的值哪里来的呢?” 在使用模式2,定时器开始工作之前,由程序为T ...

TH0是一直给TL0赋值吗?还是是一个常量?

点评

“TH0是一直给TL0赋值吗?还是是一个常量?” 哪有 “一直给TL0赋值这种事?若是 ”一直“ 赋值,单片机还做不做其它工作了? 注意:TH0是一个寄存器。    详情 回复 发表于 2020-6-29 10:50

回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-6-29 10:31 | 显示全部楼层
QWE4562009 发表于 2020-6-29 10:17 那TH0是一直给TL0赋值吗?为什么不TL0直接赋初值?

为什么不TL0直接赋初值?

你如果愿意,TL0赋初值也可以。这是随你高兴的事。


回复

使用道具 举报

1799

TA的帖子

8

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2020-6-29 10:40 | 显示全部楼层
QWE4562009 发表于 2020-6-29 10:15 这就是TH0装TL0的值才对啊

感觉你数字电路的基础知识太欠缺了,所以好多不理解,即便跟你解释的很清楚,可能还是不理解。

不能一上来就去看那么复杂的东西,还是需要先去把数电看一遍,从基础的来,然后再去理解更高的,

 

我估计C语言编程你也不是很了解,

这就好比变量和常量的关系,

TL0是变量,你把初始值写进去,开启时钟之后,TL0的值就开始在时钟的作用下,减小或者变大,一旦他变化了,TL0本身自己是不知道自己以前的值是什么,

 

TH0可以看做是常量,只要你不去改变他,他自己不会变的,当TL0计数到00,或溢出,或产生一个硬件中断,有部分监控中断的逻辑电路会捕获到这个中断信号,他就知道了TL0值已经溢出了,然后电路上会从TH0读取TH0存的值,然后把值再写到TL0里边去,TL0继续递减或者增加计数,这部分操作是电路自己完成的,不需要cpu操作,所以叫自动装载。

 

你不能把他想想成水桶,往里边装东西,这是电路,芯片里边是有读写电路,写是覆盖的写法,所有寄存器都这样,原来存的是0x55,你写进去0x11,那他就是0x11,跟0x55没关系。

 

 

坐而言不如起而行

回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-6-29 10:43 | 显示全部楼层
QWE4562009 发表于 2020-6-29 10:08 TH0都没参与计数,那TH0的值哪里来的呢?TH0的值给到TL0目的是为了什么

“TH0的值给到TL0目的是为了什么”

假定我们希望计数器每4次触发加1计数发生一次定时中断,那么TH0事先赋值FCH,TL0也赋值FCH。确定使用模式2。

一次触发,TL0变成FDH。二次触发,TL0变成FEH。三次触发,TL0变成FFH。四次触发,TL0变成00H(溢出),同时触发中断,TH0内容装入TL0,TL0又成为FCH,准备下一次触发。再经过四次触发,再次产生中断,再重装TL0……免去了每次中断需要用一条指令重装TL0的麻烦,而且用作定时器的话,比用指令重装TL0定时准确。

点评

不同阶段的中断用不同的TH0初值都是可以的对吧?  详情 回复 发表于 2020-6-29 11:29
明白了。谢谢maychang老师  详情 回复 发表于 2020-6-29 11:28

回复

使用道具 举报

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

关闭

站长推荐上一条 1/7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

词云| Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-7-13 00:18 , Processed in 0.553822 second(s), 39 queries , Gzip On, MemCache On.

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