电子时钟实验报告-电子时钟.docx
电子时钟实验报告一、实验目的学习8051定时器时间计时处理、按键扫描及1.ED数码管显示的设计方法。二、设计任务及要求利用实验平台上4个1.ED数码管,设计带有闹铃功能的数字时钟,要求:1 .在4位数码管上显示当前时间,显示格式为“时时分分”;2 .由1.ED闪动做秒显小;3 .利用按键可对时间及闹玲进行设置,并可显示闹玲时间。当闹玲时间到蜂鸣器发出音乐,按停止键使可使闹玲声停止。三、工作原理及设计思路利用单片机定时器完成计时功能,定时器0计时中断程序每隔5ms中断一次并当作一个计数,每中断一次计数加1,当计数200次时,那么表示IS到了,秒变量加1,同理再判断是否Imin钟到了,再判断是否Ih到了。为了将时间在1.ED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要数据锁存器等较多硬件,可采用动态显示法实现1.ED显示。闹铃声由交流蜂鸣器产生,电路如右图,当P1.7输出不同频率的方波,蜂鸣器便会发出不同的声音。四、电路设计及描述(1)硬件连接局部:在ZKS-03单片机综合实验仪上有四位共阳1.ED数码管,其标号分别为1.ED11.ED4.为了节省MCU的I/O口,采用串行接口方式,它仅占用系统2个I/O口,即P1.O口和P1.l口,一个用作数据线SDA,另一个用作时钟信号线C1.K,它们都通过跳线选择器JPI相连。由于采用共阳1.ED数码管,它的阴极分别通过限流电阻R20-R27连接到控制KD_0KD_Q7。这样控制8个发光二极管,就需要8个I/O口。但由于单片机的I/O口资源是有限的,因此常采用实验电路所示的串并转换电路来扩充系统资源。串并转换电路其实质是一个串入并处的移位存放器,串行数据再同步移位脉冲C1.K的作用下经串行数据线SDA把数据移位到KD_0KD_Q7端,这样仅需2根线就可以分别控制8个发光二极管的亮灭。而Po口只能作地址/数据总线,P2口只能作地址总线高8位,P3.0、P3.1作为串行输入、输出接口,实验仪上单片机可用作I/O的口仅有:Pl.O-P1.7,8位;P3.2、P3.3、P3.4、P3.5,4位。其中:P1.0用作数据线SDA,P1.l用作时钟信号C1.K,所以P1.O和P1.l应该接对应跳线的A位,即跳线的中间和下面相连。PI.3、PI.4、P1.5和P1.6是四个数码管的位扫描线,其中P1.6对应数码管Wl,显示小时高位;P1.5对应数码管W2,显示小时低位;P1.4对应数码管W3,显示分钟高位;P1.3对应数码管W4,显示分钟低位。PI.7连接蜂鸣器电路,输出不同频率的方波,使其发出不同的声音。P1.2用来控制秒的闪烁显示。故,PI.2也应该接对应跳线的A位。其显示电路如下列图所示:P3.2、P3.3、P3.4、P3.5分别连接单刀双掷开关Sl、S2、S3、S4,从而输入上下电平。将S2S1定义为功能模式选择开关;S3定义为分钟数调整开关;S4定义为小时数调整开关。当S2Sl=OO时,显示当前时间,不进行任何操作。当S2Sl=Ol时,显示当前时间,同时可进行时钟调整,假设S3=l,分钟数持续加1,假设S4=l,小时数持续加1。当S2Sl=10时,显示闹钟时间,同时可进行闹钟调整,假设S3=l,分钟数持续加1,假设S4=l,小时数持续加1。当S2Sl=Il时,显示当前时间,同时关闭闹钟。7段显示器的字形与共阳极时编码的对应关系如下表:显TK字符段码显示字符段码0COH7F8H1F9H880H2A4H990H3BOHA88H499HB83H592H无显示FFH682H音节设置原理:由不同频率的方波产生,音节与频率的关系如表1所示。要产生音频方波,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用计时器计时此半周期时间,每当计时到后就将输出方波的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚得到此频率的方波。在ZKS-O3实验仪上,产生方波的I/O脚选用P1.7,通过跳线选择器JP相连。这样P1.7输出不同频率的方波,蜂鸣器便会发出不同的声音。另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。只要设定延时时间,就可求得节拍的时间。延时作为根本延时时间,节拍值只能是它的整数倍,每个音节相应的定时器初值X可按下法计算:(1/2)*(lf)=(12fose)*(2,6-)BPx=2,6-(fose24f)其中f:音调频率,当晶振fose=l1.0592MHz时,音节“1”相应的定时器初值为x,那么可得x=63777D=F921H其它的可同样求得。在单片机上控制一个音符唱多长可采用循环延时的方法来实现。将乐谱中的每个音符的音调及节拍变换成相应的音调参数和节拍参数,将他们做成数据表格,存放在存储器中,通过程序取出一个音符的相关参数,播放该音符,该音符唱完后,接着取出下一个音符的相关参数如此直到播放完毕最后一个音符,根据需要也可循环不停地播放整个乐曲。另外,对于乐曲中的休止符,一般将其音调参数设为FFH,FFH,其节拍参数与其他音符的节拍参数确定方法一致,乐曲结束用节拍参数为OoH来表示。实验流程图:、TO溢出I时钟走时中断效劳程序,按键Y>铃时间到?二闹铃中断效劳程序各按键r程序闹钟模块:计数模块:闹怜中断五、源程序代码及注释注:首先将单片机用到的主要存放器做下说明(如下);P1.2作秒的闪烁控制位;P1.7作响铃控制电平;P3.2、P3.3作模式选择键S2、S1;P3.4作分调整键S3(分钟数+1);P3.5作时调整键S4(小时数+1);RO为计数5ms的次数;Rl为秒数;R2为分钟数;R3为时钟数;R4在显示程序中作为向1.ED传递数据时的左移次数标志位;R4在音乐闹铃程序中读取TAB1.E中的数据;R5作为节拍长度;40H作显示的分;41H作显示的时;42H作闹钟的分;43H作闹钟的时;63H、64H存放延时程序DE1.AY的延时数:60H、61H作定时器Tl的初值。*/主程序*SlBITP3.2;定义模式选择键S2、SlS2S3BITP3.4;定义时调整键S4,分调整键S3S4ORGOOOOHAJMPMAINORGOOOBH;T0的中断效劳程序的入口地址AJMPTIMER;跳转到时钟走时中断效劳程序ORGOOlBH;T1的中断效劳程序的入口地址AJMPA1.ARM_OPEN;跳转到闹钟响铃中断效劳程序ORG0030HMAIN:MOV40Hz00;显示的分MOV41Hz00;显示的时MOV42H,#58;闹钟的分MOV43H,#23;闹钟的时MOVRO,#OOH;存放器清零(RO为计数5ms的次数,Rl为秒数,MOVRI,#OOH;R2为分钟数,R3为时钟数)MOVR2,#00HMOVR3,#00HMOVTMOD,#11H;设置TO,Tl处于工作方式1MOVTH0,#OEEH;设置定时器的初值MOVT1.0,#OOHSETBEA;允许总中断SETBETO;允许TO,Tl中断SETBETlSETBTRO;启动TO1.OOP:1.CA1.1.Displayi;调用显示程序1.CA1.1.A1.ARM;调用闹铃程序1.CA1.1.MODE;调用模式判断程序AJMP1.OOP.*时钟显示局部*DISP1.AY1:MOVDPTR,#TABlMOVAz41HMOVB,#10DIVAB1.CA1.1.DISPlC1.RP1.6;1.EDl数码管显示数码,即小时的高位1.CA1.1.DE1.AYSETBP1.6JBP1.2JD;控制1.ED2数码管的小数点”dp“闪烁AJMPTDlTD:MOVA,BAJMPTD2TDl:MOVAzBADDAz#10TD2:1.CA1.1.DISPl;1.ED2数码管显示数码,即小时的低位1.CA1.1.DE1.AYSETBP1.5MOVAz40HMOVB,#10DIVAB1.CA1.1.DISPlC1.RP1.4;1.ED3数码管显示数码,即分钟的高位1.CA1.1.DE1.AYSETBP1.4MOVAzB1.CA1.1.DISPlC1.RP1.3;1.ED4数码管显示数码,即分钟的低位1.CA1.1.DE1.AYSETBP1.3RETMOVR4,#08H;R4记作左循环的次数DUPl:R1.CA;A带进位左循环移位MOVSDA,CC1.RC1.K;上升沿触发数据接收SETBC1.KDJNZR4zDUPlRET*闹钟显月局*DISP1.AY2:Movdptr,#tabiMOVA,43HMOVB,#10DIVAB1.CA1.1.DISP2C1.RP1.6;1.EDl数码管显示数码,即小时的高位1.CA1.1.DE1.AYMOVAzB1.CA1.1.DISP2C1.RP1.5;1.ED2数码管显示数码,即小时的低位1.CA1.1.DE1.AYSETBPMOVAz42HMOVB,#10DIVAB1.CA1.1.DISP2C1.RP1.4;1.ED3数码管显示数码,即分钟的高位1.CA1.1.DE1.AYMOVAzB1.CA1.1.DISP2C1.RP1.3;1.ED4数码管显示数码,即分钟的低位1.CA1.1.DE1.AYRETMOVR4,#08H;R4记作左循环的次数DUP2:R1.CA;A带进位左循环移位MOVSDA,CC1.RC1.K;上升沿触发数据接收SETBC1.KDJNZR4zDUP2RET.*判断闹钟时间是否到¼*A1.ARM:MOVAz40HCJNEMOOH,MUSIC;整点闹铃UMPB2MUSIC:MOVAz43HCJNEAz41HzBlMOVAz42HCJNEMOHzBl;音乐闹铃MOV70H00HNEXT:MOVAz70HMOVDPTRATAB1.E;从TAB1.E中读取数据声响时间MOVCA,A+DPTRMOVR4zA;将TAB1.E中读取的数据存放在R4JZENDOAN1.A,#OFHMOVR5,A;R5作为节拍长度MOVAzR4SWAPAAN1.A,#OFHJNZSINCC1.RTRlJMPDlSING:DECAMOV62H,AR1.AMOVDPTR,#TAB1.El;从TAB1.El中读取数据一一声调MOVCA,A+DPTRMOVTHlzA;设定THl值MOV61H,AMOVAz62HR1.AINCAMOVCA,A+DPTRMOVT1.l,A;设定T1.l值MOV60H,AMOVTHlz61HMOVT1.lz60HSETBTRlDl:ACA1.1.DE1.AYO;声音延时INC70H1.CA1.1.MODEJMPNEXTENDO:C1.RTRlJMPMUSICDE1.AYO:MOVRR,#2/R5的值就是声响持续时间D2:MOVR6,#214D3:MOVR4,#245DJNZR4,$DJNZR6zD3DJNZR7zD2DJNZRSzDE1.AYORETBl:C1.RTRlRETB2:MOV61H,#0FEHMOV60H,#033HMOVTHlz61HMOVT1.1,6OH;方波频率设为IKHzSETBTRl.*9闹钟响铃中断效劳程序*A1.ARM_OPEN:PUSHACCPUSHPSWMOVTH61HMOVT1.lz60HPOPPSWPOPACCRETI*/时钟走时中断效劳程序*TIMER:MOVTHOzWECH;重新对TO赋值,设置中断时间为5msMOVT1.0,#78HMOV40H,R2MOV41H,R3INCRO;计数5ms的次数加1CJNERO,#200,BACK;不够200次,跳转到BACKMOVRO,#OOH;计数5ms的次数清0,秒数加1INCRlCINERl,#60,BACK;不够60秒,跳转到BAeKMOVR1,#OOH;够60秒,秒数清0,分钟加1INCR2CJNER2,#60,BACK;够60分钟,跳转到BACKMOVR2,#00H;够60分钟,分钟数清0,小时数加1INCR3CJNER3,#24,BACK;够24小时,跳转到BACKMOVR3,#00H;够24小时,小时数清OBACK:RETI.*按键判断局部*MODE:MOVA,P3;软件消抖后再判断1.CA1.1.DE1.AYCJNEAzP3,M0DEAN1.A,#OCH;对52、Sl的值判断CJNEMOOHz1.OPIAJMPT_BACK;模式为00,开Tl中断1.OPl:CJNEA,#04H,1.OP2AJMPT_CHANGE;模式为01,进行时间调整1.0P2:CJNEAzft08Hz1.OP3AJMPA_CHANGE;模式为10,进行闹铃调整1.0P3:AJMPA_C1.OSE;模式为11,关闭闹钟/时钟调整.T_CHANGE:1.CA1.1.Displayi1.CA1.1.DE1.AYlJNBS3,TJHOUR;S3为0,判断S4T_MIN:MOVR5z40HINCR5;S3为1,分钟数加1CJNER5,#60,1.OP4MOVR5z#00H1.0P4:MOV40H,R5MOVR2z40HAJMPMODET_HOUR:JNBS4,M0DE;S4为0,跳转到MODEMOVR5z41HINCR5CJNER5,#24,1.OP5MOVR5,#00H1.0P5:MOV41H,R5MOVR3z41HAJMPMODE闹铃调整.A_CHANGE:1.CA1.1.DISP1.AY21.CA1.1.DE1.AY2JNBS3,A.H0R;S3为0,判断S4AMIN:MOVR5,42HINCR5;S3为1.分钟数加1CJNER5,#60,1.OP6MOVR5,#00H1.0P6:MOV42H,R5AJMPMODEA_HOUR:JNBS4,M0DE;S4为0,跳转到MODEMOVR5z43HINCR5;S4为1,小时数加1CJNER5,#24,1.OP7MOVR5,#00H1.0P7:MOV43H,R5AJMPMODE;返回T_BACK:SETBETl;开Tl中断RETA_C1.OSE:C1.RETl;关Tl中断RET.*延时程序*DE1.AY:MOV63H,#5HD5:MOV64H,#OFFHDJNZ64H,$DJNZ63H,D5RET.*延时程序1*DE1.AYl:MOVR7z#50HD6:1.CA1.1.DisplayiDJNZR7zD6RET*延时2*DE1.AY2:MOVR7,#50HD7:1.CA1.1.DISP1.AY2DJNZR7zD7.*RET数不马管显示的字形表*TAB1:DBOCoH,0F9H,0A4H,OBOH,99H,92H,82H,0F8H,80H,90H;数字09,不带小数点“dp”DB40H,79H,24H,30H,19H,12H,02H,78H,00H,10H;数字09,带小数点,dp,'.*音乐的节拍表*TAB1.E:DB82H,01H,81H,94H,84H,0B4H,0A4H,04HDB82H,01H,81H,94H,84H,0C4H,0B4H,04HDB82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94HDB0E2Hz01H,0ElHz0D4Hz0B4H,0C4H,0B4H,04HDB82H,01H,81H,94H,84H,0B4H,0A4H,94HDB0E2H,01Hz0ElHz0D4H,0B4Hz0C4H,0B4H,04HDB82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94HDB0E2Hz01H,0ElHz0D4H,0B4Hz0C4H,0B4H,04HDBOOH.*由音乐音符设置的Tl计数值*IAB1.El:DW64260,64440,64524,64580,64684,64777,64820,64898;音符计数值DW64968,65030,65058,65110,65157,65178,65217END六、实验过程:启动Kei1.新建一个工程,然后选择芯片(PhilipsP80P87C52X2)o编写汇编语言程序,保存并添加至工程中,然后进行编译。进行调试,直至程序正确,将P1.0、Pl.lsPl.3、P1.4、Pl.5、PI.6、P3.0、P3.1的跳线接相应的A位,P1.7的跳线接相应的C位,拔掉其它不用的跳线。插好电源,插好通信线,翻开实验仪电源开关,在实验上将工作模式开关SX拨到“1.OAD”一档,按下复位开头RESET,然后启动DPFIaSh,进行程序装载,地址将会改变,单击“编程”,选择编程文件区,假设出现错误,将实验台上的工作模式开关SX拨到“MON”位置,按下RESET复位开关,设置SO、S1、S3和S4的状态,再运行程序,拨动SO、SI.S3和S4对应的开头,检查电子时钟功能是否完整。屡次调试、修改程序,直至功能实现。相应截图如下:实验感想:七、实验感想:,不知道调试了多少次,不是信号中断就是没有现象.当时都有些灰心了.不知跑了多少趟实验室换了多少个实验箱.这次实验我们算是得到了磨练.每当我们想放弃的时候我们都在互相鼓励.遇到的问题多不一定是件坏事,遇到的困难多了,我们了解电路板了解这个实验就更多了.