MCS-51单片机精确定时的两种编程方法介绍
MCS-51单片机的中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3~8个机器周期[1]。无论是哪一种原因引起的误差,在精确定时的应用场合,必须考虑它们的影响,以确保精确的定时控制。根据定时中断的不同应用情况,应选择不同的精确定时编程方法。
文中以定时器T1工作在定时方式1为例,晶振频率为12MHz。例如:TL431ACLPR
1 方法1
在定时器溢出中断得到响应时,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据此计数值算出到下一次中断时,需多长时间,由此来重装载和启动定时器。例如定时周期为1ms,则通常定时器重装载值为-1000(0FC18H)。下面的程序在计算每个定时周期的精确重装载值时,考虑了由停止计数(CLR TR1)到重新启动计数(SETB TR1)之间的7个机器周期时间。程序中#LOW(-1000+7)和#HIGH(-1000+7)是汇编符号,分别表示-1000+7=0FC1FH这个立即数的低位字节(1FH)和高位字节(0FCH)。
……
CLR EA ;禁止所有中断
CLR TR1 ;停止定时器T1
MOV A,#LOW(-1000+7) ;期望数的低位字节
ADD A,TL1 ;进行修正
MOV TL1,A ;重装载低位字节
MOV A,#HIGH(-1000+7) ;对高位字节处理
ADDC A,TH1
MOV TH1,A
SETB TR1 ;重启动定时器
SETB EA ;重开中断
……
此方法适用于各种原因造成的定时误差的情况,为通用方法。
2 方法2
假如定时周期为10ms,通常定时器重装载值为0D8F0H,中断子程序如下[2]:
ORL TL1,#0F0H
MOV TH1,#0D8H
……
这里用ORL TL1,#0F0H代替MOV TL1,#0F0H 可提高定时精度。此方法只适用于重装载值低位字节的低4位为零,且中断响应的延迟时间小于16个机器周期的情况。类似的定时器重装载值有0FFF0H,0FFE0H等。
3 方法3
假如定时周期为1ms,通常定时器重装载值为0FC18H,中断子程序如下:
MOV A,#LOW(-1000+4) ;期望数的低位字节
ADD A,TL1
MOV TL1,A
MOV A,#HIGH(-1000+4) ;对高位字节处理
ADDC A,TH1
MOV TH1,A
DEC TL1 ;恢复提前了的2个机器周期
……
这种方法中不停止定时器计数过程,若在执行指令ADDC A,TH1 或MOV TH1,A时,恰好产生TL1溢出向TH1进位的情况,则TH1的值就不对了,会产生更大的误差。为此,程序段开头为重装载值加4,若有溢出进位,则可提前发生,其中2个机器周期是考虑到为TL1重装载占用的时间。
此方法适用于系统中无其它更高优先级中断源的情况。若类似方法1,在程序段开头和结尾分别加上禁止所有中断(CLR EA)和开中断(SETB EA)指令,则将适用于所有情况。
4 方法4
假如定时周期不确定,只知道定时器重装载值存放在寄存器R3、R2中,中断子程序如下:
MOV A,#05H ;3个机器周期装载TL1,2个周期提前
ADD A,TL1
ADD A,R2
MOV TL1,A
MOV A,R3 ;处理高位字节
ADDC A,TH1
MOV TH1,A
DEC TL1 ;恢复提前了的2个机器周期
……
此法适用于定时周期不确定的情况,其它同方法3。
5 方法5
当定时中断发生的位置可预知时,通常出现在主程序的AJMP $ (或SJMP $)等待指令处,中断延迟时间为3个或4个机器周期。取固定值4可简化补偿程序。以定时周期1ms为例,中断子程序如下:
ORG 001BH
MOV TL1,#LOW(-1000+4)
MOV TH1,#HIGH(-1000+4)
……
此方法适用于定时中断总发生在同一条指令位置,且无其它中断源的情况。
MCS-51单片机精确定时的两种编程方法介绍相关推荐
- 微信转账 服务器错误,微信转账转错了怎么办 两种补救方法介绍
微信转账转错了怎么办 两种补救方法介绍 罗琛琛 2018-08-31 11:03:50 希财网 微信转账已经是我们日常生活中再常见不过的事情了,但是一不小心也可能会出现微信转账转错了的情况,有可 ...
- 51单片机流水灯的三种实现方法
首先,介绍下原理.下图为主控芯片和流水灯模块的原理图.流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯.相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可. ...
- 使用c语言编程时输入具体的年份和月份,求月份的天数的两种编程方法
方法一:使用if--else语句 #include"stdio.h" #include"conio.h" int main() {int year,month, ...
- 51单片机有几个通用io口_51单片机IO口的四种使用方法
原标题:51单片机IO口的四种使用方法 传统51单片机IO接口只可以作为标准双向IO接口,如果用其来驱动LED只能用灌电流的方式或是用三极管外扩驱动电路. 灌电流方式 LED正极接VCC,负极接IO口 ...
- xp系统打不开vba服务器,WinXp系统无法打开控制面板怎么办?Xp系统打不开控制面板的两种解决方法...
WinXp系统下,我们可以通过windows控制面板实现设置系统外观和主题.添加/删除程序等功能.不过,最近却有些XP用户反映自己在打开控制面板时,遇到了无法打开的问题.这该怎么办呢?接下来,小编就向 ...
- 2008服务器看不见无线图标,Win7系统无线网络图标消失不见两种解决方法
Win7系统无线网络图标消失不见两种解决方法介绍给大家,随着无线网络的普及,家庭.公众场所都开始使用无线网络.使用过程中会遇到一些故障问题,最近有用户发现无线网络消失不见了,无法连接网络上网,遇到这样 ...
- 单片机数字定时闹钟设计c语言,电子设计 基于51单片机的定时闹钟设计.doc
电子设计 基于51单片机的定时闹钟设计 课件之家精心整理资料--欢迎你的欣赏 课件之家精心整理资料--欢迎你的欣赏 摘 要 单片计体积小.能耗低.成本低.功能强,广泛应用于智能产品和工业自动化上.本次 ...
- 51单片机的定时/计数器
51单片机的定时/计数器 实现LED灯闪烁,代码如下: #include <reg51.h> //51单片机头文件 sbit LED = P0^0; //定义特殊寄存器p0.0;注意:sb ...
- 宝塔定时任务执行php源码任务_ThinkPHP框架实现定时执行任务的两种方法分析
本文实例讲述了ThinkPHP框架实现定时执行任务的两种方法.分享给大家供大家参考,具体如下: 在平常的项目中我们总是会遇到需要将某个方法任务定时执行的问题,定时执行方法任务如果我们拥有服务器的权限, ...
最新文章
- Java Exception
- Hashtable的使用
- java 实现set_js 实现JAVASET
- 【图专题】三篇图神经网络中的图核函数:主要学习图的拓扑结构从而解决图分类问题...
- ITK:多相Chan和Vese稀疏场水平集分割
- Storm概念学习系列之storm的特性
- leetcode792. 匹配子序列的单词数
- Go 语言成为最受欢迎的语言
- Kaggle-泰坦尼克号
- bzoj3620 似乎在梦中见过的样子
- 移动端页面rem布局出现横向滚动条的修复
- java 上位机_java实现上位机与下位机串口通信
- 电风扇计算机控制系统,电脑控制型电风扇电路原理与检修
- Delphi著名皮肤控件库大全
- 百万军师v1.0——直播答题答案快速搜索
- php根据IP获取省份
- 高新技术企业申请后多久会出结果呢?
- Learn Vim Progressively博文学习
- 食物链(Food Chain POJ 1182)
- bugku_noteasytrick