⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 电子钟1.6.asm

📁 基于AT89C51单片机的电子钟程序
💻 ASM
字号:
;程序升级说明:在1.5基础上增加了按键蜂鸣声
;
          ORG 0000H        ;程序执行开始地址
          LJMP      START  ;跳到标号START执行
          ORG 0003H        ;外中断0中断程序入口
          LJMP      REMO   ;外中断0中断返回
          ORG 000BH        ;定时器T0中断程序入口
          LJMP      TIME0  ;跳至INTTO执行
          ORG 0013H        ;外中断1中断程序入口
          RETI             ;外中断1中断返回
          ORG 001BH        ;定时器T1中断程序入口
          LJMP      TIME1  ;跳至TIME1执行
          ORG 0023H        ;串行中断程序入口地址
          RETI             ;串行中断程序返回
;
TIME1:    RETI
;
          TIMEADD EQU 30H;30H做为软件计数缓存
          DISP1 EQU 31H;31H做为第一位显示缓存
          DISP2 EQU 32H;32H做为第二位显示缓存
          DISP3 EQU 33H;33H做为第三位显示缓存
          DISP4 EQU 34H;34H做为第四位显示缓存
          SECLED EQU P0.0;秒点显示P1.0
          HALFSEC EQU 35H;半秒计数缓存
          UPKEY BIT P3.3;定义P2.7是UP键
          SETKEY BIT P3.2;定义P2.0是SET键
          BUZZ BIT P2.0;
;
;第1位使能P2.1
;第2位使能P2.2
;第3位使能P2.3
;第4位使能P2.4
;
          ORG 0030H;
;
START:
          MOV SP,#5FH;放堆栈
          MOV P2,#0FFH;把P2置高
          CLR P2.5;把p2.5置0
          LCALL BUZZER;发出滴声
          LCALL BUZZER;按键滴声
          MOV TIMEADD,#0;软件计数器清零
          MOV TMOD,#11H;TIME0工作于方式1,TIME1工作于方式1
          MOV TH0,#3CH;
          MOV TL0,#0B0H;放定时预置数15536
          MOV IE,#8BH;开INT0,TIME0,TIME1
          MOV IP,#02H;TIME0中断优先
          SETB IT0;外部中断0为负跳变方式触发
          SETB TR0;开始计数
          MOV DISP1,#00H;
          MOV DISP2,#00H;
          MOV DISP3,#00H;
          MOV DISP4,#00H;把所有显示缓存清零
          MOV HALFSEC,#00H;把半秒计数缓存清零
          MOV DPTR,#TAB;

SCAN:
          MOV A,DISP1;把第一位显示缓存送入A
          MOVC A,@A+DPTR;查表
          SETB P2.7;
          CLR P2.4;第一位显示使能
          MOV P0,A;查表得到的7段码送给P0去显示
          LCALL DELAY;延时
          MOV P0,#0FFH;显示一小段时间后关掉7段显示,去显示下一位

          MOV A,DISP2;
          MOVC A,@A+DPTR;
          SETB P2.4;
          CLR P2.5;
          MOV P0,A;
          LCALL DELAY;
          MOV P0,#0FFH;

          MOV A,DISP3;
          MOVC A,@A+DPTR;
          SETB P2.5;
          CLR P2.6;
          MOV P0,A;
	  CLR P0.0
          LCALL DELAY;
          MOV P0,#0FFH;

          MOV A,DISP4;
          MOVC A,@A+DPTR;
          SETB P2.6;
          CLR P2.7;
          MOV P0,A;
          LCALL DELAY;
          MOV P0,#0FFH;

          JNB SETKEY,ADJUST;按键按下时去调整时间

;以下是进位程序
          MOV A,DISP1;把第一位缓存送入A
          CJNE A,#10,SCAN;如果第一位不等于10继续扫描
          MOV DISP1,#00H;如果第一位等于10了就把第一位清零

          INC DISP2;第二位加1
          MOV A,DISP2;
          CJNE A,#6,SCAN;如果第二位不等于6继续扫描
          MOV DISP2,#00H;

          INC DISP3;
          MOV A,DISP4;
          CJNE A,#2,PM;
          MOV A,DISP3;
          CJNE A,#4,SCAN;
          MOV DISP3,#00H;
          AJMP DIS4;

PM:
          MOV A,DISP3;
          CJNE A,#10,SCAN;
          MOV DISP3,#00H;

DIS4:
          INC DISP4;
          MOV A,DISP4;
          CJNE A,#3,SCAN;
          MOV DISP4,#00H;

          AJMP SCAN;
;
DELAY: ;延时子程序
	       MOV R7,#2
	       NOP
D1: 	    MOV R6,#2
          DJNZ R6,$
	       DJNZ R7,D1
	       RET
;
TAB:	    db 03h,9fh,25h,0dh,99h,49h,41h,1fh,01h,09h
;
;
;
;
;下面程序为设置时间用
ADJUST:
          LCALL ADJDELAY;
          JB SETKEY,SET1;
          LCALL BUZZER;按键滴声
          JNB SETKEY,$
          CLR TR0; 暂时关闭计时

