新闻  |   论坛  |   博客  |   在线研讨会
用51单片机设计的时钟电路(毕业论文)程序
tvb2058 | 2007-09-11 10:02:34    阅读:5452   发布文章

图片:

51 时钟电路的程序如下:

   SEC  EQU  32H ; 即时时间 \伪指令
   MIN  EQU  31H ;
   HOUR EQU  30H ;
   DAY  EQU  35H ;
   MON  EQU  34H ;
   YEAR EQU  33H ;
   MIN_1 EQU 41H ; 定时器1路、开存储单元
   HOUR_1 EQU 42H ;
   DAY_1  EQU 43H ;
   MON_1  EQU 44H ;
   YEAR_1 EQU 45H ;
   MIN_11 EQU 40H ;  定时器1路、关存储单元
   HOUR_11 EQU 46H ;
   DAY_11  EQU 47H ;
   MON_11  EQU 48H ;
   YEAR_11 EQU 49H ;
;***********************
   ORG 0000H
   ljmp MAIN
   ORG 0003H  ;中断转换显示年月日、INT0SB4键)
   LJMP SHOW
   ORG 000BH    ;计数中断 T0、方式1
   LJMP  TIME
   ORG 0013H
   LJMP CHANGE; 调整时间、定时、INT1SB0键)
;------主程序
   ORG 0030H
MAIN:

;--------初始化付值
   MOV  YEAR ,  #02
   MOV  MON  , #05
   MOV  DAY ,  #01
   MOV  HOUR , #00
   MOV  MIN ,  #00
   MOV  SEC ,  #00
   CLR  40H     ;定时单元1路清零
   CLR  41H
   CLR  42H
   CLR  43H
   CLR  44H
   CLR  45H
   CLR  46H
   CLR  47H
   CLR  48H
   CLR  49H


;-------开中断
   MOV TMOD , #01H ;计数、模式1T0
   MOV TL0,   #0B0H ;100SM 计数定时
   MOV TH0,   #3CH ;
   clr p3.0
   MOV 20H,  #0AH  ;10*100SM
   SETB PT0   ;T0为最高级
   SETB TR0   ;允许计数
   SETB ET0   ;允许T0中断
   SETB EX0   ;允许INT0中断
   SETB EX1   ;允许INT1中断
   SETB  EA   ;开总中断


;------显示、定时器启动判断
LOOP:

   MOV  R1, #30H; 存储单元
   MOV  R4, #01H; 位选通
   MOV  R3, #03H; 三组显示
NEXT:
   MOV  A , @R1  ;
   MOV  B , #10  ;将存储单元转换成两高低两组的BCD
   DIV  AB
   SWAP A
   ORL  A, B
   MOV  P0, A;输出
   MOV  P2, R4
   INC   R1  ;下一单元
   MOV  A, R4 ;
   RL   A    ;位移
   MOV  R4, A
   LCALL  DE5SM  ;延时0.5SM
   DJNZ  R3, NEXT   ;全扫描显示一偏

;------判断定时输出(只编写了一路)
   CJNE  R7, #88H,LOOP ;8则开,否则、定时已关、转
;---------
   MOV  A, YEAR
   CJNE  A, YEAR_1, LOOP_1;年比较,不等转关
   MOV  A, MON
   CJNE  A, MON_1, LOOP_1
   MOV   A, DAY
   CJNE  A , DAY_1,LOOP_1
   MOV   A,  HOUR
   CJNE  A, HOUR_1,LOOP_1
   MOV   A, MIN
   CJNE  A, MIN_1, LOOP_1
   CPL  P3.0
;---------
LOOP_1:
   MOV  A, YEAR
   CJNE  A, YEAR_11, LOOP;年比较
   MOV  A, MON
   CJNE  A, MON_11, LOOP
   MOV   A, DAY
   CJNE  A , DAY_11,LOOP
   MOV   A,  HOUR
   CJNE  A, HOUR_11,LOOP
   MOV   A, MIN
   CJNE  A, MIN_11, LOOP
   CPL  P3.0
   LJMP  LOOP

