从零开始学51单片机定时器

发布者:VelvetSoul最新更新时间:2013-01-16 来源: 21IC 关键字:51单片机  定时器  中断处理 手机看文章 扫描二维码
随时随地手机看文章

基于单片机的定时器电路原理图如下所示:

我们学单片机是首先学的就是 led 闪烁,那是用延时程序做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道单片机只能这样工作吗?当然不是,我们能用定时器来实现灯的闪烁的功能。

例 1:查询方式

ORG 0000H

AJMP START

ORG 30H

START:

MOV P1,#0FFH ;关所 灯

MOV TMOD,#00000001B ;定时/计数器 0 工作于方式 1

MOV TH0,#15H

MOV TL0,#0A0H ;即数 5536

SETB TR0 ;定时/计数器 0 开始运行

LOOP:JBC TF0,NEXT ;如果 TF0 等于 1,则清 TF0 并转 NEXT 处

AJMP LOOP ;不然跳转到 LOOP 处运行

NEXT:CPL P1.0

MOV TH0,#15H

MOV TL0,#9FH;重置定时/计数器的初值

AJMP LOOP

END AJMP LOOP

END

键入程序,看到了什么?灯在闪烁了,这可是用定时器做的,不再是主程序的循环了。简单地分析一下程序,为什么用 JBC 呢?TF0 是定时/计数器 0 的溢出标记位,当定时器产生溢出后,该位由 0 变 1,所以查询该位就可知宇时时间是否已到。该位为 1 后,要用软件将标记位清 0,以便下一次定时是间到时该位由 0 变 1,所以用了 JBC 指令,该指位在判 1转移的同时,还将该位清 0。

以上程序是能实现灯的闪烁了,可是主程序除了让灯闪烁外,还是不能做其他的事啊!不,不对,我们能在 LOOP:……和 AJMP LOOP 指令之间插入一些指令来做其他的事情,只要保证执行这些指令的时间少于定时时间就行了。那我们在用软件延时程序的时候不是也能用一些指令来替代 DJNZ 吗?是的,但是那就要求你精确计算所用指令的时间,然后再减去对应的 DJNZ 循环次数,很不方便,而现在只要求所用指令的时间少于定时时间就行,显然要求低了。当然,这样的办法还是不好,所以我们常用以下的办法来实现。[page]

程序 2:用中断实现

ORG 0000H

AJMP START

ORG 000BH ;定时器 0 的中断向量地址

AJMP TIME0 ;跳转到真正的定时器程序处

ORG 30H

START:

MOV P1,#0FFH ;关所 灯

MOV TMOD,#00000001B ;定时/计数器 0 工作于方式 1

MOV TH0,#15H

MOV TL0,#0A0H ;即数 5536

SETB EA ;开总中断允许

SETB ET0 ;开定时/计数器 0 允许

SETB TR0 ;定时/计数器 0 开始运行

LOOP: AJMP LOOP ;真正工作时,这里可写任意程序

TIME0: ;定时器 0 的中断处理程序

PUSH ACC

PUSH PSW ;将 PSW 和 ACC 推入堆栈保护

CPL P1.0

MOV TH0,#15H

MOV TL0,#0A0H ;重置定时常数

POP PSW

POP ACC

RETI

END

上面的例程中,定时时间一到,TF0 由 0 变 1,就会引发中断,CPU 将自动转至 000B处寻找程序并执行,由于留给定时器中断的空间只有 8 个字节,显然不足以写下所有有中断处理程序,所以在 000B 处安排一条跳转指令,转到实际处理中断的程序处,这样,中断程序能写在任意地方,也能写任意长度了。进入定时中断后,首先要保存当前的一些状态,程序中只 演示了保存存 ACC 和 PSW,实际工作中应该根据需要将可能会改变的单元的值都推入堆栈进行保护(本程序中实际不需保存护任何值,这里只作个演示)。

上面的两个单片机程序运行后,我们发现灯的闪烁非常快,根本分辨不出来,只是视觉上感到灯有些晃动而已,为什么呢?我们能计算一下,定时器中预置的数是 5536,所以每计 60000 个脉冲就是定时时间到,这 60000 个脉冲的时间是多少呢?我们的晶体震荡器 是12M,所以就是 60000 微秒,即 60 毫秒,因此速度是非常快的。如果我想实现一个 1S 的定时,该怎么办呢?在该晶体震荡器濒率下,最长的定时也就是 65。536 个毫秒啊!上面给出 一个例程。

ORG 0000H

AJMP START

ORG 000BH ;定时器 0 的中断向量地址

AJMP TIME0 ;跳转到真正的定时器程序处

ORG 30H

START:

MOV P1,#0FFH ;关所 灯

MOV 30H,#00H ;软件计数器预清 0

MOV TMOD,#00000001B ;定时/计数器 0 工作于方式 1

MOV TH0,#3CH

MOV TL0,#0B0H ;即数 15536

SETB EA ;开总中断允许

