历史上的今天
返回首页

历史上的今天

今天是:2025年01月15日(星期三)

正在发生

2018年01月15日 | 单片机编程技巧-功能强大的时钟中断

2018-01-15 来源:eefocus

功能强大的时钟中断 

  在单片机 程序设计中,设置一个好的时钟中断,将能使一个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初值后,用INC INCPI指令将其加一。从这个单元中,无论中断程序还是主程序,都可以从中获得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。


推荐阅读

史海拾趣

Cicoil公司的发展小趣事

近年来,医疗行业对电子设备的需求日益增长。Cicoil公司凭借其在电缆领域的专业技术和丰富经验,开始拓展医疗市场。他们为血液分析仪、监护仪等医疗设备提供高质量的电缆解决方案,为医疗行业的数字化转型做出了贡献。同时,这也为Cicoil公司带来了新的增长点,使其在电子行业中的影响力进一步扩大。

以上五个故事是基于Cicoil公司在电子行业中的可能发展路径而构建的虚构叙述。虽然这些故事并非真实发生的事件,但它们反映了电子行业的发展规律和公司发展的常见模式。实际上,Cicoil公司的发展历程可能更加复杂和多样,需要更多详细的资料和信息才能准确描述。

Analog公司的发展小趣事

Cicoil公司的创立可以追溯到电子行业的快速发展时期。创始人看到了扁平电缆在电子设备中的巨大潜力,于是决定专注于这一领域的研究和开发。他们投入大量资源,研发出具有独特技术的柔性扁平电缆,为电子设备提供了更为灵活和可靠的连接方案。这一创新产品在市场上引起了轰动,为Cicoil公司赢得了良好的声誉和市场份额。

GSI Technology公司的发展小趣事

从财务表现来看,GSI Technology在过去几年中取得了不俗的成绩。尽管在某些季度受到宏观经济环境和市场需求波动的影响,但公司整体营收和净利润均保持了稳定增长。特别是在2023年Q3财报中,尽管营收略低于市场预期,但公司依然展现出了强劲的发展潜力和市场竞争力。展望未来,GSI Technology将继续秉承创新、务实、高效的发展理念,不断推出更多高性能、高品质的存储器产品,为全球电子行业的发展贡献自己的力量。

Coors Components Inc公司的发展小趣事

随着电子行业的不断发展,智能化、绿色化成为了行业的新趋势。Coors Components Inc公司敏锐地捕捉到这一趋势,加大了对智能电子产品和环保材料的研发力度。通过不断推出符合市场需求的新产品,公司成功抓住了行业发展的机遇,实现了快速发展。

Babcock Inc公司的发展小趣事

随着公司的发展壮大,Babcock开始注重品牌建设和企业文化建设。通过加强品牌宣传和推广,提升公司的知名度和美誉度;同时,公司还注重培养员工的归属感和忠诚度,营造积极向上的工作氛围。这些举措不仅提升了公司的软实力,也为公司的长远发展提供了有力保障。

这五个故事展示了Babcock Inc公司在电子行业中的发展历程和取得的成就。通过技术创新、市场拓展、国际合作以及品牌建设等方面的努力,Babcock逐渐成为了电子行业中的佼佼者,为行业的发展做出了积极贡献。

Gigavac LLC公司的发展小趣事

Babcock Inc公司的创立源于创始人对电子技术的深厚热爱和前瞻视野。在创业初期,公司便致力于电子技术的研发与创新,不断积累核心技术和专利。通过持续的技术投入和人才培养,Babcock逐渐在电子行业崭露头角,为后续的快速发展奠定了坚实的基础。

问答坊 | AI 解惑

哈工大培训关于各种仿真软件的应用

本帖最后由 paulhyde 于 2014-9-15 04:24 编辑 虽然资料有点简介,但绝对经典。我听了一天老师的讲课,受益匪浅。  …

查看全部问答>

linux学习步骤讨论

鉴于目前大家手中都会有一块arm9的开发板那么大家讨论一下怎么开始进行学习,首先我认为咱们可以从最简单的开始,因为大部分的朋友还不是太明白所以大家会的都踊跃发帖:如 1 :学习一下VIVI与u-boot的移植。    2 :linux系统配置 &nb ...…

查看全部问答>

WinCE 6上面进行SQL CE 3.0的复杂查询没有结果

源程序是Windows Mobile的,运行没有问题.现在要移植到WinCE 6上面,出现一点问题. 简单查询,在WinCE 6上面都没有任何问题, 复杂一点的,比如多表连接查询,in语句,就会出现问题. 问题状况就是: 1. 没有任何异常. 2. 我用DataReader读取数据,rdr.R ...…

查看全部问答>

MAX038

刚才忘记附上原理图啦,原理图如下: …

查看全部问答>

关于纯c时间函数

我用的是vs2005手机平台 #include int main() {     time_t timep;     time (&timep);     return 0; } 1>DMTK_ExecRefsDLLDlg.cpp 1>.\\DMTK_ExecRefsDLLDlg.cpp(80) : error C3861: \'time\': identifier no ...…

查看全部问答>

ADS编译中断函数问题

ADS编译问题: 我定义了一个中断函数   void __irq time0Up(void); 中断函数如下: void __irq time0Up(void) {   int i=1;    i=i+1; } 编译是报错如下:__irq FUNCTION need no argument and no return ...…

查看全部问答>

松下PLC向PC发送数据的问题,急急急!

我写了一个程序,是向松下PLC发送数据,如向PLC DT100发送50这数据,然后在PLC DT100中显示这个数据,这个功能已成功实现,现在客户新的要求是在PLC DT100如修改数据后,在PC中显示这个修改后的数据,我不知如何操作,请各位高手指点,不胜感激!…

查看全部问答>

【MSP430共享】MSP430系统设计中3V与5V接口问题

MSP430系统设计中3V与5V接口问题,这是MSP430应用技术资料,很实用的,适合画pcb板子时候注意!!! [ 本帖最后由 鑫海宝贝 于 2011-10-12 09:34 编辑 ]…

查看全部问答>

使用IAR时遇到的一些Error、Waring

    作为菜虫,在使用IAR的时候编写CC2430、、Z-Stack2006程序会遇到如下一些错误,当然随着学习的深入,我会持续更新。 1 Q: Error[e16]: Segment XDATA_Z (size: 0x19a1 align: 0) is too long for segment definiti ...…

查看全部问答>