当前位置:文档之家› 电子时钟实验报告_电子时钟

电子时钟实验报告_电子时钟

电子时钟实验报告一、实验目的学习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,从而输入高低电平。

将S2S1定义为功能模式选择开关;S3定义为分钟数调整开关;S4定义为小时数调整开关。

当S2S1=00时,显示当前时间,不进行任何操作。

当S2S1=01时,显示当前时间,同时可进行时钟调整,若S3=1,分钟数持续加1,若S4=1,小时数持续加1。

当S2S1=10时,显示闹钟时间,同时可进行闹钟调整,若S3=1,分钟数持续加1,若S4=1,小时数持续加1。

当S2S1=11时,显示当前时间,同时关闭闹钟。

7段显示器的字形与共阳极时编码的对应关系如下表:(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可按下法计算:(1/2)*(1/f)=(12/fose)*(216-x)即x=216-(fose/24f)其中f:音调频率,当晶振fose=11.0592MHz时,音节“1”相应的定时器初值为x,则可得x=63777D=F921H其它的可同样求得。

在单片机上控制一个音符唱多长可采用循环延时的方法来实现。

将乐谱中的每个音符的音调及节拍变换成相应的音调参数和节拍参数,将他们做成数据表格,存放在存储器中,通过程序取出一个音符的相关参数,播放该音符,该音符唱完后,接着取出下一个音符的相关参数……,如此直到播放完毕最后一个音符,根据需要也可循环不停地播放整个乐曲。

另外,对于乐曲中的休止符,一般将其音调参数设为FFH,FFH,其节拍参数与其他音符的节拍参数确定方法一致,乐曲结束用节拍参数为00H来表示。

(3)实验流程图:闹钟模块:计数模块:五、源程序代码及注释注:首先将单片机用到的主要寄存器做下说明(如下);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、64H存放延时程序DELAY的延时数;60H、61H作定时器T1的初值。

;******************************主程序*****************************************S1 BIT P3.2 ;定义模式选择键S2、S1S2 BIT P3.3S3 BIT P3.4 ;定义时调整键S4,分调整键S3S4 BIT P3.5SDA BIT P1.0CLK BIT P1.1ORG0000HAJMP MAINORG 000BH ;T0的中断服务程序的入口地址AJMP TIMER ;跳转到时钟走时中断服务程序ORG 001BH ;T1的中断服务程序的入口地址AJMP ALARM_OPEN ;跳转到闹钟响铃中断服务程序ORG0030HMAIN: MOV 40H,#00 ;显示的分MOV 41H,#00 ;显示的时MOV 42H,#58 ;闹钟的分MOV 43H,#23 ;闹钟的时MOV R0,#00H;寄存器清零(RO为计数5ms的次数,R1为秒数,MOV R1,#00H ;R2为分钟数,R3为时钟数)MOV R2,#00HMOV R3,#00HMOV TMOD,#11H;设置T0,T1处于工作方式1MOV TH0,#0EEH;设置定时器的初值MOV TL0,#00HSETB EA ;允许总中断SETB ET0 ;允许T0,T1中断SETB ET1SETB TR0 ;启动T0LOOP: LCALL DISPLAY1 ;调用显示程序LCALL ALARM ;调用闹铃程序LCALL MODE ;调用模式判断程序AJMP LOOP;************************************时钟显示部分*****************************DISPLAY1:MOV DPTR,#TAB1MOV A,41HMOV B,#10DIV ABLCALL DISP1CLR P1.6 ;LED1数码管显示数码,即小时的高位LCALL DELAYSETB P1.6JB P1.2,TD ;控制LED2数码管的小数点"dp"闪烁AJMP TD1TD: MOV A,BAJMP TD2TD1: MOV A,BADD A,#10TD2: LCALL DISP1 ;LED2数码管显示数码,即小时的低位CLR P1.5LCALL DELAYSETB P1.5MOV A,40HMOV B,#10DIV ABLCALL DISP1CLR P1.4 ;LED3数码管显示数码,即分钟的高位LCALL DELAYSETB P1.4MOV A,BLCALL DISP1CLR P1.3 ;LED4数码管显示数码,即分钟的低位LCALL DELAYSETB P1.3RETDISP1: MOVC A,@A+DPTR ;LED串并转换口从P1.0接收MOV R4,#08H ;R4记作左循环的次数DUP1: RLC A ;A带进位左循环移位MOV SDA,CCLR CLK ;上升沿触发数据接收SETB CLKDJNZ R4,DUP1RET;************************************闹钟显示部分*****************************DISPLAY2:MOV DPTR,#TAB1MOV A,43HMOV B,#10DIV ABLCALL DISP2CLR P1.6 ;LED1数码管显示数码,即小时的高位LCALL DELAYSETB P1.6MOV A,BLCALL DISP2CLR P1.5 ;LED2数码管显示数码,即小时的低位LCALL DELAYSETB P1.5MOV A,42HMOV B,#10DIV ABLCALL DISP2CLR P1.4 ;LED3数码管显示数码,即分钟的高位LCALL DELAYSETB P1.4MOV A,BLCALL DISP2CLR P1.3 ;LED4数码管显示数码,即分钟的低位LCALL DELAYSETB P1.3RETDISP2: MOVC A,@A+DPTR ;LED串并转换口从P1.0接收MOV R4,#08H ;R4记作左循环的次数DUP2: RLC A ;A带进位左循环移位MOV SDA,CCLR CLK ;上升沿触发数据接收SETB CLKDJNZ R4,DUP2RET;********************************判断闹钟时间是否到来*************************ALARM:MOV A,40HCJNE A,#00H,MUSIC ;整点闹铃LJMP B2MUSIC: MOV A,43HCJNE A,41H,B1MOV A,42HCJNE A,40H,B1 ;音乐闹铃SETB P1.7MOV 70H,#00HNEXT: MOV A,70HMOV DPTR,#TABLE ;从TABLE中读取数据——声响时间MOVC A,@A+DPTRMOV R4,A ;将TABLE中读取的数据存放在R4JZ END0ANL A,#0FHMOV R5,A ;R5作为节拍长度MOV A,R4SWAP AANL A,#0FHJNZ SINGCLR TR1JMP D1SING: DEC AMOV 62H,ARL AMOV DPTR,#TABLE1 ;从TABLE1中读取数据——声调MOVC A,@A+DPTRMOV TH1,A ;设定TH1值MOV 61H,AMOV A,62HRL AINC AMOVC A,@A+DPTRMOV TL1,A ;设定TL1值MOV 60H,AMOV TH1,61HMOV TL1,60HSETB TR1D1: ACALL DELAY0 ;声音延时INC 70HLCALLMODEJMP NEXTEND0: CLR TR1JMP MUSICDELAY0:MOV R7,#2 ;R5的值就是声响持续时间D2: MOV R6,#214D3: MOV R4,#245DJNZ R4,$DJNZ R6,D3DJNZ R7,D2DJNZ R5,DELAY0RETB1: CLR TR1RETB2:MOV 61H,#0FEHMOV 60H,#033HMOV TH1,61HMOV TL1,60H ;方波频率设为1KHzSETB TR1;********************************闹钟响铃中断服务程序************************ALARM_OPEN:PUSH ACCPUSH PSWMOV TH1,61HMOV TL1,60HCPL P1.7POP PSWPOP ACCRETI;********************************时钟走时中断服务程序*************************TIMER: MOV TH0,#0ECH ;重新对T0赋值,设置中断时间为5ms MOV TL0,#78HMOV 40H,R2MOV 41H,R3INC R0 ;计数5ms的次数加1CJNE R0,#200,BACK ;不够200次,跳转到BACKCPL P1.2 ;够200次,P1.2翻转控制LED闪动一下MOV R0,#00H ;计数5ms的次数清0,秒数加1INC R1CJNE R1,#60,BACK ;不够60秒,跳转到BACKMOV R1,#00H ;够60秒,秒数清0,分钟加1INC R2CJNE R2,#60,BACK ;够60分钟,跳转到BACKMOV R2,#00H ;够60分钟,分钟数清0,小时数加1INC R3CJNE R3,#24,BACK ;够24小时,跳转到BACKMOV R3,#00H ;够24小时,小时数清0BACK: RETI;***********************************按键判断部分*****************************MODE: MOV A,P3 ;软件消抖后再判断LCALL DELAYCJNE A,P3,MODEANL A,#0CH ;对S2、S1的值判断CJNE A,#00H,LOP1AJMP T_BACK ;模式为00,开T1中断LOP1: CJNE A,#04H,LOP2AJMP T_CHANGE ;模式为01,进行时间调整LOP2: CJNE A,#08H,LOP3AJMP A_CHANGE ;模式为10,进行闹铃调整LOP3: AJMP A_CLOSE ;模式为11,关闭闹钟;.............................时钟调整...............................T_CHANGE:LCALL DISPLAY1LCALL DELAY1JNB S3,T_HOUR ;S3为0,判断S4T_MIN: MOV R5,40HINC R5 ;S3为1,分钟数加1CJNE R5,#60,LOP4MOV R5,#00HLOP4: MOV 40H,R5MOV R2,40HAJMP MODET_HOUR:JNB S4,MODE ;S4为0,跳转到MODE MOV R5,41HINC R5CJNE R5,#24,LOP5MOV R5,#00HLOP5: MOV 41H,R5MOV R3,41HAJMP MODE ;.............................闹铃调整................................A_CHANGE:LCALL DISPLAY2LCALL DELAY2JNB S3,A_HOUR ;S3为0,判断S4A_MIN: MOV R5,42HINC R5 ;S3为1,分钟数加1CJNE R5,#60,LOP6MOV R5,#00HLOP6: MOV 42H,R5AJMP MODEA_HOUR:JNB S4,MODE ;S4为0,跳转到MODEMOV R5,43HINC R5 ;S4为1,小时数加1CJNE R5,#24,LOP7MOV R5,#00HLOP7: MOV 43H,R5AJMP MODE ;............................返回.................................T_BACK:SETB ET1 ;开T1中断RETA_CLOSE:CLR ET1 ;关T1中断RET;************************************延时程序********************************DELAY:MOV 63H,#5HD5: MOV 64H,#0FFHDJNZ 64H,$DJNZ 63H,D5RET;************************************延时程序1********************************DELAY1:MOV R7,#50HD6: LCALL DISPLAY1DJNZ R7,D6RET;************************************延时程序2********************************DELAY2:MOV R7,#50HD7: LCALL DISPLAY2DJNZ R7,D7RET;********************************数码管显示的字形表***************************TAB1:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;数字0~9,不带小数点"dp"DB40H,79H,24H,30H,19H,12H,02H,78H,00H,10H ;数字0~9,带小数点"dp";**********************************音乐的节拍表*******************************TABLE: DB82H,01H,81H,94H,84H,0B4H,0A4H,04HDB82H,01H,81H,94H,84H,0C4H,0B4H,04HDB82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94HDB0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04HDB82H,01H,81H,94H,84H,0B4H,0A4H,94HDB0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04HDB82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94HDB0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04HDB00H;***************************由音乐音符设置的T1计数值**************************TABLE1: D W64260,64440,64524,64580,64684,64777,64820,64898 ;音符计数值DW64968,65030,65058,65110,65157,65178,65217END六、实验过程:启动Keil,新建一个工程,然后选择芯片(Philips——P80/P87C52X2)。

相关主题