51单片机实现的时钟小程序

注意:没有60秒和60分

思路:存秒钟的变量CURR_NUM_L进行判断:到了59秒就清零并跳到分钟数+1的子程序中,否则+1 ~ 分钟再进行判断:若为59则清零,若不是59则+1

  1     SECOND        EQU    31H    ;second
  2     MIN        EQU    32H    ;min
  3     HOUR        EQU    35H    ;hour
  4     VAR_TIMER    EQU    33H    ;Soft timer
  5     VAR_LED        EQU    34H    ;Led value,#03FH for red led,#0CFH for green led
  6 
  7     DAT_74164    bit    P0.6
  8     CLK_74164    bit    P0.7
  9 
 10     DIG_1        bit    p0.5
 11     DIG_2        bit    p0.4
 12     DIG_3        bit    p0.3
 13     DIG_4        bit    p0.2
 14     DIG_5        bit    p0.0
 15     DIG_6        bit    p0.1
 16 
 17 ;*********************************************
 18     org    0000H        
 19     jmp    MAIN
 20 
 21     org    000BH
 22     jmp    interrupt_T0
 23 ;*******************************************    
 24     org    0030H        ;Start program from 0030H        
 25 MAIN:
 26     mov    P0,#0FFH    ;Initialize the port    
 27     mov    P1,#0FFH    
 28     mov    P2,#0FFH    
 29     mov    P3,#0FFH
 30     
 31     /*Initilize the var*/
 32     mov    SECOND,#50        ;给变量赋值1秒计数由0〜59s
 33     mov    MIN,#00
 34     mov    HOUR,#00
 35     mov    VAR_TIMER,#00H
 36     mov    VAR_LED,#03FH
 37     mov    P1,VAR_LED
 38 
 39     /*Initialize T0*/
 40     mov    TMOD,#01H
 41     mov    TH0,#0B1H    ;20ms,load number
 42     mov    TL0,#0E0H
 43     setb    TR0        ;Start T0
 44     setb    ET0        ;Enable T0 inerrupt
 45     setb    EA        ;Enable interrupt
 46     ;mov    IE,#82H    ;#10000010B
 47 
 48 MAIN_LOOP:
 49     call    DISPLAY_NUM    ;Display number
 50     jmp    MAIN_LOOP
 51 
 52     ret
 53 ;****************************************************
 54 interrupt_T0:
 55     push    acc        ;Pay attention to here
 56     push    psw
 57 
 58     ;Reset T0,must be done
 59     ;clr    TF0        ;auto clear the tag of overflow
 60     mov    TH0,#0B1H    ;20ms,reload number
 61     mov    TL0,#0E0H
 62 
 63     inc    VAR_TIMER    ;Add 20ms
 64     /*If VAR_TIMER=50,then time for 1s */
 65     mov    a,VAR_TIMER
 66     cjne    a,#50,INT_T0_EXIT
 67 
 68     mov    VAR_TIMER,#00H
 69     call    NUM_ADD_SECOND    
 70 
 71 INT_T0_EXIT:
 72     pop    psw
 73     pop    acc
 74 
 75 reti
 76 ;****************************************************
 77 DISPLAY_NUM:
 78     ;A<-A/B,显示min
 79     mov    a,SECOND
 80     mov    b,#0Ah
 81     div    ab
 82     mov    r0,a
 83 
 84     ;Display the low value
 85     mov    a,b
 86     mov    dptr,#TAB_LED
 87     movc    a,@a+dptr
 88 
 89     call    sendTo74164    ;Display the numbet
 90     setb    DIG_2        ;显示秒钟的低位
 91     clr    DIG_1
 92     setb    DIG_3
 93     setb    DIG_4
 94     setb    DIG_5
 95     setb    DIG_6
 96     call    DELAY_DISP
 97     
 98     ;Display the high value
 99     mov    a,r0
