MCS-51单片机复位后,第一次压入到堆栈操作的数据被保存到_地址单元
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MCS-51单片机复位后,第一次压入到堆栈操作的数据被保存到_地址单元相关的知识,希望对你有一定的参考价值。
在于你给SP的赋值地址,比如程序开始你有mov sp,#5fh,之后出现压栈,那么就是60H,如果你开始没有给SP赋值,缺省状态下SP=07H,所以就是08H。追问那有两个答案啊,但是题目只给了我08H的表达,为什么会这样呢?还有第一个我不太理解,为啥就到60H了...
追答一般而言,在汇编编程上,开始都会重设SP的,不然会影响到寄存器工作区的运用,因为很多场合,需要用到多个工作寄存器区,所以缺省时SP=07H就不能满足要求了,对于52单片机因为有256个寄存器可用,一般设置SP都在7FH之后这些不能直接访问的区域。对51而言寄存器进栈是加地址的,所以栈顶初值为5FH的话,第一个压入的地址就为5F+1 了。
参考技术A 如果没有给SP赋值, 默认是08H地址 参考技术B 08H地址单元。单片机复位后高电平输出问题(收集别人的)
有些电路我需要使用高电平输出有效,但是通电自动复位时单片机IO口会有短时间输出高电平导致继电器误动作怎么办?程序中要求高电平输出有效的我已经将它置位低电平。
解决方案
51单片机复位期间,IO口呈高电平状态,万一IO口控制的设备是使用高电平触发的话,在复位的瞬间会造成设备触发。解决方法:
1、把MCU换成别的体系的,譬如AVR、PIC等,这些单片机复位时IO口呈浮空高阻状态,不会造成触发。
2、使用反相驱动,MCU输出低电平反相成高电平再去控制设备。复位时的高电平反相后变成低电平,不会触发。这是比较常用的方法,稳定,但布线复杂了不少。
3、使用光耦隔离。光耦隔离后MCU也是输出低电平打开光耦再驱动被控设备,复位时的高电平不会打开光耦,不会造成误触发。
4、使用多余的IO口锁定,这种方法比较奇怪,在没用的IO口里挑一个出来接到NPN管的基极,再把NPN管的发射极接到被控的IO口,复位时所有的IO口呈高电平,NPN管导通,把被控的IO口强行拉低,相当于把被控IO口的电平锁定为低,避免触发被控的设备。这种方法必须配合软件,复位完毕后必须软件把接NPN管基极的那根IO置低电平,释放被控的IO口。这种方法比较少用,毕竟需要有多余的IO口,还必须加上三极管、电阻,布线复杂了不少,成本也增加不少。
5、使用滤波电容。在被控IO口对地之间接一uF级电容及K级电阻,类似缓冲作用。开机瞬间IO口通过电阻向电容充电,电平有一个逐渐上升的过程。只要电容及电阻的参数选择得当,那么复位时由于缓冲作用IO口还没来得及触发设备时那么MCU已经复位完毕把电平拉低了,这样也就避免了误触发。这种方法有一定限制,会造成设备的响应速度变慢,因此被控的IO口电平不能变化太快,否则由于电容的缓冲作用,设备无法有效控制。
以上是关于MCS-51单片机复位后,第一次压入到堆栈操作的数据被保存到_地址单元的主要内容,如果未能解决你的问题,请参考以下文章
单片机成长之路(51基础篇)- 002 STC单片机冷启动和复位有什么区别