;-----年月日显示中断子程序
SHOW:
    PUSH  PSW
    push  ACC
    PUSH  B
    PUSH  01H
    PUSH  02H
    PUSH  03H
    PUSH  04H
    MOV   R2, #0FFH ;中断扫描次数
TURN: MOV R1 , #33H
      MOV R4 , #01H
      MOV R3 , #03H
NEXT_1:
      MOV A, @R1
      MOV B , #10
      DIV AB
      SWAP A
      ORL A, B
      MOV  P0, A
      MOV  P2, R4
      INC R1
      RL  A
      MOV R4  ,A
      LCALL  DE5SM
    DJNZ  R3,  NEXT_1
    DJNZ  R2,  TURN ;反复显示一定时间后返回
    POP  04H
    POP  03H
    POP  02H
    POP  01H
    POP  B
    POP  ACC
    POP  PSW
    RETI

;-----计数中断服务子程序
TIME:
   PUSH  PSW
   PUSH  ACC
   PUSH  B
   PUSH  06H
   MOV  TH0 , #3CH;重装计数
   MOV  TL0 , #0BH;

   DJNZ  20H,  OUT    ;转到中断跳出pop程序
   MOV   20H,  #0AH   ; 重装:100*10=1000
;-----进位程序
   INC SEC
   MOV R6, SEC ;
   CJNE R6, #60, OUT;比较
   MOV SEC , #00  ;

   INC   MIN
   MOV  R6, MIN
   CJNE  R6, #60, OUT
   MOV   MIN ,  #00

   INC  HOUR
   MOV  R6 , HOUR
   CJNE R6 , #25 , OUT
   MOV  HOUR ,#00

   INC  DAY
   MOV  R5, MON
   CJNE  R5, #1,  MON_22;是否1月、不是转2
   MOV   R5, DAY
   CJNE  R5, #32, OUT ; 本月是否益出
   INC  MON
   MOV  DAY,#1
   LJMP OUT

OUT:
   POP  06H
   POP  B
   POP  ACC
   POP  PSW
   RETI

MON_22:
   MOV  R5, MON
   CJNE  R5 , #2 , MON_33;是否2月、不是转3
   MOV  A,  YEAR ;判断是否瑞年
   MOV  B, #4
   DIV   AB
   MOV   A  , B
   JNZ   OUT_1;不是则转(A不为零则转)
   MOV  R5 ,DAY
   CJNE R5,#30, OUT;如是瑞年、判断是否到29
   INC MON
   MOV  DAY ,#1
   LJMP OUT

OUT_1:
   MOV  R5, DAY
   CJNE R5, #29, OUT  ;平年二月判断
   INC  MON
   MOV DAY  , #1
   LJMP OUT
MON_33:
   MOV R5, MON
   CJNE R5, #3 , MON_44
   MOV  R5, DAY
   CJNE R5 , #32, OUT
   INC  MON
   MOV  DAY ,  #1
   LJMP OUT
MON_44:
   MOV R5, MON
   CJNE R5,#4, MON_55
   MOV R5, DAY
   CJNE R5 ,#31,OUT
   INC MON
   MOV DAY , #1
   LJMP OUT
MON_55:
   MOV R5,MON
   CJNE R5,#5, MON_66
   MOV R5,DAY
   CJNE  R5,#32,OUT
   INC MON
   MOV DAY,#1
   LJMP OUT

MON_66:
   MOV R5, MON
   CJNE R5,#6, MON_77
   MOV  R5, DAY
   CJNE R5 ,#31,OUT
   INC MON
   MOV DAY , #1
   LJMP OUT

MON_77:
   MOV R5, MON
   CJNE R5,#7, MON_88
   MOV R5, DAY
   CJNE R5,#32,L1
   INC MON
   MOV DAY , #1
