《多功能数字电子钟课程设计.doc》由会员分享,可在线阅读,更多相关《多功能数字电子钟课程设计.doc(20页珍藏版)》请在三一办公上搜索。
1、微控制器技术课程设计报告设计题目:多功能数字电子钟 专业: 班级: 学号: 姓名: 指导教师: 设计时间: 微控制器技术课程设计任务书设计题目: 多功能数字电子钟 设计时间: 2014.6.8-2014.6.19 设计任务:在Proteus中画出原理图或使用实物,编制程序,实现以下功能:1、使用LED数码管显示当前时间。2、有按键,可设置时间。3、整点时间,给出提示声音。4、可设置定时时间,时间到,给出声音提示。背景资料:1、单片机原理与应用 2、检测技术3、计算机原理与接口技术进度安排:1、第1天,领取题目,熟悉设计内容,分解设计步骤和任务。2、第2-3天,规划设计软硬件,编制程序流程、绘制
2、硬件电路。3、第4-6天,动手制作硬件电路,或编写软件,并调试。4、第7天,中期检查。5、第9-10天,完善设计内容,书写设计报告。6、第11天,提交设计报告,整理设计实物,等待答辩。7、第12天,设计答辩。题目:多功能数字电子钟一、设计目的掌握单片机内部和外部器件的使用方法,例如:定时器、动态数码管、无源蜂鸣器、按键的工作原理和使用方法。设计可设置时间的多功能数字电子钟,带有定时功能,整时或定时时间到给出声音提示。使用Proteus仿真软件,画出多功能数字电子钟的整体电路图,掌握多功能数字电子钟的工作原理及其设计方法,并对各种元器件的功能和应用有所了解。并能对其在电路中的作用进行分析。另外还
3、要掌握Keil的使用,能够熟练的使用Keil编写C51程序,控制单片机实现多功能数字电子钟。程序的思路要清晰明了,以便查错维护或方便他人阅读。二、设计要求 在Proteus中画出原理图或使用实物,编制程序,实现以下功能:1、使用LED数码管显示当前时间。2、有按键,可设置时间。3、整点时间,给出提示声音。4、可设置定时时间,时间到,给出声音提示。三、方案设计与论证(1)使用单片机作为主控器件,搭建单片机最小系统与输入/输出设备的联系,完成整体电路的构建。(2)为了实现多功能数字电子钟的小时、分钟、秒,可以使用定时计数器的工作方式一,定时计数器一次定时0.05s(umiao=0.05),循环20
4、次为1s(miao=1),使用嵌套方式得到1min(fen=1)和1h(shi=1)。使用数码管动态显示的方式,把各时间位显示在数码管上。(3)为了实现定时功能,可以定义两个变量分别代表定时的小时位(shi1)和分钟位(fen1),通过判断时钟小时位(shi)和定时小时位(shi1)与上时钟分钟位(fen)和定时分钟位(fen1)是否为真,如果为真定时时间到蜂鸣器发音。(4)为了实现设置功能,使用了三个按键分别为:设置按键、加一按键、减一按键(在设置定时功能时,加一按键设置定时的开启ON与关闭OF)。按键存在抖动现象,可以使用延时消抖的办法解决这个问题。按键具体怎样完成设置功能,参照附录2。通
5、过上述分析,可规划出系统的总体原理图,如图1-1所示。四、设计原理和电路图1.硬件电路(1)时钟晶振电路单片机系统中的各个部件是在一个统一的时钟脉冲控制下有序地进行工作的,时钟电路是单片机系统最基本、最重要的电路。AT89C51单片机内部有一个高增益反相放大器,引脚XTAL1和引脚XTAL2分别是该放大器的输入端和输出端,如果在引脚XTAL1和引脚XTAL2两端跨接上晶体振荡器(简称晶振)或陶瓷振荡器,就构成了稳定的自激振荡电路,该振荡电路的输出可直接送入内部时序电路。内部时钟方式由单片机内部的高增益反相放大器和外部跨接的晶振、微调电容构成时钟电路产生时钟的方法,其工作原理如图1-3所示。C1
6、、C2的值通常选择30PF,C1、C2对频率有微调作用,晶振的频率选择12MHz。图1-2 时钟晶振电路(2)复位电路大规模集成电路在上电时一般都需要进行一次复位操作,以便使芯片的一些部件处于一个确定的初始状态。复位是一种很重要的操作。器件本身一般不具有自动上电复位功能,需要借助外部复位电路提供的复位信号才能进行复位操作。除正常初始化之外,当程序运行出错或操作错误使系统处于死锁状态时,也需要按住复位按键使AT89C51摆脱“跑飞”或死锁状态而重新启动。AT89C51单片机的第9脚(RST)为复位引脚。系统上电后,时钟电路开始工作,只要RST引脚上持续出现大于两个机器周期的高电平即可引起单片机执
7、行复位操作。图1-3 复位电路(3)按键电路为了满足时钟具有设置时间功能,设计有三个按键分别为设置、加键、减键。按一下设置键,通过加键、减键设置时钟小时位的加减,再按一下设置键,通过加键、减键设置时钟分钟位的加减,这时每按一下加键或减键秒都会清零,再按一下设置键,通过加键、减键设置定时小时位的加减,再按一下设置键,通过加键、减键设置定时分钟位的加减,再按一下设置键,通过加键设置定时的开启与关闭。再按一下设置键,退出设置。图1-4 按键电路(4)声音提示电路为实现声音提示,用单片机的17号引脚驱动蜂鸣器。Q1是放大作用,单片机的I/O口驱动能力有限,可以通过Q1放大驱动信号,来驱动蜂鸣器发声。图
8、1-5 声音提示电路(5)显示电路数码管的显示方式采用动态显示,在动态显示下,每位数码管的对应段选线连接在一起,共8段,连接到一个8位输出口上。由于单片机P0口内部无上拉电阻,所以P0口要加上拉电阻。每位数码管的位选线连接到一根独立的I/O口线上,显示信息时,段选码由同一个8位I/O口送出,由位选线控制具体哪位数码管显示。工作原理为:先在段选线上送出第一位数码管的段选码,然后让第一位数码管的位选线有效,则第一位数码管显示信息,其余数码管熄灭,延时一下,位码送关断数码管延时一下(作用:消除数码管的阴影),再送第二位数码管的信息,方法与第一位的相同,直到所有的数码管扫描一遍。由于每位数码管轮流点亮
9、,利用人眼的视觉暂留现象可造成所有数码管同时显示的效果。亮度较静态显示方式时暗,所以在位选线上加有译码器,增加驱动能力使数码管点亮。图1-6 显示电路2.软件(1)软件总体规划结合多功能数字电子钟的硬件电路和任务要求,软件可分为以下几大模块。显示模块:由于硬件显示电路采用了动态显示方式,所以程序必须以大于25Hz的速度循环扫描。为了不干扰其他程序的运行,此部分程序放在子程序中,用主程序调用子程序方式运行,程序的具体执行情况参照附录2。定时器模块:当启动系统后首先执行主函数,在主函数里面首先对定时器初始化,定时器开始工作,设置值为每50us溢出一次,每隔50usCPU会执行定时器中断一次,所以只
10、需让它循环20次就可得到1s的时间,一秒里面嵌套分钟,一秒循环60次就可得到1min,一分钟里面嵌套小时,一分钟循环60次就可得到1h,一小时循环24次就让它等于0.按键模块:时钟设置有三个按键,按键的程序放在了子函数中,使用主函数调用子函数的方式运行,按键值的设置请参照附录2 。(2)软件工作的基本流程图(c) 按键程序流程图 图(a) 数码管显示程序流程图 图(b) 定时器中断程序流程图图(d) 主程序流程图五、元件清单表1 元件清单元件序号名称主要参数元件序号名称主要参数U1AT89C51C3电解电容22uFR1金属膜,0.25w470K按键4x5x6mm(4个)R2金属膜,0.25w2
11、00RP1上拉电阻10kX1陶瓷振荡器12MHZU2译码器74HC138C1贴片电容30pFLS1蜂鸣器5vC2贴片电容30pF数码管六、硬件制作与调试由于条件有限,本次设计使用仿真来实现硬件任务,通过仿真发现仿真软件有许多弊端之处,仿真电路与实际电路有所差别,有些错误问题难以避免。本人建议:尽量创造条件完成硬件电路,用硬件电路来调试程序是最好的选择。实际硬件电路与程序结合完成我们想要的结果才是本次设计的目的。在仿真电路制作期间,发现元件的选择至关重要,元件型号的选择、元件数值的选择都是经过准确计算后得到的。然后就仿真电路的布局,有条理的布局可以使仿真电路整齐美观,更重要的是使人一目了然,电路
12、的可读性、维护性大大提高。在程序调试期间,发现程序与电路之间有许多错误,例如:动态数码管显示乱码、蜂鸣器发出奇怪声音、按键失灵、运行结果不正确等等,诸多问题让我难以接受,我们本着不忘记不放弃的原则,实心踏地潜心钻研,最终得以解决。数码管乱码是因为位码与段码的没有同时对同一个数码管输出;蜂鸣器发出奇怪声音是因为电路中使用的是无源蜂鸣器,频率对声音有影响,适当的频率可以使蜂鸣器发出悦耳的声音;按键失灵是因为按键有抖动现象,消抖后还要判断是否松键,才能解决按键失灵的情况;运行结果不正确,需要反复检查程序,发现问题解决问题,直到运行结果正确。七、设计总结在此次课程设计中遇到的难点主要还是平常的基础知识
13、没有掌握。通过这次课程设计,使我有所掌握单片机的工作原理以及电路的搭建,具体是:掌握单片机应用系统的开发步骤,以及用KeilC51进行编写程序,程序是系统的核心部分,程序的可靠运行能够大大提高系统的稳定性。使用Proteus仿真软件进行系统的总体设计,熟练使用Proteus仿真软件,能够在极短的时间内完成电路的搭建,并且布局合理,电路元件的繁多而不乱能够减少错误。通过本次课程设计的圆满结束,使我明白了单片机的工作原理以及它的强大功能,单片机深入各行各业,对于电机与电器专业的学生来说,单片机是我们必须要掌握的一门专业知识。八、参考文献 1单片机原理及应用,邓立新、董国增、曹月真编,清华大学出版社
14、,2012年 2新概念51单片机C语言教程,郭天祥编,电子工业出版社,2009年1月 3电子元器件与电子实习,马全喜、何怀明编,机械工业出版社,2006年8月 4C51单片机基础及编程应用 张自红、罗瑞、付伟编,中国电力出版社,2012 5数字电子技术童诗白编著高等教育出版社 2001年6百度网站 7电子芯片质料网 附录1 总体电路附录2 完整程序/*晶振频率12MHZ*/#include #define uchar unsigned char#define uint unsigned intuchar code table1=/*0* *1* *2*3* /0x3f,0x006,0x5b,0
15、x4f,/*4*5* *6* *7*/0x66,0x6d,0x7d,0x07,/*8* *9* *-* *O* 0x7f,0x6f,0x40,0x3f,/*N* *F*/0x37,0x71;/数码管位选 uchar code table2=0x00,0x04,0x02,0x06,0x01,0x05,0x03,0x07;int umiao,shi,fen,miao,shi1,fen1;uint k1num,flag;sbit k1=P10;sbit k2=P11;sbit k3=P12;sbit buzz=P37;/*延时函数*/void delay(uint t) uint a; for(;t
16、0;t-) for(a=110;a0;a-);/*蜂鸣器函数*/void buzzer()uint b,c;for(c=50;c0;c-)buzz=0;b=20;while(b-);buzz=1;b=20;while(b-);/*T0初始化*/void Timer3_Init()TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;EA=1;TR0=1;/*设置显示函数*/void set()if(k1num=1) P2=table23; P0=table1shi%10; delay(2); P0=0x00; delay(2);
17、 P2=table27; P0=table1shi/10; delay(2); P0=0x00; delay(2); P2=table20; P0=table1miao%10; delay(2); P0=0x00; delay(2); P2=table24; P0=table1miao/10; delay(2); P0=0x00; delay(2); if(k1num=2)P2=table26; P0=table1fen%10; delay(2); P0=0x00; delay(2); P2=table21; P0=table1fen/10; delay(2); P0=0x00; delay(
18、2); P2=table20; P0=table1miao%10; delay(2); P0=0x00; delay(2); P2=table24; P0=table1miao/10; delay(2); P0=0x00; delay(2); if(k1num=3) P2=table23; P0=table1shi1%10; delay(2); P0=0x00; delay(2); P2=table27; P0=table1shi1/10; delay(2); P0=0x00; delay(2); if(k1num=4)P2=table26; P0=table1fen1%10; delay(2
19、); P0=0x00; delay(2); P2=table21; P0=table1fen1/10; delay(2); P0=0x00; delay(2); if(k1num=5)if(flag!=0) P2=table20; P0=table112; delay(2); P0=0x00; delay(2); P2=table24; P0=table111; delay(2); P0=0x00; delay(2); if(flag=0) P2=table20; P0=table113; delay(2); P0=0x00; delay(2); P2=table24; P0=table111
20、; delay(2); P0=0x00; delay(2); /*按键函数*/void key()if(k1=0) delay(15); if(k1=0) k1num+; while(!k1); if(k1num=6) k1num=0; if(k1num=1) if(k2=0) delay(15); if(k2=0) shi+; while(!k2); if(shi=24) shi=0; if(k3=0) delay(15); if(k3=0) shi-; while(!k3); if(shi0) shi=23; if(k1num=2) if(k2=0) delay(15); if(k2=0)
21、 fen+; miao=0; while(!k2); if(fen=60) fen=0; if(k3=0)delay(15);if(k3=0)fen-;miao=0;while(!k3);if(fen0)fen=59;if(k1num=3)if(k2=0)delay(15);if(k2=0) shi1+; while(!k2); if(shi1=24) shi1=0; if(k3=0)delay(15);if(k3=0) shi1-; while(!k3); if(shi10) shi1=23; if(k1num=4)if(k2=0)delay(15);if(k2=0) fen1+; whil
22、e(!k2); if(fen1=60) fen1=0; if(k3=0)delay(15);if(k3=0) fen1-; while(!k3); if(fen10) fen1=59; if(k1num=5) if(k2=0) delay(15); if(k2=0) flag=flag; while(!k2); /*shi,fen,miao显示函数*/void time_display()P2=table20; P0=table1miao%10; delay(2);P0=0x00;delay(2); P2=table24; P0=table1miao/10; delay(2);P0=0x00;
23、delay(2);P2=table22;P0=table110;delay(2);P0=0x00;delay(2);P2=table26;P0=table1fen%10;delay(2);P0=0x00;delay(2);P2=table21;P0=table1fen/10;delay(2);P0=0x00;delay(2);P2=table25;P0=table110;delay(2);P0=0x00;delay(2);P2=table23; P0=table1shi%10; delay(2);P0=0x00;delay(2); P2=table27; P0=table1shi/10; de
24、lay(2);P0=0x00;delay(2);/*主函数*/void main()Timer3_Init();flag=0; /闹钟默认关while(1)key();set();if(k1num=0) time_display();/*T0的中断函数*/void int0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;umiao+;if(umiao=20)umiao=0;miao+;if(miao=60)miao=0;fen+;if(fen=60)fen=0;shi+;buzzer();/整点提示,蜂鸣器发音。if(shi=24)shi=0;/闹钟时间到,蜂鸣器发音一分钟/ if(shi=shi1&fen=fen1&flag!=0&fenfen1+1)buzzer();