ADJ4:
          SETB P2.4;
          CLR P2.7;
          MOV A,DISP4;
          MOVC A,@A+DPTR;
          MOV P0,A;显示第四位
          JNB SETKEY,ADJ8;如果设置键有动作去调节第3位
          JB UPKEY,ADJ4;加键是否按下
          LCALL ADJDELAY;
          JB UPKEY,ADJ4;延时后再检查加键是否按下
          LCALL BUZZER;按键滴声
          JNB UPKEY,$;等待加键松开
          INC DISP4;第四位加1
          MOV A,DISP4;
          CJNE A,#3,ADJ4;第四位不等于3转移
          MOV DISP4,#00H;第四位等于3清零
          AJMP ADJ4;再去显示第四位

ADJ8:
          LCALL ADJDELAY;
          JB SETKEY,ADJ4;
          LCALL BUZZER;按键滴声
          JNB SETKEY,$;

ADJ3:
          SETB P2.7;
          CLR P2.6;
          MOV A,DISP3;
          MOVC A,@A+DPTR;
          MOV P0,A;显示第三位
          JNB SETKEY,ADJ7;
          JB UPKEY,ADJ3;
          LCALL ADJDELAY;
          JB UPKEY,ADJ3;
          LCALL BUZZER;按键滴声
          JNB UPKEY,$;
          INC DISP3;第3位加1
          MOV A,DISP4;
          CJNE A,#2,PM1;
          MOV A,DISP3;
          CJNE A,#4,ADJ3;第3位不等于4转移
          MOV DISP3,#00H;第四位等于3清零
          AJMP ADJ3;再去显示第四位

PM1:
          MOV A,DISP3;
          CJNE A,#10,ADJ3;
          MOV DISP3,#00H;
          AJMP ADJ3;

SET1:
          LCALL BUZZER;按键滴声
          LCALL BUZZER;按键滴声
          JNB SETKEY,$;
          NOP;
          MOV HALFSEC,#00H;清零秒针
          SETB TR0;
          LJMP SCAN;

ADJ7:
          LCALL ADJDELAY;
          JB SETKEY,ADJ3;
          LCALL BUZZER;按键滴声
          JNB SETKEY,$;

ADJ2:
          SETB P2.6;
          CLR P2.5;
          MOV A,DISP2;
          MOVC A,@A+DPTR;
          MOV P0,A;显示第二位
          JNB SETKEY,ADJ6;
          JB UPKEY,ADJ2;
          LCALL ADJDELAY;
          JB UPKEY,ADJ2;
          LCALL BUZZER;按键滴声
          JNB UPKEY,$;
          INC DISP2;第2位加1
          MOV A,DISP2;
          CJNE A,#6,ADJ2;第2位不等于6转移
          MOV DISP2,#00H;第2位等于6清零
          AJMP ADJ2;再去显示第2位

ADJ6:
          LCALL ADJDELAY;
          JB SETKEY,ADJ2;
          LCALL BUZZER;按键滴声
          JNB SETKEY,$;

ADJ1:
          SETB P2.5;
          CLR P2.4;
          MOV A,DISP1;
          MOVC A,@A+DPTR;
          MOV P0,A;显示第一位
          JNB SETKEY,ADJ5;如果SET键有动作转去抖
          JB UPKEY,ADJ1;
          LCALL ADJDELAY;
          JB UPKEY,ADJ1;
          LCALL BUZZER;按键滴声
          JNB UPKEY,$;
          INC DISP1;第1位加1
          MOV A,DISP1;
          CJNE A,#10,ADJ1;第1位不等于10转移
          MOV DISP1,#00H;第1位等于10清零
          AJMP ADJ1;再去显示第1位

ADJ5:
          LCALL ADJDELAY;
          JB SETKEY,ADJ1;
          AJMP SET1;


ADJDELAY:;是不是延时40MS?
          MOV R7,#200
D3:       MOV R6,#100
          DJNZ R6,$
          DJNZ R7,D3
          RET

BUZZER:   MOV R6,255;蜂鸣子程序
BUZZ1:    CPL BUZZ;
          MOV R7,#80;
          DJNZ R7,$;
          DJNZ R6,BUZZ1;
          CLR BUZZ;
	       RET

;以上为设置时间用
;
REMO:
          RETI;
          ;
;
;
TIME0:;   TIME0中断处理程序
          MOV TH0,#3CH;
          MOV TL0,#0B6H;重新放定时预置数15542,用预置数较正时间。
          PUSH ACC;机器周期2
          PUSH PSW;机器周期2
          INC TIMEADD;软件计数器加1,机器周期1
          MOV A,TIMEADD;加1后送给A,机器周期1
          CJNE A,#10,T_RET;如果A不等于10跳到T_RET,机器周期2
          CPL SECLED;取反秒点LED,软件计数器计时半秒,机器周期1
          MOV TIMEADD,#00H;软件计数器清零,机器周期1
          INC HALFSEC;秒加1,机器周期1
          MOV A,HALFSEC;机器周期1
          CJNE A,#120,T_RET;把秒针缓存和120比较,不等跳转T_RET,机器周期2
          INC DISP1;第一位显示加1,机器周期1
          MOV HALFSEC,#00H;清零秒针,机器周期1
T_RET:
          POP PSW
          POP ACC
          RETI

END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -