51单片机定时器初值计算详解
前言:
本文详细介绍了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定时器初值计算:
- 晶振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单片机定时器初值计算详解相关推荐
- 51单片机定时器初值计算以及初值计算软件
51单片机定时器初值计算以及初值计算软件 不想搞懂计算原理的直接跳到文章末尾,使用初值计算软件来解决有关初值计算的问题 51单片机定时器初值计算部分 时钟周期,也称为振荡周期:定义为时钟脉冲的倒数,在 ...
- 51单片机定时器初值计算
**菜鸟关于51类单片机的定时器初值计算问题的计算**首先先来介绍单片机的几个周期: 1.时钟周期,也称为振荡周期:定义为时钟脉冲的倒数,在单片机中也就等于晶振的倒数. 51单片机中把一个时钟周期定义 ...
- 请描述定时器初值的计算方式_51单片机定时器初值计算方法详解
在学习单片机的时候,我们发现很多功能都是通过中断来实现的.之前也举过烧水的例子来阐述中断,今天就讲解一下定时器赋初值的方法.8位的定时器最大可计数2的8次方为256,16位的定时器最大可计数2的16次 ...
- MATLAB与51单片机进行串口通信详解
目录 一.51单片机与电脑进行串口通信 二.MATLAB串口通信函数 三.串口属性 四.示例Demo 4.1 MATLAB接收单片机发来的数据 4.2 MATLAB向单片机发送数据控制LED 五.总结 ...
- 单片机 rs232 c语言,完全手册 51单片机C语言开发详解系列之第8章 串口通讯实战—RS232...
完全手册 51单片机C语言开发详解系列 技术凝聚实力 专业创新出版 第8章 串口通讯实战-RS232接口电路与软件设计 本章主要通过实际的例子讲解AT89S51单片机的RS232串行通讯接口设计. 随 ...
- 51单片机定时器频率计算
频率是周期的倒数 51单片机定时器中TH与TL可以改变周期来改变频率. 举例如下 3000us=3ms=0.003s T=0.003s频率=333HZ 2000us=2ms=0.002s ...
- 51单片机定时器初值的计算
什么是时钟周期?什么是机器周期?什么是指令周期? 时钟周期 时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 ...
- 51单片机定时器参数计算
文章目录 计算 相关文档 寄存器 TCON TMOD 模式0 模式1 模式2 模式3 15系列单片机计算 计算 晶振为:12MHz 定时器0,16位定时器模式 TMOD & = 0xF0; T ...
- 51单片机读写内部EEPROM详解
文档共包含三个程序. 第一个程序最简单易懂,看懂了基本就会读写51单片机内部EEPROM了. 第二个程序和第一个读写EEPROM原理差不多,包含有LCD1602操作方法,有写字符串的方法. 第三个程序 ...
最新文章
- 13.在Ubuntu20.04下,chromium无法输入中文以及如何卸载chromium浏览器
- java runtime.exec 阻塞_关于Runtime.getRuntime().exec()产生阻塞的2个陷阱
- mysql linux版本 rpm_Linux下查看MySQL版本及rpm里有没有MySQL
- 如何用 60 行代码爬取知乎神回复?
- VS2005 My.Computer.Registry 对象 操作注册表 简单示例
- JS高级程序设计——阅读笔记一
- DisplayTag使用指南(二) DisplayTag标签库详解
- CentOS7中安装五笔输入法
- 计算机识别人脸原理,深入浅出人脸识别原理
- 保留数据和程序win7升级win10,平滑升级,完美!
- linux双击启动脚本文件
- 数据挖掘学习1--数据挖掘流程
- 【实战经验分享】如何对SSD固态硬盘下发SCSI command?
- c语言中数组arr的表示含义
- python 股票交易接口 github_GitHub - zhaoneng/vnpy: 基于python的开源交易平台开发框架...
- 物流人必备宝藏软件安利——Microcity
- 编程珠玑——取样总结
- 关于计算机设备自检自查报告,小学计算机室自检自查报告.docx
- 如何使用计算器正确计算机,计算器的使用方法
- ANSYS多相流的单向流固耦合(2022R1版)