((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,可能有疏漏,欢迎提出。
第一,直接使用硬件来复位,将原本要接到P3.3的电平接到硬件复位上,当然需要一定的设计第二,还是硬件,直接将此电平接到看门狗电路上
第三,软件,前提是你的单片机支持软件复位(包括直接复位和内置的看门狗)
函数简介函数名:kbhit()(VC++6.0下为_kbhit())
功 能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0。当调用kbhit()函数检测后,它的状态会自动复位。即重新进入检测状态而不会保留上一次的检测结果的。
用 法:int kbhit(void)
包含头文件: include <conio.h>
程序示例
下面的代码,如果没有键盘输入程序一直输出A,直到用户按Esc结束输出H改为输出B,第二次按Esc时,结束输出B,并输出A和B的个数。这个程序说明kbhit()可以自动复位,重复使用。
#include<stdio.h>
#include<conio.h>
int main(void)
{char ch
long a=0,b=0
while(1)
{printf("A")a++
if(kbhit())
{ch=getch()
if(27==ch)break
}
}
while(1)
{printf("B")b++
if(kbhit())
{ch=getch()
if(27==ch)break
}
}
printf("\nA=%ld B=%ld\n",a,b)
system("pause")
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)