专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51单片机可调数码钟

作者:佚名   来源:本站原创   点击数:  更新时间:2008年10月12日   【字体:


51单片机学习可调数码钟!
/******************************************************************
** 文件名:51学习可调数码钟!
** 创建人: 谢军洋
** 日 期: 2008/01/22
** 修改人: 刘力
** 日 期: 2008/01/25
** Copyright (c)  : http://www.51hei.com会员原创作品
**
** 版 本: 1.2
**------------------------------------------------------------------
**  CPU:MCS-51
** 语言:汇编
** Fosc=12M

<单片机可调数码钟仿真图>
********************************************************************/
/*---------R0自动显示年月日时长。  (单位:s)*/
/*---------R1自动显示年时分秒时长。(单位:s)*/
/*---------R6移位标志*/
M  BIT P1.0  //主键
U  BIT P1.1  //加1键
D  BIT P1.2  //减1键
O  BIT P1.6  //OK键
R  BIT P1.5  //移位键
SS BIT 00H      // M键按下标志
SSSS BIT 01H //闪烁标志
SECOND EQU 40H  //秒
MINUTE EQU 41H  //分
HOUR   EQU 42H  //小时
TIANSHU EQU 43H  //天数
TIME   EQU 44H  //天
YUE  EQU 45H  //月
NIAN EQU 46H   //年
SSM  EQU 47H  //闪烁灭记数单元
SSK  EQU 48H  //闪烁开记数单元
ORG 0000H
SJMP START  //转到主程序
ORG 000BH    //T0中断
TIME0:PUSH ACC
      MOV TL0,0BFH
   MOV TH0,03CH
   INC R4
   CJNE R4,#122,CHU
   MOV R4,#00
   INC SECOND
   INC R0
   INC R1
   MOV R3,SECOND
   CJNE R0,#4,WU
   CLR F0
   MOV R0,#00
   WU:CJNE R1,#10,WU1
      MOV R1,#00
   SETB F0
  WU1:CJNE R3,#60,CHU
   MOV SECOND,#00
   INC MINUTE
   MOV R3,MINUTE
   CJNE R3,#60,CHU
   MOV MINUTE,#00
   INC HOUR
   MOV R3,HOUR
   CJNE R3,#24,CHU
   MOV HOUR,#00
   INC TIME
   MOV A,TIME
   LCALL TIAN  //天数计算
   CJNE A,TIANSHU,CHU
   MOV TIME,#00
   INC YUE
   MOV R3,YUE  
   CJNE R3,#12,CHU
   MOV YUE,#01
   INC NIAN
   MOV R3,NIAN
   CJNE R3,#100,CHU
   MOV NIAN,#00
CHU: POP ACC
  RETI
//----------------------------主程序
START:
      MOV TMOD,01H
   MOV TL0,0BFH
   MOV TH0,03CH  //可以用kile仿真取值
   SETB TR0   //开T0
   SETB EA
   SETB ET0   //允许T0中断
   CLR F0   //F0作TIME与年月日转换显示(F0=0是显示TIME,F0=1是显示年月日)
   MOV SECOND,#00 //秒
   MOV MINUTE,#00 //分
   MOV HOUR,#12  //小时
   MOV TIME,#7    //日期
   MOV YUE,#8     //月份
   MOV NIAN,#7    //年
ANJIANSAOMIAO:
        JNB M,MAIN     //主键输入
        LCALL SHUMASAOMIAO  //数码管动态扫描
        LJMP ANJIANSAOMIAO  //按键扫描

MAIN:
     LCALL DELAY10MS  //按键去抖
  JB M,ANJIANSAOMIAO  //如M=1,是抖动返回
  LCALL KEY_0
  SETB SS
  CLR TR0
  CLR F0
WUHUI:
      LCALL SHUMASAOMIAO   //数码管动态扫描
   JNB O,OK      //确定键
   JNB U,JIA      //加一键
   JNB D,J1     //减一键
   JNB R,YIWEI     //移位键
   SJMP WUHUI
J1:LJMP JIAN     //射程太远只好加长转移
  
YIWEI:       //移位处理子程序
      LCALL DELAY10MS
   JB R,WUHUI
   LCALL KEY_1
  // JNB R,$  
   INC R6
  XIA:CJNE R6,#3,XIA1
      //LCALL SHUMASAOMIAO//------
      SETB F0   //移位到第三位时显示年月日(手动)  
XIA1: CJNE R6,#6,HUI
   MOV R6,#00H
   CLR F0   //到第6位时转显示时分秒   (手动)
  HUI:LJMP WUHUI  
