- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用定时器中断闪灯-51单片机学习网
第6 课,用定时器中断闪灯,定时器中断的学习
在第二课,我们学习了用指令延时闪灯,但是用指令方式闪灯有cpu 不能做其他工作的
缺点。
这一课,我们将学习如何使用定时器方式使灯闪烁。
中断的理解。
这里将涉及到单片机中断的应用,在cpu 的一步步按照指令运行的过程中(主程序),
可能会有其它的更紧急的需要做的事情(中断服务程序),需要cpu 暂时停止当前的程序(主
程序),做完了(中断服务程序)之后,又可以继续去运行先前的程序(主程序)。就像你正
在吃饭,一边又在给水桶里放水,吃着吃着,水满了,你就得赶快去把水龙头关掉或者换一
个空的水桶,再回来吃饭。
单片机的定时器就像是一个水桶,你让它启动了,也就是水龙头打开了;开始装水了;
定时在每个机器周期不断自动加1,最后溢出了;水桶的水不断增加,最也就满出来了;定
时器溢出时,你就要去做处理了;水桶的水满了,你也应该处理一下了;处理完后,单片机
又可以回到刚刚开停止的地方继续运行;水桶处理了,先前你在做什么也可以继续去做什么
了。
单片机的主程序是从 0x0000 开始运行的,单片机服务程序从哪里开始运行呢?在 51
里,有多个中断服务程序入口,0 号入口是外中断0 ,地址在0x0003 ;1 号入口是定时器0 ,
在0x000B ;2 号入口是外中断 1;地址在0x0013 ,3 号入口是定时器2 ;地址在0x001B ,
等等。当中断发生时,程序就记下当前运行的位置,跳到对应的中断入口去运行中断服务程
序,运行完之后,又跳回到原来的位置继续运行。
在 C51 中,你不用理会中断服务程序放在哪里,会怎么跳转。你只要把某个函数标识
为几号中断服务函数就可以了。在发生了对应的中断时,就会自动的运行这个函数。
请看一下相关的51 的硬件的书,对定时器工作的寄存器设置做进一步的了解。也可以
做完试验再了解,因为例程中都已经为您设置好了。
请看程序,主程序里的循环里是个死循环,什么也没有做,在实际应用中这里是放的
主程序。
在定时器服务函数里,需要重新置入定时器的值,这样才能保证每次溢出时,都是你
指定的时间。这里置入的是0x0006,还需要走0x 10000-0x0006 个机器周期才溢出。换成10
进制也就是每65530 个机器周期中断一次。我们仿真的晶振是22 118400HZ ,每12 个时钟一
个机器周期。65530 ×120.036 秒。也就是差不多28HZ 的闪烁频率。
因为51 的定时器最大只有 0xffff,溢出的速度很快,无法做出更久的闪烁频率来,这
一课就先观察一下这个28HZ 左右频率。在下一课我们会用静态变量的办法,做一个长达 1
秒钟的LED 闪烁频率。
另外,由于51 从中断发生到进入中断的时间不定,是3 至8 个机器周期,我们在进入
了中断后才重新置新的定时器初始值,这样就会存在定时误差。也就是不是精确定时,如果
要精确定时,需要使用定时器自动装载方式,也就是在定时器溢出的同时,硬件逻辑就自动
把定时器初始值装载进去了,而不是在中断服务程序里赋初始值,这样就可以实现精确定时,
误差只出现晶振的频率上。这是下一颗的内容。
现在请仔细研究一下程序,并编译,进入仿真,全速运行,观察运行结果。我们可以
看到P10 上的LED 在快速闪烁。
顺便,也请再练习一下停止,单步,断点等等的调试方法。
一个特殊的地方,使用DX516 在单步时运行时,可能无法进入到中断服务函数中。这
是因为中断函数可能在单步处理的瞬间已经运行过去了。如果要单步调试中断服务函数,请
在中断服务函数内设置断点,再点全速。稍后就会停止在断点上,就可以继续单步运行了。
如图:
还有,在使用DX5 16 仿真器时,你输入EA 查看它的值时,会发现它等于 0 ,而你明
明在程序中置了1。
作业:
试着设置一个新的定时器初始值,看看闪烁频率会不会变化。注意如果太快,肉眼就
无法观察到闪烁了。
文档评论(0)