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

如题所述

查询方式:
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
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-01
高手还是很多吗?
第2个回答  2011-12-01
现在单片机很少用汇编了。我可以提供c的。

求C51单片机汇编语言控制两位数码管倒计时程序,最好能说明下思路
DIV AB ;当前值除以10 MOV 20H,A ;得出的商送给十位 MOV 21H,B ;得出的余数送给个位 MOV A,20H ;十位显示 MOVC A,@A+DPTR MOV P0,A SETB P2.1

求C51单片机汇编语言控制两位数码管倒计时程序,从60秒到30秒再到90秒...
是倒计时,就像红绿灯的倒计时那样。从60秒倒计时开始到01,之后变成30秒倒计时到01,之后,变成90秒倒计时到01,之后再到60秒,就跟前边的接上了 追答 轮流使用三种初始时间:60、90、30,分别倒计时到1。 追问 如何编写程序呀?您能帮我改下我的程序吗? 更多追问 本回答由提问者推荐 举报| 答案纠错 | 评论(2...

51单片机编程2位数码管倒计时,从10秒开始每隔一秒减一当减到零有重复...
include<reg51.h> define uchar unsigned char define uint unsigned int uchar DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};\/\/主程序 void main(){ P0=0x06; \/\/显示10 P2=0x3f;i=0;Second_Counts=100;TMOD=0x01; \/\/定时器0方式1 TH0=(65536-50000...

想用51单片机编个倒计时的c程序,要求用两位数码管显示分钟的,并用一...
全局变量2个用于表示个位和十位,显示的时候可以省点力不用每次计算个位十位。然后一个全局变量代表秒 编程的话,首先是按键响应中断,控制某个全局变量flag的值,三种状态:正常、暂停、到时间。按键可以在前两种之间切换,如果已经是第三种状态则没反应(或者要重置什么随你)然后定时器,一直开着就好,...

51单片机两个阳极数码管显示24倒计时怎么显示00
1、基于51单片机共阴两位数码管显示倒计时#includeunsigned char s=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;unsigned char count,d1,d2,g,y;signed int time=10; void delay(unsigned char i);void sm()d1=time\/10;d2=time%10;P1=sd1;P3=0x00;delay(2);P3=0x01;P1...

小白求救,51单片机利用两个数码管实现60秒倒计时?
然后下面这个程序你可以参考一下。是符合我的硬件图的。include <reg51.h> unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void show(unsigned char n);void delay(unsigned int k);void main(){ unsigned char i;int j;while(1){ for(i=60;j=60,i...

我想用51单片机编个倒计时的c程序,要求用两位数码管显示分钟的,并用一...
全局变量2个用于表示个位和十位,显示的时候可以省点力不用每次计算个位十位。然后一个全局变量代表秒 编程的话,首先是按键响应中断,控制某个全局变量flag的值,三种状态:正常、暂停、到时间。按键可以在前两种之间切换,如果已经是第三种状态则没反应(或者要重置什么随你)然后定时器,一直开着就好,...

求两位数码管显示一个倒数时间的单片机程序,比如显示从99到0
\/\/两位数码管显示倒计数99~00,51单片机。include<reg52.h> \/\/ 倒计数 define uint unsigned int define uchar unsigned char uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar bai,shi;uint a1,a2;sbit D1=P3^...

c51单片机怎么用两个按键控制两个数码管的加减,加到99就好,求程序
1、首先先在proteus画出仿真图,方便仿真程序。2、接着来编写程序,先来写入头函数。2、根据自己在proteus画的图,定义一下管脚根据你的原理图进行编写。3、然后写一个延时函数,来调节流水灯的时间间隔延时时间自己定义。4、下图就是主函数,包括流水灯的反复循环和j流水灯的方向。5、检查没有错误,...

求助,C51单片机用矩阵键盘按制两位数管显示的方案 内详!
回答:LED = 第1次输入 + 第2次输入 × 10

相似回答