大家都知道51单片机有的寄存器R0-R7共有四组。最近1年来,我在与新手朋友交流时发现,很多朋友对寄存器组的使用时经常出现问题。虽然这并不是多难的问题,但如果出现错误,也会造成很严重的后果。
首先介绍一下51的寄存器组:
通过设置PSW寄存器的第3位和第4位可以任意切换寄存器组。在进入中断前,切换寄存器组,可以方便的保护原寄存器组的数据不被中断里的语句破坏,很方便。
RS1RS0字节地址
000组寄存器00H~07H
011组寄存器08H~0FH
102组寄存器10H~17H
113组寄存器18H~1FH
RS1=PSW.4RS0=PSW.3
常见错误有三种:
1、为中断函数指定了第0组寄存器
C程序:voidint0()interrupt0using0
编译后的汇编如下:
PUSHACC
PUSHB
PUSHDPH
PUSHDPL
PUSHPSW
MOVPSW,#0x00
。。。。。。
因为main()函数使用的就是第0组寄存器,中断程序会改变寄存器组的数据。主程序运行时,随时都有可能产生中断,等中断返回主程序时,寄存器R0-R7的值已经被改变了。这是非常严重的错误。而且故障时有时无,错误也是莫明其妙。
2、中断优先级不同,寄存器组号相同
C程序:voidint0()interrupt0using1//低优先级中断
voidT0()interrupt1using1//高优先级中断
因为高优先级的中断可以打断正在执行的低级中断,转向持行高级中断。这就是所谓的中断的中断。与第1种错语一样,高级中断的程序,会改变低级中断正在使用的寄存器。
3、不写using。严格的说,这样写不能算是错误。但这是相当不好的习惯。
C程序:voidint0()interrupt0
编译后的汇编如下:
PUSHACC
PUSHB
PUSHDPH
PUSHDPL
PUSHPSW
MOVPSW,#0x00
PUSH0x00
PUSH0x01
PUSH0x02
PUSH0x03
PUSH0x04
PUSH0x05
PUSH0x06
PUSH0x07
。。。。。。
没用using指定寄存器组,编译器就默认分配了第0组寄存器,然后又用8条语句把第0组的R0-R7保存到栈中,退出中断时还需要8个弹栈。这样“笨拙”的写法,占用了程序空间32个字节、占有堆栈8个字节。也许高级版本的编译器会改进吧,搞单片机的还是规矩些好。
经验总结:
1、写中断程序一定要用using语句指定寄存器组。第1、2、3组都可以,不能是0.
2、51单片机的中断有两个优先级。一个中断不会打断另一个相同优先级的中断。这样相同级别中断可以使用同一个组。比如:低优先级的中断函数都用using1,高优先级的中断都用using2。这样不会冲突。
下面是一个正常的例子:
C程序:voidint0()interrupt0using1
编译后的汇编如下:
PUSHACC
PUSHB
PUSHDPH
PUSHDPL
PUSHPSW
MOVPSW,#0x08
。。。。。。
关键字:51单片机 中断寄存器 组选择
引用地址:
51单片机中断寄存器组选择
推荐阅读最新更新时间:2024-03-16 14:37
单片机控制继电器_51单片机控制继电器详解
单片机控制继电器 51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。 很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。 控制继电器是一种自动电器,它适用于远距离接通和分断交、直流小容量控制电路,并在电力驱动系统中供控制、保护及信号转换用。控制继
[单片机]
MCS51单片机的指令时序
时序是用定时单位来描述的,MCS-51的时序单位有四个,它们分别是节拍、状态、机器周期和指令周期,接下来我们分别加以说明。 ·节拍与状态: 我们把振荡脉冲的周期定义为节拍(为方便描述,用P表示),振荡脉冲经过二分频后即得到整个单片机工作系统的时钟信号,把时钟信号的周期定义为状态(用S表示),这样一个状态就有两个节拍,前半周期相应的节拍我们定义为1(P1),后半周期对应的节拍定义为2(P2)。 ·机器周期: MCS-51有固定的机器周期,规定一个机器周期有6个状态,分别表示为S1-S6,而一个状态包含两个节拍,那么一个机器周期就有12个节拍,我们可以记着S1P1、S1P2……S6P1、S6P2,一个机器周期共
[单片机]
MCS-51单片机定时器/计数器基础详述
MCS-51子系列单片机有2个定时器/计数器,即定时器/计数器0和1,52子系列单片机(8032/8052)除了有上述2个定时器/计数器外,还有一个定时器/计数器2,后者的功能比前两者强。 1 定时器/计数器0和1 在专用寄存器TMOD(定时器方式)中,有一个控制位(C/T),分别用于控制定时器/计数器0和1是工作在定时器方式还是计数器方式。 1. 输入信号基本要求:24个振荡周期,即两个机器周期; 2. 作为定时器时,计数速率是 振荡频率/12; 3. 由定时器/计数器模式控制寄存器设置工作方式。 2 定时器/计数器2(自己阅读) 定时器/计数器2是一个具有16位自动重装载或捕获能力的定时器/计数器。专用寄存器
[单片机]
MCS-51单片机的内部结构介绍
1、8051单片机片内并行接口 2、MCS-51的内部资源 3、MCS-51的芯片引脚 4、单片机的工作方式 单片机的工作方式包括:复位方式、程序执行方式、单步执行方式、低功耗操作方式以及EPROM编程和校验方式。 1. 复位方式:经典的上电复位电路 2. 程序执行方式:(1)执行内部程序;(2)执行外部程序 3. 单步执行方式:用于调试程序和系统 4. 低功耗操作方式 5. 编程和校验
[单片机]
基于80C51单片机的电子储物柜系统
基于80C51单片机的电子储物柜系统 电路描述: 安全是我们日常的生活中最关心的问题。 每个人都觉得安全问题是非常至关重要的,在家里的门和安全,可以尽可能多的安全。 为了对于门访问安全 因此,我们打算通过引进一个电子密码锁系统,该系统包括一个人得到一个访问某些项目之前要输入密码的安全性,以及在家里,一个房间密码锁系统,不只是普通的单用户密码锁系统,需要用户插入已编程的代码来访问一个房间; 它是一个密码锁系统,有密码而且可以启用多个用户访问。 在基于51单片机的门储物柜,只允许授权人员进入限制区域的门禁系统。 该系统由8位微控制器AT89C2051具有ROM的2K字节的程序存储器完全控制。 该系统具有通过该密码,可以通过它来输入
[单片机]
51单片机的串口通信详解-原理 寄存器 编程等
单片机的通信一般有并行通信和串行通信。并行通讯是数据的各位同时发送或接收,并行通信控制简单,传输速度快,传输线较多。 参看下图: 串行通讯传输线少,可利用电话网,但传送控制复杂。数据一位一位顺序发送或接收。 串行通讯中有一种是异步通信,即我们通常所说的串口通信。这是我们今天要分享的内容: 异步通讯用一个起始位表示字符的开始,用停止位表示字符的结束。其每帧的格式如下:在一帧格式中,先是一个起始位0,然后是8个数据位,规定低位在前,高位在后,接下来是奇偶校验位(可以省略),最后是停止位1。用这种格式表示字符,则字符可以一个接一个地传送。 一、在异步通讯中,CPU与外设之间必须有两项规定,即字符格式和波特
[单片机]
8051单片机的特点_8051单片机的控制总线信号有哪些
8051单片机的特点 8051的指令系统由111条指令组成。如果按字节数分类,有49条单字节指令46条双字节指令和16条三字节指令,以单字节指令为主;如果按照指令执行时间分类,有64条单周期指令、45条双周期指令和2条四周期指令,以单周期指令为主。 8051的指令系统具有以下特点: (1)存储效率高、执行速度快,可以进行直接地址到直接地址的数据传送,能把一个并行I/O口中的内容传送到内部RAM单元中而不必经过累加器A或工作寄存器Rn。这样可以大大提高传送速度和缓解累加器A的瓶颈效应。 (2)用变址寻址方式访问程序存储器中的表格,将程序存储器单元中的固定常数或表格字节内容传送到累加器A中。这为编成翻译算法提供
[单片机]
51单片机控制步进电机硬件连接部分
1、概要: 本案例讲解的内容是51单片机控制步进电机硬件连接部分。后续会分别讲解单片机程序,S曲线加减速方法,上位机等相关内容 2、功能原理图: 2.1、51单片机: ①输出脉冲到TB6600驱动器PUL端口,从而控制步进电机转动 ②控制TB6600驱动器ENA端口,从而控制步进电机使能 ③控制TB6600驱动器DIR端口,从而控制步进电机转动方向 2.2、步进电机: ①提供机械动力 2.3、稳压电源: ①为步进电机提供电源 2.4、TB6600驱动器: ①二相四线步进电机专用驱动器 3、实物图: ** ①** 、51****单片机控制板一个 ** ②** 、二相四线步进电机一个 ** ③** 、稳压电源一个 ** ④** 、
[单片机]