大致说来就是
你先开启个定时器,根据你选用的
晶振
,计算出你要用定时器定时的基准时间,
就假设是10毫秒吧。
然后给定时器的THx,TLx写入初值,开启中断,进行定时。
然后就等待中断。
在你响应中断的程序中,再次给单片机送入初值,
由于是10毫秒中断一次,因此我们设置几个“软件计数器”
比如每此中断,软甲计数器+1,
例如“软件计数器1”在中断程序中计数100次,则是10ms*100=1s
而“软件计数器2”在1的基础上继续计数100次,则是1S*100=100S
而“软件计数器3”在2的基础上继续计数36次,则是100S*36=3600S=1小时。
程序从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,基本是空闲的,可以利用。
51单片机汇编语言,用定时器中断实现数码管从0-F每秒进1且循环进行。
电路与程序如下:
由于条件不足,晶振频率不明,所以,本程序没有精确定时。
提问者采纳的答案是错误的。
题目要求显示 0~F,这就需要 16 个七段码。
而采纳答案中,并没有写全。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)