单片机程序存储器61K,刚开始不明白,现在通过软件来验证是否是61K
本帖最后由 小白学习 于 2026-8-11 22:35 编辑刚接触单片机在学校,上课听得云里雾里,印象最深刻的是某某单片机的程序存储器多少K,一直不明白这个,后面工作自学单片机不断了解这里的多少K,今天来讲讲我的理解
方案1:通过写很多代码去堆积代码量占用到61K
方案2:只写一条功能代码,把代码放在容量的末尾,装入代码后容量刚好满61K或多或少
我用的方案2,一下是我的代码
;=========================
; 使用外部中断0来这段代码来演示单片机程序存储器大小
; 芯片:STC90C516RD+ (61K=62464)
; 功能:P3.2(INT0)下降沿触发中断,每次中断翻转P0.0电平(我开发板P0.0接的LED阴级,有电平翻转就会亮灭)
;=========================
;interrupt vector table ; 中断向量表区域
ORG 0000H ; 让PC内容为0000H,CP相当于CPU导航,告诉CPU从0000H位置去干活
LJMP MAIN ; 长跳转到主程序,避开下方中断向量地址
ORG 0003H ; 外部中断0(INT0)中断向量地址固定0003H
LJMP EXINT0 ; 若发生INT0中断时,则跳转到中断服务函数
;-----------------------------------------
ORG 0F3F2H ; 主程序存放起始地址0F3F2H,61K程序存储器内存地址是0000H-F3FFH,这里把代码几乎放到容量的末尾了,方便验证容量是否为61K
MAIN: ; ;;主函数在程序存储器只用了14个字节,所以这是为什么从0FF0H开始存放,因为这样刚好存满62464个字节(61K)
MOV SP, #7FH ; 设置堆栈指针SP=7FH
; 51默认SP=07H,和寄存器组重叠;设置7FH,堆栈从80H开始,防止覆盖通用RAM
SETB IT0 ; IT0=1:外部中断0触发方式,下降沿触发
; IT0=0为低电平触发
SETB EX0 ; EX0=1:使能外部中断0(允许INT0中断)
SETB EA ; EA=1:开启CPU全局总中断开关
SJMP $ ; 原地无限循环,等待中断触发(主程序空转)
;-----------------------------------------
;External interrupt0 service routine; 外部中断0中断服务子程序
EXINT0:
CPL P0.0 ; P0.0引脚电平取反:高变低 / 低变高
RETI ; 中断返回指令,回到被打断的SJMP $处继续运行
;-----------------------------------------
END ; 汇编源代码结束标记
把代码不断调整到容量末尾位置,从ORG 0F3F1H开始装代码时候,P3.2接的按键只要有被按下,P0.0的灯就会亮,再按下就灭~~~
从ORG 0F3F2H开始装代码时候,P3.2接的按键只要有被按下,P0.0的灯就会亮,再按下就灭~~~(现象同上)
从ORG 0F3F3H开始装代码时候,P3.2接的按键被按下,P0.0的灯虽然能亮,但是松开按键就灭了,按一下亮一下,一直按着一直亮,而且P2.0\P2.1\P2.2这三个口接的LED也有轻微点亮的痕迹(开始出现功能不正常了)
从ORG 0F3F4H开始装代码的时候,P3.2接的按键被按下,没有任何反应,由此可知在ORG 0F3F2H时候,代码刚好装满62464个字节就是61K
补充内容 (2026-8-18 21:49):
ORG 0000H相当于告诉编译器从0000H位置开始存放代码,Keil自动默认也是从0000H开始装代码,所以在Keil不要ORG 0000H也能用 高手汇编写的 好帖,顶一个! 学习了,非常好 学习 感谢分享 感谢分享
