为了能对初学单片机的朋友有所启发,我简单的把我的实验的制作过程叙述一下高手们就没必要看这些拉,我也是个初学者,就在去年过年的时候在朋友的宿舍偶尔看到一本单片机原理及应用技术的书,没事做随便拿起来看了几页,突然发现自己对这个挺有兴趣的,就把朋友的书借了准备回去看看,我这个人对什么都是这么认真,拿回去花了一周的时间一口气把这本书看完,因为我有点计算机和编程基础,所以看起来没感觉到费劲,但是当我看完整本书后,却发现在这本书上我根本没有学到东西,所以在今年开学来了就想着再从头来,边看边做点实验,第一个实验
我选择做个电子时钟,但是手头上什么也没怎么做呢?在网上看到很多实验板,由于初学对这也是一点不懂,幸好遇到了明天大哥,告诉我实验板不买也罢,最好自己做,还能学点东西,所以我就买了一个廉价的编程器,凭着自己仅有的一点电子基础焊了这块小板板,然后就是构思我的程序,可能有很多初学者会说:那么长的程序我还是初学,指令也没记住怎么做呢?没关系的,那么枯燥抽象的东西让你看几遍把他全部记住是件不容易的事,如果你大体了解一点那就开始吧,再遇到不懂的的时候就把书拿来仔细看,实在不懂的到BBS里,群里去找答案,这样下来会觉的收获很大的,由于没有仿真器,我用KEIL软件仿真的,刚打开这个软件时一头
雾水,全英文软件,个人英文又不好,当时心想这么难什么时候才能学会,一个办法就是去找资料,找点中文的使用说明,结果弄了俩天下来,感觉熟悉了很多,所以我觉的学习这事,不要怕麻烦,耐心一点一切都会好的!
嘿嘿,一个能调时间的电子时钟,功能很简单,准备再往上加点功能!第一次做,也没有实验板,仿真机,所以先弄了个简单的!
6段数码管分别显示,时,分,秒,四个按键,K1(P0.0),K2(P0.1),
K3(P0.2),K4(P0.3),四个按键用来调时间的,按下K1,所有位都清零显示,然后按下K2,秒在闪烁,继续按K2分闪烁,不段地按K2 秒--分--时切换着闪烁,在某位闪时按下K3相应位加一,确认调整,按K4,取消调整再按K1。在K1按下以后才有调时的功能,如果K1没有按下,按别的键没有反映。这为了在加点按键功能留着用!
程序:
;*****************************************
;主程序
;*****************************************
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP TIM0
ORG 001BH ;用来闪烁定时
LJMP TIM1
ORG 0100H
MAIN: MOV SP,#50H ;设置栈指针
MOV R2,#00H ;闪烁标记位清零
MOV R7,#00H ;调整标记位清亮?
MOV 28H,#00H ;T0定时中断次数
MOV 29H,#00H ;T1定时中断次数
MOV 21H,#00H ;秒单元清零
MOV 22H,#00H ;分单元清零
MOV 23H,#00H ;时单元清零
SETB ET0 ;开T0中断
SETB ET1
SETB EA ;开中断
MOV TMOD,#01H ;定时器初始化
MOV TL0,#0B0H ;赋定时初值
MOV TH0,#3CH
MOV TL1,#0B0H
MOV TH1,#3CH
SETB TR0 ;T0开始定时
CLR TR1 ;使T1可靠停止
NEXT: LCALL DISP ;调用显示处理子程序
LCALL SCAN ;调用扫描子程序
LCALL KEY ;调用按键处理子程序
SJMP NEXT
;******************************************
;TO定时中断处理子程序:
;******************************************
TIM0: PUSH ACC
PUSH PSW
MOV TL0,#0B0H
MOV TH0,#3CH
INC 28H ;中断计数
MOV A,28H
CJNE A,#0AH,ETI0
MOV 28H,#00H ;一秒时间到
MOV A,21H
ADD A,#01H ;秒单元加一
DA A
MOV 21H,A
CJNE R7,#00H,J1
MOV 30H,A ;把秒单元数送入显示缓冲单元
J1: CJNE A,#59H,ETI0
MOV 21H,#00H ;一分钟时间到
MOV A,22H
ADD A,#01H ;分单元加一
DA A
MOV 22H,A
CJNE R7,#00H,J2
MOV 31H,A
J2: CJNE A,#59H,ETI0
MOV 22H,#00H ;一小时到
MOV A,23H
ADD A,#01H ;时单元加一
DA A
MOV 23H,A
CJNE R7,#00H,J3
MOV 32H,A
J3: CJNE A,#23H,ETI0
MOV 23H,#00H ;时单元清零
ETI0: POP PSW
POP Acc
RETI
;*******************************************
;T1定时中断处理程序
;*******************************************
TIM1: PUSH ACC
PUSH PSW
MOV TL1,#0B0H
MOV TH1,#3CH
INC 29H ;中断计数
MOV A,29H
CJNE A,#05H,ETI1 ;0.3秒时间到,用来闪烁延时
MOV 29H,#00H
MOV A,R2
CJNE A,#01H,LOOP1 ;R2为01秒闪烁
MOV 3EH,#0FDH ;使时位选能够正常扫描
MOV 3FH,#0FEH
XRL 3AH,#20H ;使秒原来正常扫描的位选关闭,原来关闭的能够正常扫描
XRL 3BH,#10H
AJMP ETI1
LOOP1: CJNE A,#02H,LOOP2 ;R2为02分闪烁
MOV 3AH,#0DFH ;使秒位选能够正常扫描
MOV 3BH,#0EFH
XRL 3CH,#08H ;使分原来正常扫描的位选关闭,原来关闭的能够正常扫描
XRL 3DH,#04H
AJMP ETI1
LOOP2: CJNE A,#03H,ETI1 ;R2为03时闪烁
MOV 3CH,#0F7H ;使分位选能够正常扫描
MOV 3DH,#0FBH
XRL 3EH,#02H ;使时原来正常扫描的位选关闭,原来关闭的能够正常扫描
XRL 3FH,#01H
ETI1: POP PSW
POP ACC
RETI
;*******************************************
;显示处理子程序:
;*******************************************
DISP: MOV R1,#2AH ;秒个位显示寄存器
MOV A,30H ;将秒显示缓冲单元内容送入A
MOV B,#10H
DIV AB
MOV @R1,B ;秒个位存入2AH单元
INC R1
MOV @R1,A ;秒十位存入2BH单元
INC R1
MOV A,31H ;将分显示缓冲单元内容送入A
MOV B,#10H
DIV AB
MOV @R1,B ;分个位存入2CH单元
INC R1
MOV @R1,A ;分十位存入2DH单元
INC R1
MOV A,32H ;将时显示缓冲单元内容送入A
MOV B,#10H
DIV AB
MOV @R1,B ;时个位存入2EH单元
INC R1
MOV @R1,A ;时十位存入2FH单元
MOV A,R2
CJNE A,#00,JK ;有闪烁跳JK,位选由T1中断处理给出
MOV 3AH,#0DFH ;将秒个位选码送入扫描缓冲单元
MOV 3BH,#0EFH ;将秒十位选码送入扫描缓冲单元
MOV 3CH,#0F7H ;将分个位选码送入扫描缓冲单元
MOV 3DH,#0FBH ;将分十位选码送入扫描缓冲单元
MOV 3EH,#0FDH ;将时个位选码送入扫描缓冲单元
MOV 3FH,#0FEH ;将时十位选码送入扫描缓冲单元
JK: RET
;*********************************
;扫描子程序:
;*********************************
SCAN: MOV R0,#2AH ;秒个位扫描缓冲单元地址存入R0
MOV R3,#06 ;扫描长度
MOV DPTR,#TABLE ;段码首地址
MOV R1,#3AH ;第一个LED位选码
LOOP: MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
MOV A,@R1
MOV P2,A
MOV R6,#0D0H ;延时使其不闪烁
DJNZ R6,$
MOV 27H,#12
MOV P2,#0FFH ;消影
DJNZ 27H,$
INC R0
INC R1
DJNZ R3,LOOP
RET
;********************************
;按键判断处理子程序:
;********************************
KEY: MOV P0,#0FFH
JNB p0.0,A1 ;K1键没有按下,返回
LJMP RETX
A1: LCALL DISP ;消抖
LCALL SCAN
JNB P0.0,A2 ;再一次判断K1是否按下
LJMP RETX
A2: JNB P0.0,$ ;等待按键释放
MOV R7,#01H
QL: MOV 30H,#00H ;秒单元清零
MOV 31H,#00H ;分单元清零
MOV 32H,#00H ;时单元清零
LCALL DISP ;显示秒,分,时都为零
LCALL SCAN
JNB P0.1,B1 ;K2键没有按下跳M3
LJMP M3
B1: JNB P0.1,$ ;等待按键释放
MS: SETB TR1
MOV R2,#01H ;R2为闪烁标记位,01H位秒闪烁
LCALL DISP
LCALL SCAN
JB P0.2,K1 ;K3键没有按下跳K1
JNB P0.2,$
MJ: MOV A,30H ;K3键按下秒单元加一
ADD A,#01H
DA A
MOV 30H,A
CJNE A,#60H,F1
MOV 30H,#00H ;秒单元到60
INC 31H ;分单元加一
F1: JB P0.2,K1 ;K3键没有按下跳K1
JNB P0.2,$
AJMP MJ ;秒继续加
K1: JNB P0.1,B2 ;K2键没有按下
LJMP M1
B2: JNB P0.1,$
FS: MOV R2,#02H ;R2为02时分闪烁
LCALL DISP
LCALL SCAN
JB P0.2,K2
JNB P0.2,$
FJ: MOV A,31H
ADD A,#01H
DA A
MOV 31H,A
CJNE A,#60H,F2
MOV 31H,#00H
INC 32H
F2: JB P0.2,K2
JNB P0.2,$
AJMP FJ
K2: JB P0.1,M2
JNB P0.1,$
SS: MOV R2,#03H ;R2为03H位时闪烁
LCALL DISP
LCALL SCAN
JB P0.2,K3
JNB P0.2,$
SJ: MOV A,32H
ADD A,#01H
DA A
MOV 32H,A
CJNE A,#24H,F3
MOV 32H,#00H
F3: JB P0.2,K3
JNB P0.2,$
AJMP SJ
K3: JB P0.1,L1
JNB P0.1,$
LJMP MS
L1: JB P0.0,L2
JNB P0.0,$
LJMP BBF
L2: JB P0.3,SS
JNB P0.3,$
BF: MOV 21H,30H
MOV 22H,31H
MOV 23H,32H
BBF: CLR TR1
MOV R2,#00H
MOV R7,#00H
MOV 30H,21H
MOV 31H,22H
MOV 32H,23H
AJMP RETX
M2: JB P0.0,L3
JNB P0.0,$
AJMP BBF
L3: JNB P0.3,C1
LJMP FS
C1: JNB P0.3,$
AJMP BF
M1: JB P0.0,L4
JNB P0.0,$
AJMP BBF
L4: JNB P0.3,C2
LJMP MS
C2: JNB P0.3,$
AJMP BF
M3: JB P0.0,L5
JNB P0.0,$
AJMP BBF
L5: JNB P0.3,C3
LJMP QL
C3: JNB P0.3,$
AJMP BF
RETX: RET
TABLE: DB 88H,0DBH,94H,92H,0C3H,0A2H,0A0H,9BH,80H,82H
END