0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于AT89C51系统时钟中断的应用

电子工程师 来源:网络整理 作者:工程师姚远香 2018-07-21 11:08 次阅读

功能强大的时钟中断

单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。我们可以把一些例行的及需要定时执行的程序放在时钟中断中,还可以利用时钟中断协助主程序完成定时、延时等操作。

下面以6MHz时钟的AT89C51系统为例,说明时钟中断的应用。

定时器初值与中断周期时钟中断无需过于频繁,一般取20mS(50Hz)即可。如需要百分之一秒的时基信号,可取10mS(100Hz)。这里取20mS,用定时器T0工作于16位定时器方式(方式1)。T0的工作方式为:每过一个机器周期自动加1,当计满0FFFFh,要溢出时,便会产生中断,并由硬件设置相应的标志位供软件查询。即中断时比启动时经过了N+1个机器周期。所以,我们只要在T0中预先存入一个比满值0FFFFh小N的数,然后启动定时器,便会在N个机器周期后产生中断。这个值便是所谓的“初值”。下面计算我们需要的初值:时钟为6MHz,12个时钟周期为一个机器周期,20mS中有10000个机器周期。(10000)10=(2710)16,则0FFFFh-2710h+1=0D8F0h。由于响应中断、保护现场及重装初值还需要7~8个机器周期,把这个值再加上7,即T0应装入的初值是0D8F7h。每次中断进入后,先把A及PSW的值压入堆栈,然后即把0D8F7h装入T0。

设置一个单元,每次中断加1我们可以取内部RAM中一个单元,取名为INCPI(Increase Per Interrupt),在中断中,装完T0初值后,用INCINCPI指令将其加一。从这个单元中,无论中断程序还是主程序,都可以从中获得20mS的1~256之间任意整数倍的信号。例如:有一段向数码管送显的程序,需要每0.5秒执行一次以便刷新显示器,便可以设一单元(称为等待单元)W_DISP,用/MOV A,INCPI/ADD A,#25/MOV W_DISP,A/语句让其比当前的INCPI值大25,然后在每次中断中检查是否于INCPI值相等。若相等,说明已过了25个中断周期,便执行送显程序,并且让W_DISP再加上25,等待下个0.5秒。我们可以设置多个等待单元,以便取出多个不同的时基信号。让中断程序在每次中断时依次查询各个等待单元是否与INCPI相等,若相等,则执行相应的处理,并重新设置该等待单元的值,否则跳过。例如:用0.5秒信号刷新或闪烁显示器,用1秒信号产生实时时钟,或输出一定频率的方波,以一定间隔查询输入设备等。

在中断中读键通常,我们在主程序中读键盘,步骤为:扫描键盘,若有键按下,则延时几十毫秒去抖动,再次确认此键确实按下,然后处理该键对应的工作,完成后再次重上述步骤。但这有两点不足:1.处理相应工作时无法锁存按键的输入,即可能漏键。2.延时去抖时CPU无法做其它事情,效率不高。如果把读键放入时钟中断中,则可避免上述不足。方法为:如果两次相邻的中断中都读到同一个键按下,则这个键是有效的(达到了去抖目的),并将其锁存到先入先出(队列)的键盘缓冲区,等主程序来处理。这样,主程序处理按键的同时,仍可响应键盘的输入。缓冲区深度通常可设为8级,若锁存的键数多于8个,则忽略新的按键,并报警提示用户新的按键将无效。若键盘缓冲队列停滞的时间大大长于主程序处理按键所需要的最大时间,说明主程序已出错或跑飞,可以在中断用指令将系统复位,起到了看门狗的目的。

主程序中的延时由于有常开的时钟中断,所以当主程序中有需要时间较短、精度较高的延时时,应暂时把时钟中断关闭。而程序中需要时间较长、精度不高的延时时,便可仿照下需的写法,避免多层嵌套的循环延时。

例:在P1.1输出1秒的高电平脉冲

MOV A,INCPI

INC A

