[微机原理]用8086、8255、8254(8253)实现电子秒表

在复习微机原理硬件考试的时候给本学期的附加题项目写了一下批注,在这里顺便简单分享一下我的思路。

题目如下:用8086、8255、8254(8253)实现电子跑表,分别显示小时、分钟、秒的计数,60秒后分钟进一,60分钟后小时进一。使用按键控制秒表的状态,按下一个键时开始计时,按下另一个键时停止计时,按下又另一个键时退出程序。8255的地址为320H、324H、328H、32CH。8254的地址为300H、304H、308H、30CH。(题目描述可能不太清晰,大致是这样)

 

我的代码:

.486					;软件要求,根据实际情况编写
CODES SEGMENT USE16
    ASSUME CS:CODES
	ORG 1000H
START:
    MOV DX,32CH         ;8255
	MOV AL,10001001B   	;C IN,	A\B OUT
	OUT DX,AL
	
	MOV DX,30CH			;8254初始化,选用方式3,生成周期为1s的时钟信号
	MOV AL,00110110B
	OUT DX,AL
	MOV DX,300H
	MOV AX,47000		;8254收到的频率为47000hz
	OUT DX,AL
	MOV AL,AH
	OUT DX,AL			;1S
		

K1:	
    MOV CX,0
    CALL AGAIN					 
	CALL CHECK1         ;等待键盘输入信息
   	CMP AL,8EH			;当键盘0按下时,开始计时
	JZ BEGIN1
	CMP AL,8DH			;当键盘1按下时,停止计时
	JZ STOP
	CMP AL,8BH			;当键盘2按下时,退出 
	JZ QIUT
	JMP K1

BEGIN1:					;计数按键
	MOV CX,39590D  	    ;预设值,可以更改
T1:	
	CALL AGAIN			;显示现在寄存的时间值
	CALL CHECK1			;检测键盘情况
	CMP AL,8DH			;当键盘1按下时,停止计时
	JZ STOP
	CMP AL,8BH			;当键盘2按下时,退出 
	JZ QIUT
	MOV DX,328H    		;C口输入
	IN  AL,DX      		;时钟信号由c0口输入
	TEST AL,01
	JNZ T1	   		    ;判断时钟0信号是否到来
T2:	
	CALL AGAIN			;显示现在寄存的时间值
	CALL CHECK1			;检测键盘情况
	CMP AL,8DH			;当键盘1按下时,停止计时
	JZ STOP				
	CMP AL,8BH			;当键盘2按下时,退出 
	JZ QIUT
	MOV DX,328H    			 
	IN AL,DX							
	TEST AL,01			;c口输入检测时钟1信号是否到来
	JZ T2				;时钟仍然为0,保持原计数值并显示,继续下一次检测
	INC CX				;时钟1到来,说明1s已经过去,计数值加一,跳转到显示程序		
	JMP T1

STOP:					;停止按键
	CALL AGAIN			;显示现在寄存的值
	CALL CHECK1			;检测键盘输入情况,之后判断是否有功能键被按下
	CMP AL,8EH			;当键盘0按下时,重新从预设值开始计时
	JZ BEGIN1
	CMP AL,8DH			;当键盘1按下时,开始计时
	JZ T1
	CMP AL,8BH			;当键盘2按下时,退出 
	JZ QIUT
	MOV DX,328H    		;C口输入
	IN  AL,DX      		;时钟信号由c0口输入
	TEST AL,01
	JNZ STOP	   		;判断时钟0信号是否到来
STOP1:	
	CALL AGAIN
	CALL CHECK1
	CMP AL,8EH			 
	JZ BEGIN1
	CMP AL,8DH
	JZ T1
	CMP AL,8BH			
	JZ QIUT
	MOV DX,328H    
	IN AL,DX
	TEST AL,01			;c口输入检测时钟1信号是否到来
	JZ STOP1			;时钟仍然为0,保持原计数值并显示,继续下一次检测
	JMP STOP			;时钟1到来,说明1s已经过去,计数值加一,跳转到显示程序
					;理论上来讲STOP1这部分可以不写,但我记得在硬件实操时可能由于延时不够长导致检测到死循环而崩溃

    	
QIUT: MOV CX,0H				;退出按键
      CALL AGAIN			;显示寄存的值
      JMP WT				;死循环终止程序
