原创 多功能51单片机学习板③-数码电子钟

2007-11-9 13:58 2147 7 12 分类: MCU/ 嵌入式

点击看大图


;使用LED1SCH实验板制作数码电子钟


DISP01 EQU 30H  ;秒个位
DISP02 EQU 31H  ;秒十位
DISP03 EQU 32H  ;分个位
DISP04 EQU 33H  ;分十位
DISP05 EQU 34H  ;秒信号
DISP06 EQU 35H  ;秒信号
DISP07 EQU 36H  ;时个位
DISP08 EQU 37H  ;时十位
;------------------------------------------
MIAO EQU 38H  ;秒寄存器
FEN EQU 39H  ;分寄存器
SE EQU 3AH  ;时寄存器
;------------------------------------------
K_MEN EQU 3BH
KEU_UP EQU 3CH
KEY_DO EQU 3DH
KEYSYS EQU 3EH  ;秒钟
KEYST EQU 3FH
;------------------------------------------
MIAO_A EQU 40H  ;秒个位
MIAO_B EQU 41H  ;秒十位
FEN_A EQU 42H  ;分个位
FEN_B EQU 43H  ;分十位
SE_A EQU 44H  ;时个位
SE_B EQU 45H  ;时十位
DISP7 EQU 45H  ;
DISP8 EQU 47H  ;
;------------------------------------------
D_FEN  EQU 48H  ;分定时寄存器
D_SE  EQU 49H  ;时定时寄存器
D_MIAO  EQU 4AH  ;分定寄存器
D_MIAO_A EQU 4BH  ;时间寄存器
D_MIAO_B EQU 5CH
;------------------------------------------
S_DATA EQU 4CH  ;日历寄存器
NIAN EQU 4DH  ;年寄存器
YE EQU 4EH  ;月寄存器
RE EQU 4FH  ;日寄存器
;-------------------------------------------
NIAN_A EQU 50H  ;年个位
NIAN_B EQU 51H  ;年十位
NIAN_C EQU 52H  ;年百位
NIAN_D EQU 53H  ;年千位
YE_A EQU 54H  ;月个位
YE_B EQU 55H  ;月十位
RE_A EQU 56H  ;日个位
RE_B EQU 57H  ;日十位
;-------------------------------------------
D_FEN_A EQU 58H  ;定时分个位
D_FEN_B EQU 59H  ;定时分十位
D_SE_A EQU 5AH  ;定时时个位
D_SE_B EQU 5BH  ;定时时十位
;-------------------------------------------
BITCNT  EQU  5CH  ;送数8位
SUBADR EQU  5EH  ;取存储地址
SDA     BIT     P3.7
SCL     BIT     P3.6
;-------------------------------------------
 ORG  0000H
 LJMP  MAIN
 ORG  000BH   ;定时器0的中断向量地址
 LJMP  TIME0   ;跳转到真正的定时器程序处
 ORG 0030H
MAIN:
 MOV R0,#7FH
MCR:
 MOV @R0,#00H
 DJNZ R0,MCR
 CLR K_MEN
 CLR P3.3
 JNB P1.0,SS
 CLR P1.0
 LCALL DISP1
SS:
 MOV 60H,#00  ;软件计数器预清0
 MOV  TMOD,#00000001B ;定时/计数器0工作于方式1
 MOV  TH0,#3CH
 MOV  TL0,#0B0H
 SETB  EA   ;开总中断允许
 SETB  ET0   ;开定时/计数器0允许
 SETB  TR0   ;定时/计数器0开始运行
;------------------------------------------
;**********************************************
;键码测试,在P1口LED上显示
;*************************************
KEY:
 MOV A,#00H
 MOV B,#00H
 MOV  P0,#0FH   ;P0=0000 1111 用反转法查键
 MOV  A,P0   ;A =0000 1111
 ANL  A,#0FH   ;A =0000 1111
 MOV  B,A   ;B =0000 1111
 MOV  P0,#0F0H  ;P0=1111 0000
 MOV  A,P0   ;A =1111 0000
 ANL  A,#0F0H   ;A =1111 0000
 ORL  A,B   ;A =1111 1111
 CJNE A,#0FFH,SE_KEY
 LCALL  READ_24C02
 LJMP KEY
