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实现也不失为一种好方法
求stc单片机软件复位的程序
单片机实现软件复位(软复位)的方法及讨论 (天堂雨林博客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实现也不失为一种好方法
在三菱编程软件里如何输入RST复位指令
1 单片机的硬件复位和门狗复位都是对单片机的复位引脚 加一个复位电平产生的 此时单片机将进行复位操作 pc=0000h p0=p1=p2=p3=0ffh sp=07h 其它特殊寄存器将被清零。
复位结束后 单片机重新开始运行。
2 软件复位;一般为了防止程序跑飞 可以在程序存储器中没有指令的地方 全部写入 LJMP 0000H指令一旦单片机运行跑飞 进入LJMP 0000H指令区 将还返回单片机的第一条指令 重新运行单片机的正常程序.软件复位时,P0 P1 P2 P3 和特殊寄存器的内容都不会再改变.这点与硬件复位不同....
AT89C51能不能软件复位
还用这种老掉牙的东西,首先,它没有这个功能,内部寄存器不能清0,真是AT89C51吗,确实没有看错,就转到0000H处,当需要软件复位时,进入死循环,由看门狗来实现软件复位。
最后问一句,你用AT89C51是仿真吗?如果是实物,那你可用不了,烧录程序就烧不了,那需要专用的编程器,可是早就没有人卖了。
那你问这个问题就毫无意义了。
你能确定。
如果是 AT89S51倒是可以,并不算是软件复位,因为。
但是,不能实现硬件复位的那些功能,例如。
这都什么年代了这就看你的要求是什么了,如果只是要求从头开始重新执行程序。
从这个意义上说,启动看门狗...