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

单片机控制时钟显示源程序

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

这是我在大学的时候编的. 记得当时我们开发小组从下午5点调试到11点多才成功, 最有成就感的一天!  

;=======================================
; Clock  programe
; Create date: 2004_05_12
; First  Modify:  2004_05_13
; First  Modify:  2004_05_13
; Last   Modify:  2004_05_20
; Author:  Dengjingyue
;=======================================
SDA        BIT     P0.1    ;定义
SCL        BIT     P0.0    ;定义
Second_0       EQU   40H    ;定义秒个位
Second_1       EQU   41H    ;定义秒十位
LED2           EQU   42H    ;
Minute_0       EQU   43H    ;定义分个位
Minute_1       EQU   44H    ;定义分十位
LED5           EQU   45H
Hour_0         EQU   46H    ;定义小时个位
Hour_1         EQU   47H    ;定义小时十位
SECOND     EQU   48H    ;定义秒
MINUTE     EQU   49H    ;定义分
HOUR       EQU   50H    ;定义小时

ORG  0000H
     AJMP   MAIN
ORG  000BH
     AJMP   INT_CLOCK     ;中断入口
ORG  0100H
;============主程序开始=======================
MAIN:
      MOV  R7,#00H        ;赋初值
      MOV  SECOND, #00H   ;赋初值
      MOV  MINUTE, #00H   ;赋初值
      MOV  HOUR, #00H     ;赋初值
      ACALL Separate     ;拆分子程序
      ACALL DISPLAY       ;显示子程序
   ;----------------------------
      MOV  TMOD,#01H     ;设定时器0为定时方式1(16位)
      MOV TH0, #0DBH     ;定时初值高8位
      MOV TL0, #0F0H     ;定时初值低8位
      SETB EA            ;开总中断允许
      SETB ET0           ;开定时器0允许中断
      SETB TR0           ;启动定时器
      AJMP  $

;================中断服务子程序=====================
INT_CLOCK:
      MOV TH0, #0DBH       ;定时初值高8位
      MOV TL0, #0F0H       ;定时初值低8位
      INC  R7
      CJNE R7,#100, EXIT   ;每次中断时间是0.1秒, 100次是1秒.
      MOV  R7,#00          ;到1秒, R7清零
   ;-----------------------------------
      INC   SECOND         ;秒加1
      MOV   A,SECOND
      CJNE  A,#60, LP
      MOV   SECOND, #00H   ;秒清0
      INC   MINUTE         ;分加1
      MOV   A,MINUTE
      CJNE  A,#60, LP
      MOV   MINUTE, #00H   ;分清0
      INC   HOUR            ;小时1
      MOV   A,HOUR
      CJNE  A,#24, LP
      MOV   HOUR, #00H      ;小时清0
LP:    ACALL Separate       ;拆分子程序
       ACALL DISPLAY        ;显示子程序
      ; ACALL DELAY_1*       ;延时约一秒
**IT:  RETI
;===主程序结束===
;==============拆分子程序=====================
Separate:
        MOV   DPTR,#TAB1
      ;-------------------
      MOV     A,SECOND
      MOVC    A,@A+DPTR     ;查表,十六进制转为十进制数
      mov     R0,A          ;R0暂存A中的数
      ANL     A,#0FH        ;屏蔽高4位
      MOV     Second_0, A   ;送秒个位
      MOV     A,R0          ;恢复A中数
      ANL     A, #0F0H      ;屏蔽低4位
      SWAP    A             ;高4位与低4位交换
      MOV     Second_1,A    ;送秒十位
  ;--------------------
      MOV   LED2,#0FFH      ;数码管灭的显示代码
  ;--------------------
      MOV   A,MINUTE
      MOVC  A,@A+DPTR
      mov   R0,A
      ANL   A,#0FH
      MOV   Minute_0, A
      MOV   A,R0
      ANL   A, #0F0H
      SWAP  A
      MOV   Minute_1,A
   ;-----------------------
      MOV   LED5,#0FFH      ;数码管灭的显示代码
   ;-----------------------
      MOV   A,HOUR
      MOVC  A,@A+DPTR
      ANL   A,#0FH
      MOV   Hour_0, A
      MOV   A,HOUR
      ANL   A, #0F0H
      SWAP  A
      MOV   Hour_1,A
      RET
  ;-----------------------
  TAB1: DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H       ; 十六进制转十进制数表
        DB 10H,11H,12H,13H,14H,15H,16H,17H,18H,19H
        DB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H
        DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
        DB 40H,41H,42H,43H,44H,45H,46H,47H,48H,49H
        DB 50H,51H,52H,53H,54H,55H,56H,57H,58H,59H
        DB 60H,61H,62H,63H,64H,65H,66H,67H,68H,69H
        DB 70H,71H,72H,73H,74H,75H,76H,77H,78H,79H
        DB 80H,81H,82H,83H,84H,85H,86H,87H,88H,89H
        DB 90H,91H,92H,93H,94H,95H,96H,97H,98H,99H
;===================显示子程序=====================
DISPLAY:
       MOV   DPTR,#TAB2         ;送显示代码首地址
      MOV     A,Second_0        ;秒个位送A
      MOVC    A,@A+DPTR         ;显示代码查表
      ACALL   SHIFT             ;调移位子程序
      MOV     A,Second_1
      MOVC    A,@A+DPTR
      ACALL   SHIFT
      MOV     A,LED2
      MOVC    A,@A+DPTR
      ACALL   SHIFT
      MOV     A,Minute_0
      MOVC    A,@A+DPTR
      ACALL   SHIFT
      MOV     A,Minute_1
      MOVC    A,@A+DPTR
      ACALL   SHIFT
      MOV     A,LED5
      MOVC    A,@A+DPTR
      ACALL   SHIFT
      MOV     A,Hour_0
      MOVC    A,@A+DPTR
      ACALL   SHIFT
      MOV     A,Hour_1
      MOVC    A,@A+DPTR
      ACALL   SHIFT
      RET
;----------------------------------------------
TAB2: DB  11H,0D7H,32H,92H,0D4H,98H,18H,0D3H   ;0,1,2,3,4,5,6,7       显示代码
      DB  10H,90H,50H,1CH,39H,16H,38H,78H,0FFH ;8,9,A,B,C,D,E,F,灭
;---------------------------------------------
;================移位子程序==================
SHIFT:      push  a            ;A进栈暂存
            MOV     R2,#8
            CLR     C
            CLR     SCL
DL:
            RLC     A
            MOV     SDA,C
            SETB    SCL
            CLR     SCL
            DJNZ    R2,DL
            pop a             ;出栈恢复A值
            RET
;============延时约一秒子程序=============
DELAY_1S:   MOV     R6,#1FH
LOOP7:      MOV     R5,#0FFH
LOOP6:      NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            DJNZ    R5,LOOP6
            DJNZ    R6,LOOP7
            RET
  END
完整程序请从这里下:http://www.51hei.com/ziliao/file/shiz.rar  ,本人已经测试通过.

关闭窗口

相关文章