您的位置 首页 解答

浅谈单片机软件复位办法

浅谈单片机软件复位方法-现用一简单的实验说明,实验电路如附图所示。接于仿真插座P1.0的发光二极管LED0用来表示主程序的工作情况,接于P1。1的发光二极管LED1用于表示低级中断子程序的工作情况,接于P1。2的发光二极管LED2用来表示高级中断子程序的工作情况,接于P3。

有的单片机(如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。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/348216.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部