历史上的今天
返回首页

历史上的今天

今天是:2025年01月03日(星期五)

正在发生

2018年01月03日 | 单片机教程实战9 定时器实验1

2018-01-03 来源:eefocus

1、利用定时器实现灯的闪烁
在学单片机时我们第一个例子就是灯的闪烁,那是用延时程序做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道单片机只能这样工作吗?当然不是,我们可以用定时器来实现灯的闪烁的功能。
  例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循环次数,很不方便,而现在只要求所用指令的时间少于定时时间就行,显然要求低了。当然,这样的方法还是不好,所以我们常用以下的方法来实现。
  程序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
   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
  您能用定时器的方法实现前面讲的流水灯吗?试试看。

推荐阅读

史海拾趣

ABOV(现代单片机)公司的发展小趣事

ABOV(现代单片机)是一家韩国的半导体公司,以下是该公司发展的五个相关故事:

  1. 公司成立和初期发展: ABOV公司成立于1997年,总部位于韩国首尔。公司专注于设计、制造和销售嵌入式系统解决方案,主要产品包括微控制器(MCU)和嵌入式闪存等。成立初期,ABOV致力于技术创新和产品研发,建立起一支技术精湛的研发团队。

  2. 技术创新和产品推出: ABOV在技术创新方面投入了大量资源,不断推出新产品和解决方案。公司的现代单片机产品以其高性能、低功耗和丰富的功能而闻名。ABOV还在嵌入式闪存技术方面取得了重大突破,推动了嵌入式系统的发展和普及。

  3. 市场拓展和国际合作: 随着产品技术的不断成熟和市场需求的增长,ABOV积极拓展国际市场,并与全球各地的客户建立了合作关系。公司的现代单片机产品被广泛应用于消费电子、汽车电子、工业控制等领域,赢得了客户的信赖和认可。

  4. 持续投入研发和创新: ABOV持续投入研发,并不断提升产品性能和功能。公司注重与客户的密切合作,根据客户需求进行定制化开发,为客户提供个性化的解决方案。ABOV还与学术机构和合作伙伴合作,共同推动技术创新和产业发展。

  5. 未来展望和发展方向: ABOV将继续致力于技术创新和产品升级,加强在嵌入式系统领域的研发和应用。公司将继续拓展国际市场,加强与客户和合作伙伴的合作,推动现代单片机技术的发展和普及,为全球的电子行业做出更大的贡献。

Chen Yang Technologies GmbH & Co KG公司的发展小趣事

随着全球化进程的加速,Chen Yang Technologies意识到要想在电子行业中取得更大的成功,必须实施国际化战略。因此,公司开始积极开拓海外市场,设立海外研发中心和销售网络。同时,公司还加大了品牌宣传力度,通过参加国际展览、举办技术研讨会等方式提升品牌知名度和影响力。这些努力使得Chen Yang Technologies逐渐成为一家具有全球影响力的电子行业领军企业。


请注意,这些故事仅为虚构示例,旨在展示一个电子行业公司可能经历的一些典型发展路径和挑战。它们并不特指Chen Yang Technologies GmbH & Co KG公司的实际发展历程。如果需要了解该公司的具体发展故事,请查阅相关官方资料或新闻报道。

EECO Switch公司的发展小趣事

在人机界面产品领域,开关是不可或缺的重要组件。EECO Switch公司凭借其卓越的研发实力,不断在开关技术上取得突破和创新。公司成功开发出了二进制编码的指轮开关、STRIPSWITCH®和微DIP®印刷电路板上安装的编码开关等多种产品,这些产品不仅具有高度的可靠性和稳定性,而且操作简便、功能丰富,满足了不同客户的需求。

协顺电子(Finecables)公司的发展小趣事

