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

📄 2051电子钟程序.asm

📁 基于AT89C2051电子钟程序 汇编语言
💻 ASM
字号:
;30h为秒个位,31H秒十位,32H分个位,33分十位,34时个位,35时十位
;储存单位定义
mgw equ 30h
msw equ 31h
fgw equ 32h
fsw equ 33h
sgw equ 34h
ssw equ 35h
mgw1 equ 36h
msw1 equ 37h
fgw1 equ 38h
fsw1 equ 39h
sgw1 equ 3ah
ssw1 equ 3bh
;按键输入定义
k1  equ p3.0     ;按键1引脚定义
K2  equ p3.1     ;按键2引脚定义
;喇叭引脚定义
;spk bit p3.2
;________主程序开始_________
org 0000h
ljmp main
org 000bh
ljmp zd
org 0030h
main:
;acall led
;acall bz             ;喇叭
;acall zhsm           ;逐行扫描
    acall  csh       ;初始化
    acall zh         ;转换
ks0:acall sz         ;设置
    setb tr0         ;开启计数
ks: acall sjjs       ;时间计算
    acall zh         ;转换
    acall xs         ;送出显示
    jnb   k1,tc
    ajmp  ks
tc: mov   r3,#255
tc1:acall sjjs
    acall zh
    acall xs
    jb    k1,ks
    djnz  r3,tc1

tc2:acall sjjs
    acall zh
    acall xs
    jnb   k1,tc2
    clr   tr0
    ajmp  ks0

;cpl p1.7



org 0100h              ;中断入口
zd:
push psw               ;保护现场
push a
clr tr0                ;计时器关闭
mov th0,#3ch           ;存入低位
mov tl0,#0b0h          ;存入高位
setb tr0               ;开计时器0
inc 7fh                ;秒加1
pop a                  ;恢复现场
pop psw
reti                   ;中断返回

;---------时间计算-----------
sjjs:
mov   a,7fh
cjne  a,#10,a2
mov   7FH,#0
cpl   p3.7
inc   72H
mov   a,72H
cjne  a,#120,a2          ;120/2=60s
mov   72H,#0
inc   fgw
jpd3:
mov   a,fgw
cjne  a,#10,a2           ;分个位满10?没,返回,有则向下执行
mov   fgw,#0             ;分个位清0
inc   fsw                ;分十位加1
jpd4:
mov   a,fsw
cjne  a,#06,a2           ;分十位满6?没,返回,有则向下执政
mov   fsw,#0
inc   sgw
jpd5:
mov   a,sgw
cjne  a,#4,a7            ;时个位满4?有再判断时十位满2?
a6:
mov   a,ssw
cjne  a,#2,a2
mov   sgw,#0
mov   ssw,#0
ljmp  a2
a7:
cjne  a,#10,a2
mov   sgw,#0
inc   ssw
a2:ret
;------------设置---------
sz:
;cjne  a,#1,sz
sz3: acall key       ;调用键盘程序,取键值
     orl   fgw1,#80h ;将高位置1,相当于小数点点亮
     acall key
     cjne  a,#1,sz9  ;如果不为1,跳sz9,或者向下执行
sz4: anl   fgw1,#7fh
     orl   fsw1,#80h
     acall key
     cjne  a,#1,sz10
sz5: anl   fsw1,#7fh
     orl   sgw1,#80h
     acall key
     cjne  a,#1,sz11
sz6: anl   sgw1,#7fh
     orl   ssw1,#80h
     acall key
     cjne  a,#1,sz12
     anl   ssw1,#7fh
     ret
sz9: cjne  a,#2,sz3
     acall jia3
     ajmp  sz3
sz10: cjne  a,#2,sz4
     acall jia4
     ajmp  sz4
sz11: cjne  a,#2,sz5
     acall jia5
     ajmp  sz5
sz12: cjne  a,#2,sz6
     acall jia6
     ajmp  sz6
     
