前言:

本文详细介绍了51单片机学习过程中定时器的初值计算问题以及相关概念,力求把每一个学习过程中的可能会遇到的难点说清楚,并举相关的例子加以说明。学习完毕,又顺手利用刚学到定时器的相关知识写了一个“定时器初值计算”控制台程序,能够实现:51定时器三种不同工作方式下的初值计算输出,既实用,又能加深对所学知识的理解。


     

   软件使用VS2012编写,实现效果如下,仅仅是控制台程序,没有界面,有兴趣的话可以自己用C#或者QT写个界面,或者做一些功能上拓展,跟我们平常学习51资料中附带的定时器初值计算小工具一样哦!

   附51系列单片机控制台程序定时器初值核心计算函数源码(完整VS2012工程源码下载)

/** 函数名:Timer_Initial_calculation* 描述  :定时器初值计算函数* 输入  :无* 输出  :无*/
void Timer_Initial_calculation()
{int N; //计数值 int n;  //定时器位数 int TimeDigit;    //计数总值 N = (t*fosc*1000) / 12;     //计算计数值N //定时器位数选择switch(y){case 0: n=13;TimeDigit = pow(2.0,n);      //定时器位数选择 TimingMax = TimeDigit*12/fosc/1000;      //计算定时最长时间 THX = (TimeDigit - N)/32;   //初值高八位 TLX = (TimeDigit - N)%32;  //初值低八位 break;case 1: n=16;TimeDigit = pow(2.0,n);      //定时器位数选择 TimingMax = TimeDigit*12/fosc/1000;        //计算定时最长时间 THX = (TimeDigit - N)/256;  //初值高八位 TLX = (TimeDigit - N)%256; //初值低八位 break;case 2: n=8;TimeDigit = pow(2.0,n);      //定时器位数选择 TimingMax = TimeDigit*12/fosc/1000;     //计算定时最长时间  THX = TimeDigit - N;       //初值高八位 TLX = TimeDigit - N;       //初值低八位 break;default:break;}}

   

下面开始正式介绍定时器初值计算相关内容:

一、系统周期:

时钟周期

时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率,则时钟周期为250ns。由于时钟脉冲是计算机的基本工作脉冲,它控制着计算机的工作节奏(使计算机的每一步都统一到它的步调上来)。显然,对同一种机型的计算机,时钟频率越高,计算机的工作速度就越快。但是,由于不同的计算机硬件电路和器件的不完全相同,所以其所需要的时钟周频率范围也不一定相同。我们学习的8051单片机的时钟范围是1.2MHz-12MHz。 在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。

机器周期

在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。8051系列单片机的一个机器周期同6个S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。

指令周期

指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。

通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令

二、定时器初值的计算:

例:对12MHz  1个机器周期 1us  12/fosc = 1us

方式0  13位定时器最大时间间隔  = 2^13 = 8.192ms

方式1  16位定时器最大时间间隔  = 2^16 = 65.536ms

方式2  8位定时器最大时间间隔  = 2^8 = 0.256ms =256 us

方式3 仅适用于T0,此时T0分成两个8位计数器,T1停止计数

当选用定时器的方式1时,设机器周期为Tcy,定时器产生一次中断的时间为t,那么需要计数的个数N=t/Tcy,装入THX和TLX中的数分别为:

THX = (2^16 - N)/256     TLX = (2^16 -N )%256(此处的X为定时器0或定时器1)

公式为:(2^y - X)*Tcy = t

Tosc= 1/ fosc

一个机器周期 = 12个时钟周期 = 12/fosc

溢出速率 = 1 / 溢出时间        故:初值X = 2^y – t/Tcy

THX = 高八位   TLX = 低八位

注:

X:定时器初值

N:计数值

y:定时器工作方式

fosc:晶振频率

Tcy:机器周期,Tosc:时钟周期  Tcy = 1/Tosc

例:50ms定时器初值计算:

  1. 晶振12M

12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。

65536-50000=15536(3cb0)

TH0=0x3c,TL0=0xb0

2.晶振11.0592M

11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期。

65536-46080=19456(4c00)

TH0=0x4c,TL0=0x00

以12M晶振为例:每秒钟可以执行1000000次机器周期个机器周期。而T 每次溢出 最多65536 个机器周期。我们尽量应该让溢出中断的次数最少(如50ms),这样对主程序的干扰也就最小。

三、定时器不同工作方式下赋初值问题:

1)定时器方式0为13为计数器,由TL0低5位(高3位未用)和TH0的8为组成,因此定时器方式0最多能装载的数为2^19=8192个。当使用定时器方式0时,计数初值

THX=(8192-N)/32,TLX=(8192-N)%32.   N 为计数个数=t/Tcy.

2)定时器方式1为16为计数器,由TLX的8位和THX的8位组成的加1计数器。因此最多能装载2^16=65536个数。计数初值为:

THX=(65536-N)/256,TLX =(65536-N)%256

在定时器的方式0和方式1中,当计数溢出后,计数器变为0,因此在循环定时或循环计数时,必须使用软件反复设置计数初值,这样会影响到定时精度,也会使程序设计比较麻烦,使用定时器方式2可解决反复装初值所带来的问题。

3)定时器方式2为8位初值自动重装的定时/计数器,THX被作为常数缓冲器,当TLX计数溢出时,在使溢出标志TFX置1的同时,还会自动地将THX中的常数重新装入TLX中。方式2适合用作较精确的脉冲信号发生器。计数初值为:

THX=256-N,TLX=256-N

4)方式3只适用于定时/计数器T0。此时,T0被分成两个独立的计数器。需要注意:当T0工作在方式3时,T1一定不要有中断的场合,因为工作方式3时,T0会占用T1的中断标志位。

取模与取余问题:

高八位和低八位就像我们十进制的十位和个位,就比如整数89=8*10+9*1;十位上算的“8”当然就是要89对10求模,而个位上的9则是89对10求余了!至于为什么TH0和TL0赋初值要对256求模或求余,那是因为高八位和低八位都是8个byte的,也就是它最大只能是“11111111”,化成十进制就是255,再加最前面的“00000000”也就是256个位矢量,所以就要对256求模或求余。

因为高TH0和低TH0都是八位的 最多能装的数据是255,如果不对255取模取余的话 是装不下的。

定时器方式0为13为计数器,由TL0低5位(高3位未用),所以应对2^5也就是32进行取余、取模。

定时器模式2是自动重装模式, TH0和TL0都要用到,TL0是真正的定时/计数器,肯定要有一个初值,在此基础上向上计数,溢出时就将TH0的值装入TL0,不用再次人工写程序干预

四、计数器初值的计算:

计数器的初值计算要比定时器的相对简单,例如:定时器T1工作在方式2的计数器状态,计算T1的初值:

初值X = 2^8 – 计数值