WT:   JMP WT		
	

AGAIN PROC				;时间计算与显示子程序
	MOV AX,CX			
    	CMP AX,65535D			;判断是否超寄存器范围	
	JA QIUT				;超出则直接退出
	MOV DX,0H			;清零DX(原因见下)
	MOV BX,3600D			;BX=3600S=1H
	DIV BX				;此处DIV的意义为DX:AX/BX,也解释了上面DX清零的原因
	PUSH DX				;DX中为计算结果的余数,压栈保存
	MOV BL,10D			;BL=10
	DIV BL				;此处DIV的意义为AX/BL,AX为前面除法结果的商,运算后AL为商,即小时的十位,AH为余数,即小时的个位
	PUSH AX				;压栈保存AX
 	MOV AH,20H			;AH给数码管位选LED6	
 	CALL DISP			;显示小时的十位
 	POP AX				;弹栈AX,根据FILO,弹出的AL为商,即小时的十位,AH为余数,即小时的个位
 	MOV AL,AH			;个位数字送AL
	MOV AH,10H			;位选LED5
 	CALL DISP			;显示小时个位
 	POP DX				;弹栈,弹出余数
 	MOV AX,DX				
 	MOV BL,60D			;BL=60S=1MIN
	DIV BL				;AX/BL 运算后AL为商,为分钟数,AH为余数,为秒数
	PUSH AX				;压栈保存除法结果
	MOV BL,10D			;BL=10
	AND AH,0			
	DIV BL				;AX/BL 运算后AL为商,为分钟的十位,AH为余数,为分钟的个位
	MOV BX,AX		
	PUSH BX				;压栈保存分钟数个位
 	MOV AH,08H			;位选LED4
 	CALL DISP			;显示分钟十位
 	POP BX				;弹栈
 	MOV AL,BH			
	MOV AH,04H			;位选LED3
 	CALL DISP			;显示分钟个位
 	POP AX				;弹栈秒数
 	MOV AL,AH		
 	MOV BL,10D			;BL=10
 	AND AH,0
	DIV BL				;AX/BL AL为商为秒数的十位,AH为余数,为秒数的个位
	PUSH AX				
	MOV AH,02H			;位选LED2
	CALL DISP			;显示秒数十位
	POP AX
	MOV AL,AH
	MOV AH,01H			;位选LED1
	CALL DISP			;显示秒数个位
	RET	
AGAIN ENDP			
		         		

    	

DLY PROC				;延时程序
	PUSH CX				;压栈cx
	MOV CX,4FH			;根据硬件情况选择cx的值
DELY:
	LOOP DELY
	POP CX
	RET
DLY ENDP

DISP PROC				;显示程序
    LEA BX,SEGPT		;字型码表首地址给bx
	XLAT 				;AX=[BX+AL],执行该操作后AL=原AL数字的字形型码
	MOV DX,320H			
	OUT DX,AL
	MOV DX,324H
	MOV AL,AH
	OUT DX,AL			;位选,字型码输出
	CALL DLY			;延时
	RET
DISP ENDP


CHECK1 PROC				;检测键盘程序
        MOV AL,00H			
	MOV DX,328H			;只用一列键盘所以不用进行扫描,直接读键特征值
	IN AL,DX		 
	AND AL,0F0H			;键盘信息输入到c口高四位
	MOV AH,80H
	PUSH CX
	MOV CX,4
	SHR  AL,CL			;将AL高四位移到低四位,即键盘信息
	POP CX
	OR AL,AH			;键盘特征值为0:8EH 1:8DH 2:8BH
	RET
CHECK1 ENDP	

SEGPT DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH       ;字型码

CODES ENDS
    END START	

硬件连接我用proteus简单演示了一下,其中地址译码模块我没有放进去,根据自己需求做就好了(我的Proteus有点问题跑不了仿真就不演示仿真了)

e429e8b721074fdba8efd130567c3dfb.png

我收到很多私信向我询问原理图,先说明一件事,proteus仿真我并没有得到比较好的仿真结果,因为我没有时间去搭建和调试8086的系统,而且我也不打算做这件事了。所以我没有展示完整的原理图,因为我害怕有朋友直接照抄结果抄不出来...

