如何使用单片机C语言实现复位

如何使用单片机C语言实现复位,第1张

可以使用下面的程序跳到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,可能有疏漏,欢迎提出。

第一,直接使用硬件来复位,将原本要接到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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7826153.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存