历史上的今天
返回首页

历史上的今天

今天是:2025年04月10日(星期四)

正在发生

2018年04月10日 | MCS51系列单片机软件复位方法介绍

2018-04-10 来源:eefocus

    有的单片机(如8098)有专门的复位指令,某些增强型MCS-51系统单片机虽然没有复位指令,但片内集成了WATCHDOG电路,故抗干扰也不成问题。而普及型MCS-51系列单片机(如8031和8032)既然无复位指令,又不带硬件WATCHDOS,如果没有外接硬件WATCHDOG电路,就必须采用软件抗干扰技术。常用的软件抗干扰技术有:软件陷阱、指令冗余、软件WATCHDOG等,它们的作用是在系统受干扰时能及时发现,再用软件的方法使系统复位。所谓软件复位就是用一系列指令来模仿复位操作,这就是MCS-51系列单片机所特有的软件复位技术。

 

    现用一简单的实验说明,实验电路如附图所示。接于仿真插座P1.0的发光二极管LED0用来表示主程序的工作情况,接于P1。1的发光二极管LED1用于表示低级中断子程序的工作情况,接于P1。2的发光二极管LED2用来表示高级中断子程序的工作情况,接于P3。2口的按钮用来设立干扰标志,程序检测到干扰标志后故意进入死循环或掉进陷井,模仿受干扰的情况,从而检验各种复位方法的实际效果。寮验初始化程序如下:

    ORG 0000H

    STAT: LJMP MAIN ;复位入口地址

    LJMP PX0 ;按钮中断向量(低级中断)

    ORG 000BH

    LJMP PT0 ;t0中断向量(低级中断)

    ORG 001BH

    LJMP PT1 ;T1中断向量(高级中断)

    ORG 0030H

    MAIN:

    CLR EA

    MOV SP,#7

    MOV P1,#0FFH

    MOV P3,#0FFH

    MOV TMOD,#11H

    CLR 00H ;干扰标志初始化

    SETB ET0

    SETB ET1

    SETB EX0

    SETB PT1

    SETB TR0

    SETB TR1

    SETB EA

    LOOP: CPL P1.0 ;主程序发光二极管LED闪烁

    MOV R6,#80H

    MOV R7,#0

    TT1:

    DJNZ R7,TT1

    DJNZ R6,TT1

    SJMP LOOP

    PX0:

    SETB 00H ;设立干扰标志,模拟发生干扰

    PT0: CPL P1.1 ;低级中断程序发光二极管LED1闪烁

    RETI

    PT1: CPL P1.2 ;高级中断程序发光二极管LED2闪烁

    RETI

    END


    实验步骤如下:

    1.按上述程序启动执行,三个发光二极管都应闪烁(否则应先排除故障),表示主程序和各中断子程序正常。因模拟干扰标志未加检测,故不受按钮影响。

    2.修改主程序如下,按下按钮后主程序即掉入死循环中。

    LOOP: CPL P1.0

    MOV R6,#80H

    MOV R7,#0H

    TT1: DJNZ R7,TT1

    DJNZ R6,TT1

    JNB 00H,LOOP ;受干扰否?

    STOP: LJMP STOP ;掉入死循环。

    这时可以看到,主程序停止工作(LED0停止闪烁),而两个中断子程序继续运行(LED1和LED2继续闪烁)。

    3. 将定时器T1妆作软件WATCHDOG,将30H单元用作软件WATCHDOG计数器。主程序中加入一条复位软件WATCHDOG的指令。

    LOOP: CPL P1.0

    MOV 30H,#0 ;复位软件WATCHDOG计数器

    LOOP: CPL P1.0

    MOV R6,#80H

    MOV R7,#0H

    TT1: DJNZ R7,TT1

    DJNZ R6,TT1

    JNB 00H,LOOP ;受干扰否?

    STOP: LJMP STOP ;掉入死循环。

    T1中断子程序修改如下:

    PT1: CPL P1.2 ;高级中断程序发光二极管闪烁

    INC 30H

    MOV A,30H

    ADD A,#0FDH

    JC ERR ;达到3次否?

    RETI

    ERR: LJMP STAT ;软件WATCHDOG动作

    当按下按钮前,程序正常运行(三个LED全闪)。按下按钮后,主程序能迅速恢复工作,但两个中断子程序被封锁,不再工作。过程如下:主程序检测到干扰后进入死循环,不能执行复位30H单元的操作,T1中断使30H不断增值,计数到3时,软件WATCHDOG执行动作,执行一条LJMP指令,使程序从头执行。MAIN过程中清除了干扰标志(表示干扰已经过去),使主程序迅速恢复工作。按理说MAIN过程中也重新设定了各个中断,并开放了它们,为什么中断不能恢复工作呢?这是因为中断激活标志的复位工作被遗忘了,因为它没有明确的位地址可供编程,直接转向0000H地址并不能完成真正的复位。软件复位是使用软件陷井和软件WATCHDOG后必须进行的工作,这时程序出错完全有可能发生中断子程序中,中断激活标志已置位,它将阻止同级中断响应。由于软件WATCHDOG是高级中断,它将阻止所有中断响应。由此可见,清除中断激活标志的得要性,很多文献的作者回为没有认识到这一点进入误区。


    4.在所有指令中,只有RETI指令能清除中断激活标志。出错处理程序ERR主要是完成这一功能,其它的善后工作交由复位后的系统去完成。为此,我们重新设计T1中断子程序如下所示:

    PT1: CPL P1.2 ;高级中断程序发光二极管闪烁

    INC 30H ;软件WATCHDOG计数器增值

    MOV A,30H

    ADD A,#0FD

    JC ERR ;达到3次否?

    RETI

    ERR: CLR EA ;关中断

    CLR A ;准备复位地址(0000H)

    PUSH ACC

    PUSH ACC

    RETI ;清除中断激活标志并复位

    这段程序先关中断,以便后续处理能顺利进行,然后用RETI指令替代LJMP指令,从而既清除了中断激活标志又完成了转向0000H的任务。按这样改好后程序再运行,结果仍不理想:按下按钮后,有时只有主程序和高级中断子程序能迅速恢复正常,而低级中断仍有被关闭的可能。如果按如下方法把干扰转移到低级中断中,则按下按钮后低级中断必然被关闭:

    LOOP: CPL P1.0

    MOV R6,#80H

    MOV R7,#0H

    TT1: DJNZ R7,TT1

    DJNZ R6,TT1

    SJMP LOOP

    PT0: CPL P1.1

    JB 00H,STOP

    RETI

    STOP: LJMP STOP ;掉入死循环。

    仔细分析后可能得出结论:当软件WATCHDOG是嵌套在低级中断中起作用时,复位后只清除了高级中断激活标志,低级中断标志仍然被置位,从而使低级中断一直被关闭。

    5. 修改出错处理如下:

    ERR: CLR EA ;正确的软件复位入口

    MOV 66H,#0AAH ;重建上电标志

    MOV 67H,#55H

    MOV DPTR,#ERR1 ;准备第一次返回地址

    PUSH DPL

    PUSH DPH

    RETI ;清除高级中断激活标志

    ERR1: CLR A

    PUSH ACC

    PUSH ACC

    RETI ;清除低级中断激活标志


    这时,必须执行两次RETI,才能到达0000H,以保证清除全部中断激活标志,达到和硬件复位相同的效果。同样,软件陷井也必须由下列三条指令

    NOP

    NOP

    LJMP STAT

    改成:

    NOP

    NOP

    LJMP ERR

    才能达到目的。

    当主程序受到干扰被软件陷阱捕获时,中断标志并未置位,执行ERR过程中,RETI指令等效于RET指令,同样可以达到软件复位的目的。有兴趣的读者可以将软件陷阱代替死循环,分别用LJMP STAT和LJMP ERR1来替代LJMP ERR,再将干扰检测分别设在低级中断和主程序中,实验结果必然证明同:只有LJMP ERR才能万无一失地实现软件复位,使系统摆脱干扰同,恢复正常。在MCS-51单片机的软件复位过程中,必须连续执行两次中断返回指令RETI。


