求C51单片机汇编语言控制两位数码管倒计时程序,最好能说明下思路

供稿:hz-xin.com     日期:2025-01-12
求C51单片机汇编语言控制两位数码管倒计时程序,从60秒到30秒再到90秒并循环倒计时显示。

从60秒到30秒再到90秒并循环倒计时显示。
----
有点不好理解。

从60秒到30秒,看来,是倒计时。
到了30之后,怎么办?是立即改为90吗?
到了90之后,再怎么办?是立即改为60吗?

并用一个按键啥? 51单片机我没设计过电路,用的学习板是现成的,对着电路图。 那个学习板上没有锁存器啥的,只能靠扫描来显示2个数字(就是两个数码管轮流显示数字,因为轮流速度非常快人眼看不出来一次其实只有一个在显示) 思路的话,按键和计时器都用中断控制会比较方便, 1个全局变量代表当前剩余秒数,一个全局变量代表当前剩余分钟数(或者你要一个16位变量代表秒数也行) 因为计时器无法定时1秒所以还要一个变量来辅助计时器实现每1秒引发一次事件的操作。 加上按键,这样就有2个事件:一个是1秒引发一次,一个是按钮引发 按钮作用是什么我不知道,你自己看着办 计时器就是全局变量的秒数减去1 这两个事件实现以后,主程序逻辑就是一开始启用中断、启用定时器、初始化全局变量, 然后就开始死循环,循环里的功能是把全局变量里的数字显示到数码管上,只管显示不管别的的话还是很容易的,别的(计时、按钮)全部交给中断去完成,即可。

查询方式:
ORG 00H

START: MOV R0,#20
MOV R4,#60
LP0: MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV DPTR,#TABLE
SETB TR0

LP1: JBC TF0,LP2
ACALL DISP
AJMP LP1

LP2: DJNZ R0,LP0
CLR TR0
MOV R0,#20
MOV A,R4
CJNE A,#0,DEC1
MOV R4,#60
AJMP JP1

DEC1: DEC A
MOV R4,A

JP1: ACALL DISP
AJMP LP0

DISP: MOV A,R4
MOV B,#10
DIV AB ;当前值除以10
MOV 20H,A ;得出的商送给十位
MOV 21H,B ;得出的余数送给个位

MOV A,20H ;十位显示
MOVC A,@A+DPTR
MOV P0,A
SETB P2.1
LCALL DELAY
CLR P2.1

MOV A,21H ;个位显示
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
LCALL DELAY
CLR P2.0
RET

DELAY: ;误差 0us
MOV R6,#10
DL0:
MOV R5,#50
DJNZ R5,$
DJNZ R6,DL0
RET

TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H ;共阳极0-9显示代码
DB 92H,82H,0F8H,80H,90H

END

中断方式:
ORG 00H
AJMP MAIN
ORG 0BH
AJMP T0INT
ORG 30H

MAIN:
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H ;50MS一中断
MOV R0,#20 ;20次为1S
MOV R4,#60 ;60S开始倒计时
SETB EA
SETB ET0
SETB TR0
MOV DPTR,#TABLE
MAIN1:
ACALL DISP
AJMP MAIN1

DISP:
MOV A,R4
MOV B,#10
DIV AB ;当前值除以10
MOV 20H,A ;得出的商送给十位
MOV 21H,B ;得出的余数送给个位

MOV A,20H ;十位显示
MOVC A,@A+DPTR
MOV P0,A
SETB P2.1
LCALL DELAY
CLR P2.1

MOV A,21H ;个位显示
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
LCALL DELAY
CLR P2.0
RET

T0INT:
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ R0,RTI
MOV R0,#20
DEC R4
CJNE R4,#0,RTI
MOV R4,#60
RTI:
RETI

DELAY: ;误差 0us
MOV R6,#10
DL0:
MOV R5,#50
DJNZ R5,$
DJNZ R6,DL0
RET

TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H ;共阳极0-9显示代码
DB 92H,82H,0F8H,80H,90H

END

高手还是很多吗?

现在单片机很少用汇编了。我可以提供c的。

你好,可否帮忙编写一个51单片机的汇编程序。将一个双字节的16进制数转换...
已知:R2 R3 R4 中是 BCD 码,其中R2中是万位,R3中是千、百位,R4中是十、个位。结果:R2 R3 中是 BCD 码,其中R2中是万、千位,R3中是百位、十位。子程序如下:MOV A, R4 ;R4原有十、个位数 SWAP A ANL A, #0FH ;截取十 MOV B, A ;保存一下 ;MOV A, R3 ...

在单片机汇编语言中c是什么意思
C为进借位标志位,就是CY 意思是两数相加(ADDC指令)有进位就置C为1,两数减(SUBB指令)有借位就置C为1,上面两种请况C的置1是系统自动的。另外还可以自己对C进行操作 指令如下:MOV C, bit 将bit位地址中的值送PSW中的进位标志位CY MOV bit, C 将PSW中的进位标志位CY的值送bit位地址中 ...

51单片机汇编语言。求两个数的平方和。
AAA EQU 30H BBB EQU 31H CCC EQU 40H ORG 8000H MAIN: MOV R3,#0 ;清零 MOV A,AAA ACALL SQRT ;调用求平方子程序 MOV R3,A MOV A,BBB ACALL SQRT ;调用求平方子程序 ADD A,R3 MOV R3,A MOV CCC,R3 SJMP SQRT: MOV DPTR,#TAB MOVC A,@A+DPTR RET TAB: DB 0,1,4,9,1...

51单片机控制数字钟原理图及汇编程序设计
include <reg51.h> define uchar unsigned char uchar display_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar display_data[8]={0,0,0,0,0,0,0,0};uchar time[3]={0,0,0};void delay(void)\/\/延时05ms { uchar i...

汇编语言51单片机怎么实现用KEY 1控制数码管上显示的数字加1 KEY2控制...
原有key1为P3.4,添加个key2键为P3.5;1、按你显示程序的逻辑,对TAB修改如下:TAB:DB 00H,3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H 即数据的首尾为0(这是个标记而已),中间才是七段码 0--F 的显示数据;2、对CK1、CK2键盘按下及松开程序...

51单片机能识别和执行的语言
在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。高级语言包括C语言,BASIC语言和PL\\M语言等。现在一般使用C语言进行单片机编程,其他语言用作单片机编程较少。由于计算机只能看懂机器语言所以无论是汇编语言还是高级语言都需要经过编译成为机器语言才能够执行。

51单片机c语言设计,按键控制数码管,依次按下显示0到9循环
include<reg51.h> sbit k1=P1^0;define uint16 unsigned int define uchar unsigned char uchar code shuzu[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(){ uint16 i=1000;while(i--);} void main(){ uchar n ;P2=0xfe;P1=0xff;while(1){ if...

用汇编语言编写1234H和5678h相加的程序代码
先加底二位34和78用add在加高两位用addc m51大概的写法 算法都是对的 记得采纳啊 MOV A #34H ADD A #78H MOV R1 A MOV A #12H ADDC A #56H MOV R2 A

51单片机怎样进行两个16位数的运算
运算过程是在累加器和寄存器中自动进行的

51单片机汇编语言按键控制数码管加1加到999
思路是对的,细节描述有问题,算法描述要严谨。为什么要99时清零啊,这可能就是错误的地方了。系统初始化时,清除使用到的寄存器!!然后,当需要加1时做如下动作 寄存器a = a+1 如果寄存器a == 100,{寄存器b=b+1;寄存器a = 0} 这样就可以了,b中的1代表100,a中的1就是1 ...