编一个AT89C51单片机00 —99 秒的汇编程序,要求有循环和暂停,用两个独立数码管显示

如题所述

;利用中断的99秒计时器 ,动态扫描两位数码管

;P0口接J3,数据端口

;P2.2接 J2 B端子,表示段码锁存

;P2.3接 J2 A端子,标志位码锁存

LATCH1 BIT P2.2

LATCH2 BIT P2.3

ORG 00H

JMP START

ORG 0BH

JMP TIM0

START:MOV R3,#00   ;中断循环次数

      MOV R4,#0    ;时间初值

      MOV DPTR,#TABLE

      MOV SP,#40H

      MOV TMOD,#01H  ;定时器工作方式

      MOV TH0,#HIGH(65536-3800)

      MOV TL0,#LOW(65536-3800)  ;初值4MS

      SETB TR0

      MOV IE,#82H  ;开中断

TIM0:

     MOV TH0,#HIGH(65536-3800)

     MOV TL0,#LOW(65536-3800)

     INC R3

     CJNE R3,#250,X1  ;1S

     MOV R3,#0

              

     MOV A,R4       ;十进制转换

     MOV B,#10

     DIV AB

     MOV 20H,B  ; 个位

     MOV 21H,A  ; 十位

     INC R4

     CJNE R4,#100,LEDSCAN  ;到100则清零

     MOV R4,#0

LEDSCAN: CALL SCAN  ;调用数码管扫描

X1:   PUSH ACC

      PUSH PSW

      CALL SCAN

      POP PSW

      POP ACC

      RETI

SCAN:

     MOV A,21H

     MOVC A,@A+DPTR

     MOV P0,A

     SETB LATCH1

     CLR LATCH1

     MOV P0,#11111110B ;扫描子程序

     SETB LATCH2

     CLR LATCH2

     CALL DELAY1

     MOV A,20H

     MOVC A,@A+DPTR

     MOV P0,A

     SETB LATCH1

     CLR LATCH1

     MOV P0,#11111101B  ;0代表选通该位数码管

     SETB LATCH2

     CLR LATCH2

     CALL DELAY1

     RET

DELAY:MOV R5,#50         ;典型延时程序

D1:   MOV R6,#40

D2:   MOV R7,#248

      CALL SCAN

      DJNZ R7,$

      DJNZ R6,D2

      DJNZ R5,D1

      RET

DELAY1:MOV R6,#4    ;扫描延时

D3:    MOV R7,#248

       DJNZ R7,$

       DJNZ R6,D3

       RET

TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH    ;共阴字码表

END 

是用动态扫描的方法显示的,用了2个锁存器,8个数码管的。 

附上电路图

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-10-14

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV TMOD,#01H

MOV TH0,#HIGH(65536-10000)

MOV TL0,#LOW(65536-10000)

SETB ET0

SETB TR0

SETB EA

SETB 00H

LOOP:

SJMP LOOP

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-10000)

MOV TL0,#LOW(65536-10000)

SETB TR0

MOV DPTR,#TABLE

T0C:

CPL 00H

JB 00H,T001

MOV P3,#0FDH

MOV A,R1

MOVC A,@A+DPTR

MOV P2,A

SJMP T002

T001:

MOV P3,#0FEH

MOV A,R0

MOVC A,@A+DPTR

MOV P2,A

T002:

INC R2

MOV A,R2

CJNE A,#100,T0E

MOV R2,#0

INC R0

CJNE R0,#9,T0E

MOV R0,#0

INC R1

CJNE R1,#9,T0E

MOV R1,#0

T0E:

RETI

TABLE:      ; 共阴极数码管显示代码表

DB    3FH,06H,5BH,4FH,66H ;01234

DB    6DH,7DH,07H,7FH,6FH ;56789


END

本回答被网友采纳
第3个回答  2011-04-25
wo lai bangzhu ni

...秒的汇编程序,要求有循环和暂停,用两个独立数码管显示
CLR LATCH1 MOV P0,#11111101B ;0代表选通该位数码管 SETB LATCH2 CLR LATCH2 CALL DELAY1 RET DELAY:MOV R5,#50 ;典型延时程序 D1: MOV R6,#40 D2: MOV R7,#248 CALL SCAN DJNZ R7,DJNZ R6,D2 DJNZ R5,D1 RET DELAY1:MOV R6,#4 ;扫描延时 D3: MOV R7,#2...