SETB ET0 ;开定时/计数器 0 允许

SETB TR0 ;定时/计数器 0 开始运行

LOOP: AJMP LOOP ;真正工作时,这里可写任意程序

TIME0: ;定时器 0 的中断处理程序

PUSH ACC

PUSH PSW ;将 PSW 和 ACC 推入堆栈保护

INC 30H

MOV A,30H[page]

CJNE A,#20,T_RET ;30H 单元中的值到了 20 了吗?

T_L1: CPL P1.0 ;到了,取反 P10

MOV 30H,#0 ;清软件计数器

T_RET:

MOV TH0,#15H

MOV TL0,#9FH ;重置定时常数

POP PSW

POP ACC

RETI

END

先自己分析一下,看看是怎么实现的?这里采用了软件计数器的概念,思路是这样的,先用定时/计数器 0 做一个 50 毫秒的定时器,定时是间到了以后并不是立即取反 P10,而是将软件计数器中的值加 1,如果软件计数器计到了 20,就取反 P10,并清掉软件计数器中的值,不然直接返回,这样,就变成了 20 次定时中断才取反一次 P10,因此定时时间就延长了成了 20*50 即 1000 毫秒了。

这个思路在工程中是非常有用的,有的时候我们需要若干个定时器,可 51 中总共才有 2个,怎么办呢?其实,只要这几个定时的时间有一定的公约数,我们就能用软件定时器加以实现,如我要实现 P10 口所接灯按 1S 每次,而 P11 口所接灯按 2S 每次闪烁,怎么实现呢?对了我们用两个计数器,一个在它计到 20 时,取反 P10,并清零,就如上面所示,另一个计到 40 取反 P11,然后清 0,不就行了吗?这部份的程序如下

ORG 0000H

AJMP START

ORG 000BH ;定时器 0 的中断向量地址

AJMP TIME0 ;跳转到真正的定时器程序处

ORG 30H

START:

MOV P1,#0FFH ;关所 灯

MOV 30H,#00H ;软件计数器预清 0

MOV TMOD,#00000001B ;定时/计数器 0 工作于方式 1

MOV TH0,#3CH

MOV TL0,#0B0H ;即数 15536

SETB EA ;开总中断允许

SETB ET0 ;开定时/计数器 0 允许

SETB TR0 ;定时/计数器 0 开始运行

LOOP: AJMP LOOP ;真正工作时,这里可写任意程序

TIME0: ;定时器 0 的中断处理程序

PUSH ACC

PUSH PSW ;将 PSW 和 ACC 推入堆栈保护

INC 30H

INC 31H ;两个计数器都加 1

MOV A,30H

CJNE A,#20,T_NEXT ;30H 单元中的值到了 20 了吗?

T_L1: CPL P1.0 ;到了,取反 P10

MOV 30H,#0 ;清软件计数器

T_NEXT:

MOV A,31H

CJNE A,#40,T_RET ;31h 单元中的值到 40 了吗?

T_L2:

CPL P1.1

MOV 31H,#0 ;到了,取反 P11,清计数器,返回

T_RET:

MOV TH0,#15H

MOV TL0,#9FH ;重置定时常数

POP PSW

POP ACC

RETI

END

关键字:51单片机  定时器  中断处理 引用地址:从零开始学51单片机定时器

上一篇:AT89S51看门狗程序例子
下一篇:51单片机串口通信错误的原因

推荐阅读最新更新时间:2024-03-16 13:16