OK:        //OK键处理子程序
   LCALL DELAY10MS
   JB O,WUHUI     //去抖
   SETB TR0     //开定时器
   MOV R6,#00    //OK键按下后重新开始移位
   CLR SS
   LJMP ANJIANSAOMIAO    
JIA:     //加一处理子程序
    LCALL DELAY10MS
JB U,WUHUI
LCALL KEY_2
CJNE R6,#0,MINUTEJIA
MOV R3,HOUR     //R5作LED0~3的中转
CJNE R3,#24,I0    //到十不变返回
MOV HOUR,#00
I0:INC HOUR    //没有到小时加一
MINUTEJIA:CJNE R6,#1,SECONDJIA
         MOV R3,MINUTE
         CJNE R3,#60,I1
   MOV MINUTE,#00
      I1:INC MINUTE
SECONDJIA:CJNE R6,#2,NIANJIA
         MOV R3,SECOND
         CJNE R3,#60,I2
   MOV SECOND,#00
      I2:INC SECOND
NIANJIA:CJNE R6,#3,YUEJIA
          MOV R3,NIAN
    CJNE R3,#100,I3
    MOV NIAN,#01
       I3:INC NIAN
    
YUEJIA:CJNE R6,#4,TIMEJIA    
          MOV R3,YUE
    CJNE R3,#12,I4
    MOV YUE,#01
    I4:INC YUE
    
TIMEJIA:CJNE R6,#5,GO
          MOV A,TIME
    LCALL TIAN   //根据月份判天数
    CJNE A,TIANSHU,I5
    MOV TIME,#00
    I5:INC TIME                              
       GO:LJMP WUHUI  
JIAN:     //减一处理子程序
  LCALL DELAY10MS
//  JB D,WUHUI    // 射程太远,不要没有关系
  LCALL KEY_3
  CJNE R6,#0,MINUTEJIAN
  MOV R3,HOUR
  CJNE R3,#0,D0
  MOV HOUR,#24
  D0:DEC HOUR
MINUTEJIAN:CJNE R6,#1,SECONDJIAN
          MOV R3,MINUTE
    CJNE R3,#0,D1
    MOV MINUTE,#60
       D1:DEC MINUTE
SECONDJIAN:CJNE R6,#2,NIANJIAN
          MOV R3,SECOND
    CJNE R3,#0,D2
    MOV SECOND,#60
       D2:DEC SECOND
NIANJIAN:CJNE R6,#3,YUEJIAN
           MOV R3,NIAN
     CJNE R3,#0,D3
     MOV NIAN,#99
        D3:DEC NIAN
  
YUEJIAN:CJNE R6,#4,TIMEJIAN
          MOV R3,YUE
    CJNE R3,#00,D4
    MOV YUE,#12
    D4:DEC YUE
    
TIMEJIAN:CJNE R6,#5,GO1
          MOV R3,TIME
    CJNE R3,#01,D5
    LCALL TIAN    //根据月份判天数
    MOV TIME,TIANSHU
    D5:DEC TIME          
       GO1:LJMP WUHUI
//--------------显示
//--------------数码管动态扫描子程序
SHUMASAOMIAO:
             MOV DPTR,#TABLE
    JNB SS,ZZ
    INC SSK
    MOV R3,SSK
    CJNE R3,#250,YY
    CLR SSK
    CLR SSSS
    INC SSM
    YY:
       MOV R3,SSM
       CJNE R3,#2,ZZ
    MOV SSM,#00
    MOV SSK,#00
    SETB SSSS    
      
          ZZ:MOV A,HOUR
    JNB F0,YUAN  //F0为1时显示年,为0时显示小时
    MOV A,NIAN
