Proteus VSM Studio汇编 + 8位数码管时钟按键可调

Proteus VSM Studio汇编 + 8位数码管时钟按键可调


  • Proteus基于VSM Studio编译仿真演示
    在这里插入图片描述

VSM Studio代码(.asm)

基于Keil编译器
在这里插入图片描述

S_SET	BIT		P1.0						;数字钟秒控制位
M_SET	BIT		P1.1						;分钟控制位
H_SET	BIT		P1.2						;小时控制位
SECOND	EQU		30H
MINUTE	EQU		31H
HOUR	EQU		32H
TCNT	EQU		34H
		ORG		00H
		SJMP	START
		ORG		0BH
		LJMP	INT_T0
START:	MOV		DPTR,#TABLE
		MOV		HOUR,#0						;初始化
		MOV		MINUTE,#0
		MOV		SECOND,#0
		MOV		TCNT,#0
		MOV		TMOD,#01H
		MOV		TH0,#(65536-50000)/256		;定时50毫秒
		MOV		TL0,#(65536-50000)MOD 256
		MOV		IE,#82H
		SETB	TR0
;****************************************************
;判断是否有控制键按下,是哪一个键按下
A1:		LCALL	DISPLAY		
		JNB		S_SET,S1
		JNB		M_SET,S2
		JNB		H_SET,S3				
		LJMP	A1
	S1:	LCALL	DELAY		;去抖动
		JB		S_SET,A1
		
		INC		SECOND		;秒值加1
		MOV		A,SECOND
		CJNE	A,#60,J0	;判断是否加到60秒
		MOV		SECOND,#0
		LJMP	K1
	S2:	LCALL	DELAY
		JB		M_SET,A1
		
	K1:	INC		MINUTE		;分钟值加1
		MOV		A,MINUTE
		CJNE	A,#60,J1	;判断是否加到60分
		MOV		MINUTE,#0
		LJMP	K2
	S3:	LCALL	DELAY
		JB		H_SET,A1
		
	K2:	INC		HOUR		;小时值加1
		MOV		A,HOUR
		CJNE	A,#24,J2	;判断是否加到24小时
		MOV		HOUR,#0
		MOV		MINUTE,#0
		MOV		SECOND,#0
		LJMP	A1
;****************************************************
;等待按键抬起
J0:		JB		S_SET,A1
		LCALL	DISPLAY
		SJMP	J0
J1:		JB		M_SET,A1
		LCALL	DISPLAY
		SJMP	J1
J2:		JB		H_SET,A1
		LCALL	DISPLAY
		SJMP	J2
;***********************************************
;定时器中断服务程序,对秒,分钟和小时的计数
INT_T0:	MOV		TH0,#(65536-50000)/256
		MOV		TL0,#(65536-50000)MOD 256		
		INC		TCNT
		MOV		A,TCNT
		CJNE	A,#20,RETUNE	;计时1秒
		INC		SECOND
		MOV		TCNT,#0
		MOV		A,SECOND
		CJNE	A,#60,RETUNE
		INC		MINUTE
		MOV		SECOND,#0
		MOV		A,MINUTE
		CJNE	A,#60,RETUNE
		INC		HOUR
		MOV		MINUTE,#0
		MOV		A,HOUR
		CJNE	A,#24,RETUNE
		MOV		HOUR,#0
		MOV		MINUTE,#0
		MOV		SECOND,#0
		MOV		TCNT,#0
RETUNE:	RETI
;******************************************
;显示控制子程序
DISPLAY:MOV		A,SECOND	;显示秒
		MOV		B,#10
		DIV		AB
		CLR		P3.6
		MOVC	A,@A+DPTR
		MOV		P0,A
		LCALL	DELAY
		SETB	P3.6
		MOV		A,B
		CLR		P3.7
		MOVC	A,@A+DPTR
		MOV		P0,A
		LCALL	DELAY
		SETB	P3.7

		CLR		P3.5
		MOV		P0,#40H		;显示分隔符
		LCALL	DELAY
		SETB	P3.5

		MOV		A,MINUTE	;显示分钟
		MOV		B,#10
		DIV		AB
		CLR		P3.3
		MOVC	A,@A+DPTR
		MOV		P0,A
		LCALL	DELAY
		SETB	P3.3
		MOV		A,B
		CLR		P3.4
		MOVC	A,@A+DPTR
		MOV		P0,A
		LCALL	DELAY
		SETB	P3.4

		CLR		P3.2
		MOV		P0,#40H		;显示分隔符
		LCALL	DELAY
		SETB	P3.2

	   	MOV		A,HOUR		;显示小时
		MOV		B,#10
		DIV		AB
		CLR		P3.0
		MOVC	A,@A+DPTR
		MOV		P0,A
		LCALL	DELAY
		SETB	P3.0
		MOV		A,B
		CLR		P3.1
		MOVC	A,@A+DPTR
		MOV		P0,A
		LCALL	DELAY
		SETB	P3.1
		RET

TABLE: 	DB 		3FH,06H,5BH,4FH,66H
		DB		6DH,7DH,07H,7FH,6FH
DELAY:	MOV		R6,#10
D1:		MOV		R7,#250
		DJNZ	R7,$
		DJNZ	R6,D1
		RET

		END

程序源码和仿真资源

程序可以基于Proteus中的VSM Studio代码编译,也可以通过外部keil软件编译后,导入hex文件仿真,本实验基于Proteus8.9SP2平台。

链接:https://pan.baidu.com/s/1cCiI6KyQPN6dgpq9rJjclA 
提取码:bu07

  抓不住的沙,你就放下一把;抓不住的人,那么放下也罢。
在8051单片机上通过汇编语言实现数码管显示电子时钟,一般需要以下几个步骤: 1. **初始化**:设置定时器T0或T1作为波特率发生器,用于控制数码管的扫描速度,通常选择1ms或更高频率。 ```assembly ; 初始化定时器T0 MOV TMOD, #0x01 ; T0工作于模式1,自动重装初值 MOV TH0, #0x7F ; 设置高8位计数初值,取决于晶振频率 MOV TL0, #0x7F SETB TR0 ; 启动T0 ``` 2. **数据线处理**:8051单片机一般有4根数据线D4-D7连接到7段数码管,使用P0口或其他IO口。每次定时断时,将当前的时间分段送至对应的数码管位。 ```assembly ; 定时断服务程序ISR(TIMER0) LJMP TIM_ISR TIM_ISR: MOV A, #0x3F ; 分别为小时、分钟和秒的最高位 MOVC A @A+DPTR ; 将A寄存器内容送到数码管寄存器 OUT P0, A ; 数据线输出 DEC A ; 秒、分钟递减一位 JNZ TIM_ISR ; 如果不为0,则继续下一次循环 RET ; 断返回 ``` 3. **显示流程**:在一个完整的显示周期内,先清零数码管显示,然后依次显示各个位,最后回到初始状态,等待下一个时间点到来。 4. **结束和复位**:在适当的时候关闭定时器并可能清除数码管寄存器以便下次显示新的时间。 需要注意的是,这只是一个简化的示例,实际应用可能还需要考虑硬件布局、数码管驱动电路、以及如何处理闰秒等问题。同时,在编写代码时,还要记得添加适当的错误处理和状态管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值