;*************************************************
;时间调节
;*************************************************
SE_KEY:
 CJNE A,#77H,K2  ;小时加
 INC SE
 MOV A,SE
 CJNE A,#24,KS1
 MOV SE,#0
KS1:
 LCALL DELAY
 LCALL DISP
 LJMP KS
K2:
 CJNE A,#0B7H,K3  ;小时减
 DEC SE
 MOV A,SE
 CJNE A,#0,KS2
 MOV SE,#24
KS2:
 LCALL DELAY
 LCALL DISP
 LJMP KS
K3:
 CJNE A,#7BH,K4  ;分钟加
 INC FEN
 MOV A,FEN
 CJNE A,#60,KS3
 MOV FEN,#0
KS3:
 LCALL DELAY
 LCALL DISP
 LJMP KS
K4:
 CJNE A,#0BBH,KS5  ;分钟减
 DEC FEN
 MOV A,FEN
 CJNE A,#0,KS4
 MOV FEN,#60
KS4:
 LCALL DELAY
 LCALL DISP
KS5:
 CJNE A,#0E7H,KS
 CLR K_MEN
 
 LCALL DELAY
 LCALL DELAY
 LCALL DISP
KS:
 LJMP KEY
;**********************************************
TIME0:     ;定时器0的中断处理程序
; PUSH  ACC
; PUSH  PSW   ;将PSW和ACC推入堆栈保护
 INC  60H
 INC 61H
 MOV  A,60H
 CJNE  A,#20,T_NEXT  ;30H单元中的值到了20了吗?
T_L1:
 CLR KEYSYS
 LCALL DIS_TIME   ;到了,取反P10
 MOV  60H,#0   ;清软件计数器
T_NEXT:
 MOV A,61H
 CJNE A,#10,T_RET
 SETB KEYSYS
 MOV 61H,#0
 LCALL DISP
T_RET:
 MOV  TH0,#3CH
 MOV  TL0,#0B0H  ;重置定时常数
; POP  PSW
; POP  ACC
 RETI
;********************************************
DIS_TIME:
 INC MIAO
 MOV A,MIAO
 CJNE A,#60,TIME_RET
 MOV MIAO,#00


 INC FEN
 CPL P1.7
 LCALL ADDR24
 CPL P1.7
 MOV A,FEN
 CJNE A,#60,TIME_RET
 MOV FEN,#00


 INC SE
 MOV A,SE
 CJNE A,#24,TIME_RET
 MOV SE,#00
TIME_RET:
 LCALL DISP
 MOV A,SE
 CJNE A,#0,LRET
 MOV A,FEN
 CJNE A,#01,LRET
 MOV A,MIAO
 CJNE A,#0,LRET
 PUSH SE
 PUSH FEN
 PUSH MIAO
 LCALL MUSIC
 CLR P3.3
 POP MIAO
 POP FEN
 POP SE
LRET:
 RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
DISP1:
 CLR P1.0
 MOV MIAO,#00
 MOV FEN,#00
 MOV SE,#00
DISP:
 MOV A,MIAO  ;秒----------
 MOV B,#10
 DIV AB
 MOV MIAO_B,A ;秒十位
 MOV MIAO_A,B ;秒个位


 MOV A,MIAO_A ;秒个位
 MOV R0,#DISP01
 LCALL DISNUMB


 MOV A,MIAO_B ;秒十位
 MOV R0,#DISP02
 LCALL DISNUMA
;-------------------------------------------
 MOV A,FEN  ;秒----------
 MOV B,#10
 DIV AB
 MOV FEN_B,A  ;秒十位
 MOV FEN_A,B  ;秒个位


 MOV A,FEN_A  ;秒个位
 MOV R0,#DISP03
 LCALL DISNUMB


 MOV A,FEN_B  ;秒十位
 MOV R0,#DISP04
 LCALL DISNUMA
;-------------------------------------------
A1:
 JNB KEYSYS,A2
 MOV R0,#DISP05 ;-
 MOV @R0,#11111111B


 MOV R0,#DISP06 ;-
 MOV @R0,#11111111B
 LJMP A3
;-------------------------------------------
A2:
 MOV R0,#DISP05 ;-
 MOV @R0,#11111110B


 MOV R0,#DISP06 ;-
 MOV @R0,#11110111B
;-------------------------------------------
A3:
 MOV A,SE  ;时----------
 MOV B,#10
 DIV AB
 MOV SE_B,A  ;时十位
 MOV SE_A,B  ;时个位


 MOV A,SE_A  ;时个位
 MOV R0,#DISP07
 LCALL DISNUMB


 MOV A,SE_B  ;时十位
 MOV R0,#DISP08
 LCALL DISNUMA
;**********************************************
;发送子程序
;**********************************************
LOOP_DISP:
        MOV     R2,#8          ;2个8字显示
        MOV     R0,#DISP01      ;缓冲区首址入R0
        MOV     SCON,#00H       ;UART方式0设定
SOUT:   MOV     A,@R0           ;发送数据入A中
        CLR     TI              ;发送结束标志清零
        MOV     SBUF,A          ;启动发送
WAIO:   JNB     TI,WAIO         ;发送等等
        INC     R0              ;指向下一个发送数据地址
        DJNZ    R2,SOUT         ;N个字节发送完未完转SOUT
DISRET:
        RET
;============================
ADDR24:
 MOV A,MIAO
 MOV R7,A
 LCALL WRITE_24C02
 INC SUBADR
 MOV A,FEN
 MOV R7,A
 LCALL WRITE_24C02
 INC SUBADR
 MOV A,SE
 MOV R7,A
 LCALL WRITE_24C02
 INC SUBADR
 RET
;============================
WRITE_24C02:
        ACALL  START      ;发送IC总线起始条件
        MOV A,#0A0H       ;24C02总线地址
        ACALL  ONETBYTE    ;发送24C02器件总线地址
        JB  F0,SEND  ;出错返回
        MOV  A,SUBADR        ;取存储地址
        ACALL  ONETBYTE
        JB  F0,SEND
        MOV  A,R7
        ACALL  ONETBYTE      ;发送一次数据
        JB  F0,SEND   ;出错返回
        ACALL  STOP            ;发送IC总线停止条件
DELAY10:                        ;延时10MS等待数据写完
        MOV  44H,30H
D1:
 MOV  45H,#34H
     DJNZ  45H,$
     DJNZ  44H,D1
SEND:
 RET
;=======================================
READ_24C02:                      ;读24C02
        ACALL  START            ;发送IC总线起始条件
        MOV  A,#0A0H
        ACALL  ONETBYTE         ;24C02总线地址
        JB  F0,RCVRETURN     ;出错返回
        MOV  A,SUBADR         ;取存储地址
        ACALL  ONETBYTE         ;发送24C02器件总线地址
        JB  F0,SEND    ;出错返回
        ACALL  START            ;发送IC总线重复起始条件
        MOV  A,#0A1H          ;24C02总线地址
        SETB  ACC.0            ;取总线读操作数
        ACALL  ONETBYTE         ;发送被控制总线地址
        JB  F0,RCVRETURN     ;出错返回
        ACALL  RCVBYTE          ;接受数据
RCVRETURN:
 RET
;=========================================
START:
      SETB  SDA              ;发送起始条件的数据信号
      NOP
      NOP
      NOP
      SETB  SCL              ;发送起始条件的时钟信号
      NOP                      ;起始条件建立时间大于4.7s
      NOP
      NOP
      CLR  SDA              ;发送起始信号
      NOP                      ;起始条件锁定时间大于4s
      NOP
      NOP
      CLR  SCL              ;钳住IC总线准备发送或接受数据
      RET
;==================================
STOP:
      CLR  SDA              ;发送停止条件的数据信号
      NOP
      NOP
      NOP
      SETB  SCL              ;发送停止条件的时钟信号
      NOP                      ;起始条件建立时间大于4s
      NOP
      NOP
      SETB  SDA              ;发送IC总线停止信号
      NOP
      NOP
      NOP
     NOP
      RET
;===============================
ONETBYTE:                         ;送数8位;发送24C02器件总线地址
        MOV  BITCNT,#08H
SENTB:
       RLC  A                 ;要发送的数据左移,发送入位C
       MOV  SDA,C
       NOP
  NOP
       NOP
       SETB  SCL               ;置时钟线为高,通知被控制开始接受数据位
       NOP                       ;保证时钟高周期大于4s
       NOP
       NOP
       CLR  SCL               ;钳住总线准备接受下一个数据位
       DJNZ  BITCNT,SENTB      ;8位没发送完继续发送
       NOP
      NOP
      SETB  SDA               ;8位发送完后释放数据线准备收应答位
     NOP
      NOP
      SETB  SCL               ;开始接受应答信号
      NOP
      NOP
      CLR  F0                ;预先清发送数据出错标志
      JNB  SDA,ACKEND        ;判断是否接受应答信号正常转ACKEND
      SETB  F0                ;未受到应答置位错误标志
ACKEND:      ;应答信号正常
        NOP
        CLR  SCL               ;发送结束钳住总线准备下一步发送或接受数据或进行其他处理
        RET
;=================================
RCVBYTE:
        SETB  SDA               ;置数据线为输入方式
        MOV  BITCNT,#08H       ;要传送的数据长度为8位
RCV:
     NOP
     CLR  SCL               ;置时钟线为低,准备接受数据
      NOP                       ;时钟低周期大于4.7s
      NOP
      NOP
      NOP
      NOP
      SETB  SCL               ;置时钟线为高使数据线上数据有效
      NOP
      NOP
      MOV  C,SDA
      RLC  A                 ;接受的数据位放入ACC
      NOP
      NOP
      DJNZ  BITCNT,RCV        ;8位没收完继续接受
      CLR  SCL               ;8位接受完置时钟线和数据线
      NOP
      NOP
      CLR  SDA
      SETB  SDA               ;接受非应答信号
        NOP
      NOP
      SETB  SCL               ;置时钟线为高使应答位有效
      NOP                       ;时钟高周期大于4.7s
      NOP
      SETB  SDA
      NOP
      NOP
      NOP
      CLR  SCL                ;清时钟线钳住IC总线以便发送停止条件
      RET
;===================================
DISNUMA:
DIS0A:     ;前0
 CJNE A,#0,DIS1A
 MOV @R0,#10001000B
 RET
DIS1A:     ;前1
 CJNE A,#1,DIS2A
 MOV @R0,#11101110B
 RET
DIS2A:     ;前2
 CJNE A,#2,DIS3A
 MOV @R0,#10010010B
 RET
DIS3A:     ;前3
 CJNE A,#3,DIS4A
 MOV @R0,#10100010B
 RET
DIS4A:     ;前4
 CJNE A,#4,DIS5A
 MOV @R0,#11100100B
 RET
DIS5A:     ;前5
 CJNE A,#5,DIS6A
 MOV @R0,#10100001B
 RET
DIS6A:     ;前6
 CJNE A,#6,DIS7A
 MOV @R0,#10000001B
 RET
DIS7A:     ;前7
 CJNE A,#7,DIS8A
 MOV @R0,#11101010B
 RET
DIS8A:     ;前8
 CJNE A,#8,DIS9A
 MOV @R0,#10000000B
 RET
DIS9A:     ;前9
 CJNE A,#9,DISA
 MOV @R0,#10100000B
 RET
DISA:     ;前a
 CJNE A,#0AH,DISB
 MOV @R0,#11000000B
 RET
DISB:     ;前b
 CJNE A,#0BH,DISC
 MOV @R0,#10000101B
 RET
DISC:     ;前c
 CJNE A,#0CH,DISD
 MOV @R0,#10010111B
 RET
DISD:     ;前d
 CJNE A,#0DH,DISE
 MOV @R0,#10000110B
 RET
DISE:     ;前e
 CJNE A,#0EH,DISF
 MOV @R0,#10010001
 RET
DISF:     ;前f
 CJNE A,#0FH,DISARET
 MOV @R0,#11010001
 RET
DISARET:
 RET
;**********************************************
DISNUMB:
DIS0B:     ;后0
 CJNE A,#0,DIS1B
 MOV @R0,#00010001B
 RET
DIS1B:     ;后1
 CJNE A,#1,DIS2B
 MOV @R0,#01110111B
 RET
