您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机-电子时钟实验报告
一、实验任务及要求在焊接的电路板中,4个LED数码管,设计带有闹铃功能的数字时钟,要求:1、在4位数码管上显示当前时间。显示格式“时时分分”;”2、由LED闪动做秒显示;3、利用按键可对时间及闹玲进行设置,并可显示闹玲时间。当闹玲时间到蜂鸣器发出声响,按停止键使可使闹玲声停止。二、方案论证与比较2.1数字时钟方案数字时钟是本设计的最主要的部分。根据需要,可利用两种方案实现。方案一:本方案采用Dallas公司的专用时钟芯片DS12887A。该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。方案二:本方案完全用软件实现数字时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现5毫秒定时中断,每产生一次中断,存储器内相应的计数值加1;若计数值达到200,则将其清零,并将方案一:静态显示。所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。该方式每一位都需要一个8位输出口控制。静态显示时较小的电流能获得较高的亮度,且字符不闪烁。但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。方案二:动态显示。所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度合适,字符才不闪烁。显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口,降低了能耗。从节省I/O口和降低能耗出发,本设计采用方案二。三、各个部分的分析1)显示电路:通过4个LED显示屏显示分钟和小时两个两联的LED显示器,通过与单片机P1接口连接实现显示功能。而实现4个LED灯动态显示,靠的是位选电路2)位选电路四位共阳LED数码管,其标号分别为HourH,HourL,MinL,MinH,低电平选通,且任何时候仅有一位输出低电平,显示时对各显示器进行动态扫描,显示器分时轮流工作。虽然每次只有一个显示器显示,但是由于人的视觉暂留现象我们仍会感觉所有的显示器都在同时显示。P0口作为输出口控制8个发光二极管的亮灭,控制数码管的显示。因此,可以实现4个LED在我们看来同时亮,显示时间。3)闹铃部分:使用蜂鸣器实现闹钟功能其中,buzzer端口接到单片机的P1.7输出。(端口连接在最后介绍)4)开关部分:使用了5个开关控制整个电路的启动,修改时间,设置闹钟,关闭电路等功能为查询方式典型电路。其中Setbutton为复位开关,swtich为转换模式开关,即工作模式和调时间模式,Increase为调时间模式中控制时间变化的按钮,STRAT和STOP分别为开启和结束按钮,这5个开关分别接到P2.0-P2.5端口,以控制其输入。5)串转并电路为了进一步节省I/O口,有添加了一个额外的串转并电路由以上电路,我们将P1.0-P1.2扩展到7个I/O口,我们采用的是74HC595芯片,管脚图如下:7)复位电路整体电路图如下:四、软件设计由于汇编语言繁琐,我们采用的是C语言编程,源程序及注释如下:#includereg52.h#includeintrins.h//时分#defineTYPEunsignedchar#defineHOUR0#defineMIN1//显示状态#defineNORMAL0#defineBELLTIME1#defineSETTING_N2#defineSETTING_C3//闪烁显示#defineNoMask0#defineMaskHour1#defineMaskMin2#defineMaskAll3#defineucharunsignedchar#defineuintunsignedint//BitDefinition//数码管sbitHourH=P1^3;//低电平,数码管使能sbitHourL=P1^4;sbitMinH=P1^5;sbitMinL=P1^6;//蜂鸣器sbitBuzzer=P1^7;//低电平,蜂鸣器响//键盘sbitSetButton=P2^0;//按键定义,设置(正常,定时显示切换)键,时位分位转换键,增加键sbitSwitch=P2^1;sbitIncrease=P2^2;sbitStart=P2^3;sbitStop=P2^4;//LEDsbitSecLed=P2^5;//秒显示,低电平点亮sbitClockStartLED=P2^6;//闹钟定闹开始//74HC595输入管脚定义sbitSH_CP=P1^0;sbitDS=P1^1;sbitST_CP=P1^2;//FunctionDefinitionvoiddelay5ms(void);voidClock();voidDisplay();voidSet();voidRing();voidStopRing();voidShowANum(uchari);voidStartRing();voiddelaykey(void);voidMaskShow(ucharNum,TYPEt);//VariableDefinition//正常时间ucharhour=8;ucharmin=0;ucharsec=0;uintcount=0;//闹钟定时ucharmp=1;ucharst=0;ucharcHour=8;ucharcMin=0;//模式标示uchardisplayMode=NORMAL;ucharcurrentSelect=HOUR;//数码管数字显示编码ucharH1;ucharH2;ucharM1;ucharM2;uchartemp;ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//闪烁显示ucharMaskType=NoMask;uintblinkcount=0;//音乐ucharp=0;uchartemp=0;ucharjiepai=0;ucharyindiao=0;ucharPai1_4=20;ucharjpLength=0;//音调数组unsignedcharcodemusic[]={0xFF,0xFF,0xF8,0x89,0xf9,0x59,0xfa,0x13,0xfa,0x68,0xfb,0x04,0xfb,0x90,0xfc,0x0c,0xfc,0x44,0xfc,0xad,0xfd,0x0a,0xfd,0x34,0xfd,0X82,0xfd,0xc8,0xfe,0x06,0xfe,0x22,0xfe,0x56,0xfe,0x85,0xfe,0x9a,0xfe,0xc1,0xfe,0xe4,0xff,0x03,0xff,0x11};//音乐编码unsignedcharcodeMmusic[]={////音阶测试//1,4,2,4,3,4,4,4,5,4,6,4,7,4,8,4,//9,4,10,4,11,4,12,4,13,4,14,4,15,4,//16,4,17,4,18,4,19,4,20,4,21,4,22,4,//两只老虎1,4,2,4,3,4,1,8,1,4,2,4,3,4,1,8,3,2,4,8,5,5,3,2,4,8,5,5,5,5,6,2,5,5,4,4,3,4,1,8,5,5,6,2,5,5,4,4,3,4,1,8,3,4,1,4,2,8,3,4,1,4,2,8,0xff,0x00//结束标记};voidmain(){//设置T0,T1TMOD=0x11;TH0=0x0EC;TL0=0x78;TH1=0x0F0;TL1=0x60;ET0=1;ET1=1;EA=1;TR0=1;//设置定时器的优先级PT0=1;//5ms标准时钟设为高优先级,保证计时的准确性PT1=0;//顺序执行(主循环)while(1){//设置何时开启T1定时器if(displayMode!=NORMAL||mp==0)TR1=1;else{TR1=0;MaskType=NoMask;}//方法并行Display();Display();Set();StartRing();Ring();StopRing();}}voidClock()interrupt1{TH0=0x0EC;TL0=0x78;count++;if(mp==0){//控制音乐节拍if(jpLength--=0){jiepai=Mmusic[2*p+1];jpLength=Pai1_4*jiepai;//控制每个音调持续多少个1/4节拍p++;if(Mmusic[2*p+1]==0x00)p=0;//重放//控制屏幕随乐曲闪烁if(MaskType==NoMask)MaskType=MaskAll;elseMaskType=NoMask;}}if(count%100==0)//控制秒灯闪烁,每秒闪一次{SecLed=~SecLed;}}voidMaskClock()interrupt3{if(mp==0)//生成音调频率方波{yindiao=Mmusic[2*p];TH1=music[2*yindiao];TL1=music[2*yindiao+1];Buzzer=~Buzzer;}else//响铃时,屏蔽闪烁显示的功能{if(displayMode==BELLTIME||displayMode==SETTING_C){TH1=0x0F0;TL1=0x60;}else{TH1=0x0F8;TL1=0x30;}blinkcount++;if(blinkcount=100){blinkcount=0;if(displayMode==BELLTIME){if(MaskType==NoMask)MaskType=MaskAll;elseMaskType=NoMask;}elseif(displayMode==SETTING_C||displayMode==SETTING_N){if(currentSelect==HOUR){if(MaskType==NoMask)MaskType=MaskHour;elseMaskType=NoMask;}if(currentSelect==MIN){if(MaskType==NoMask)MaskType=MaskMin;elseMaskType=NoMask;}}}}}voidStartRing(){if(Start==0){ClockStartLED=0;st=1;Start=1;}}voidRing(){if(st==1&&cHour==hour&&cMin==min){//Buzzer=0;mp=0;}}voidStopRing(){if(Stop==0){Buzzer=1;mp=1;p=0;ClockStartLED=1;st=0;MaskType=NoMask;}}voidDisplay(){//分析COUNT,合成HOUR,MINif(count=200){count=count-200;sec++;if(sec==60){sec=0;min++;if(min==60){min=0;hour++;if(hour==25){hour=0;}}}}//显示时间if(displayMode==NORMAL||displayMode==SETTING_N){HourH=1;HourL=1;MinH=1;MinL=1;H1=hour/10;H2=hour%10;M1=min/10;M2=min%10;MaskShow(H1,HOUR);HourH=0;delay5ms();HourH=1;MaskShow(H2,HOUR);
本文标题:单片机-电子时钟实验报告
链接地址:https://www.777doc.com/doc-5598386 .html