L1:   LJMP OUT
MON_88:
   MOV R5, MON
   CJNE R5,#8, MON_99
   MOV R5, DAY
   CJNE R5 ,#32,L2
   INC MON
   MOV DAY , #1
L2:   LJMP OUT
MON_99:
   MOV  R5, MON
   CJNE R5,#9, MON_00
   MOV  R5,DAY
   CJNE R5 ,#31,L3
   INC MON
   MOV DAY , #1
L3:  LJMP OUT
MON_00:
   MOV R5, MON
   CJNE R5,#10, MON_AA
   MOV R5, DAY
   CJNE R5 ,#32,L4
   INC MON
   MOV DAY , #1
L4:   LJMP OUT
MON_AA:
   MOV  R5, MON
   CJNE R5,#11, MON_BB
   MOV R5,DAY
   CJNE R5,#31,L5
   INC MON
   MOV DAY , #1
L5:   LJMP OUT
MON_BB:
   MOV R5, DAY
   CJNE R5 ,#32,L6
   INC YEAR
   MOV MON, #1
   MOV DAY , #1
L6:LJMP  OUT

;-----校对时间、定时调整中断

CHANGE : PUSH  PSW
     PUSH  ACC
     PUSH  B
     PUSH  00H
     mov p2,#00h

SHOW_1:
     MOV  A , #01H;显示1
     MOV  P0, A
     MOV  P2, #0FFH;三组数码管都显示1
     LCALL  READ  ;调用读p1口键程序
     CJNE A, 01H, SHOW_1;去抖后比较
     LCALL  DE250SM ;  延时250

     CJNE A, #0FBH,ttT1
     LJMP  SB3_1
ttT1: CJNE A, #0FEH,SHOW_1
     AJMP  SHOW_2

;-------二组显示
SHOW_2:
     MOV  A,  #02H; 显示2
     MOV  P0, A
     MOV P2, #0FFH;
     LCALL  READ
     CJNE A, 01H, SHOW_2 ;去抖后比较
     LCALL  DE250SM;  延时250
     CJNE A, #0FBH,T2;不等转去判断此时SB3按了没
     LJMP  SB3_2
 T2: CJNE A, #0FEH, SHOW_2
     AJMP  SHOW_3
;_------三组显示
SHOW_3:
     MOV A,  #03H;  显示3
     MOV P0, A
     MOV P2, #0FFH;位码
     LCALL  READ
     CJNE A, 01H,SHOW_3;去抖后比较
     LCALL DE250SM;延时250
     CJNE A, #0FBH, T3;不等转去判断此时SB3按了没
     LJMP  SB3_3
T3:  CJNE A, #0FEH, SHOW_3
     AJMP SHOW_4;------即时年单元调时、显示
SHOW_4:
     MOV  A , YEAR  ;调出年单元
     MOV  B, #10    ;BCD转换
     DIV AB
     SWAP A
     ORL A, B
     MOV P0, A ;
     MOV P2, #01H;
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H, SHOW_4 ;去抖
     CJNE A, #0FEH, KEY2_1 ;SB2 转年调整
     AJMP  MON_CH   ;SB1往下调月单元
KEY2_1:CJNE A, #0FDH, SHOW_4
     LCALL  YEAR_AD ; 调用年调整
     AJMP SHOW_4 ;

MON_CH: MOV  A , MON  ; 月单元调整
     MOV  B, #10
     DIV AB
     SWAP A
     ORL A, B
     MOV P0, A ;
     MOV P2, #02H;
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H, MON_CH ;去抖
     CJNE A, #0FEH, KEY2_2 ;SB2 转月调整
     LJMP  DAY_CH   ;SB1往下调日单元
KEY2_2:CJNE A, #0FDH, MON_CH
     LCALL  MON_AD ; 调用月调整
     LJMP MON_CH ;

DAY_CH:
     MOV  A , DAY  ; 日单元调整
     MOV  B, #10
     DIV AB
     SWAP A
     ORL A, B
     MOV P0, A ;
     MOV P2, #04H;
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H, DAY_CH ;去抖
     CJNE A, #0FEH, KEY2_3 ;SB2 转日调整
     LJMP  HOUR_CH   ;SB1往下调时单元