DIS2B:     ;后2
 CJNE A,#2,DIS3B
 MOV @R0,#10010100B
 RET
DIS3B:     ;后3
 CJNE A,#3,DIS4B
 MOV @R0,#01010100B
 RET
DIS4B:     ;后4
 CJNE A,#4,DIS5B
 MOV @R0,#01110010B
 RET
DIS5B:     ;后5
 CJNE A,#5,DIS6B
 MOV @R0,#01011000B
 RET
DIS6B:     ;后6
 CJNE A,#6,DIS7B
 MOV @R0,#00011000B
 RET
DIS7B:     ;后7
 CJNE A,#7,DIS8B
 MOV @R0,#01110101B
 RET
DIS8B:     ;后8
 CJNE A,#8,DIS9B
 MOV @R0,#00010000B
 RET
DIS9B:     ;后9
 CJNE A,#9,DISBA
 MOV @R0,#01010000B
 RET
DISBA:     ;后a
 CJNE A,#0AH,DISBB
 MOV @R0,#00110000B
 RET
DISBB:     ;后b
 CJNE A,#0BH,DISBC
 MOV @R0,#00011010B
 RET
DISBC:     ;后C
 CJNE A,#0CH,DISBD
 MOV @R0,#10011001B
 RET
DISBD:     ;后d
 CJNE A,#0DH,DISBE
 MOV @R0,#00010110B
 RET
DISBE:     ;后e
 CJNE A,#0EH,DISBF
 MOV @R0,#10011000B
 RET
DISBF:     ;后f
 CJNE A,#0FH,DISBRET
 MOV @R0,#10111000B
 RET
DISBRET:
 RET
;**********************************************
MUSIC:
 MOV R7,10
MUS:
 CPL P3.3
 LCALL DELAY
 LCALL DELAY
 CPL P3.3
 DJNZ R7,MUS
 RET
;*****************************************************


DELAY:
 MOV R4,#0FFH
DELB:
 MOV R5,#0FFH
 DJNZ R5,$
 DJNZ R4,DELB
 RET


 END

文章评论5条评论)

登录后参与讨论

用户115412 2007-11-16 11:08

用户1293116 2007-11-12 22:09

我的邮箱是:yannami@126.com.呵呵,忘了写上邮箱

用户1293116 2007-11-12 22:08

朋友,可以发我一原理图码?麻烦你哦

用户115412 2007-11-12 11:29

原理图已上传,请到这里下载:http://www.ednchina.com/blog/sbr1398/58864/message.aspx

用户39379 2007-11-9 23:19

能否发来电路图看看啊

 mxp082016@21cn.com

相关推荐阅读
用户115412 2008-03-31 15:16
08看最新电影高速下载
蜘蛛侠3DVDrip:http://www.namipan.com/d/203cc771bfaf6364a27146579ca610a1ad8e38aacf789d0fhttp://www.namip...
用户115412 2008-02-22 14:31
免费主页空间,支持asp、access,ftp、web上传1G流量
常来网免费空间(TheC.Cn) - 国内最大的免费空间站【注册地址】:  http://web.99081.com/sysweb/RegTrans.aspx?CodeProvider=sbr1398...
用户115412 2008-01-16 13:57
4G免费个人空间-单个文件可达200M
"纳米盘" - 免费网络硬盘http://www.namipan.com/a. 免费存储,随时随地访问你的文件b. 图片外链,和朋友分享照片上传下载必备--纳米机器人!> 下载,上传速度更快&g...
用户115412 2007-11-28 14:17
免费赚取金蛋换本本
     免费赚取金蛋换本本                                         http://www.pceggs.cn/pgComDefault.aspx?ID=514...
用户115412 2007-11-22 14:34
好地方大家去赚金蛋啊.......
好地方大家赶快来免费赚金蛋啊.......赚到金蛋可以换很多东西,最高可以换笔记本电脑哦!大家记得注册资料全部要真实,这样才不影响您收奖品.赶快免费注册吧.......http://www.pcegg...
用户115412 2007-11-16 18:05
12v-220v逆变电路
转一个实用的12v-220v逆变电路...
EE直播间
更多
我要评论
5
7
关闭 站长推荐上一条 /3 下一条