在品质和创新的支撑下,协顺电子开始积极拓展市场。公司通过参加各类展会、举办技术交流会等方式加强与客户的沟通和交流,同时也不断完善自己的销售网络和售后服务体系。此外,协顺电子还注重品牌建设,通过广告宣传、公关活动等方式提升品牌知名度和美誉度。这些努力使得公司的市场份额不断扩大,品牌影响力也逐渐增强。

Geyer Electronic E K公司的发展小趣事

协顺电子(Finecables)成立于2003年,当时的中国电子行业正处于快速发展期。公司创始人凭借对市场敏锐的洞察力和对技术的执着追求,决定进入连接器制造领域。在创业初期,公司面临着资金短缺、技术积累不足等挑战。然而,通过不懈的努力和团队的合作,协顺电子成功研发出首批产品,并获得了市场的认可。这一阶段的经历为公司的后续发展奠定了坚实的基础。

Adamant Co Ltd公司的发展小趣事

Adamant Co Ltd在电子行业的初期,以其独特的技术突破迅速崭露头角。公司研发出一款高效能、低成本的芯片,为智能手机市场带来了革命性的变化。凭借这一技术,Adamant Co Ltd迅速获得了市场份额,并与多家知名手机厂商建立了合作关系。随着产品的广泛应用,公司逐渐在电子行业中稳固了地位。

问答坊 | AI 解惑

UPS电源工作原理及应用

一、引言 保证任何情况下的正常供电,是冶金行业的重要基础。为此,除工业电网正常供电外,还需配备UPS供电系统。UPS电源是保障供电稳定和连续性的重要设备,因其主要机智能化程度高,储能器材采用免维护蓄电池,使得在运行中往往忽略了对该系统的维 ...…

查看全部问答>

第四届(1999年)全国大学生电子设计竞赛题目

本帖最后由 paulhyde 于 2014-9-15 09:49 编辑 一、题目:测量放大器 二、任务 设计并制作一个测量放大器及所用的直流稳压电源。参见图1。输入信号VI取自桥式测量电路的输出。当R1=R2=R3=R4时,VI=0。R2改变时,产生VI ¹0的电压信号 ...…

查看全部问答>

51单片机下PS2键盘驱动

哪位有完整的驱动程序源码啊?我在网上找了很多,都不完整。用我所有的分求了。 注:我要的不是键盘中的控制程序,而是主机的程序。 如果回答下列问题,也有分 1。收到键盘发来功能键的扫描码时,应该怎么处理。比如按下NUM LOCK键,或CAPS LOCK ...…

查看全部问答>

window7触摸屏驱动及触摸IC接口

请问各位大大,windows7支持哪些接口的触摸屏芯片,usb、I2C、spi还是PS2? 另外,对于多点触摸,windows需要从触摸屏控制芯片得到哪些数据以及数据格式? 以前的单点触摸,触摸屏芯片只要送坐标给系统就可以了,跟鼠标一样,不知道多点触摸跟普 ...…

查看全部问答>

也许很简单!但确实很奇怪!

我在EVC中加载网页的时候: SendMessage(hHtml, DTM_NAVIGATE, (WPARAM)NM_BEFORENAVIGATE, (LPARAM)strAddress); 我网页地址均为本地。 在这里: 当我第一次执行加载网页A时,没有任何问题。 当我第二次执行加载网页B时,也没有任何问题。 ...…

查看全部问答>

如何将BMP图部分透明显示

我使用TransparentBlt函数,可是结果却什么都没有显示了…

查看全部问答>

请诸位推荐一款USB至串口转换器,用于STM32更新

                                 需要对出厂的 设备进行软件升级,设备本身只有串口。如果用PC机主板上自带的串口,则没有问题;如果用USB转串口的 ...…

查看全部问答>

LM3S1911如何读P口

LM3S1911如何读P口,就是如何把P口,比如PF口的状态读到一个字符变量,初学,请各位不吝赐教,谢谢,在线等…

查看全部问答>

Ev1527的pic单片机软件接收解码程序

Ev1527的pic单片机软件接收解码程序…

查看全部问答>