一个简单的C51单片机汇编语言程序分析

一个简单的C51单片机汇编语言程序分析,第1张

楼上说的有理,但是即使删去LJMP main也不行,因为在中断时它把EA关了,也就不会中断了。

其实不用关EA,你把CLR ea也删去就可以运行。只要你的手没有中断服务程序快就会有中断。每次按都有。你试一下在开发板上运行,应该可以的。

原因是当你外中断置低电平时,就会进入中断程序。运行完就会自动返回主程序

而你的主程序是SJMP $死循环,就是用来等待中断的。所以不用重新中断初始化。

程序从20H开始查找数据,把首次出现的数据存放到40H开始的单元,并在60H开始的单元,存放该数据的个数,如果数据是重复出现的,就将其个数加一。

之后从60H单元开始找最大值的位置,然后从40H开始找到出现次数最多的数据,送到A及P1。

程序已经经过了验证,符合要求,如下:

ORG 0000H

MOV 20H, #12H 准备数据.

MOV 21H, #23H

MOV 22H, #32H

MOV 23H, #32H

MOV 24H, #32H

MOV 25H, #43H

MOV 26H, #32H

MOV 27H, #56H

MOV 28H, #56H

MOV 29H, #35H

-------------------------------------------------

MOV R0, #20H未知数据起始地址.

MOV R1, #40H筛选后的数据起始地址.

MOV 7FH, #1 现筛选出来1个数据: 00H

MOV 7EH, 7FH

INC 7EH

MOV R7, #10 共有10个未知数据,(最多可以有32个)

BBB:

MOV A, @R0 取出未知数据.

MOV R1, #40H从头和已筛选出的比较.

WWW:

MOV B, @R1

CJNE A, B, CCC不同就比较下一个.

RRR:

MOV A, R1 相同则个数加一.

ADD A, #20H

MOV R1, A

INC @R1

INC R0 转到下一个未知数据.

MOV 7EH, 7FH

INC 7EH

DJNZ R7, BBB

SJMP EEE 查找数据结束

-----------------------------------------------------

CCC:

INC R1

DJNZ 7EH, WWW 按照已知数据的个数循环.

-----------------------------------------------------

MOV A, #40H没有找到,那就存入这个数据.

ADD A, 7FH

MOV R1, A 计算出新数据应该存放的地址.

MOV A, @R0

MOV @R1, A 存放.

INC 7FH 已知数据个数加一.

MOV 7EH, 7FH

INC 7EH

SJMP RRR

-----------------------------------------------------

EEE: 从筛选后的个数中找最多数据的地址.

MOV 7EH, #0

MOV R0, #60H

YYY:

MOV A, @R0

CJNE A, 7EH, $+3

JC TTT

MOV 7EH, A

MOV B, R0

TTT:

INC R0

DJNZ 7FH, YYY

-----------------------------------------------------

MOV A, B 根据地址,再找到数据.

CLR C

SUBB A, #20H

MOV R0, A

MOV A, @R0

MOV P1, A 输出到P1

SJMP $

END

------------------------------------------------------

它们是51单片机片内RAM的最后两个单元。

对筛选出来的数据,需要统计个数,进行循环处理,还需要控制循环次数,7FH 7EH,就担任了这个任务。

用Rn也可,但是涉及互相传送的时候,不方便;7FH 7EH,基本是空闲的,可以利用。

MCS-51汇编语言源程序设计中,下列符号中不能用作标号的有()。

A.LOOP

B.MOV

C.LD1

D.ADD1

正确答案:MOV


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11918027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存