AT89C51单片机电话遥控报警器电路的设计
1 引 言 由于经济的快速发展,人们生活水平得到较大的提高,生活节奏也越来越快,为此家电遥控和家庭安全也为人们所需要和重视。以AT89C51单片机为核心通过电话进行电器遥控和报警装置主要解决这些问题。他的主要功能有:通过电话可以遥控16路电器通断,遥控路数可以根据需要进行扩展;可以实现电器调压调速控制,有密码设定,保密安全性好;有语言提示,避免盲目操作;可以取消已输入的操作命令;当单片机接收到家中天然气泄露、温度超限和失窃信号后会自动拨打预留电话并报告家中发生的情况。 2硬件电路设计 总体电路设计思路是:电话遥控报警器与家用电话采用并联方式,当有振铃信号时单片机开始记数,前10次铃声内若有人接电话,则遥控报警器被屏蔽,不影响正
[单片机]
AT89C<font color='red'>51单片机</font>电话遥控报警器电路的设计
使用普通IO口自定义协议实现两个51单片机互相通讯
因为想使两个51单片机通讯,又不能使用串口,因为STC89C52单片机只有一个串口,己被占用了,没有串口可以用。所以编写了这个程序。 使用仿真软件进行测试,工作正常。 在电路上实际测试,运行正常。 对控制线,进行短接干扰,测试,都按照预想的结果运行。 测试代码: 发送端不停的发送自定义数据帧,每发送一次,将第数据帧中的2个字节数加 1,再发送。 接收端使用LCD1602 将接收的据据帧中的第2个字节,显示出来。 对两根控制线进行断线,和对地短路干扰测试,也按照预想,干扰消除后,恢复正常工作。 下面是说明文档,附件源代码,和仿真电路图下载。 双单片机通信协议说明文档 一、通信协议的作用 功能:实现两片51单片机互相通
[单片机]
使用普通IO口自定义协议实现两个<font color='red'>51单片机</font>互相通讯
定时器中断程序-AVR STUDIO6-ATMEGA88PA
#include avr/io.h #include avr/interrupt.h unsigned int CNT = 0; void timer0_init() { TCCR0A = 0x00; //普通模式 TCCR0B = 0x00; //停止计数 TCNT0 = 0xFA; //计数初值,为了单步时能快点计数溢出,就用0xFA作初值了 TIMSK0 = 0x01; //计数溢出使能 } int main(void) { timer0_init(); TCCR0B = 0x01; //计数频率=系统时钟频率 sei(); //开启全局中断 while(1) { ;//TODO
[单片机]
S3C2440的PWM及定时器的使用
s3c2440芯片中一共有5个16位的定时器,其中有4个定时器(定时器0~定时器3)具有脉宽调制功能,即他们都有个输出引脚,可以通过定时器来控制引脚周期性的高低电平变化,定时器4没有输出引脚。上次脱机运行PWM测试程序实验的时候就用到了这块,所以这次将PWM和定时器放在一起来学习。 定时器部件的时钟源为PCLK,首先通过两个8位预分频器降低频率,定时器0和1共用第一个预分频器,2,3,4共用第二个预分频器。预分频器输出接入第二级分频器,可以生成5种分频信号(1/2,1/4,1/8,1/16,TCLK),其中8位预分频器是可编程,根据装载值来分频PCLK,值储存在TCFG0和TCFG1中。 定时器内部控制逻辑工作流
[单片机]
STM32定时器中断应用实例
本文将介绍:通过STM32cube mx配置工程文件,实现定时器中断的功能; 实例中使用的是STM32F407芯片 ①STM32cube mx配置工程文件 ②代码实现 ①STM32cube mx配置工程文件 Step1:使能RCC、选择外部晶振 Step2:配置时钟树 Step3:使能TIM6、配置TIM6 ,1秒产生一次定时器中断 Step4:配置中断的优先级分组、中断优先级 Step4:使能串口、用于调试使用 Step5:生成工程文件 ②代码实现 Step1:编写串口输出重定向函数,用于调试使用;记得添加头文件stdio.h Step2:开启定时器中断 Step3:自定义定时器中断服务函数 先在
[单片机]
STM32<font color='red'>定时器</font>中断应用实例
基于AT89C51单片机实现剪毛刀架高度自动控制系统的设计
概述 人造毛皮后整理联合烫剪机中剪毛刀架的定位调节,原是人工用按钮控制异步电动机正、反转,通过机械减速器(齿轮装置)后带动剪毛刀架蜗杆,使剪毛刀架做上、下运动至要求的位置。操作烦琐,需反复测量、调整,很难恰好到位,误差大。为此,我们用AT89C51单片机构成剪毛高度控制器,对剪毛刀架高度进行自动控制。 使用该控制器,只需由触摸开关设定工艺要求的剪毛高度(毫米数),控制器则发出相应的控制信号使剪毛刀架达到希望的高度,并可由工艺人员设置相对的机械零位。对运行状态和参数设置进行数码显示,相应地还有剪毛刀架高度减少及增大指示,控制趋势一目了然。 一.硬件设计 根据用户要求,为不增加成本,驱动电动机仍保持原异步电动机,原机械减速器及
[单片机]
基于AT89C<font color='red'>51单片机</font>实现剪毛刀架高度自动控制系统的设计
51单片机实现两片联级74HC595控制跑马灯
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: LED-74HC595 ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200529 ---- @ModifiedTime: 20200529
[单片机]
<font color='red'>51单片机</font>实现两片联级74HC595控制跑马灯
c51中定时器工作时如何使用T0脚输入脉冲信号?
嵌入式系统中,定时器是一种常用的设备,可以实现各种时间控制功能,如计时、计数、产生中断等。8051单片机中有两个定时器:T0和T1,其中T0定时器主要用于计时和计数操作,可以通过T0脚输入脉冲信号来控制定时器的工作。 T0脚是单片机的P3.4口,既可以作为普通的输入输出口,也可以作为T0定时器的外部输入引脚。当T0脚作为定时器的外部输入引脚时,可以通过输入的脉冲信号来控制定时器的计数。在使用T0脚输入脉冲信号时,需要采取一些措施来确保信号的稳定性和正确性。 首先,需要确定输入脉冲信号的频率。在使用T0脚输入脉冲信号时,需要将信号的频率与定时器的工作频率相匹配。具体来说,当定时器使用外部时钟源时,其工作频率为外部时钟源频率的一半,因
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved