请先看最下面的程序
这是一款针对Keil软件的,被称作“纯软件”复位的程序。所谓“纯软件”是指它没有直接操作硬件以及寄存器。
事实上如果不懂硬件和汇编也不可能有这段C程序,不管怎么样,我们还是来看一看它的真面目:
我们知道51 单片机
可以把数据放在程序存储器里面,也就是程序和数据没有本质区别,都是一些特定的数据。如果我们将一段程序,以数组数据的形式存储在程序存储器里面,那么是不是也可以执行呢?答案是肯定的。
-
言归正传,先来看看这个数组数据 0xe4,0xc0,0xe0,0xc0,0xe0,0x22,中Keil的汇编窗口看出,它其实是四条汇编语句:
CLR A ;编译后为 0XE4
PUSH ACC ;编译后为 0XC0 0XE0
PUSH ACC ;编译后为 0XC0 0XE0
RET ;函数返回 编译后为 0X22可以看出,其实这就是51 单片机 的汇编复位指令。
其实这里只是C复位代码的写法难看而已,rst是一个指向程序存储器的字节指针,我们把它转换为指向返回为空的函数的指针,返回为空的函数指针的格式为:void
(*)(),这个表达式比较复杂因运算符优先级关系,用括号括号括起来,就成了(void
(*)())rst,这样rst就成函数指针了,再来看看求函数指针的一般格式(*p)(),把p代换成(void
(*)())rst括起来就成了(*((void (*)())rst))(),这说将这个复位的全部面纱揭开了。
以下为测试,验证程序:
#include
main()
{
unsigned char code rst[6]={0xe4,0xc0,0xe0,0xc0,0xe0,0x22};//定义一个code类型的数组,一定要为code类型
while(1)//循环测试
{
TMOD=5;//测试用可以是任何语名
TI=1;
P1=0;
P1=1;
P2=2;
P3=3;
(*((void (*)())rst))();//复位
SCON=0x50;
}
}
关键字:51单片机 软件复位
引用地址:
51单片机的软件复位
推荐阅读最新更新时间:2024-03-16 14:54
51单片机常见的7种时钟电路介绍
在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据硬件电路的不同,单片机的时钟连接方式可分为内部时钟方式和外部时钟方式,如下图所示。 时钟电路:(a)内部方式时钟电路,(b)外接时钟电路 在内部方式时钟电路中,必须在XTAL1和XTAL2引脚两端跨接石英晶体振荡器和两个微调电容构成振荡电路,通常C1和C2一般取30pF,晶振的频率取值在1.2MHz~12MHz之间。对于外接时钟电路,要求XTAL1接地,XTAL2脚接外部时钟,对于外部时钟信号并无特殊要求,只要保证一定的脉冲宽度,时钟频率低于12MHz
[单片机]
从零开始51单片机教程 —— 14 单片机逻辑与或异或指令详解
单片机逻辑与或异或指令详解 ANL A,Rn ;A与Rn中的值按位'与',结果送入A中 ANL A,direct ;A与direct中的值按位'与',结果送入A中 ANL A,@Ri ;A与间址寻址单元@Ri中的值按位'与',结果送入A中 ANL A,#data ;A与立即数data按位'与',结果送入A中 ANL direct,A ;direct中值与A中的值按位'与',结果送入direct中 ANL direct,#data ;direct中的值与立即数data按位'与',结果送入direct中。 这几条指令的关键是知道什么是逻辑与。这里的逻辑与是指按位与 例:71H和56H相与则将两数写成二进制形式: (
[单片机]
以AT89C51单片机为控制核心的低成本高精度倒计时系统设计
1 引 言 倒计时系统的任务, 就是对某一设定日期进行倒数, 并在显示屏显示当前至设定日期的时间, 以增强人们的关注度和紧迫感。开发实践表明: 以时钟芯片DS12C887为时钟模块、单片机AT89C51为控制模块的高精度倒计时系统具有精度高、能够长时间连续稳定地工作、使用方便的特点, 可较好满足实际需要。系统的硬件设计和软件设计如下。 2 系统的硬件设计 系统的控制模块由AT89C51单片机构成, 用于完成对串行口控制器的初始化和数据读写, 并对接收的各种数据进行识别、转储及显示。时钟芯片DS12C887提供高精度的年、月、日、时、分、秒时间,校准后直接与单片机相连。倒计时显示模块由LED数码管, 74HC595芯片和74L
[单片机]
51单片机中断应用与编程方法
中断的概念 中断示意图见图1,以下做3点说明。 1、CPU 在处理某一事件A 时,发生了另一事件B 请求CPU 迅速去处理(中断发生); 2、CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 3、待 CPU 将事件B 处理完毕后,再回到原来事件A 被中断的地方继续处理事件A(中断返回),这一过程称为中断 。 图1 中断示意图 引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构),51单片机中断结构见图2。 图2 中断结构
[单片机]
51单片机 矩阵按键的扫描、消抖、动作分离
#include reg52.h sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; sbit KEY_IN_1 = P2^4; sbit KEY_IN_2 = P2^5; sbit KEY_IN_3 = P2^6; sbit KEY_IN_4 = P2^7; sbit KEY_OUT_1 = P2^3; sbit KEY_OUT_2 = P2^2; sbit KEY_OUT_3 = P2^1; sbit KEY_OUT_4 = P2
[单片机]
关于51单片机不能正常起振的原因
如何确定晶振正常起振? 1、判断方法很多,用示波器看波形是最直接的,用数字万用表的电压档测电压也行,因晶振波形的占空比为50%,所以测得的平均电压为1/2Vcc左右,对于51单片机,在使用外置程序存储器的时候还可以测PSEN引脚或P0口引脚的电压或波形,只有晶振电路正常工作,那些引脚才会有信号输出,但现在很少采用片外扩展存储器,所以测晶体两端的电压或波形即可,只是晶振电路设计不良时,测试设备的引入有可能导致停振。 2、晶体两端的电压差不是平均电压差,虽然事实上因外电路的影响,晶体两端的电压可能会有差别,但这不是判断晶振是否起振的依据,也不是晶振电路正常工作的条件。至于一高一低没有工作是指一端为Vcc或接近Vcc,另一端为0
[单片机]
【51单片机】考试例程|汇编实现
目录 中断3个程序 第一个程序 第二个程序 第三个程序 DA转换 Triangle Triangle2 矩形波 显示/键盘: 数码管的动态显示(C语言实现): 矩阵键盘(C语言实现) 加法、乘法 第二个例程 例程 例程 中断3个程序 第一个程序 ORG 0000H RESET: AJMP MAIN ORG 000BH AJMP IT0P MAIN: MOV SP, #60H; MOV TMOD, #01; ACALL PT0M0; HRER: AJMP HERE PT0M0: MOV TL0, #0CH MOV TH0, #0FEH SETB ET0; SETB EA; SE
[单片机]
基于51单片机的ADC0809C程序代码
51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。 A/D转换器是模拟信号源与计算机或其它数字系统之间联系的桥梁,它的任务是将连续变化的模拟信号转换为数字信号,以便计算机等数字系统进行处理、存储、控制和显示。在工业控制
[单片机]