可以使用下面的程序跳到0000H实现软复位,下面的程序实际上是一个函数指针,指针指向了0000H地址。
((void (code *) (void)) 0x0000) ();
下面的例子将实现软件自复位void reset (void)
{
((void (code *) (void)) 0x0000) ();
}
void main (void)
{
reset ();
}
你可能注意到以上的软复位程序并不能清除8051的中断系统和某些8051的外围设备,当您在中断程序中调用上面的软件复位程序后,中断将再不能触发。因此,以上的软复位程序不能在中断子程序中调用。
下面的小段汇编函数可以在中断程序或主程序中调用,该函数将0x0000压栈,然后通过“RETI”出栈,这将清除中断环境并让程序从0000H重新开始运行。
?PR?RESET SEGMENT CODE
RSEG ?PR?RESET
; C prototype: void reset (void);
PUBLIC reset
reset: POP ACC ; pop return address
POP ACC
CLR A ; push 0 as new
PUSH ACC ; return address to stack
PUSH ACC
RETI ; execute return of interrupt
END
以上程序在选择bank 0寄存器组时工作良好,假如选择的不是bank0寄存器组,那么可能无法获得预料的结果。你应该在以上的程序或启动代码中加上“MOV PSW, #0”来选择bank 0寄存器组。
以上文章由龙啸九天翻译自KEIL FAQ,可能有疏漏,欢迎提出。
51单片机如何实现软件复位系统(C语言),谢谢
单片机实现软件复位(软复位)的方法及讨论
单片机实现软件复位(软复位)的方法及讨论
(天堂雨林博客blog.sina.com.cn/acer收集整理)
单片机软复位有什么好的方法?如从机收到复位命令(软件命令),程序怎么使机器复位?虽然要使软件始终处于可控状态,最好不要用"复位",因为复位是纯硬件过程,软件是不可控的.但是我们还是要讨论方法,一般流传的方法如下:
1、放狗;
2、((void(code *)(void))0x0000)();
3、用单片机一个引脚控制点一下RSTRST;
4、用单片机一个引脚控制重新加电;
5、用单片机自带的软件复位指令或内狗指令;
6、goto大法;
天堂雨林博客对以上方法的意见:
方法1:“放狗”是单片机软复位的最好办法,也基本上是唯一的一个办法。但并不是所有单片机都具备看门狗的功能,也不是一个万全之策。
办法2:这不是复位,只是把程序转到地址0去执行,不如用一个JMP更直接。目前可能极少数单片机或者用户已经自行添加Boot load时用户程序的程序开始地址并不为0x0000,所以需要查找这些特定单片机的启动地址。
在keil C51下面可以这样实现:
void soft_reset(void)
{
((void (code *) (void)) 0x0000) ();
}
在需要软件复位的地方使用语句:
soft_reset();
一般可实现软件复位。
办法3:用软件实现的硬复位。需要牺牲一个单片机引脚,且增加了单片机外部电路构造的复杂性,很不可取。
办法4:类似办法3,同样需要牺牲一个单片机引脚,且增加了单片机外部电路构造的复杂性,很不可取。但不能把它单单地当成是复位,应该叫上电复位。
办法5:Atmel 89C不带内狗,S的有内狗,只是一条指令就行。如STC的单片机有软件复位指令,即ISP_CONTR,地址在0E7H 单元(即str ISP_CONTR=0xE7),MOV ISP_CONTR,#00100000B(C语言为ISP_CONTR=0x20),内狗也是一条指令MOV WDT_CONTR,#00111100B!
STC 51系列单片机Datasheet中指出:传统的8051 单片机由于硬件上未支持此功能,用户必须用软件模拟实现,实现起来较麻烦。现STC 新推出的增强型8051 根据客户要求增加了ISP_CONTR 特殊功能寄存器,实现了此功能。用户只需简单的控制ISP_CONTR 特殊功能寄存器的其中两位 SWBS / SWRST 就可以系统复位了。
办法6:程序从头(上电复位处)开始运行,且只有一个循环这种情况,当然可以用goto,如在main()的开头设一个start:,在程序的唯一循环中设定一个条件,然后goto命令。但需要注意,如果是在中断例程里,那么中断挂号寄存器仍置位,同级中断不能执行。所以必须先使中断挂号寄存器清零,EA = 0。只有RETI指令可以使中断挂号寄存器清零。51单片机有两级中断优先级,所以需要执行两次RETI指令。这用汇编是很简单的事,而C则比较难以实现。但是,goto命令尽量不要用,因为goto会到处乱窜,而且goto不能跑到函数外面去执行一个命令。
最后总结如下:最好使用办法5最为简洁方便,使用办法2实现也不失为一种好方法
参考资料:http://blog.sina.com.cn/s/blog_417f5de30100cua6.html
单片机的硬件复位和软件复位有什么区别?
嘿嘿 还是俺来帮你解答吧
1 单片机的硬件复位和门狗复位都是对单片机的复位引脚 加一个复位电平产生的 此时单片机
将进行复位操作 pc=0000h p0=p1=p2=p3=0ffh sp=07h 其它特殊寄存器将被清零。
复位结束后 单片机重新开始运行。
2 软件复位;
一般为了防止程序跑飞 可以在程序存储器中没有指令的地方 全部写入 LJMP 0000H指令
一旦单片机运行跑飞 进入LJMP 0000H指令区 将还返回单片机的第一条指令 重新运行单片机的正常程序.
软件复位时,P0 P1 P2 P3 和特殊寄存器的内容都不会再改变.这点与硬件复位不同.
呵呵 满意就给加分吧
我是一个单片机新手,请问一下 1.单片机的硬件复位和软件复位有什么区别?
嘿嘿 还是俺来帮你解答吧
1 单片机的硬件复位和门狗复位都是对单片机的复位引脚 加一个复位电平产生的 此时单片机
将进行复位操作 pc=0000h p0=p1=p2=p3=0ffh sp=07h 其它特殊寄存器将被清零。
复位结束后 单片机重新开始运行。
2 软件复位;
一般为了防止程序跑飞 可以在程序存储器中没有指令的地方 全部写入 LJMP 0000H指令
一旦单片机运行跑飞 进入LJMP 0000H指令区 将还返回单片机的第一条指令 重新运行单片机的正常程序.
软件复位时,P0 P1 P2 P3 和特殊寄存器的内容都不会再改变.这点与硬件复位不同.
呵呵 满意就给加分吧
单片机嵌入式系统软件复位的几种方式
在硬件设计、实现、系统互连 中,需要采取相关措施保证EMI指标;在软件设计及编程时,对于嵌入式计算机最容易出现 的“程序跑飞”问题,需要采取预防和补救措施。本文将结合作者的实践经验,对以上问题进 行讨论。 一、硬件系统的抗干扰设计 硬件系统的抗干扰设计主要指电磁兼容性设计,电磁兼容性包含两个方面:(1)对环境 中的电磁干扰有一定的耐受能力;(2)不可以向空间环境发射过强的电磁能量。 EMI问题主要源自电路的分布参数。许多电路从原理 (集中参数)上看,似乎没有问题, 而实际系统中由于器件的非理想性,以及结构、布线等问题,造成EMI发射或敏感。抗干扰 设计的基本原理包括: (I)抑制干扰源:减小电压/电流变化率,如并联阻容吸收电路,串联阻尼电感,并联续 流二极管等。 (2)切断传导及辐射千扰的传播路径:如使用滤波器或隔离电路,使用屏蔽技术。 (3)提高敏感器件的抗千扰性能:缩短连线,减小环路面积,加宽电源及地线 以下主要从电原理及印制板设计、机箱屏蔽及电缆连接技术等方面讨论硬件系统的抗干 扰设计技术。 1.1电路设计及布线 在研制初期,就应该对系统进行可靠性预计及分析工作,确定影响可靠性的关键部件及 元器件。确认方案的合理性后,对影响可靠性的关键元器件降额使用。 以 卜是作者在实践中的儿点体会: (1)尽可能简化、优化体系结构。如使用功能更全的Soc,嵌入式计算机。 (2)注意嵌入式系统的可靠复位。当电源有尖峰干扰或电压上升速度太慢时,普通阻容 复位电路难以正确复位,可考虑专用器件。 (3)电路的环路面积对EMI性能影响很大,使用大规模集成电路,可以有效减小环路面 积,从而提高抗干扰性、减小空间电磁发射。 (4)逻辑器件尽量使用CMOs电路,因为噪声容限大、功耗低。CMOs器件的输出阻抗 很小,而输入阻抗很大,连线过长时,应在输入端使用阻抗匹配电阻:不使用的输入端应接 高电平。 (5)数字信号的转换速率应与要求速度相适应 (必要时使用阻尼电路),仅在需要时使 用高速器件。 (6)注意信号电缆的EMI性能。最好使用屏蔽电缆,必要时使用隔离电路。如必须使用 扁平电缆,则可以将信号线与地线交错布置。 关于印制板设计的几点建议: (1)成本允许时,尽量使用4层以上的线路板,以提高EMI性能。 (2)仔细考虑器件的位置和方向。 (3)对敏感电路及强辐射电路使用屏蔽。 (4)尽量减小高频信号及高敏感信号 (如时钟信号)的回路面积,旁边不布置其它信号 线,并用地线包围。 (5)在器件的电源、地端就近布置退藕电容器。 (6)无论器件位置、布线、信号电缆、地线,都尽可能按照电特性的不同 (模拟信号、 数字信号、离散量信号等)进行分组。 (7)不同部分的电路使用不同的地线,并形成树形连接,避免地线环路;PCB空白位置 可以用地线填充:如果要连接系统地线与机箱地线,则在信号电缆连接器位置进行低阻抗连 接。 (8)使用先进的制造工艺。如PCB设计、制做、焊接、器件老化。 1.2机箱及过线的EMI设计 机箱及穿过的电源线、信号电缆通常是EMI设计的关键问题。机箱的作用是双向电磁屏 蔽及接地,而穿过的导线很容易破坏机箱的电磁屏蔽效果。 为了防止设备本身产生的电磁干扰进入电源线,同时防止电源线上的干扰进入设备,一 般需要使用电源线滤波器抑制双向的共模及差模传导干扰,还可以使用瞬态电压保护器及压 敏电阻抑制浪涌电压。 需要指出,来自电源线的共模千扰通过共模抑制电容器接至机箱。机箱必须妥善接地, 才能保证共模千扰的抑制效果。较大的共模抑制电容器可以改善共模千扰的抑制效果,但会 产生较大的漏电流,对安全不利。 当设备比较复杂时,屏蔽和接地方案需要仔细设计。如图1,作者的一些体会: (1)从机箱电源输入口到电源线滤波器输入端的连线应尽量短,以防止双向空间电磁祸 合。最好选用带插座的电源线滤波器。 电源线滤波器外壳应该与机箱形成良好导电接触,并就近布置接地桩。 电Dv,线滤波器的输入、输出引线不要靠近,以防庄电磁祸合。建议把电源线滤波器靠近机箱 壁放置。 (2)穿过机箱的信号电缆很容易引入共模干扰,最好使用馈通滤波器或光电隔离器,必 要时应使用屏蔽网套。信号电缆应远离电源线。 (3)为了屏蔽电磁干扰、抑制静电放电干扰,机箱应近似为完整、连续的导电体:严格 控制机箱开孔尺寸,必要时使用多个狭缝或蜂窝状屏蔽通风窗。 (4)键盘及显示器件往往需要较大的窗口,不利于电磁屏蔽,可以考虑使用隔离仓技术 将显示电路与其它电路隔离,或使用透明屏蔽材料。 图1建议的机箱及屏蔽方案 二、软件系统的抗干扰设计 嵌入式系统的灵魂是软件系统,嵌入式系统的抗干扰设计,必须解决软件系统的抗干扰 问题。很遗憾,目前的冯一诺依曼计算机体系无法保证软件运行的绝对可靠,因此,必须使用 工程方法增强软件系统的可靠性。以下结合作者的实践经验,给出一些针对软件系统的可靠 性设计技术。 2.1软件的可靠性设计 (1)开机自检。即在复位后,软件先进行系统检查,以确保ROM内容正确、RAM可正 常读写、各外设正常工作……开机自检对系统可靠运行是十分必要的。 (2)软件的正确性和功能符合性。符合功能规范要求、并能正确运行,是软件可靠性设 计的基本要求。和微机上的纯软件相比,嵌入式软件不但和具体硬件紧密关联,而且往往具 有明显的、需要程序员维护的多任务特性:嵌入式系统还要求简洁、直观的人机交互方式, 因而需要仔细设计软件。 (3)对错误数据的抗敏性。除了基本功能符合性之外,软件设计时还应提高对错误数据 的抗敏性,如对输入数据应进行必要的检查、数据通信的校验机制等。关于数据通信的举例: 从串口接收数据,数据报格式为:[报头」[-氏度]{数据}[报文校验和],接收到[长度l后,应检查 长度值的合法性:接收时,还应检查数据报相邻字节的时间间隔,超时后放弃接收。 (’) 面向对象的程序设计。嵌入式系统的编程语言一般是c语言,甚至汇编语言,它们 都是过程性语言。和面向对象的编程语言 (C++, java)相比,过程性语言缺乏数据抽象、封 装和隐藏,程序员经常使用一堆零散的变量表示一个对象,不容易保证软件的可靠性,也不 利于软件维护。 根据作者的实践经验,即使使用过程性语言,只要在程序设计中使用了面向对象的编程 思想,也可以设计出可移植性强、易于维护的程序。当然,在传统的过程性语言中体现出面 向对象的编程思想,需要一定的编程经验和技巧。 2.2暂态设计 在设备复位、启动或关闭时,往往要求输出端口具有确定状态、或进入安全态,可以从 以 卜儿方面分析、测试并处理: (1)假设电源稳定,当CPU处于复位状态时,设各输出端处于什么状态? 可以分析得到。如果复位时输出端状态与要求状态相反,可以使用非门转换;如果复位时口 线呈现高阻态,则可以加上拉或一「拉电阻。 (2)电源接通、断开瞬间,设备输出端处于什么状态? 由于实际系统的复杂性,电源接通、断开瞬间,设备输出端的状态很难准确分析,一般采用 试验、调整方法解决。 (3)许多可编程芯片都有复位时间要求,设备启动时能否保证这些芯片的复位时间?主 要依靠分析和试验方法解决。 2.3程序跑飞时输出保持安全态 安全态指非动作态 (如电机停止运转)。在嵌入式系统中,来自内部的程序设计缺陷或外 部窜入的电磁干扰都有可能造成程序跑飞。在系统方案设计时就应采取措施,当程序跑飞时 输出尽可能保持在安全态。 程序跑飞时,CPU已无法执行正常程序流程。为了使输出保持在安全态,必须使用硬件 逻辑判断CPU发出的指令是否正确。基本思路是:CPU的输出口线不直接控制动作器,而在 两者之间增加硬件判断逻辑:当CPU口线输出特定的信号序列时,硬件判断逻辑才输出动作 指令,否则不输出动作指令。 如图2,图中使用了单稳态触发器判断动作信号:只有当CPU口线连续输出高于一定频 率的方波时,才有动作指令输出。图中用与非门实现两个信号的“与”操作,提高可靠性。可 以使用CPLD等器件实现更复杂的动作信号判断。 图2用单稳态触发器实现指令判断 2.4程序跑飞后能自动恢复 即看门狗(WatcliDog)技术,己普遍应用。其基本原理是:设置一个定时器(即“看门狗, ’), 该定时器溢出时会引起系统复位。程序需仔细设计:在正常执行时,能及时地对看门狗定时 器清零 (称为“喂狗,,),看门狗定时器不会溢出:当程序跑飞后,由于没有及时“喂狗” ,看门 狗定时器溢出,系统复位。 看门狗程序设计的关键是:(1)“喂狗”指令应比较特殊,以防程序跑飞后CPU将其它数 据解释为“喂狗”指令:(2)只在少数关键程序位置“喂狗” ,以保证程序跑飞后看门狗溢出。 可见,看门狗的作用是程序跑飞后尽快复位,并不能从根本上改善系统的可靠性。因此, 可靠性设计仍应从系统、硬件、软件实现上仔细设计‘ 除看门狗之外,还有其它类似技术。如:(1)在不使用的程序存储器中存放“软利复位” 指令,当程序跑 匕后,引起软件复位;(2)在汇编指令之间插入一些nop指令,减少CPU对 L指令错误读取的概率。 2.5部分数据发生错误— 休闲复位 软件的运行错误有时还表现为一部分数据发生错误,而主进程 〔或土循环)仍在运行。 如:系统在开始运行时设定外设的工作状态,运行中不再刷新。在运行中,如果外设的一{作 状态被干扰破坏,将无法恢复。这样的错误很难用看门狗技术完全检测。嵌入式系统通常设 计为尽量简洁的用户界面、尽量少的用户干预,当系统出现运行错误时,应尽可能自动恢复 到正常运行状态。 为解决以上问题,一种可用的处理方法是:程序定期刷新外设的工作状态 其缺点是; 系统性能下降、效果不理想、具体实现较复杂。为此,作者在实践中使用“空闲复位”技术进 行解决: 当系统处于空闲状态一定时间以后,自动重新启动。为了维持以前的状态信息,可以在 非易失性存储器中保存少数关键数据。系统重新启动后,需要检查这些数据,如果数据值无 异常,则装入这些数据:否则,装入缺省数据,并根据需要给予提示。 三、结语 嵌入式系统的抗干扰设计是一个非常复杂、实践性很强的问题,以上主要从硬件的EMI 设计及软件的抗干扰设计等方面讨论了作者对嵌入式系统抗千扰设计技术的一些理解。从目 前的应用现状看,硬件EMI设计技术己经很成熟,应用也较成功;但作为嵌入式系统的核心 与灵魂的软件系统,在可靠性方面还需要继续改进。
设计了一个单片机程序,可是上电后必须复位才能正常显示不知道是什么原因? 还有就是H桥驱动的问题
要看你使用的是什么单片机了,如果像89S51的话那么必须接好上电复位电路,有的单片机在内部已经集成了上电复位的电路那么可以省了,不然的话必须要弄好,建议参考你那个单片机技术资料。你那个软件复位并不是真正的系统复位,简单的说仅仅是一些初始化而已。
H桥不知道你是怎么接的,发个图上来吧,一般电路跟接线正确就没有什么问题的,除非你程序有瑕疵。
单片机上电或复位后从哪处开始执行?应用程序为什么一般在该处放一条转移指令
1.从0000H开始执行
2.跳过前面一些中断入口, 所以在0000H放一条转移指令
单片机程序不断复位会有什么问题
是什么型号的单片机?有些单片机有看门狗,会自动实现复位,但条件是已经启动了看门狗。
也可能是外部复位电路的问题。
如果是用了外部看门狗 电路,那就是外部看门狗造成的。
转载请注明出处51数据库 » 单片机软件复位程序 单片机如何用C程序复位