推荐阅读

史海拾趣

Genesis Microchip公司的发展小趣事

在20世纪中期,GI作为一家新兴的电子设备制造商,以其对新兴技术的敏锐洞察力和创新精神而崭露头角。公司创始人意识到半导体技术的巨大潜力,决定投入大量资源进行研发。通过不懈努力,GI成功推出了多款基于半导体技术的创新产品,如早期的晶体管收音机和电视机,这些产品不仅在当时市场上引起了轰动,也为公司后续的快速发展奠定了坚实基础。这一阶段的成功,标志着GI在电子行业技术创新的道路上迈出了坚实的一步。

Gauthier Connectique公司的发展小趣事
长期使用或不当操作可能导致元器件损坏。解决方法是检查并更换损坏的元器件。
Gulf Semiconductor公司的发展小趣事
该电路适用于多种设备,包括电视机、录像机、音响设备、空调器和玩具等,展现了广泛的设备兼容性。
Advanced Energy公司的发展小趣事

随着公司的不断发展壮大,AE公司于某一时期成功在纳斯达克上市。这一里程碑事件标志着AE公司在电子行业的地位得到了进一步的巩固和提升。上市为公司带来了更多的资金支持,使得AE公司能够加大在研发、生产、销售等方面的投入,进一步提升了公司的竞争力。同时,上市也增强了公司的品牌影响力,吸引了更多的合作伙伴和客户。

