资源描述
数字电子技术实验报告
(一) 实验目的
学习 8051定时器时间计时处理、按键扫描及 LED数码管显示的设计方法。
(二) 设计任务及要求
利用实验平台上 4 个 LED数码管, 设计带有闹铃功能的数字时钟,要求:
1. 在 4 位数码管上显示当前时间。显示格式“时时分分”
2. 由 LED闪动做秒显示。
3. 利用按键可对时间及闹玲进行设置,并可显示闹玲时间。当闹玲时间到蜂鸣器发
出声响,按停止键使可使闹玲声停止。
(三)工作原理及设计思路
利用单片机定时器完成计时功能,定时器 0 计时中断程序每隔 5ms 中断一次并当作一个计数,每中断一次计数加 1,当计数 200 次时,则表示 1s 到了,秒变量加 1,同理再判断是否 1min 钟到了,再判断是否 1h 到了。为了将时间在 LED 数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要数据锁存器等较多硬件,可采用动态显示法实现
LED显示。其显示电路如图 1
闹铃声由交流蜂鸣器产生,电路如图 2,当 P1.7 输出不同频率的方波,.蜂鸣器便会发出不同的声音。
(四)设计方案
1.软件实现数字时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。该方案具有硬件电路简单的特点。但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。
2.数码管显示:
方案一:静态显示。所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。该方式每一位都需要一个8 位输出口控制。静态显示时较小的电流能获得较高的亮度,且字符不闪烁。但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。
方案二:动态显示。所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口,降低了能耗。
从节省I/O口和降低能耗出发,本设计采用方案二。
(五)源程序
ORG 0000H
MAIN: CLR EA ;程序初始化
CLR PSW.3 ;选择寄存器组0
CLR PSW.4
MOV TMOD,#10H ;定时器1,方式1,定时方式
MOV 50H,#00H ;闹铃初始时间 08:00
MOV 51H,#00H ;分别对应分的低、高位,时的低、高位
MOV 52H,#08H
MOV 53H,#00H
MOV R0,#00H ;设置时间初值 07:59
MOV R1,#09H ;分别对应分的低、高位,时的低、高位
MOV R2,#05H
MOV R3,#07H
MOV R4,#00H
CLR TF1 ;清标志
START: ACALL ALARM ;判断是否闹铃
MOV R5,#02H ;两层外循环,每层循环500ms
START1: MOV R7,#10 ;10次内循环,10*50ms=500ms
START2: ACALL DELAY ;调用延时 10ms
ACALL DISPLAY ;调用延时 40ms
M0: JB P3.2,M1 ;是否设闹铃,查询3.2口,为一转到M1,为0设置闹铃
ACALL SETALARM
M1: JB P3.3,M2 ;是否设时间
ACALL SETCLOCK
M2: DJNZ R7,START2 ;R7减1循环
CPL P1.2 ;每500ms给P1.2一个正负交替的电平信号
DJNZ R5,START1 ;R5为2,循环两次后为1s
INC R0 ;R0加1
CJNE R0,#60,START ;判断R0为60,跳转
MOV R0,#00H ;R0清零
M3: CJNE R1,#09H,L1 ;时间逻辑,如果为23:59分,则全部清零
CJNE R2,#05H,L2
CJNE R4,#02H,L3
CJNE R3,#03H,L4
MOV R1,#00H
MOV R2,#00H
MOV R3,#00H
MOV R4,#00H
AJMP START
L1: INC R1 ;上面的几个分支
AJMP START
L2: INC R2
MOV R1,#00H
AJMP START
L3: CJNE R3,#09H,L4
INC R4
MOV R3,#00H
MOV R2,#00H
MOV R1,#00H
AJMP START
L4: INC R3
MOV R2,#00H
MOV R1,#00H
AJMP START
DISPLAY: MOV DPTR,#TABLE ;显示子程序,把TABLE的首地址送给DPTR
MOV A,R1 ;将偏移量给A
MOVC A,@A+DPTR ;将对应地址中的量给A
ACALL BIT1 ;显示第一个字节,也就是分的低位
MOV A,R2 ;显示第二个字节,分的高位
MOVC A,@A+DPTR
ACALL BIT2
MOV A,R3 ;显示第三个字节,时的低位
MOVC A,@A+DPTR
ACALL BIT3
MOV A,R4 ;显示第四个字节,时的高位
MOVC A,@A+DPTR
ACALL BIT4
RET
BIT1: MOV R6,#08H ;显示第一个字节(分的低位)的子程序
LOOP1: RLC A ;A带进位左移,移出的最高位存到C中
MOV P1.0,C ;把C的值给P1.0口
CLR P1.1 ;在P1.1产生一个上升沿,将P1.0的值输入
SETB P1.1
DJNZ R6,LOOP1 ;8次循环,输入第一个字节8段的值
CLR P1.3 ;给P1.3一个低电平,点亮分的低位对应的数码管
ACALL DELAY ;延时 5ms
SETB P1.3 ;置位
RET
BIT2: MOV R6,#08H ;显示第二个字节(分的高位)的子程序
LOOP2: RLC A
MOV P1.0,C
CLR P1.1
SETB P1.1
DJNZ R6,LOOP2
CLR P1.4
ACALL DELAY
SETB P1.4
RET
BIT3: MOV R6,#08H ;显示第三个字节(时的低位)的子程序
LOOP3: RLC A
MOV P1.0,C
CLR P1.1
SETB P1.1
DJNZ R6,LOOP3
CLR P1.5
ACALL DELAY
SETB P1.5
RET
BIT4: MOV R6,#08H ;显示第四个字节(时的高位)的子程序
LOOP4: RLC A
MOV P1.0,C
CLR P1.1
SETB P1.1
DJNZ R6,LOOP4
CLR P1.6
ACALL DELAY
SETB P1.6
RET
ALARM: MOV A,R1 ;闹铃判断子程序,判断闹铃是否与时间各位相等
CJNE A,50H,RETURN ;分别判断,若不等则跳出
MOV A,R2
CJNE A,51H,RETURN
MOV A,R3
CJNE A,52H,RETURN
MOV A,R4
CJNE A,53H,RETURN
MOV R6,#03H
MING: LCALL DOL ;若各位都相等,则驱动闹铃,响音乐
LCALL DOL
LCALL SOL
LCALL SOL
LCALL LA
LCALL LA
LCALL SOL
LCALL SOL
LCALL FA
LCALL FA
LCALL MI
LCALL MI
LCALL RE
LCALL RE
LCALL DOL
RETURN:RET ;返回
DOL:MOV R4,#131 ;低音DO子程序
DOL05:MOV TMOD,#11H
MOV TL1,#21H
MOV TH1,#0F9H
SETB TR1
WAIT1:JNB TF1,WAIT1
CLR TF1
CPL P1.7
DJNZ R4,DOL05
RET ;返回
RE:MOV R4,#147 ;RE子程序
RE05:MOV TMOD,#11H
MOV TL1,#0E1H
MOV TH1,#0F9H
SETB TR1
WAIT2:JNB TF1,WAIT2
CLR TF1
CPL P1.7
DJNZ R4,RE05
RET ;返回
MI:MOV R4,#165 ;MI子程序
MI05:MOV TMOD,#11H
MOV TL1,#8CH
MOV TH1,#0FAH
SETB TR1
WAIT3:JNB TF1,WAIT3
CLR TF1
CPL P1.7
DJNZ R4,MI05
RET ;返回
FA:MOV R4,#179 ;FA子程序
FA05:MOV TMOD,#11H
MOV TL1,#0D8H
MOV TH1,#0FAH
SETB TR1
WAIT4:JNB TF1,WAIT4
CLR TF1
CPL P1.7
DJNZ R4,FA05
RET ;返回
SOL:MOV R4,#192 ;SOL子程序
SOL05:MOV TMOD,#11H
MOV TL1,#68H
MOV TH1,#0FBH
SETB TR1
WAIT5:JNB TF1,WAIT5
CLR TF1
CPL P1.7
DJNZ R4,SOL05
RET ;返回
LA:MOV R4,#220 ;LA子程序
LA05:MOV TMOD,#11H
MOV TL1,#0E9H
MOV TH1,#0FBH
SETB TR1
WAIT6:JNB TF1,WAIT6
CLR TF1
CPL P1.7
DJNZ R4,LA05
RET ;返回
XI:MOV R4,#247 ;XI子程序
XI05:MOV TMOD,#11H
MOV TL1,#5BH
MOV TH1,#0FCH
SETB TR1
WAIT7:JNB TF1,WAIT7
CLR TF1
CPL P1.7
DJNZ R4,XI05
RET ;返回
DOH:MOV R4,#255 ;高音DO子程序
DOH05:MOV TMOD,#11H
MOV TL1,#8FH
MOV TH1,#0FCH
SETB TR1
WAIT8:JNB TF1,WAIT8
CLR TF1
CPL P1.7
DJNZ R4,DOH05
RET ;返回
TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
RET ;将数码管中显示的0~9分别对应的数存入TABLE开始的一段程序存储器中
SETALARM:MOV 40H,R1 ;闹铃设定子程序,保存当前时间
MOV 41H,R2
MOV 42H,R3
MOV 43H,R4
MOV R1,50H ;将初始设定的闹铃时间赋给偏移量R1~R4
MOV R2,51H
MOV R3,52H
MOV R4,53H
ACALL DISPLAY ;显示闹铃时间
KS: JB P3.4,LK0 ;闹铃设置逻辑,当P3.4口为低电平时,设定分(LK0为DISPLAY子程序)
CJNE R1,#09H,LL0 ;当P3.4口为低电平时,不断加一,低位为9时,进位
MOV R1,#00H
CJNE R2,#05H,LL1
MOV R2,#00H ;当为59分时,清零
AJMP LK0
LL1: INC R2
AJMP LK0
LL0: INC R1
LK0: ACALL DISPLAY ;设定一次显示一次时间
JB P3.5,LK1 ;P3.5口为低电平时,设定时(LK1为子程序)
CJNE R4,#02H,KK0
CJNE R3,#03H,KK1
MOV R3,#00H ;当时为23时,清零
MOV R4,#00H
AJMP LK1
KK1: INC R3
AJMP LK1
KK0: CJNE R3,#09H,KK1
MOV R3,#00H
INC R4
AJMP LK1
LK1: ACALL DISPLAY ;设定结束,显示设定时间
JNB P3.2,KS ;当控制闹铃设置的P3.2口变为高电平时,退出设定
MOV 50H,R1 ;保存闹铃时间
MOV 51H,R2
MOV 52H,R3
MOV 53H,R4
MOV R1,40H ;恢复时间
MOV R2,41H
MOV R3,42H
MOV R4,43H
ACALL DISPLAY ;显示时间
RET
SETCLOCK:JB P3.4,MN0 ;用P3.4口设定分,原理同闹铃设定,低电平有效
CJNE R1,#09H,MM0
MOV R1,#00H
CJNE R2,#05H,MM1
MOV R2,#00H
AJMP MN0
MM1: INC R2
AJMP MN0
MM0: INC R1
MN0: ACALL DISPLAY
JB P3.5,MN1 ;用P3.5口设定时,低电平有效
CJNE R4,#02H,NN0
CJNE R3,#03H,NN1
MOV R3,#00H
MOV R4,#00H
AJMP MN1
NN1: INC R3
AJMP MN1
NN0: CJNE R3,#09H,NN1
MOV R3,#00H
INC R4
AJMP MN1
MN1: ACALL DISPLAY
JNB P3.3,SETCLOCK ;若P3.3口仍处于低电平,继续处于时间设定状态
RET
DELAY1: MOV TH1,#0ECH ;5ms延时子程序
MOV TL1,#78H ;赋初值60536,实现5000次计数,历时5ms
CLR TF1
SETB TR1
WAIT: JNB TF1,WAIT
RET
DELAY:ACALL DELAY1
ACALL DELAY1
RET
END
8
展开阅读全文