1、数字电子技术实验报告 (一) 实验目的 学习 8051定时器时间计时处理、按键扫描及 LED数码管显示的设计方法。 (二) 设计任务及要求 利用实验平台上 4 个 LED数码管, 设计带有闹铃功能的数字时钟,要求: 1. 在 4 位数码管上显示当前时间。显示格式“时时分分” 2. 由 LED闪动做秒显示。 3. 利用按键可对时间及闹玲进行设置,并可显示闹玲时间。当闹玲时间到蜂鸣器发 出声响,按停止键使可使闹玲声停止。 (三)工作原理及设计思路 利用单片机定时器完成计时功能,定时器 0 计时中断程序每隔 5ms 中断一次并当作一个计数,每中断
2、一次计数加 1,当计数 200 次时,则表示 1s 到了,秒变量加 1,同理再判断是否 1min 钟到了,再判断是否 1h 到了。为了将时间在 LED 数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要数据锁存器等较多硬件,可采用动态显示法实现 LED显示。其显示电路如图 1 闹铃声由交流蜂鸣器产生,电路如图 2,当 P1.7 输出不同频率的方波,.蜂鸣器便会发出不同的声音。 (四)设计方案 1.软件实现数字时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现1秒定时中断,每
3、产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。该方案具有硬件电路简单的特点。但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。 2.数码管显示: 方案一:静态显示。所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。该方式每一位都需要一个8 位输出口控制。静态显示时较小的电流能获得较高的亮度,且字符不闪烁。但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资
4、源的浪费。 方案二:动态显示。所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口,降低了能耗。 从节省I/O口和降低能耗出发,本设计采用方案二。 (五)源程序 ORG 0000H MAIN: CLR EA ;程序初始化 CLR PSW.3 ;选择寄存器组0 CLR
5、 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
6、 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 P
7、3.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
8、 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
9、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,
10、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 BIT
11、2 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中
12、 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 ;置位
13、 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: RL
14、C 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
15、 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
16、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
17、 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 ;返回
18、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
19、 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
20、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
21、 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 ;高音D
22、O子程序 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分别对应的数存入TA
23、BLE开始的一段程序存储器中 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 P
24、3.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: AC
25、ALL 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
26、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 ;恢复时间
27、 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
28、 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,#0
29、0H 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