Agilent Technologies公司的发展小趣事

随着公司的不断发展壮大,AE公司于某一时期成功在纳斯达克上市。这一里程碑事件标志着AE公司在电子行业的地位得到了进一步的巩固和提升。上市为公司带来了更多的资金支持,使得AE公司能够加大在研发、生产、销售等方面的投入,进一步提升了公司的竞争力。同时,上市也增强了公司的品牌影响力,吸引了更多的合作伙伴和客户。

Filtran Ltd公司的发展小趣事

随着业务规模的扩大,Filtran Ltd意识到供应链管理的重要性。公司开始在全球范围内寻找优质原材料供应商,并在亚洲和欧洲建立了生产基地,以降低成本并缩短交货周期。同时,通过引入先进的ERP系统和数字化管理工具,实现了供应链的高效协同。这一战略调整不仅提高了生产效率,还增强了公司对市场变化的快速响应能力。

问答坊 | AI 解惑

i2c总线问题——起始停止条件

大家好,现在学习实践I2C总线方面的知识。这个过程中遇到的问题还希望能够得到大家的指教,谢谢! 下面这段话摘自“I2C总线规范”, “在SCL线是高电平时SDA线从高电平向低电平切换,这个情况表示起始条件。 在SCL线是高电平时SDA线由低电平向 ...…

查看全部问答>

青越锋与 DXP 内幕设计详细渗透(二)

一.添加设置过孔   在DXP 中添加布线过孔(Via)可以直接利用热键TAB,在Layer 中设置不同的走线层即可自动添加过孔,务必在先确定一点并且在不同的层面上,自动添加的过孔会以浮动的形式根据需要确定位置!连接布线的焊盘的移动式和光标 ...…

查看全部问答>

这里挺好

想学点东西这里挺不错的…

查看全部问答>

VMware+RH9+skyeye1.2 仿真lcd出现segmentation fault

VMware+RH9+skyeye1.2 仿真lcd出现segmentation fault 配置文件内容: cpu: arm720t mach: ep7312 mem_bank: map=M, type=R,  addr=0x0, size=0xC0000 mem_bank: map=M, type=R,  addr=0x000C0000, size=0x00340000, fil ...…

查看全部问答>

PPC2003问题若干

  小弟毕业设计就快完了,搞的是PPC2003软件设计。在开发过程中,现在还留了点问题下来。 一、有没有能够实现将某个文件中所有的EXE文件,文件名及文件路径存入一个表中的操作或是函数; 二、我用的是VS2005自带的仿真上的数据库,没有另外安装 ...…

查看全部问答>

at+cipstart无法用域名的形式访问网络?

我使用sim3000的gprs模块,昨天已经可以用ip地址访问我在花生壳上注册的地址了.然后我尝试用域名的形式访问网络.先 at+cipshut,关闭连接 然后 配置dns服务器 at+cdnscfg=\"202.96.128.56\" 然后设置为域名访问方式at+cdnsorip=1 最后使用域名访 ...…

查看全部问答>

使用51单片机与pc串口通信中数据不一致问题

我用51单片机与pc机进行串口通讯,上位机软件用的是出口调试助手3.0,下位机是我自己编的,主要目的是pc向单片机发个数据,单片机接收后向p2口输出,之后再把接收到的数据发给pc。但是我发现pc上发出与收到的数据总是不一致。例如,我用pc输出字符 ...…

查看全部问答>

请教各位达人,急

private void button2_Click(object sender, EventArgs e)         {             IAsyncResult result1;             projec ...…

查看全部问答>

冰天雪地×体跪问,驱动程序安装问题(如果问题解决,100分送)

冰天雪地×体跪问,驱动程序安装问题(如果问题解决,100分送) 我的驱动程序开发环境为WINNT4+VC6+NT4DDK+DriverStudio2.5,用DriverStudio2.5生成驱动程序框架,驱动程序开发完编译后,在我的开发机上安装运行,一切正常,但是当我把驱动程序拷 ...…

查看全部问答>

2440中断按键检测

最近在学linux驱动开发,在做中断程序的时候不知道为什么就是进不了中断服务函数,下面贴出源码,希望各位大侠们给点帮助,不胜感激~ //s3c2440_key.c(底层驱动程序) //#include #include #include #include #include //#include # ...…

查看全部问答>