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