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

📄 家庭时钟6.10.asm

📁 时钟单片机汇编程序,可以随意调整时间。。。。
💻 ASM
字号:
;本实验是做一个计时器,能从00:00计到59:59共1个小时。
;数码管1、2位为时,3、4位为分。
         DS1    EQU   22H      ;数码管显示缓存
         DS2    EQU   23H
         DS3    EQU   24H
         DS4    EQU   25H
      BUFF_LP   EQU   28H
   BUFF_LED_LP  EQU   29H      ;T0键盘显示扫描缓存
         HOR    EQU   30H      ;时值缓存
         MIN    EQU   31H      ;分钟值缓存
         SEC    EQU   32H      ;秒值缓存
      SET_TIME  BIT   33H
     SET_CLOCK  BIT   34H
          RAM1  EQU   35H
          RAM2  EQU   36H
          
     LED_PORT   EQU   P0       ;数码管段码接口
         KEY    EQU   P1
         GRE    BIT   P2.0
         RED    BIT   P2.1
         BUZZ   BIT   P2.2
         LED    BIT   P2.3
         IRC    BIT   P3.2
        ORG   000H
        JMP   MAIN
        ORG   003H
        JMP   INT0
        ORG   00BH
        JMP   T0_INT

        ORG    0100H
MAIN:   MOV    SP ,#40H
        MOV    PSW,#00H
        MOV    R0,#7FH      ;初始化RAM区,
CLR_RAM:MOV    A,#00H
        MOV    @R0,A
        DJNZ   R0,CLR_RAM
        MOV    P1,0FFH
        MOV    P2,0FFH
        MOV    P0,0FFH
        MOV    P3,0FFH
        MOV    TH0,#0F0H     ;装入定时时间T0=4MS
        MOV    TL0,#060H
        MOV    IE,#83H
        SETB   IT0 ;设定INT0的触发方式为脉冲负边沿触发
        MOV    TMOD,#01H
        SETB   TR0           ;开始定时
        SETB   IRC
        SETB   BUZZ          ;关蜂鸣器
        SETB   LED           ;关LED
        SETB   RED
        SETB   GRE
        CLR    SET_TIME
        CLR    SET_CLOCK
        MOV    KEY,#0FFH      ;设P1口为输入口
 LOOP:  MOV    A,KEY
        CJNE   A,#0FFH,START
        LJMP   LOOP
 START: LCALL  DEL_10MS
        JNB    SET_TIME,KEY5;;;;;
  KEY1: JB     ACC.0,KEY2
        MOV    A,HOR          ;
        CJNE   A,#23,ADD_HOR  ;
        MOV    HOR,#0         ;
        LJMP   KEY1OUT
ADD_HOR:INC    HOR            ;
KEY1OUT:LJMP   KEYFRE

  KEY2: JB     ACC.1,KEY3
        MOV    A,HOR          ;
        CJNE   A,#00,SUB_HOR  ;
        MOV    HOR,#23        ;
        LJMP   KEY2OUT
SUB_HOR:DEC    HOR            ;
KEY2OUT:LJMP   KEYFRE

  KEY3: JB     ACC.2,KEY4
        MOV    A,MIN          ;
        CJNE   A,#59,ADD_MIN   ;
        MOV    MIN ,#0         ;
        LJMP   KEY3OUT
ADD_MIN:INC    MIN             ;
KEY3OUT:LJMP   KEYFRE

  KEY4: JB     ACC.3,KEY5
        MOV    A,MIN           ;
        CJNE   A,#00,SUB_MIN   ;
        MOV    MIN ,#59        ;
        LJMP   KEY2OUT
SUB_MIN :DEC    MIN            ;
KEY4OUT:LJMP   KEYFRE

  KEY5: JB     ACC.4,KEY6
        LCALL  BELL
        JBC    SET_TIME,K5_OUT
        SETB   SET_TIME
        CLR    SET_CLOCK
        CLR    RED
        SETB   GRE
        LJMP   KEYFRE
 K5_OUT:SETB   RED
        LJMP   KEYFRE

  KEY6: JB     ACC.5,KEY7
        LCALL  BELL
        JBC    SET_CLOCK,K6_OUT
        SETB   SET_CLOCK
        CLR    SET_TIME
        SETB   RED
        CLR    GRE
        LJMP   KEYFRE
 K6_OUT:SETB   GRE
        LJMP   KEYFRE

  KEY7: JB     ACC.6,KEY8
        ;CPL    GRE
        LJMP   KEYFRE

  KEY8: JB     ACC.7,KEYFRE
        ;CPL    RED
        LJMP   KEYFRE

KEYFRE: JB     SET_TIME,KEYR1
        JNB    SET_CLOCK,KEYR2
  KEYR1:LCALL  BELL
  KEYR2:MOV    A,KEY             ;等待键释放
        CPL    A
        XRL    A,#00H
        JNZ    KEYR2
        LJMP   LOOP

BELL  : MOV    R5,#100
  BEL:  CLR    BUZZ
        LCALL  DEL
        SETB   BUZZ
        LCALL  DEL
        DJNZ   R5,BEL
        RET

DEL:     MOV   R7,#2
DEL01:   MOV   R6,#25
         DJNZ  R6,$
         DJNZ  R7,DEL01
         RET

DEL_10MS: MOV   R6,#25
   D10MS: MOV   R7,#250
          DJNZ  R7,$
          DJNZ  R6,D10MS
          RET

YS1:   MOV R4,#20 ;延时子程序1,精确延时882微秒
D1:    MOV R5,#20
       DJNZ R5,$
       DJNZ R4,D1
       RET