KEY2_3:CJNE A, #0FDH, DAY_CH
     LCALL  DAY_AD ; 调用日调整
     LJMP DAY_CH

HOUR_CH:
     MOV  A , HOUR  ; 时单元调整
     MOV  B, #10
     DIV AB
     SWAP A
     ORL A, B
     MOV P0, A ;
     MOV P2, #01H;
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H, HOUR_CH ;去抖
     CJNE A, #0FEH, KEY2_4 ;SB2 转时调整
     AJMP  MIN_CH   ;SB1往下调分单元
KEY2_4:CJNE A, #0FDH, HOUR_CH
     LCALL  HOUR_AD ; 调用时调整
     AJMP HOUR_CH ;

MIN_CH:
     MOV  A , MIN ; 分单元调整
     MOV  B, #10
     DIV AB
     SWAP A
     ORL A, B
     MOV P0, A ;
     MOV P2, #02H;
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H, MIN_CH ;去抖
     CJNE A, #0FEH, KEY2_5 ;SB2 转分调整
     AJMP  SEC_CH   ;SB1往下调秒单元
KEY2_5:CJNE A, #0FDH,MIN_CH
     LCALL  MIN_AD ; 调用分调整
     LJMP MIN_CH ;

SEC_CH:
     MOV  A , SEC  ; 秒单元调整
     MOV  B, #10
     DIV AB
     SWAP A
     ORL A, B
     MOV P0, A ;
     MOV P2, #04H;
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H, SEC_CH ;去抖
     CJNE A, #0FEH, KEY2_6 ;SB2 秒调整
     LJMP OUT_A   ;SB1跳出
KEY2_6: CJNE  A, #0FDH, SEC_CH
     CLR  SEC ; 归零
     LJMP SEC_CH  ;


;-------SB2\定时器年单元加1子程序
SB3_2: LJMP  SHOW_2  ;二路没编返回
SB3_3: LJMP  SHOW_3   ;三路没编返回
SB3_1:
     MOV A , YEAR_1  ;   调时年单元
     MOV B ,#10
     DIV AB
     SWAP A
     ORL A,B
     MOV  P0, A
     MOV  P2, #01H
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H, SB3_1
     CJNE A, #0FBH, KEY2_7 ;SB2 转年调整
     LJMP MON_111  ;SB1往下调月单元
KEY2_7:CJNE A, #0FDH, SB3_1
     INC YEAR_1  ; 1路年单元加1
     MOV R5,YEAR_1
     CJNE R5,#09,SB3_1 ;益出
     MOV YEAR_1, #00H
     AJMP SB3_1 ;

;-------月单元加1子程序
MON_111:
     MOV A , MON_1 ;   调时月单元显示
     MOV B ,#10
     DIV AB
     SWAP A
     ORL A,B
     MOV  P0, A
     MOV  P2, #02H
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H, MON_111
     CJNE A, #0FBH, KEY2_8 ;SB2 转月调整
     LJMP  DAY_111
KEY2_8:
      CJNE A,#0FDH,MON_111
     INC MON_1  ;1路月单元加1
     MOV R5,MON_1
     CJNE R5,#13,MON_111;益出
     MOV MON_1, #01H
     AJMP MON_111 ; 转到月显

;_------日单元加1子程序
DAY_111:
     MOV A , DAY_1 ;   调时日单元显示提示
     MOV B ,#10
     DIV AB
     SWAP A
     ORL A,B
     MOV  P0, A
     MOV  P2, #04H
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H,DAY_111
     CJNE A, #0FBH, KEY2_9  ;SB2 转日调整
     LJMP  HOUR_111
KEY2_9: CJNE A,#0FDH,DAY_111
     INC DAY_1  ;1组日单元加1
     MOV R5, DAY_1
     CJNE R5,#32,DAY_111;益出
     MOV DAY_1, #01H
     AJMP DAY_111 ; 转到日显