其次,我上面的原理图片的主要目的是为了展示我这个小实验的接线情况,这比我直接甩一张实验箱接线图要直观得多。所以上面的图包含了所有的硬件接线,只是左边我省略了一个8086系统,大家不知道怎么搭的话,同站上搜一下,也有很多教程的。

最后,别再找我要原理图啦,确实没有。但是大家想要进一步做仿真的话,欢迎和我讨论,有空我会回复😀

 

 

  • 9
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 电子秒表是一款非常常见的计时器设备,用于在各种比赛、运动等场合中进行时间计时。在微机原理课程设计中,使用8254芯片来设计电子秒表显示0-60s是一个典型的实践案例。 首先,我们需要了解8254芯片的基本结构和功能。8254是一种集计时、计数、中断控制等多种功能于一身的可编程计数器/计时器,它有三个独立的计数通道,每个通道可以选择不同的工作模式,以满足不同的需求。 在设计电子秒表时,我们需要将8254芯片的一个计数通道设置为定时模式,将计数周期设置为1s,即每隔1s输出一个计时信号。然后,我们可以将此信号与一个数码管显示芯片连接起来,以实现对时间的显示。 具体而言,我们可以使用常见的7段数码管来显示时间,每一位数码管需要接一个控制芯片来实现显示。当我们每隔1s接收到计时信号时,我们需要对显示值进行更新: 1. 如果当前显示时间为59s,则需要将秒数归零,重置计时器; 2. 如果当前显示时间不为59s,则将秒数加1,并将其在数码管上进行显示。 此外,我们还需要设计一些操作按钮,如计时开始/暂停、清零等按钮,来方便用户对计数器进行控制。通过这些设计和调试,我们即可得到一款简单而实用的电子秒表应用。 总之,微机原理课程设计中使用8254芯片设计电子秒表是一个充满挑战性和趣味性的案例,既涉及到硬件电路设计,又涉及到程序设计,是学生们锻炼实践能力和创新能力的重要方式之一。 ### 回答2: 在微机原理课程设计中,设计一款使用8254芯片显示0-60秒的电子秒表,需要遵循以下步骤: 1. 确定硬件接口:选择使用8254芯片作为计时器,连接相应的控制引脚,将输出接口与数码显示器连接。 2. 编写程序框架:采取中断方式进行计时,设定中断间隔为1秒。在程序中定义计时器初值为0,并采用循环方式进行计数,直到达到60秒。 3. 编写计时中断处理程序:在中断处理程序中,每次中断发生时将计时器的计数值加1,并使用BCD码转换将计数值转换为数码显示器可识别的格式。 4. 编写数字显示程序:使用相应的数码显示器驱动程序,将计数值显示在数码显示器上。 5. 调试程序并优化:进行测试和调试,发现问题后进行优化,确保程序能够正常运行。 总之,设计一款使用8254芯片显示0-60秒的电子秒表需要硬件和软件两方面的技术,需要对8254芯片的特性有深入的了解,同时需要熟练掌握操作系统和编程语言,才能够完成一个稳定可靠的电子秒表。 ### 回答3: 8254是一款计数器芯片,通过编程来实现对时间的计算和控制。我们可以使用8254来设计一个电子秒表,让它可以自动计时,达到60秒自动停止并显示时间。 首先,需要将8254编程为定时器模式,并设置计数时间间隔为1秒。然后,在程序中添加一个异步时钟电路,以确保计时精度。接下来,就可以开始编写程序,以实现秒表的计时和显示功能。 具体的实现细节包括:初始化8254定时器,设置计时周期;开启定时器中断,以便能够响应定时器中断事件;在中断服务程序中累加计时器计数值,同时判断是否达到60秒时间;若达到60秒时间则停止定时器,显示时间结果;否则继续计时。 在显示方面,可以使用LED数字管或LCD显示屏等设备,通过编程控制其显示内容。在停止计时后,需要将计时结果转换为可读的格式,并显示出来,如显示为“00:00:60”表示计时器达到60秒。 总的来说,使用8254设计电子秒表可以锻炼编程思维和计算思维能力,在实现过程中需要充分考虑时序、中断、显示等方面的问题,同时需要注意代码的简洁性和可读性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M1KELONG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值