社区导航

 

搜索
查看: 332|回复: 11

[求助] 为什么一个数放入寄存器一定要对高位取商 对低位取余数后才能放呢?

[复制链接]

1026

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2020-6-30 19:05 | 显示全部楼层 |阅读模式

为什么一个数放入寄存器一定要对高位取商 对低位取余数后才能放呢?

此帖出自单片机论坛
QQ图片20200630161709.png

回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-6-30 19:48 | 显示全部楼层

“为什么一个数放入寄存器一定要对高位取商 对低位取余数后才能放呢?”

这可不是 “一个数放入寄存器”。

这是需要 t 微秒后16位定时器溢出产生中断。而这个16位定时器每1微秒加1。为了实现这个目的,必须为TH0和TL0赋初值。如何赋初值才能够实现这个目的,自己想。书中已经给出答案,你只要想通为什么要这样赋初值即可。


回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-6-30 20:09 | 显示全部楼层

实在想不出来,可以用笨办法计算:

要求1微秒后这个16位计数器产生溢出中断,TH0和TL0应该赋初值多少?

要求2微秒后这个16位计数器产生溢出中断,TH0和TL0应该赋初值多少?

要求3微秒后这个16位计数器产生溢出中断,TH0和TL0应该赋初值多少?

……

要求254微秒后这个16位计数器产生溢出中断,TH0和TL0应该赋初值多少?

要求256微秒后这个16位计数器产生溢出中断,TH0和TL0应该赋初值多少?

就清楚了。

点评

我的意思是这个 t为什么不直接转换成16个二进制数直接赋值给TH0 TH1  详情 回复 发表于 2020-7-1 08:21

回复

使用道具 举报

1026

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2020-7-1 08:21 | 显示全部楼层
maychang 发表于 2020-6-30 20:09 实在想不出来,可以用笨办法计算: 要求1微秒后这个16位计数器产生溢出中断,TH0和TL0应该赋初值多少? ...

我的意思是这个 t为什么不直接转换成16个二进制数直接赋值给TH0 TH1

点评

1楼红色框里面所说的设置公式,是使用十进制记数。65536-t除以256,注意TL0逢256进1到TH0。余数放入TL0,商放入TH0。具体放到TL0和TH0里面时,正是二进制数。这个从十进制转换成二进制的过程,由C编译程序自动完成  详情 回复 发表于 2020-7-1 10:14
把65536-t这个数放到TH0+TL0构成的二字节计数器,也可以将65536-t转换成16进制数,然后把低端两位16进制数放入TL0,高两位16进制数放入TH0。其实,转换成16进制数的方法如前所述,就是除以16,余数放入16进制数最  详情 回复 发表于 2020-7-1 10:09
“我的意思是这个 t为什么不直接转换成16个二进制数直接赋值给TH0 TH1‘ 再看看65536-t这个数如何 ”转换成16个二进制数“。 二进制数是 ”逢2进1“。把一个数转换成二进制数  详情 回复 发表于 2020-7-1 10:04
“我的意思是这个 t为什么不直接转换成16个二进制数直接赋值给TH0 TH1” 不是 t ,而是65536-t ! TH0+TL0 构成16位加计数器。每输入一个脉冲(机器周期或者外部输入脉冲)加1。当TL0溢出时向TH0进  详情 回复 发表于 2020-7-1 09:54

回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-7-1 09:54 | 显示全部楼层
QWE4562009 发表于 2020-7-1 08:21 我的意思是这个 t为什么不直接转换成16个二进制数直接赋值给TH0 TH1

“我的意思是这个 t为什么不直接转换成16个二进制数直接赋值给TH0 TH1”

不是 t ,而是65536-t

TH0+TL0 构成16位计数器。每输入一个脉冲(机器周期或者外部输入脉冲)加1。当TL0溢出时向TH0进位,TH0加1。所以要在输入 t 个脉冲后TH0溢出产生中断申请,TH0+TL0构成的16位计数器必须预置为65536-t