;-------SB2时单元加1子程序
HOUR_111:
     MOV A , HOUR_1 ;   调时时单元显示提示
     MOV B ,#10
     DIV AB
     SWAP A
     ORL A,B
     MOV  P0, A
     MOV  P2, #01H
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H,HOUR_111
     CJNE A, #0FBH, KEY2_10 ; SB2 转时调整
     LJMP MIN_111
KEY2_10:CJNE A,#0FDH,HOUR_111
     INC HOUR_1
     MOV  R5,HOUR_1
     CJNE R5,#24,HOUR_111;益出
     MOV HOUR_1, #00H
     AJMP HOUR_111 ; 转到时显

;-------分单元加1子程序
MIN_111:
     MOV A , MIN_1 ;   调时分单元、并显示提示
     MOV B ,#10
     DIV AB
     SWAP A
     ORL A,B
     MOV  P0, A
     MOV  P2, #02H
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H,MIN_111
     CJNE A, #0FBH, KEY2_11 ;SB2 转分调整
     AJMP  OFF_CH  ;SB3往下调定时:关单元
KEY2_11: CJNE A, #0FDH, MIN_111
     INC MIN_1  ;1路分单元加1
     MOV  R5, MIN_1
     CJNE R5,#60,MIN_111;益处
     MOV MIN_1, #00H
     AJMP MIN_111 ; 转到分显
年单元调整
OFF_CH: MOV A , YEAR_11  ;   调时年单元
     MOV B ,#10
     DIV AB
     SWAP A
     ORL A,B
     MOV  P0, A
     MOV  P2, #01H
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H, OFF_CH
     CJNE A, #0FBH, KEY2_F7 ;SB2 转年调整
     LJMP MON_OFF  ;SB1往下调月单元
KEY2_F7:CJNE A, #0FDH, OFF_CH
     INC YEAR_11  ; 1路年单元加1
     MOV R5,YEAR_11
     CJNE R5,#09,OFF_CH ;益出
     MOV YEAR_11, #00H
     AJMP OFF_CH ;

;-------月单元加1子程序
MON_OFF:
     MOV A , MON_11 ;   调时月单元显示
     MOV B ,#10
     DIV AB
     SWAP A
     ORL A,B
     MOV  P0, A
     MOV  P2, #02H
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H, MON_OFF
     CJNE A, #0FBH, KEY2_F8 ;SB2 转月调整
     LJMP  DAY_OFF
KEY2_F8:
      CJNE A,#0FDH,MON_OFF
     INC MON_11  ;1路月单元加1
     MOV R5,MON_11
     CJNE R5,#13,MON_OFF;益出
     MOV MON_11, #01H
     AJMP MON_OFF ; 转到月显

;_------日单元加1子程序
DAY_OFF:
     MOV A , DAY_11 ;   调时日单元显示提示
     MOV B ,#10
     DIV AB
     SWAP A
     ORL A,B
     MOV  P0, A
     MOV  P2, #04H
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H,DAY_OFF
     CJNE A, #0FBH, KEY2_F9  ;SB2 转日调整
     LJMP  HOUR_OFF
KEY2_F9: CJNE A,#0FDH,DAY_OFF
     INC DAY_11  ;1组日单元加1
     MOV R5, DAY_11
     CJNE R5,#32,DAY_OFF;益出
     MOV DAY_11, #01H
     AJMP DAY_OFF ; 转到日显

;-------SB2时单元加1子程序
HOUR_OFF:
     MOV A , HOUR_11 ;   调时时单元显示提示
     MOV B ,#10
     DIV AB
     SWAP A
     ORL A,B
     MOV  P0, A
     MOV  P2, #01H
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H,HOUR_OFF
     CJNE A, #0FBH, KEY2_F10 ; SB2 转时调整
     LJMP MIN_OFF