51单片机定时器初值计算详解相关推荐

  1. 51单片机定时器初值计算以及初值计算软件

    51单片机定时器初值计算以及初值计算软件 不想搞懂计算原理的直接跳到文章末尾,使用初值计算软件来解决有关初值计算的问题 51单片机定时器初值计算部分 时钟周期,也称为振荡周期:定义为时钟脉冲的倒数,在 ...

  2. 51单片机定时器初值计算

    **菜鸟关于51类单片机的定时器初值计算问题的计算**首先先来介绍单片机的几个周期: 1.时钟周期,也称为振荡周期:定义为时钟脉冲的倒数,在单片机中也就等于晶振的倒数. 51单片机中把一个时钟周期定义 ...

  3. 请描述定时器初值的计算方式_51单片机定时器初值计算方法详解

    在学习单片机的时候,我们发现很多功能都是通过中断来实现的.之前也举过烧水的例子来阐述中断,今天就讲解一下定时器赋初值的方法.8位的定时器最大可计数2的8次方为256,16位的定时器最大可计数2的16次 ...

  4. MATLAB与51单片机进行串口通信详解

    目录 一.51单片机与电脑进行串口通信 二.MATLAB串口通信函数 三.串口属性 四.示例Demo 4.1 MATLAB接收单片机发来的数据 4.2 MATLAB向单片机发送数据控制LED 五.总结 ...

  5. 单片机 rs232 c语言,完全手册 51单片机C语言开发详解系列之第8章 串口通讯实战—RS232...

    完全手册 51单片机C语言开发详解系列 技术凝聚实力 专业创新出版 第8章 串口通讯实战-RS232接口电路与软件设计 本章主要通过实际的例子讲解AT89S51单片机的RS232串行通讯接口设计. 随 ...

  6. 51单片机定时器频率计算

    频率是周期的倒数 51单片机定时器中TH与TL可以改变周期来改变频率. 举例如下 3000us=3ms=0.003s   T=0.003s频率=333HZ    2000us=2ms=0.002s   ...

  7. 51单片机定时器初值的计算

    什么是时钟周期?什么是机器周期?什么是指令周期? 时钟周期 时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 ...

  8. 51单片机定时器参数计算

    文章目录 计算 相关文档 寄存器 TCON TMOD 模式0 模式1 模式2 模式3 15系列单片机计算 计算 晶振为:12MHz 定时器0,16位定时器模式 TMOD & = 0xF0; T ...

  9. 51单片机读写内部EEPROM详解

    文档共包含三个程序. 第一个程序最简单易懂,看懂了基本就会读写51单片机内部EEPROM了. 第二个程序和第一个读写EEPROM原理差不多,包含有LCD1602操作方法,有写字符串的方法. 第三个程序 ...

最新文章

  1. 13.在Ubuntu20.04下,chromium无法输入中文以及如何卸载chromium浏览器
  2. java runtime.exec 阻塞_关于Runtime.getRuntime().exec()产生阻塞的2个陷阱
  3. mysql linux版本 rpm_Linux下查看MySQL版本及rpm里有没有MySQL
  4. 如何用 60 行代码爬取知乎神回复?
  5. VS2005 My.Computer.Registry 对象 操作注册表 简单示例
  6. JS高级程序设计——阅读笔记一
  7. DisplayTag使用指南(二) DisplayTag标签库详解
  8. CentOS7中安装五笔输入法
  9. 计算机识别人脸原理,深入浅出人脸识别原理
  10. 保留数据和程序win7升级win10,平滑升级,完美!
  11. linux双击启动脚本文件
  12. 数据挖掘学习1--数据挖掘流程
  13. 【实战经验分享】如何对SSD固态硬盘下发SCSI command?
  14. c语言中数组arr的表示含义
  15. python 股票交易接口 github_GitHub - zhaoneng/vnpy: 基于python的开源交易平台开发框架...
  16. 物流人必备宝藏软件安利——Microcity
  17. 编程珠玑——取样总结
  18. 关于计算机设备自检自查报告,小学计算机室自检自查报告.docx
  19. 如何使用计算器正确计算机,计算器的使用方法
  20. ANSYS多相流的单向流固耦合(2022R1版)

热门文章

  1. 语音识别研究综述——阅读笔记4(总结与展望)
  2. Windows系统快捷键分类说明
  3. 商米V1 Unity接口开发
  4. ubuntu 建立光纤连接
  5. 部署Vista(9)——配置OOBE实现完全自动化
  6. 游戏运营岗位的相关知识点
  7. 【codevs 1450】小天昊的旅行2333333
  8. “中国天眼”观测到宇宙极端爆炸起源证据
  9. 牛客 小米校招 分布式集群消息传递最短路模板题
  10. Android唤醒、解锁屏幕代码实例