C51 定时器 TL0=(65536-50000)%256是怎么推导出来的?

2019-05-20来源: eefocus关键字:C51  定时器  推导

文章1:如果你选的单片机的晶振一定,比如12MHZ来说吧,机器周期是1us,就是说每1us产生一次计数,就拿50ms来说,这是你想要的计时,意思是,对机器周期进行50000计数就可以得到我想要的,可T0是一个可以对机器周期能进行65536次计数,也就是说我想要的50MS不能让T0溢出,怎么办,那么先给这个定时器里面放些数,放多少,就是我们想要的50MS在加上一个多少就能等于65536,也就是65536和50000的差值,这个值就是我们说的初值。

      为什么除以256,因为我们的计时器是两个8位组成的,那么要把那些差值装进这两个8位,那么低8位最多能装256个机器周期,那么256计满了就用高8位的,就是说低8位满一次高8位加1,那么高8位装多少,低8位就满了几次,算法就是用差值除一下256取其整数,剩下的,就是还剩了小于256次数的就放在低8位,就是差值 的余数。如果我要放一个超过256的数,肯定是超过先放高八位,把剩下的部分放在低八位中了,TH0=(65536-50000)/256就是把TL0中放不下的部分放在TH0中,再把剩下的部分放在TH0中。

 void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

flag++;

if(flag==20)//当定时到1秒时执行花括号里面的语句

{    }

}

(Fromhttp://bbs.ednchina.com/BLOG_ARTICLE_3012623.HTM)


文章2:

其实很简单,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期
机器周期=12/n(n指晶振频率),假设你要定时的时间为M
那么定时的初值为:
M/机器周期=初值;
TH0=(65536-初值)/256;         
TL0=(65536-初值)%256;
将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值
例如用12M晶振做1ms定时计算如下:
机器周期=12/12*10^6=1us(微秒)
定时初值=(1*10^-3)/(1*10^-6)=1000;
所以:TH0=(65536-1000)/256;(求模运算,即可求出高八位的值)
      TL0=(65536-1000)%256;(求余运算,因为低八位最大能装255)
将65536-1000=64536化为16进制为:0xFC18
TH0=0xFC;
TL0=0X18;

(Fromhttp://blog.sina.com.cn/s/blog_5134d7020100ey3i.html)


关键字:C51  定时器  推导 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic462278.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STC单片机之1602显示时钟
下一篇:STC12C5A32S2单片机之1602渐入显示

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

单片机模拟I2C总线及24C02(I2C EEPROM)读写实例
;*//************************************************************************//* Name:AT24C02存储器的读写程序,用到I2C总线,含相对独立的I2C总线读写函数 *//* Language: C51单片机编程语言                                          *//* Platform: Win98,Intel Celeron 433 Processor,伟福仿真器,仿真8751     *//* Author
发表于 2020-03-10
STM32开发笔记79: 解决C++调用C函数,链接时报L6218E的问题
单片机型号:STM32L053R8T6调试W5500程序,最后生成时报L6218E错误,如下图所示:此错误具体的解释是,一个函数调用另外一个文件中的函数,但是在链接时,找不到那个函数的具体位置。我反复确认此问题,我在dev_w5500中调用ctlnetwork函数,此函数在wizchip_conf.c中已经正确编译,但仍然报此错误。不过,除了调用W5500的wizchip_conf.c、w5500.c和socket.c 3个文件外,调用其它的文件中的函数无此问题。看一下wizchip_conf.c、w5500.c和socket.c 3个文件中相应的头文件开始部分的写法。#ifndef 
发表于 2020-03-10
STM32开发笔记79: 解决C++调用C函数,链接时报L6218E的问题
I2C寄存器控制
    /* 设置寄存器启动传输 */    /* 1. 配置为 master tx mode */    IICCON |= (1<<7); /* TX mode, 在ACK周期释放SDA */    IICSTAT = (1<<4);            /* 2. 把从设备地址写入IICDS */    IICDS = msg->addr<<1;        /*
发表于 2020-03-10
关于软件I2C与MSP430通信的问题
在MSP430作为从设备,主机模拟软件I2C与MSP430通信的时候,一定要注意在发送了8个bit的数据之后,马上将SCLK释放掉。因为MSP430在繁忙的过程中会将SCLK拉低,空闲后才将SCLK释放。所以主机应该先将SCLK交给MSP430,等读到SCLK被MSP430释放后,再发送时钟来接受ACK。对于主机从MSP430读数据的时候也是一样,每次读完了一个字节的数据之后,主机都应该释放掉SCLK,等待MSP430也释放掉了SCLK之后,主机再发送ACK给MSP430。上面一段理解错了,从MSP430读取数据时不需要释放SCLK,而需要在每次读完8个字节之后延时一段时间再发送ACK,等待MSP430处理完毕。主机从MSP430
发表于 2020-03-10
智能厚度测量系统设计
本课题所研究的智能厚度计是基于单片机的成套解决方案,由主控制器、测量传感器、AD转换模块、液晶显示模块以及相应配套硬件组成。通过对测量传感器的运用,对厚度参数进行精确地数据采集,然后通过AD转换模块将测量传感器采集到的模拟信号转换成数字信号,再通过主控制器对AD转换模块输出的数字信号进行相应的数据分析处理,最后通过液晶显示模块对厚度参数进行直观地显示,以完成整个系统的功能需求。1 主控制器电路设计STC89C52单片机最小系统具有体积小、质量轻、功能强、功耗低、性价比高等特点。STC89C52单片机最小系统由芯片、系统时钟、I/O端口设备及复位电路等构成。STC89C52芯片内部结构框图单片机最小系统电路2 电阻式位移传感器
发表于 2020-03-09
智能厚度测量系统设计
pic之I2C设置
在pic中设置i2c:初始化的时候不能把引脚设置为开漏输出,否则在模块使能的时候,两个引脚的电平会一直拉低的。在寄存器I2CxION直接把bit<15> 设置为1,设置波特率,后面的参考资料;
发表于 2020-03-09
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved