
原因:单片机中,0000H单元为系统启动地址,ORG 0000H AJMP MAIN 就是在该地址存放一条绝对跳转指令,转入主程序的入口地址。ORG 0030H 是为了把用户程序定位到用户RAM区(30H-7FH),0000H-0030H存储单元地址是有其他特殊功能的。
在汇编语言源程序的开始通常都用一条ORG伪指令来实现规定程序的起始地址。如果不用ORG规定则汇编得到的目标程序将从0000H开始。程序从ROM的0000开始存放程序,但是AJMP MAIN是一条无条件跳转指令,也就是说,单片机上电之后首先从0000处开始执行程序。
但是,AJMP直接将程序跳转到MAIN标号指向的存储区域开始取指令,并执行,而一般MAIN标号是放在语句ORG 0030之后的,也即,主程序是从0030这个地址开始存放的。
扩展资料:
单片机数据存储器的特殊区段:
1、工作寄存器区(00H-1FH)
在00H-1FH共32个单元,被均匀地分为四组工作寄存器堆:RB0、RB1、RB2、RB3,每组寄存器堆包含8个工作寄存器,均以R0-R7来命名,这些寄存器被称为通用寄存器。工作寄存器用于临时存放8位信息。在使用时,由程序状态字寄存器中的RS0、RS1来选择工作寄存器堆。
2、位寻址区(20H-2FH)
片内数据存储器的20H-2FH存储区为位寻址区,既可作为一般单元按字节寻址,也可按位进行寻址。位寻址区有16个字节,位地址为00H-7FH。
参考资料来源:百度百科-单片机存储器
参考资料来源:百度百科-org
ORG 是汇编的伪指令 告诉编译器我的代码放在什么位置在单片机复位的时候 在你没有做任何改变的时候 程序指针会是指向00000H的地址
所以我们吧 START 卸载地址00H 让单片机复位后直接跳转到 START的程序段去执行
ORG 30H 是你程序的代码开始地址,由于30H以前有中断向量入口和寄存器的地址,所以一般用户程序都是从30H开始的。
程序的基本框架如下ORG 0000H
LJMP START 需要跳过中断服务程序入口地址,
ORG 0100H
START:
MOV SP,#50H 设堆栈区起始地址,一般不可少
...........
SETB P0.0
SETB P0.3
...........
LOOP:
SETB P1.5 设定P1.5为输入状态
JB P1.5, NEXT 假设P1.5为高是未达到既定值
CLR P0.0 达到既定值
NEXT:
LCALL DELAY30MS
SETB P1.7 设定P1.7为输入状态
JB P1.7, LOOP 假设P1.7为高是未达到要求
CLR P0.0
CLR P0.3
SETB P0.2
LJMP LOOP
DELAY30MS:
(此处编写一段延时30ms的程序,很简单的,循环一定次数即可)
RET
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)