回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-7-1 10:04 | 显示全部楼层
QWE4562009 发表于 2020-7-1 08:21 我的意思是这个 t为什么不直接转换成16个二进制数直接赋值给TH0 TH1

“我的意思是这个 t为什么不直接转换成16个二进制数直接赋值给TH0 TH1‘

再看看65536-t这个数如何 ”转换成16个二进制数“。

二进制数是 ”逢2进1“。把一个数转换成二进制数,方法就是这个数除以2,保留商,余数放到这个二进制数的最低位。然后商再除以2,保留商,余数放入这个二进制数的次低位。然后商再除以2,保留商,余数放入这个二进制数的次次低位……直到商为0。

16进制数是 ”逢16进1“。把一个数转换成16进制数,方法就是这个数除以16,保留商,余数放到这个16进制数的最低位。然后商再除以16,保留商,余数放入这个16进制数的次低位。然后商再除以16,保留商,余数放入这个16进制数的次次低位……直到商为0。

 

TH0+TL0,高字节和低字节可以看成256进制数,因为低字节TL0逢256向高字节TH0进1。那么,待装入TH0+TL0这个二字节计数器的数,除以256,余数放到低字节,商放到高字节,就对了。

点评

这个说的已经非常详细了    详情 回复 发表于 2020-7-1 11:10

回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-7-1 10:09 | 显示全部楼层
QWE4562009 发表于 2020-7-1 08:21 我的意思是这个 t为什么不直接转换成16个二进制数直接赋值给TH0 TH1

65536-t这个数放到TH0+TL0构成的二字节计数器,也可以将65536-t转换成16进制数,然后把低端两位16进制数放入TL0,高两位16进制数放入TH0。其实,转换成16进制数的方法如前所述,就是除以16,余数放入16进制数最低位……


回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-7-1 10:14 | 显示全部楼层
QWE4562009 发表于 2020-7-1 08:21 我的意思是这个 t为什么不直接转换成16个二进制数直接赋值给TH0 TH1

1楼红色框里面所说的设置公式,是使用十进制记数。65536-t除以256,注意TL0逢256进1到TH0。余数放入TL0,商放入TH0。具体放到TL0和TH0里面时,正是二进制数。这个从十进制转换成二进制的过程,由C编译程序自动完成,不必你操心。


回复

使用道具 举报

1026

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2020-7-1 11:10 | 显示全部楼层
maychang 发表于 2020-7-1 10:04 “我的意思是这个 t为什么不直接转换成16个二进制数直接赋值给TH0 TH1‘ 再看看65536-t这 ...

这个说的已经非常详细了  


回复

使用道具 举报

3667

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2020-7-1 18:58 | 显示全部楼层

之所以装入负数最根本的原因是定时器计数为加计数

高位取商低位取余的运算是要把16位的二进制数拆成两个字节分别赋值


回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-7-2 14:11 | 显示全部楼层

你在另一帖中问:“i j k和定时的关系是怎样的?还是软件生成的?”。在那段程序中你写下 “ unsigned char i,j,k; ”,声明了三个 unsigned char 类型的变量,然后为这三个变量赋初值。

如果你声明了一个两个字节长度的 int 类型变量 abcd,然后为这个变量赋值 abcd=32768,那么编译程序就会将32768转换成二进制数,直接放入这两个字节。至于 abcd 这个变量的地址,你不必操心,编译程序自会安排。

 


回复

使用道具 举报

1万

TA的帖子

0

TA的资源

超级版主

Rank: 6Rank: 6

发表于 2020-7-2 14:15 | 显示全部楼层

之所以TH0和TL0这两个字节,在装入16位数字时,必须把除以256的余数装入TL0,商装入TH0,那是因为TH0和TL0并不是 int 类型的变量,TH0和TL0必须分开装入。


回复

使用道具 举报

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

关闭

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

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

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

GMT+8, 2020-7-10 20:17 , Processed in 0.381289 second(s), 34 queries , Gzip On, MemCache On.

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