1127|11

1922

帖子

0

资源

纯净的硅(高级)

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

 

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

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

回复

1万

帖子

0

资源

超级版主

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

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

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


回复

1万

帖子

0

资源

超级版主

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

要求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

回复

1922

帖子

0

资源

纯净的硅(高级)

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万

帖子

0

资源

超级版主

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万

帖子

0

资源

超级版主

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万

帖子

0

资源

超级版主

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万

帖子

0

资源

超级版主

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

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


回复

1922

帖子

0

资源

纯净的硅(高级)

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

这个说的已经非常详细了  


回复

3891

帖子

0

资源

版主

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

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


回复

1万

帖子

0

资源

超级版主

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

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

 


回复

1万

帖子

0

资源

超级版主

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


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

最新文章 更多>>
    关闭
    站长推荐上一条 1/5 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表