第十九课 单片机的定时与中断实验.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十九课 单片机的定时与中断实验

第十九课 单片机的定时与中断实验 前面的两节课程我们介绍了单片机定时/计数器和中断的原理及结构,这节课我们就来做几个实验验证一下前面所学的内容。实验一、利用定时器实现灯的闪烁 在开始学单片机时我们所做的第一个实验就是LED 灯的闪烁,不过那是用延时程序做的,现在回想起来,这样做不是很恰当,为什么呢?因为我们的主程序做了灯的闪烁,就不能再干其它的事情了,难道单片机只能这样工作吗?当然不是,我们可以用定时器来完成灯的闪烁功能。 程序如下: ORG 0000H ;? AJMP START ;? ORG 30H ;? START:MOV P1,#0FFH ;关所有的灯 MOV TMOD, ;?定时/计数器0 工作于方式1? MOV TH0,#15H ;? MOV TL0,#0A0H ;立即数(15AH+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。 把程序下载到实验板,看到了什么?灯开始闪烁了,这可是用定时器做的,不再是主程序的循环了。简单分析一下程序,为什么用JBC 呢?TF0 是定时/计数器0 的溢出标记位,当定时器产生溢出后,该位由“0”变“1”,所以查询该位就可知道定时时间是否已到,该位为“1”后,要用软件将标记位清“0”,以便下一次定时时间到了将该位由“0”变为“1”,所以用了JBC 指令,该指令前面已经学过--判“1”转移的同时,将该位清“0”。 以上程序可以实现灯的闪烁了,可是主程序除了让灯闪烁外,还是不能做其他的事啊!不对,我们可以在LOOP:JBC TF0,NEXT 和AJMP LOOP 指令之间插入一些指令来做其他的事情,只要保证执行这些指令的执行时间少于定时时间就可以了。 提个问题,我们在用软件延时程序的时候不是也可以用DJNZ 替代一些指令吗?是的,但是那就要求你精确计算所用指令的时间,然后再减去相应的DJNZ 循环次数,很不方便,而现在只要求所用指令的时间少于定时时间就行,显然要求低了。当然,这样的方法还不是最好,所以我们常用下面的方法来实现: 实验二、利用中断方式实现灯的延时 ORG 30H ;START:MOV P1,#0FFH ;关所有灯MOV TMOD, ; 定时/计数器0 工作于方式1 MOV TH0,#15H ; MOV TL0,#0A0H ;立即数5536 SETB EA ;开总中断允许SETB ET0 ;开定时/计数器0 允许SETB TR0 ;定时/计数器0 开始运行LOOP:AJMP LOOP ;真正工作时,这里可写任意程序TIME0USH ACC ;将ACC 推入堆栈保护PUSH PSW ;将PSW 推入堆栈保护CPL P1.0 ;取反P1.0 MOV TH0,#15H ; MOV TL0,#0A0H ;重置定时常数POP PSW?OP ACC ;RETI ;END。 上面的例子中,定时时间一到,TF0 由“0”变“1”,就会引发中断,CPU 将自动转至000B 处寻找程序并执行,由于留给定时器中断的地址空间只有8 个字节,显然不足以写下所有的中断处理程序,所以在ORG 000BH 后安排了一条长跳转指令,转到实际处理中断的程序处,这样,中断程序可以写在任意地方,也可以写任意长度了。单片机进入定时中断后,首先要保存当前的一些状态,在这里程序只演示了保存ACC 和PSW,实际工作中应该根据需要将可能会改变的单元的值都推入堆栈进行保护(本程序中实际不需保护任何值,这里只作个演示)。 上面的两个程序运行后,我们发现灯的闪烁非常快,根本分辨不出来,只是视觉上感到灯有些晃动而已,为什么呢?我们可以计算一下,定时器中预置的数是5536 ,所以每计60000(65536-5536 )个脉冲就是定时时间到,这60000 个脉冲的时间是多少呢?我们的晶振是12 兆的,所以就是60000 微秒,即60 毫秒,因此速度是非常快的。如果我想实现一个1 秒的定时器,该怎么办呢?在该晶振频率下,最长的定时也就是65.536 个毫秒啊!请看第三个实验: 实验三、延长定时时间的方法 程序如下: ORG 0000H ; AJMP START ;ORG 000BH ;定时器0 的中断向量地址AJMP TIME0 ;跳转到真正的定时器程序处ORG 30H ;START:MOV P1,#0FFH ; 关所有的灯MOV 30H,#00H ;软件计数器预清

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档