100     mov    dptr,#TAB_LED
101     movc    a,@a+dptr
102 
103     call    sendTo74164    ;Display the number
104     setb    DIG_1        ;显示秒钟的高位
105     clr    DIG_2
106     setb    DIG_3
107     setb    DIG_4
108     setb    DIG_5
109     setb    DIG_6
110     call    DELAY_DISP
111 
112     ;
113     ;A<-A/B,显示second
114     mov    a,MIN
115     mov    b,#0Ah
116     div    ab
117     mov    r0,a
118 
119     ;Display the low value
120     mov    a,b
121     mov    dptr,#TAB_LED
122     movc    a,@a+dptr
123 
124     call    sendTo74164    ;Display the numbet
125     setb    DIG_1        ;显示分钟的低位
126     setb    DIG_2
127     clr    DIG_3
128     setb    DIG_4
129     setb    DIG_5
130     setb    DIG_6
131     call    DELAY_DISP
132     
133     ;Display the high value
134     mov    a,r0
135     mov    dptr,#TAB_LED
136     movc    a,@a+dptr
137 
138     call    sendTo74164    ;Display the numbet
139     setb    DIG_2        ;显示分钟的高位
140     setb    DIG_1
141     setb    DIG_3
142     clr    DIG_4
143     setb    DIG_5
144     setb    DIG_6
145     call    DELAY_DISP
146 
147     ;A<-A/B,显示hour
148     mov    a,HOUR
149     mov    b,#0Ah
150     div    ab
151     mov    r0,a
152 
153     ;Display the low value
154     mov    a,b
155     mov    dptr,#TAB_LED
156     movc    a,@a+dptr
157 
158     call    sendTo74164    ;Display the numbet
159     setb    DIG_2        ;显示时低位
160     setb    DIG_1
161     setb    DIG_3
162     setb    DIG_4
163     clr    DIG_5
164     setb    DIG_6
165     call    DELAY_DISP
166     
167     ;Display the high value
168     mov    a,r0
169     mov    dptr,#TAB_LED
170     movc    a,@a+dptr
171 
172     call    sendTo74164    ;Display the number
173     setb    DIG_1        ;显示时高位
174     setb    DIG_2
175     setb    DIG_3
176     setb    DIG_4
177     setb    DIG_5
178     clr    DIG_6
179     call    DELAY_DISP
180 
181     ret
182 ;*******************************************
183 ;Send data of A to chip 74LS164
184 sendTo74164:
185     push    07h
186     push    acc
187 
188     mov    r7,#08        ;send 8 bits      
189 SEND164_LOOP:
190     clr    CLK_74164    ;clear clock-line for reading data
191     rlc    a
192     mov    DAT_74164,c    ;move data-bit to data-line    
193     setb    CLK_74164    ;send data to 74164
194     djnz    r7,SEND164_LOOP
195     clr    CLK_74164    ;clear clock-line for reading data
196         
197     pop    acc
198     pop    07h
199     ret
200 ;****************************************************
201 NUM_ADD_SECOND:
202     ;Get previos value
203     mov    a,SECOND
204     inc    a
205     mov    SECOND,a
206     ;到了1秒看变量是不是59,是变量赋0(分钟数+1),不是则+1
207     cjne    a,#59,NUM_ADD_EXIT
208 
209 
210 
211 NUM_ADD_RESET_SECOND:
212     
213     mov    SECOND,#00        ;
214 
215 
216 NUM_ADD_MIN:
217     
218     ;到了59min,分钟数清零,没到加一
219     ;判断MIN是不是59,是的话清零,不是+1
220     ;get previous value
221     mov    a,MIN
222     inc    a
223     mov    MIN,a
224     cjne    a,#59,NUM_ADD_EXIT
225 
226 NUM_ADD_RESET_MIN:
227     
228     mov    MIN,#00        
229     
230 NUM_ADD_HOUR:
231     
232     ;到了59hour。小时数清零,没到加一
233     ;判断HOUR是不是59,是的话清零,不是+1
234     ;get previous value
235     mov    a,HOUR
236     inc    a
237     mov    HOUR,a
238     cjne    a,#24,NUM_ADD_EXIT
239 
240 NUM_ADD_RESET_HOUR:
241     
242     mov    HOUR,#00
243 
244 NUM_ADD_EXIT:    
245     
246     ret
247 ;****************************************************
248 
249     
250 ;****************************************************
251 DELAY_DISP:
252     mov    r7,#5
253 DELAY_DISP_LOOP:
254     mov    r6,#200
255     djnz    r6,$
256     mov    r6,#200
257     djnz    r6,$
258 
259     djnz    r7,DELAY_DISP_LOOP
260     ret
261 ;****************************************************
262 ;****************************************************
263 ;LED code
264 TAB_LED:    
265     DB    0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
266 ;****************************************************
267     END    

 

posted on 2022-11-23 22:24  罗小罗佳油  阅读(378)  评论(0编辑  收藏  举报