AT89C51单片机用C语言编写一个99秒倒计时的程序,要求复位或上电2位数码...
首先呢,定义两个全局变量,以作十与个并赋值为0,然后编写一个独立键盘函数,分别用于判断SB1~4,若 SB1==0,TR0=1,若SB2==0,TR0=0,若SB3==0,SHI ,若SB4==0,FEN 。主要功能就这样,当然这个并不完美,需要你自己去添加一些功能,然后再编写中断函数。希望我的回答能帮助到你。

求大神写个程序,at89c51单片机实现两个7SEG-COM-ANODE灯循环显示00...
P2=0xc0;while(1);} \/\/T0中断程序 void T0_int() interrupt 1 { TH0 =0x3C;TL0 =0xB0;t0n++;if(t0n>=10)\/\/0.5秒到 { t0n=0;num++;\/\/加1 if(num>99)num=0;P0=tab[num\/10];P2=tab[num%10];} } 仿真结果

用单片机AT89C51驱动两位数码管显示00--99依次循环程序代码
以下是用单片机AT89C51驱动两位数码管显示00--99循环的程序代码片段:程序开始于0000h地址,通过计数器temp(22h)控制数码管从00到99的循环显示。计数器初始化为0,然后调用子程序display进行显示。每当计数器加1并判断是否达到100后,若未满则返回stlop继续循环,满100则清零重新开始。display子程序中,先...

AT89C51中断程序设计两位数码管0到99,工作方式1,定时计数,1s,不用C语 ...
SECOND EQU 30H; 定义 TCOUNT EQU 31H ;定义 ORG 00H ; 起始 LJMP START; 跳转 ORG 1BH ; 中断矢量地址 LJMP INT0X ; 跳转 START:MOV SECOND,#00H ; 设置计数0送入SECOND MOV TCOUNT,#00H ; 设置计数0送入TCOUNT MOV TMOD,#10H ; 设置计数器1 MOV TH1,#(65536-50000) \/ 256 ...

单片机用汇编写两个数码管显示0到99循环的程序
2、数码管段选表。3、延时函数。4、uchar i; 变量i;wk = 1;打开位选,P0 = 0xf7;1111 0111第4位数码管显示,wk = 0;关闭位选。5、while(1) \/\/死循环效果{} 。6、dk = 1;\/\/打开段选,P0 = leddata[i];,dk = 0;\/\/关闭段选,delay(100);\/\/延时效果。7、选择效果,限制i值...

AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊?
display(second)子函数与两个数码管的连接方式有关 void main(void )\/\/主程序 { TMOD=0x01;\/\/ 定时器1工作方式一 ET0=1;EA=1;TH0=(65536-10000)\/256;\/\/定时10ms TL0=(65536-10000)%256;TR0=0;\/\/上电先不启动 while(1){ if(key1==0)\/\/判断按键是否按下 { Delay1ms(10);\/\/延时...

用AT89C51单片机编写一个C语言程序实现2个数码管秒计数器,用4个按键...
uchar num=0;sec,key;void delay(unsigned int a){ unsigned int i,j;for(i=0;i<a;i++)for(j=0;j<120;j++);} void display(){ LED1=sec\/10;LED2=sec%10;P2=0x01;P0=distab[LED1];delay(3);P2=0x02;P0=distab[LED2];delay(3);} void t0isr() interrupt 1 { TH0=(...

1、 基于AT89C51单片机,利用定时器设计一个两位数码管显示电路。 设计...
if(shu==99) shu=0; } } void time1(void) interrupt 3 { TH1=(65536-5000)\/256; TL1=(65536-5000)%256; display(); } void init() { TMOD=0x11; EA=1; ET0=1; ET1=1; TR1=1; TR0=1; } main() { init(); while(1) { conv(shu); } } 本回答由提问者推荐 举报| 答案纠错 |...

求篮球30秒倒计时器的设计和制作,数字电路课程设计,详细论文
30秒倒计时器的设计和制作有很多方法,本文介绍的30秒倒计时器以AT89C51单片机作为控制单元,采用两个数码管显示时间,用三个按键分别控制计时器的计时开始、复位和暂停。倒计时器初始状态显示“30”,当裁判员按下计时键,30秒倒计时开始,当计时器时间减到0时,计时器发出声光报警,提示裁判计时时间已到。 一、电路设计...

相似回答