CJNE A,INCPI$ ;等待一次中断处理完成

SETB P1.1 ;设P1.1为H,脉冲开始

ADD A,#50 ;50个20mS为1秒

CJNE A,INCPI,$ ;等中断将INCPI加一50次

CLR P1.1 ;设P1.1为L,脉冲结束

结束语:从上看出,要灵活地应用时钟中断,将任务合理分配给中断和主程序,并且二者要分工明确,接口简单。这其中的技巧还需要大家在实践中多多摸索与体会。另外要注意:应尽量缩短中断处理程序的执行时间,更不要长于20mS。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 时钟
    +关注

    关注

    10

    文章

    1479

    浏览量

    130304
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41021
  • AT89C51
    +关注

    关注

    27

    文章

    543

    浏览量

    80348
收藏 人收藏

    评论

    相关推荐

    请问AT89C51和S51的烧录方式是一样的么?

    AT89C51和S51的烧录方式是一样的么?
    发表于 10-30 07:37

    请问AT89c51和AT89S52有什么区别?

    AT89C51和AT89S52都是51系单片机它们有什么区别?
    发表于 10-28 07:47

    如何把程序通过烧写器加到at89c51单片机上?

    谁知道要把程序通过烧写器加到at89c51单片机上,那么at89c51的电路该怎么连接才能把这个程序加进去,求高人指点,感激不尽
    发表于 10-26 06:54

    基于AT89C51单片机中断的封帽机保护系统设计

    电子发烧友网站提供《基于AT89C51单片机中断的封帽机保护系统设计.pdf》资料免费下载
    发表于 10-18 10:02 1次下载
    基于<b class='flag-5'>AT89C51</b>单片机<b class='flag-5'>中断</b>的封帽机保护<b class='flag-5'>系统</b>设计

    AT89C51单片机制作分分秒秒简易时钟需要几个中断

    AT89C51单片机制作分分秒秒简易时钟需要几个中断
    发表于 10-17 07:12

    基于AT89C51的防贪睡闹钟设计

    电子发烧友网站提供《基于AT89C51的防贪睡闹钟设计.pdf》资料免费下载
    发表于 10-08 10:50 1次下载
    基于<b class='flag-5'>AT89C51</b>的防贪睡闹钟设计

    at89c51可以在低速时钟下下工作吗?

    at89c51可以在低速时钟下下工作吗
    发表于 09-20 08:19

    基于AT89C51单片机用DS1302与1602LCD设计电子日历与时钟

    基于AT89C51单片机用DS1302与1602LCD设计的可调式电子日历与时钟Proteus仿真及程序
    发表于 05-04 15:35 271次下载

    基于AT89C51单片机用定时器设计的门铃仿真及代码

    基于AT89C51单片机用定时器设计的门铃仿真及代码
    发表于 05-04 15:33 2次下载

    基于AT89C51单片机用计数器中断实现100以内的按键计数

    基于AT89C51单片机用计数器中断实现100以内的按键计数仿真及代码
    发表于 05-04 15:32 1次下载

    基于AT89C51单片机74LS148扩展中断Proteus仿真

    基于AT89C51单片机74LS148扩展中断Proteus仿真及程序
    发表于 05-04 15:23 0次下载

    基于AT89C51单片机1602液晶显示的DS1302实时时钟

    基于AT89C51单片机1602液晶显示的DS1302实时时钟Proteus仿真及程序
    发表于 05-04 15:18 2次下载

    基于AT89C51单片机INT0及INT1中断计数仿真及代码

    基于AT89C51单片机INT0及INT1中断计数仿真及代码
    发表于 05-04 14:53 0次下载

    基于AT89C51单片机INT0中断计数仿真及代码

    基于AT89C51单片机INT0中断计数仿真及代码
    发表于 05-04 14:52 8次下载

    基于AT89C51单片机INT0中断控制LED仿真及代码

    基于AT89C51单片机INT0中断控制LED仿真及代码
    发表于 05-04 14:49 16次下载