一、 实验目的
学习8051定时器时间计时处理、按键扫描及LED数码管显示的设计方法。
二、 设计任务及要求
利用实验平台上4个LED数码管, 设计带有闹铃功能的数字时钟,要求: 1. 在4位数码管上显示当前时间,显示格式为“时时分分” ; 2. 由LED闪动做秒显示;
3. 利用按键可对时间及闹玲进行设置,并可显示闹玲时间。当闹玲时间到蜂鸣器发出音乐,按停止键使可使闹玲声停止。
三、 工作原理及设计思路
利用单片机定时器完成计时功能,定时器0计时中断程序每隔5ms中断一次并当作一个计数,每中断一次计数加1,当计数200次时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要数据锁存器等较多硬件,可采用动态显示法实现LED显示。
闹铃声由交流蜂鸣器产生,电路如右图,当P1.7输出不同频率的方波,蜂鸣器便会发出不同的声音。
四、电路设计及描述
(1) 硬件连接部分:
在ZKS-03单片机综合实验仪上有四位共阳LED数码管,其标号分别为LED1~LED4。为了节省MCU的I/O口,采用串行接口方式,它仅占用系统2个I/O口,即P1.0口和P1.1口,一个用作数据线SDA,另一个用作时钟信号线CLK,
它们都通过跳线选择器JP1相连。
由于采用共阳LED数码管,它的阴极分别通过限流电阻R20~R27连接到控制KD_0~KD_Q7。这样控制8个发光二极管,就需要8个I/O口。但由于单片机的I/O口资源是有限的,因此常采用实验电路所示的串并转换电路来扩充系统资源。串并转换电路其实质是一个串入并处的移位寄存器,串行数据再同步移位脉冲CLK的作用下经串行数据线SDA把数据移位到KD_0~KD_Q7端,这样仅需2根线就可以分别控制8个发光二极管的亮灭。而P0口只能作地址/数据总线,P2口只能作地址总线高8位,P3.0、P3.1作为串行输入、输出接口,实验仪上单片机可用作I/O的口仅有:P1.0--P1.7 ,8位;P3.2、P3.3、P3.4、P3.5 ,4位。其中:P1.0 用作数据线SDA,P1.1用作时钟信号CLK,所以P1.0和P1.1应该接对应跳线的A位,即跳线的中间和下面相连。P1.3、P1.4、P1.5和P1.6是四个数码管的位扫描线,其中P1.6对应数码管W1,显示小时高位;P1.5对应数码管W2,显示小时低位;P1.4对应数码管W3,显示分钟高位;P1.3对应数码管W4,显示分钟低位。P1.7连接蜂鸣器电路,输出不同频率的方波,使其发出不同的声音。P1.2 用来控制秒的闪烁显示。故,P1.2也应该接对应跳线的A位。
其显示电路如下图所示:
P3.2、P3.3、P3.4、P3.5分别连接单刀双掷开关S1、S2、S3、S4,从而输入高低电平。将S2 S1 定义为功能模式选择开关;S3 定义为分钟数调整开关;S4 定义为小时数调整开关。
当S2 S1=00时,显示当前时间,不进行任何操作。
当S2 S1=01时, 显示当前时间,同时可进行时钟调整,若S3=1,分钟数持续加1,
若S4=1,小时数持续加1。
当S2 S1=10时,显示闹钟时间,同时可进行闹钟调整,若S3=1,分钟数持续加1,若S4=1,小时数持续加1。
当S2 S1=11 时,显示当前时间,同时关闭闹钟。 7段显示器的字形与共阳极时编码的对应关系如下表:
显示字符 0 1 2 3 4 5 6 段码 COH F9H A4H B0H 99H 92H 82H 显示字符 7 8 9 A B 无显示 … 段码 F8H 80H 90H 88H 83H FFH … (2)音节设置原理:
由不同频率的方波产生,音节与频率的关系如表1所示。要产生音频方波,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用计时器计时此半周期时间,每当计时到后就将输出方波的I/0反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚得到此频率的方波。在ZKS-03实验仪上,产生方波的I/O脚选用P1.7,通过跳线选择器JP1将单片机的P1.7与蜂鸣器的驱动电路相连。这样P1.7输出不同频率的方波,蜂鸣器便会发出不同的声音。另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。只要设定延时时间,就可求得节拍的时间。延时作为基本延
时时间,节拍值只能是它的整数倍,
每个音节相应的定时器初值X可按下法计算:
1616
(1/2)*(1/f)=(12/fose)*(2-x) 即 x=2-(fose/24f)
其中f:音调频率,当晶振fose=11.0592MHz时,音节“1”相应的定时器初值为x,则可得x=63777D=F921H 其它的可同样求得。在单片机上控制一个音符唱多长可采用循环延时的方法来实现。将乐谱中的每个音符的音调及节拍变换成相应的音调参数和节拍参数,将他们做成数据表格,存放在存储器中,通过程序取出一个音符的相关参数,播放该音符,该音符唱完后,接着取出下一个音符的相关参数……,如此直到播放完毕最后一个音符,根据需要也可循环不停地播放整个乐曲。另外,对于乐曲中的休止符,一般将其音调参数设为FFH,FFH,其节拍参数与其他音符的节拍参数确定方法一致,乐曲结束用节拍参数为00H来表示。
(3)实验流程图:
开始 设置端口,初值,程序初始化,开计数器中断,启动计数 调用时间显示,闹铃判断子程序,扫描按键 N T0溢出 闹铃时间到? N Y 时钟走时中断服务程序 按键 Y 闹铃中断服务程序 N 各按键子程序 Y
闹钟模块:
计数模块:闹铃中断 N 闹铃开关 Y 比较闹铃时间与当N 前时间是否相等 Y 响音乐 N 停止? Y 中断返回
定时器0中断 Y 中断100次? N N 中断200次? Y 59秒? Y 秒清0 秒指示灯亮 秒+1 N 秒指示灯灭 59分? N Y 分清0 分+1 23小时? Y 小时清0 N 小时+1 中断返回
五、源程序代码及注释
注:首先将单片机用到的主要寄存器做下说明(如下); P1.2 作秒的闪烁控制位; P1.7 作响铃控制电平;
P3.2 、P3.3 作模式选择键S2、S1; P3.4 作分调整键S3(分钟数+1);
P3.5 作时调整键S4(小时数+1);
R0为计数5ms的次数;R1为秒数;R2为分钟数;R3为时钟数; R4 在显示程序中作为向LED传递数据时的左移次数标志位; R4 在音乐闹铃程序中读取TABLE中的数据; R5作为节拍长度;
40H 作显示的分;41H 作显示的时;42H 作闹钟的分;43H 作闹钟的时; 63H、H 存放延时程序DELAY的延时数; 60H、61H 作定时器T1的初值。 ;******************************
***************************************** S1 S2 S3 S4 SDA
BIT P3.2 BIT P3.3 BIT P3.4 BIT P3.5 BIT P1.0
;定义时调整键S4,分调整键S3
;定义模式选择键S2、S1
主
程
序
CLK BIT P1.1 ORG 0000H AJMP MAIN ORG
000BH
;T0的中断服务程序的入口地址
AJMP TIMER ORG
;跳转到时钟走时中断服务程序
;T1的中断服务程序的入口地址
001BH
AJMP ALARM_OPEN ;跳转到闹钟响铃中断服务程序
ORG 0030H
MAIN: MOV 40H,#00 ;显示的分
MOV 41H,#00 ;显示的时 MOV 42H,#58 ;闹钟的分 MOV 43H,#23 ;闹钟的时
MOV R0,#00H ;寄存器清零(RO为计数5ms的次数,R1为秒数,
MOV R1,#00H MOV R2,#00H MOV R3,#00H
MOV TMOD,#11H ;设置T0,T1处于工作方式1 MOV TH0,#0EEH ;设置定时器的初值
;R2为分钟数,R3为时钟数)
MOV TL0,#00H
SETB EA SETB
;允许总中断
;允许T0,T1中断
ET0
SETB ET1 SETB TR0
;启动T0
LOOP: LCALL DISPLAY1 ;调用显示程序 LCALL ALARM
;调用闹铃程序
;调用模式判断程序
LCALL MODE AJMP LOOP
;************************************
时钟显示部分
***************************** DISPLAY1:
MOV DPTR,#TAB1
MOV A,41H MOV B,#10
DIV AB
LCALL DISP1 CLR P1.6
LCALL DELAY SETB P1.6 JB P1.2,TD
AJMP TD1 TD:
MOV A,B
AJMP TD2
TD1:
MOV A,B
ADD A,#10 TD2:
LCALL DISP1
CLR P1.5 LCALL DELAY SETB P1.5 MOV A,40H MOV
B,#10
;LED1数码管显示数码,即小时的高位
;控制LED2数码管的小数点\"dp\"闪烁
;LED2数码管显示数码,即小时的低位
DIV AB LCALL DISP1 CLR P1.4
;LED3数码管显示数码,即分钟的高位
LCALL DELAY SETB MOV
P1.4 A,B
LCALL DISP1 CLR P1.3
;LED4数码管显示数码,即分钟的低位
LCALL DELAY SETB RET
DISP1: MOVC A,@A+DPTR MOV DUP1: RLC
R4,#08H
;LED串并转换口从P1.0接收
;R4记作左循环的次数
P1.3
A ;A带进位左循环移位
MOV SDA,C
;上升沿触发数据接收
CLR CLK SETB DJNZ RET
CLK R4,DUP1
;************************************ ***************************** DISPLAY2:
闹钟显示部分
MOV DPTR,#TAB1 MOV A,43H MOV B,#10 DIV
AB
LCALL DISP2 CLR
P1.6
LCALL DELAY SETB P1.6 MOV A,B LCALL DISP2 CLR
P1.5
LCALL DELAY SETB P1.5 MOV A,42H MOV B,#10 DIV
AB
LCALL DISP2 CLR
P1.4
LCALL DELAY SETB P1.4 MOV A,B LCALL DISP2
;LED1数码管显示数码,即小时的高位;LED2数码管显示数码,即小时的低位;LED3数码管显示数码,即分钟的高位
CLR P1.3 ;LED4数码管显示数码,即分钟的低位
LCALL DELAY SETB P1.3
RET
DISP2: MOVC A,@A+DPTR ;LED串并转换口从P1.0接收
MOV R4,#08H
;R4记作左循环的次数
DUP2: RLC A
;A带进位左循环移位
MOV SDA,C CLR
CLK
;上升沿触发数据接收
SETB CLK DJNZ R4,DUP2
RET
;******************************** 判断闹钟时间是************************* ALARM: MOV A,40H
CJNE A,#00H,MUSIC
;整点闹铃
LJMP B2
MUSIC: MOV A,43H CJNE A,41H,B1 MOV A,42H CJNE A,40H,B1
;音乐闹铃
否到来
SETB P1.7
MOV 70H,#00H
NEXT: MOV A,70H
MOV DPTR,#TABLE
MOVC A,@A+DPTR MOV R4,A
JZ
END0
ANL A,#0FH MOV R5,A
MOV A,R4 SWAP A ANL A,#0FH JNZ SING CLR
TR1
JMP D1 SING: DEC A MOV 62H,A RL A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR MOV TH1,A
MOV 61H,A
;从TABLE中读取数据——声响时间
;将TABLE中读取的数据存放在R4 ;R5作为节拍长度
;从TABLE1中读取数据——声调
;设定TH1值 MOV A,62H RL A INC
A
MOVC A,@A+DPTR MOV TL1,A MOV 60H,A MOV TH1,61H MOV TL1,60H SETB TR1 D1: ACALL DELAY0
INC
70H
LCALL MODE
JMP NEXT
END0: CLR TR1
JMP MUSIC
DELAY0:
MOV R7,#2 D2: MOV R6,#214 D3:
MOV R4,#245
DJNZ R4,$ DJNZ R6,D3
DJNZ R7,D2
;设定TL1值
;声音延时
;R5的值就是声响持续时间
DJNZ R5,DELAY0 RET
B1:
CLR
TR1
RET
B2: MOV 61H,#0FEH MOV 60H,#033H
MOV TH1,61H
MOV TL1,60H
SETB TR1
;******************************** ************************ ALARM_OPEN:
PUSH ACC
PUSH PSW MOV TH1,61H MOV TL1,60H CPL
P1.7
POP PSW POP ACC
RETI
;******************************** *************************
;方波频率设为1KHz
钟响铃中钟走时中断服断服务程务程序序
闹时TIMER: MOV TH0,#0ECH MOV TL0,#78H MOV 40H,R2 MOV 41H,R3 INC
R0
;重新对T0赋值,设置中断时间为5ms
;计数5ms的次数加1 ;不够200次,跳转到BACK
;够200次,P1.2翻转控制LED闪动一下 ;计数5ms的次数清0,秒数加1
CJNE R0,#200,BACK CPL
P1.2
MOV R0,#00H INC
R1
CJNE R1,#60,BACK MOV R1,#00H INC
R2
;不够60秒,跳转到BACK ;够60秒,秒数清0,分钟加1
CJNE R2,#60,BACK MOV R2,#00H INC
R3
;够60分钟,跳转到BACK
;够60分钟,分钟数清0,小时数加1
CJNE R3,#24,BACK MOV R3,#00H BACK: RETI
;够24小时,跳转到BACK ;够24小时,小时数清0
;*********************************** ***************************** MODE: MOV A,P3
按键判断部分
;软件消抖后再判断
LCALL DELAY
CJNE A,P3,MODE
;对S2、S1的值判断
ANL A,#0CH CJNE AJMP
A,#00H,LOP1 T_BACK
;模式为00,开T1中断
LOP1: CJNE A,#04H,LOP2 AJMP
T_CHANGE
;模式为01,进行时间调整
LOP2: CJNE A,#08H,LOP3 AJMP
A_CHANGE
;模式为10,进行闹铃调整
LOP3: AJMP A_CLOSE ;模式为11,关闭闹钟
;............................. 时钟调整 ............................... T_CHANGE:
LCALL DISPLAY1
LCALL DELAY1 JNB S3,T_HOUR T_MIN: MOV R5,40H
INC
R5
;S3为1,分钟数加1
;S3为0,判断S4
CJNE R5,#60,LOP4 MOV R5,#00H
LOP4: MOV 40H,R5 MOV
R2,40H
AJMP MODE T_HOUR:
JNB S4,MODE MOV
;S4为0,跳转到MODE
R5,41H
INC R5 CJNE MOV
R5,#24,LOP5 R5,#00H
LOP5: MOV 41H,R5 MOV AJMP
R3,41H MODE
;............................. 闹铃调整 ................................ A_CHANGE:
LCALL DISPLAY2
LCALL DELAY2 JNB S3,A_HOUR A_MIN: MOV R5,42H INC R5 CJNE MOV
;S3为1,分钟数加1
;S3为0,判断S4
R5,#60,LOP6 R5,#00H
LOP6: MOV 42H,R5 AJMP MODE A_HOUR: JNB S4,MODE MOV
;S4为0,跳转到MODE
R5,43H
INC R5 ;S4为1,小时数加1
CJNE R5,#24,LOP7 MOV
R5,#00H
LOP7: MOV 43H,R5 AJMP
MODE
;............................ 返回 ................................. T_BACK:
SETB ET1
;开T1中断
RET A_CLOSE:
CLR
ET1
;关T1中断
RET
;************************************ 延
******************************** DELAY: MOV 63H,#5H
D5:
MOV H,#0FFH
DJNZ H,$ DJNZ 63H,D5 RET
;************************************ 延
********************************
时
程
程
序序
1
时
DELAY1:
MOV R7,#50H D6:
LCALL DISPLAY1
DJNZ R7,D6 RET
;************************************ ******************************** DELAY2:
延
时
程
序
2
MOV R7,#50H D7:
LCALL DISPLAY2
DJNZ R7,D7 RET
;******************************** ***************************
TAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;数字0~9,不带小数点\"dp\"
DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H ;********************************** *******************************
TABLE: DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H
DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
音
乐
;数字0~9,带小数点\"dp\"
的
节
拍
表
数
码
管
显
示
的
字
形
表
DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H DB 82H,01H,81H,94H,84H,0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H DB 00H
由音乐音符设置的
T1
计数值
;*************************** **************************
TABLE1: DW 260,440,524,580,684,777,820,8 ;音符计数值 END
DW 968,65030,65058,65110,65157,65178,65217
六、实验过程:
启动Keil,新建一个工程,然后选择芯片(Philips——P80/P87C52X2)。编写汇编语言程序,保存并添加至工程中,然后进行编译。进行调试,直至程序正确,将P1.0、P1.1、P1.3、P1.4、P1.5、P1.6、P3.0、P3.1的跳线接相应的A位,P1.7的跳线接相应的C位,拔掉其它不用的跳线。插好电源,插好通信线,打开实验仪电源开关,在实验上将工作模式开关SX拨到“LOAD”一档,按下复位开头RESET,然后启动DPFlash,进行程序装载,地址将会改变,单击“编程”,选择编程文件区,若出现错误,将实验台上的工作模式开关SX拨到“MON”位置,按下RESET复位开关,设置S0、S1、S3和S4的状态,再运行程序,拨动S0、S1、S3和S4对应的开头,检查电子时钟功能是否完整。
多次调试、修改程序,直至功能实现。相应截图如下:
实验感想:
七、实验感想:
本次实验做的还是比较艰难的.实验过程中我们遇到了很多很多的问题.首先是程序,不知道一开始有什么问题,实验程序就是不行,结果换了好几次才敲定了最终的程序.有了程序并不代表我们就成功了.我们也是在这里意识到理论和现实有多么大的差距,不知道调试了多少次,不是信号中断就是没有现象.当时都有些灰心了.不知跑了多少趟实验室换了多少个实验箱.这次实验我们算是得到了磨练.每当我们想放弃的时候我们都在互相鼓励.遇到的问题多不一定是件坏事,遇到的困难多了,我们了解电路板了解这个实验就更多了.
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务