用汇编语言编写完整可仿真的程序,要求如下: 基于单片机89C51,用2个共阳极数码管显示票数,1个共阳极数码管接单片机P2.0至P2.6端口,1个共阳极数码管接单片机P3.0至P3.6端口(1个显示已投的票数,1个显示未投票的)。 7个人(7个按钮用单片机P1.1至P1.7端口)同时投票,每个人只能投一次,多投无效。 主持人1个按钮接单片机P1.0端口,控制投票开始、暂停(利用外部中断设置好初值)、记票清零重新开始。(主持人按钮第一次按下为投票开始,第二次按下为投票暂停,第三个按下为记票清零重新开始)
时间: 2023-09-06 22:11:25 浏览: 86
如何用汇编语言来编写程序
3星 · 编辑精心推荐
这是一道很具体的嵌入式系统设计题目,需要对硬件和汇编语言编程都有较好的掌握。以下是一个简单的实现思路:
硬件部分:
1. 使用89C51单片机控制数码管和按钮。
2. 用2个共阳极数码管显示票数,其中一个显示已投票数,另一个显示未投票数。
3. 7个人投票的按钮连接到89C51单片机的P1.1至P1.7端口。
4. 主持人控制投票开始、暂停和记票清零重新开始的按钮连接到89C51单片机的P1.0端口。
编程部分:
1. 初始化程序,包括设置数码管和按钮的输入输出口,以及设置外部中断。
2. 开始投票,主持人按下开始按钮后,程序进入投票状态,等待7个人投票。
3. 接收投票,每当有人按下按钮时,程序检测是否已经投过票,如果没有,则累加已投票数,否则忽略该按键。
4. 暂停投票,主持人按下暂停按钮后,程序进入暂停状态,此时不再接受投票。
5. 记票清零,主持人按下记票清零按钮后,程序清空已投票数和未投票数,并重新开始投票。
代码实现:
```
ORG 0H
MOV P1,#11111110B ; P1.0作为输入,设置为1
MOV P2,#0FFH ; P2口为输出口,初始值为0FFH
MOV P3,#0FFH ; P3口为输出口,初始值为0FFH
MOV TMOD,#01H ; 设置定时器0为模式1
MOV TH0,#3CH ; 定时器初值设为3CH
MOV TL0,#0B4H ; 定时器初值设为0B4H
SETB TR0 ; 开始定时器0
START:
CLR P1.0 ; 投票开始
SETB EX0 ; 开启外部中断0
MOV A,#0 ; 初始化已投票数
MOV R0,#0 ; 初始化未投票数
JMP WAIT
VOTE:
CPL P1.0 ; 投票暂停
CLR EX0 ; 关闭外部中断0
SJMP WAIT
CLEAR:
MOV A,#0 ; 清零已投票数
MOV R0,#0 ; 清零未投票数
JMP WAIT
WAIT:
MOV P2,#0FFH ; 显示已投票数
MOV P3,#A ; A为已投票数
ACALL DELAY ; 延迟一段时间
MOV P2,#0FFH ; 显示未投票数
MOV P3,#R0 ; R0为未投票数
ACALL DELAY ; 延迟一段时间
SJMP WAIT
DELAY:
MOV R1,#20H
LOOP1: MOV R2,#0FFH
LOOP2: DJNZ R2,LOOP2
DJNZ R1,LOOP1
RET
INT0_ISR:
MOV A,P1 ; 获取按键值
CJNE A,#1BH,VOTE ; 如果不是7个投票按钮之一,跳过
MOV A,P2 ; 获取已投票数
INC A ; 已投票数加1
MOV P2,A ; 显示已投票数
ACALL DELAY ; 延迟一段时间
SETB P1.0 ; 闪烁提示已投票
ACALL DELAY ; 延迟一段时间
CLR P1.0 ; 关闭提示
JMP INT_EXIT
INT_EXIT:
RETI
END
```
以上代码只是一个简单的实现,如果要考虑更多的功能和异常情况,需要进一步完善程序。
阅读全文