YS2:   MOV R4,#10 ;延时子程序2,精确延时4740微秒
D2:    MOV R5,#235
       DJNZ R5,$
       DJNZ R4,D2
       RET

YS3:   MOV R4,#2;延时程序3,精确延时1000微秒
D3:    MOV R5,#248
       DJNZ R5,$
       DJNZ R4,D3
       RET


BIN_BCD:  MOV  B,#10
          DIV  AB
          RET

;以下为进入P3.2脚外部中断子程序,也就是解码程序
INT0:  CLR EA ;暂时关闭CPU的所有中断请求
       MOV R6,#10
SB:    ACALL YS1;调用882微秒延时子程序
       JB IRC,EXIT;延时882微秒后判断IR脚是否出现高电平如果有就退出解码程序
       DJNZ R6, SB;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
       ;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
       JNB IRC, $ ;等待高电平避开9毫秒低电平引导脉冲
       ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码

       MOV R7,#26;忽略前26位系统识别码

JJJJA: JNB IRC,$;等待地址码第一位的高电平信号
       LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
       MOV C,IRC;将IR引脚此时的电平状态0或1存入C中
       JNC UUUA;如果为0就跳转到UUUA
       LCALL YS3;检测到高电平1的话延时1毫秒等待脉冲高电平结束
       ;========保存识别码
UUUA:  DJNZ R7,JJJJA

       MOV R1,#RAM1;设定1AH为起始RAM区
       MOV R2,#2;接收从1AH到1BH的2个内存,用于存放操作码和操作反码
PP:    MOV R3,#8;每组数据为8位

JJJJ:  JNB IRC,$;等待地址码第一位的高电平信号
       LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
       MOV C,IRC;将IR引脚此时的电平状态0或1存入C中
       JNC UUU;如果为0就跳转到UUU
       LCALL YS3;检测到高电平1的话延时1毫秒等待脉冲高电平结束
UUU:   MOV A,@R1;将R1中地址的给A
       RRC A;将C中的值0或1移入A中的最低位
       MOV @R1,A;将A中的数暂时存放在R1数值的内存中
       DJNZ R3,JJJJ;接收满8位换一个内存
       INC R1;对R1中的值加1,换下一个RAM
       DJNZ R2,PP ;接收完8位数据码和8位数据反码,存放在1AH/1BH中

       MOV A,RAM1
       CPL A;对RAM1取反后和RAM2比较
       CJNE A,RAM2,EXIT;如果不等表示接收数据发生错误,放弃
       MOV  A,RAM1
       SWAP A
       ANL  A,#0FH
       MOV  DS1,A
       MOV  A,RAM1
       ANL  A,#0FH
       MOV  DS2,A
;=====解码正确===============
 KK:  ;LCALL BELL
EXIT:
       SETB EA ;允许中断
       RETI ;退出解码子程序

;===============数码管扫描定时中断================
T0_INT:  PUSH   ACC
         PUSH   PSW
         MOV    TH0,#0F0H             ;T0=4MS
         MOV    TL0,#060H
         INC    BUFF_LED_LP
         MOV    A,BUFF_LED_LP
         CJNE   A,#250,CONT_SCAN     ;250*4MS=1S
         MOV    BUFF_LED_LP,#00H
         INC    SEC
         CPL    LED
         MOV    A,SEC
         CJNE   A,#60,CONT_SCAN
         MOV    SEC,#00H
         INC    MIN
         MOV    A,MIN
         CJNE   A,#60,CONT_SCAN
         MOV    MIN,#00H
         INC    HOR
         MOV    A,HOR
         CJNE   A,#24,CONT_SCAN
         MOV    HOR,#00H
CONT_SCAN:INC   BUFF_LP
          MOV   A,MIN  ;
          LCALL BIN_BCD
          MOV   DS4,B
          MOV   DS3,A
          MOV   A,HOR ;
          LCALL BIN_BCD
          MOV   DS2,B
          MOV   DS1,A
    SCAN: MOV   A,BUFF_LP
          MOV   B,#04
          DIV   AB
          MOV   A,B
          RL    A
          MOV   DPTR,#TAB_SCAN
          JMP   @A+DPTR
TAB_SCAN: AJMP  SCAN_L1
          AJMP  SCAN_L2
          AJMP  SCAN_L3
          AJMP  SCAN_L4

SCAN_L1:  CLR   P2.7
          SETB  P2.6
          SETB  P2.5
          SETB  P2.4
          MOV   A,DS1
          JMP   END_SCAN
SCAN_L2:  SETB  P2.7
          CLR   P2.6
          SETB  P2.5
          SETB  P2.4
          MOV   A,DS2
          JMP   END_SCAN
SCAN_L3:  SETB  P2.7
          SETB  P2.6
          CLR   P2.5
          SETB  P2.4
          MOV   A,DS3
          JMP   END_SCAN
SCAN_L4:  SETB  P2.7
          SETB  P2.6
          SETB  P2.5
          CLR   P2.4
          MOV   A,DS4
END_SCAN: MOV   DPTR,#TAB_LED
 DISPLAY: MOVC  A,@A+DPTR
          MOV   LED_PORT,A
EXIT_T0:  POP   PSW
          POP   ACC
          RETI


;=========共阳数码管段码表=============
TAB_LED:  DB    0C0H,0F9H,0A4H,0B0H,99H  ;"0","1","2","3","4"
          DB    92H,82H,0F8H,80H,90H     ;"5","6","7","8","9"
          DB    88H,83H,0A7H,0A1H,86H,8EH;"A","B","C","D","E","F"
          DB    0FFH                     ;" "
          END

⌨️ 快捷键说明

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