//--------------///闪烁程序^ SSM -闪烁灭。SSK-闪烁开。

    YUAN:
             MOV B,#10
    DIV AB
          MOVC A,@A+DPTR
             JNB SS,NEXT0   //--
    CJNE R6,#0,NEX0  //--
    SJMP XX0    //--
  NEX0: CJNE R6,#3,NEXT0  //--
  XX0:  JNB SSSS,NEXT0  //--
    MOV A,#00   //--闪烁程序
   NEXT0: MOV P0,A
    CLR P3.0
    LCALL DELAY1MS
    SETB P3.0
    
    MOV A,B
          MOVC A,@A+DPTR
    JNB SS,NEXT  //--
    CJNE R6,#0,NEX
    SJMP XX
  NEX: CJNE R6,#3,NEXT
  XX:  JNB SSSS,NEXT
    MOV A,#00   //-- 闪烁程序
  NEXT:MOV P0,A
    CLR P3.1
    LCALL DELAY1MS
    SETB P3.1
    
    MOV A,#10   //显示‘-’
    MOVC A,@A+DPTR
    MOV P0,A
    CLR P3.2
    LCALL DELAY1MS
    SETB P3.2
    
    MOV A,MINUTE
    JNB F0,YUAN1 ////F0为1时显示月,为0时显示分
    MOV A,YUE
    YUAN1:MOV B,#10
    DIV AB
          MOVC A,@A+DPTR
             JNB SS,NEXT2   //--
    CJNE R6,#1,NEX2  //--
    SJMP XX2    //--
  NEX2: CJNE R6,#4,NEXT2  //--
  XX2:  JNB SSSS,NEXT2  //--
    MOV A,#00   //--闪烁程序
    NEXT2: MOV P0,A
    CLR P3.3
    LCALL DELAY1MS
    SETB P3.3
    MOV A,B
          MOVC A,@A+DPTR
    JNB SS,NEXT1  ///--
    CJNE R6,#1,NEX1  //--
    SJMP XX1    //--
  NEX1: CJNE R6,#4,NEXT1 //--
  XX1: JNB SSSS,NEXT1    //--
       MOV A,#00     //-- --闪烁程序
  NEXT1:MOV P0,A
    CLR P3.4
    LCALL DELAY1MS
    SETB P3.4
    
    MOV A,#10    //显示‘-’
    MOVC A,@A+DPTR
             MOV P0,A
    CLR P3.5
    LCALL DELAY1MS
    SETB P3.5
    
    MOV A,SECOND
    JNB F0,YUAN2 ////F0为1时显示日,为0时显示秒
    MOV A,TIME
    YUAN2:MOV B,#10
    DIV AB
          MOVC A,@A+DPTR
             JNB SS,NEXT4   //---
    CJNE R6,#2,NEX4  //----
    SJMP XX4    //---
  NEX4: CJNE R6,#5,NEXT4//---
  XX4: JNB SSSS,NEXT4  //--
       MOV A,#00  //--闪烁程序
    NEXT4:MOV P0,A
    CLR P3.6
    LCALL DELAY1MS
    SETB P3.6
    
    MOV A,B
          MOVC A,@A+DPTR
    JNB SS,NEXT5
    CJNE R6,#2,NEX5
    SJMP XX5
  NEX5: CJNE R6,#5,NEXT5
  XX5: JNB SSSS,NEXT5
       MOV A,#00
  NEXT5: MOV P0,A
    CLR P3.7
    LCALL DELAY1MS
    SETB P3.7
     RET
//-------------------根据月份查天数
TIAN:MOV R3,YUE
     CJNE R3,#1,YUE2
  MOV TIANSHU,#31
YUE2:CJNE R3,#2,YUE3
     MOV TIANSHU,#28
YUE3:CJNE R3,#3,YUE4
     MOV TIANSHU,#31
YUE4:CJNE R3,#4,YUE5
     MOV TIANSHU,#30          
YUE5:CJNE R3,#5,YUE6
     MOV TIANSHU,#31
YUE6:CJNE R3,#6,YUE7
     MOV TIANSHU,#30
YUE7:CJNE R3,#7,YUE8
     MOV TIANSHU,#31
YUE8:CJNE R3,#8,YUE9
     MOV TIANSHU,#31
YUE9:CJNE R3,#9,YUE10
     MOV TIANSHU,#30
YUE10:CJNE R3,#10,YUE11
      MOV TIANSHU,#31
YUE11:CJNE R3,#11,YUE12
      MOV TIANSHU,#30
YUE12:CJNE R3,#12,OVER
      MOV TIANSHU,#31
OVER:RET
//----------------------
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H,00H  //0~9-
KEY_0:JB R,KEY_0CHU
      LCALL SHUMASAOMIAO
      SJMP KEY_0     //移位等待 (用此等待可以去按键按下时黑屏)
KEY_0CHU:RET
KEY_1:JB R,KEY_1CHU
      LCALL SHUMASAOMIAO
      SJMP KEY_1     //移位等待
KEY_1CHU:RET
KEY_2:JB U,KEY_2CHU
      LCALL SHUMASAOMIAO
      SJMP KEY_2     //加1等待
KEY_2CHU:RET
KEY_3:JB D,KEY_3CHU
      LCALL SHUMASAOMIAO
      SJMP KEY_3     //减1等待
KEY_3CHU:RET
DELAY10MS:MOV R7,#1     //延时10MS子程序
       L1:NOP
    DJNZ R7,L1
DELAY1MS:RET          
END

此可调数码钟用PS仿真已经成功,第一屏显示时间第2屏显示年月
 
 

关闭窗口