KEY2_F10:CJNE A,#0FDH,HOUR_OFF
     INC HOUR_11
     MOV  R5,HOUR_11
     CJNE R5,#24,HOUR_OFF;益出
     MOV HOUR_11, #00H
     AJMP HOUR_OFF ; 转到时显

;-------分单元加1子程序
MIN_OFF:
     MOV A , MIN_11 ;   调时分单元、并显示提示
     MOV B ,#10
     DIV AB
     SWAP A
     ORL A,B
     MOV  P0, A
     MOV  P2, #02H
     LCALL READ
     LCALL DE250SM
     CJNE A, 01H,MIN_OFF
     CJNE A, #0FBH, KEY2_F11 ;SB2 转分调整
     LJMP  ON_1   ;SB3往下调定时:开与关
KEY2_F11: CJNE A, #0FDH, MIN_OFF
     INC MIN_11  ;1路分单元加1
     MOV  R5, MIN_11
     CJNE R5,#60,MIN_OFF;益处
     MOV  MIN_11, #00H
     LJMP MIN_OFF ; 转到分显
;-------开、关定时
ON_1:CJNE A, #0FBH, MIN_OFF
  K1:  MOV  A, #88H
     MOV  R7, A
     MOV  P0, A
     MOV P2, #0FFH;三组都显示开
     LCALL  READ
     LCALL  DE250SM
     CJNE A, 01H, ON_1;去抖后比较
     CJNE A, #0FBH,KEY2_12 ;SB2 转关
     LJMP  OUT_A  ;SB3调出、处于开状态
KEY2_12: CJNE  A, #0FDH, K1
 k2: MOV  A,  #00H; 显示0
     MOV  R7, A
     MOV  P0, A
     MOV P2, #0FFH;
     LCALL  READ
     LCALL  DE250SM
     CJNE A, 01H, K2;去抖后比较
     CJNE A, #0FBH,KEY2_13 ;SB2 转开
     LJMP OUT_A ;SB3调出、处关状态
KEY2_13:
     CJNE  A, #0FDH, K2  ;  比较按了没
     LJMP  K1  ; 按了SB2、转开

OUT_A:
      POP   00H
      POP   B
      POP   ACC
      POP   PSW
     RETI

;_------读取按键程序
READ:MOV  A , P1;读取按键
     MOV R1, A
     LCALL DE10MS
     MOV  A, P1
     RET
;_----延时程序
DE5SM:
      PUSH 01H
      MOV R1, #0FFH
      DJNZ  R1,$
      POP 01H
      RET

DE10MS: PUSH  04H
       PUSH  05H
        MOV R4, #0AH
   Dl1: MOV R5, #0FFH
   dl2: DJNZ  R5,$
        DJNZ  R4,dl1
      POP  05H
      POP  04H
     RET

DE250SM:PUSH  02H
        PUSH  00H
        MOV   R0,  #0FFH
    DEL:MOV   R2, #0FFH
        DJNZ R2,$
        DJNZ  R0, DEL
        POP   00H
        POP   02H
        RET
;_---调整时间进位程序
MIN_AD:
   INC   MIN
   MOV  R6, MIN
   CJNE  R6, #60, OU1
   MOV   MIN ,  #00
OU1:    RET

HOUR_AD:
   INC  HOUR
   MOV  R6 , HOUR
   CJNE R6 , #25 , OU2
   MOV  HOUR ,#00
OU2:  RET

DAY_AD:
   INC  DAY
   MOV R6, DAY
   CJNE  R6 , #32, OU3 ; 是否益出
   MOV  DAY ,#01H
OU3:   RET

MON_AD:
   INC   MON
   MOV R6, MON
   CJNE  R6, #13, OU4 ; 是否益出
   MOV  MON ,#01H
OU4:   RET

YEAR_AD:
   INC  YEAR
   MOV R6, YEAR
   CJNE  R6, #09, OU5;是否益出
   MOV  YEAR ,#00H
OU5:   RET
   END

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
贤 [ 匿名]  2008-06-16 17:23:39 

为什么没有硬件电路图

推荐文章
最近访客