;--------键盘程序--------
key:acall xs         ;调显示程序
    jnb  k1,l1       ;k1按下?有,跳l1,没,则向下执行
    jnb  k2,l1       ;k2按下?有,跳l1,没,则向下执行
    mov  a,#0        ;两键都没按,则a置0,返回主程序
    ajmp l10
l1: acall xs         ;这里主要为消抖用,为提高走时精确
    acall xs         ;这里主要为消抖用,为提高走时精确
    jnb   k1,kk1     ;k1按下?有,跳kk1,没,则向下执行
    jnb   k2,kk2     ;k2按下?有,跳kk2,没,则向下执行
l10:ret              ;返回主程序

kk1:
    mov    a,#1      ;将a置1
    acall  xs
    jnb    k1,kk1    ;为下次扫描键用
    ajmp   l10
kk2:
    mov    a,#2      ;将a置2
    acall  xs
    jnb    k2,kk2
    ajmp   l10
    acall  zh
    ret

jia3:inc fgw         ;分个位加1
     acall jpd3      ;调jpd3
     acall zh
     ret
jia4:inc fsw
     acall jpd4
     acall zh
     ret
jia5:inc sgw
     acall jpd5
     acall zh
     ret
jia6:inc ssw
     mov a,ssw
     swap a
     add a,sgw          ;将时个位和时十位相加
     cjne a,#24h,jia7   ;是否等于24?是跳jia7
     acall zh
     ajmp  jia8
jia7:acall zh
     jnc    jia8        ;c为0跳转
     ret
jia8:mov  sgw,#0
     mov  ssw,#0
     acall zh
     ret
;--------程序初始化---------
csh:                       ; 初始化
mov tmod,#01h
mov th0,#3ch
mov tl0,#0b0h
mov ie,#10000010b
mov sp,#60h
mov  dptr,#tab1
    mov  fgw,#0
    mov  fsw,#0
    mov  sgw,#0
    mov  ssw,#0
    mov  7fh,#0
    mov  71H,#0

    mov  72H,#0
    clr  p3.7
    ret
;---------值转换--------
zh:
    mov  A,fgw         ;分个位转换
    MOVC A,@A+DPTR     
    MOV fgw1,A

    mov  A,fsw         ;分十位转换
    MOVC A,@A+DPTR
    MOV fsw1,A

    mov  A,sgw        ;时个位转换
    MOVC A,@A+DPTR
    MOV sgw1,A

    mov  A,ssw        ;时十位转换
    MOVC A,@A+DPTR
    MOV ssw1,A

ret
;--------显示模块开始--------
xs:
    mov  p1,fgw1   ;将分个位值送入p1口
    clr p3.5       ;将p3.5口清零
    acall ys1ms    ;延时1ms
    setb p3.5      ;将p3.5置1

    mov  p1,fsw1   ;将分十位的值送入p1口
    clr p3.4
    acall ys1ms
    setb p3.4

    mov  p1,sgw1
    clr p3.3
    acall ys1ms
    setb p3.3

    mov  p1,ssw1
    clr p3.2
    acall ys1ms
    setb p3.2
ret
;--------显示程序结束---------
;延时20MS子程序
;计算方法:
;总延时=2us*r4*r6*r5
;      =2us*100*100*10
;      =200 000us =20ms
ys20ms:
      mov r5,#10
  dd1:mov r6,#100
  dd2:mov r4,#100
  dd3:nop
     djnz r4,dd3
     djnz r6,dd2
     djnz r5,dd1
ret
;延时1ms子程序
ys1ms:
     mov r5,#1
  d1:mov r6,#5
  d2:mov r4,#100
  d3:nop
     djnz r4,d3
     djnz r6,d2
     djnz r5,d1
ret

tab1:
DB  3fh,06H,5bH,4fH,066H,06dH,7dH,07H,7fH,06fh
end

⌨️ 快捷键说明

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