1、目 录第1章 系统总体方案与说明3 1.1系统总体方案3 1.2 系统设计说明3 1.3系统设计目的4 1.4系统设计要求4第2章 硬件电路设计4 2.1总原理图4 2.2各个模块设计5 2.3 器件清单9第3章 软件设计10 3.1 硬件框图10 3.2 程序流程图10第4章 心得体会11第5章 附件12 附录A. 源程序清单12 附录B.硬件原理图28 附件C 参考文献29 第1章 系统总体方案与说明1.1系统总体方案 该课程设计是利用AT89C51单片机内部的定时计数器、中断系统、以及独立键盘和LED显示器等部件,设计的一个单片机精确时钟,16位LED数码显示,分别显示“年、月、日、时、
2、分、秒、毫秒”。该作品主要用于日期显示,24小时计时显示,能整时蜂鸣报时。使用方法:开机后按P3.6时钟在2013 01 01 00:00:00起开始计时。 (1)按P3.2进入选择调节状态:每按一次系统将依次选择打开对秒、分、时、日、月、年的调节模式; (2)按P3.3进入循环递增设定状态:与P3.2相结合依次设定正确时间。 1.2 系统设计说明 (1)系统由AT89C51、LED数码管、驱动软件、按键、电容、电阻、蜂鸣器等部分构成,能实现时间的调整、输出、调时间等功能。(2)时间调整:该设计需要校对时间,所以用两个按键来实现。按“选调”来选择需要调节的部分,按“调节”来调节各部分时间。“选
3、调”时系统暂停计时,调节结束后将“选调”标志位(即数码管小数点点亮)移动到毫秒上时计时继续。 (3)中断:中断技术在单片系统中有着十分重要的作用,它不仅可以提高单片机CPU的效率,也可以对突发事件处理。所谓中断就是CPU在执行主程序的过程中,被意外事件打断,转去执行一段子程序,CPU执行完子程序后,又返回到原程序继续执行。本系统采用的中断方式为定时器0方式2。1.3系统设计目的通过课程设计的教学实践,巩固、加深和扩大51系列单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力。对课题设计方案的分析、选择、比较、熟悉用51单片机做系统开发、研制的过程,软硬件设计的方法、内容及步骤。提
4、高动手实践能力、提高科学的思维能力。1.4系统设计要求1.掌握单片机最小系统的电路原理图; 2.硬件的焊接、连接;3.独立编辑、编译软件;4.调试要求:本设计以MCS-51系列单片机为核心,采用常见电子器件设计,一个电源开关,一个按键负责设置时间和开始走时,一个按键负责循环递增时间,16位数码管显示,可实时显示年、月、日、时、分、秒、百分秒,要求精确到0.01秒。整点能播放提示音,最后一声较尖锐,为准确整点时间。要求按键输入采用中断方式,按键A接INT0,按键B接INT1。第2章 硬件电路设计2.1总原理图 如原理图所示,硬件系统主要由单片机最小应用系统、LED数码管显示模块、电源模块、晶振模
5、块、按键模块、复位电路、整点报时电路、驱动电路等组成。2.2各个模块设计1、单片机最小系统 AT89C51概述:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4kbytes的可反复擦写的只读程序存储器(PEROM)和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。 功能特性概述: AT89C51提供以下标准功能:4k字节Flash闪速存
6、储器,128字节内部RAM,32个IO口线,两个16位定时计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。2、显示模块 LED数码管是由发光二极管构成的,亦称半导体数码管。将条状发光二极管按照共阴极(负极)或共阳极(正极)的方法连接,组成“8”字,再把发光二极管另一电极作笔段电极,就构成了LED数码管。若按规定使某些笔段
7、上的发光二极管发光,就能显示从09的系列数字。同荧光数码管(VFD)、辉光数码管(NRT)相比,它具有:体积小、功耗低、耐震动、寿命长、亮度高、单色性好、发光响应的时间短,能与TTL、CMOS电路兼容等的数显器件。+、-分别表示公共阳极和公共阴极。ag是7个笔段电极,DP为小数点。 本系统利用4个4位LED数码管显示时间,共阳极结构。LED数码管由8段发光二极管组成,当要显示某个数字时只要将数字所对应的引脚送入低电平。3.按键模块 本设计中主要有三个控制按键,按键功能为: (1)按P3.6时钟在2013 01 01 00:00:00起开始计时; (1)按P3.2进入选择调节状态:每按一次系统将
8、依次选择打开对秒、分、时、日、月、年的调节模式; (2)按P3.3进入循环递增设定状态:与P3.2相结合依次设定正确时间。 4晶振模块 时钟振荡电路下图所示,时钟振荡电路用于产生单片机正常工作时所需要的时钟信号,电路由两个30pF的瓷片电容和一个11.0592MHz的晶振组成,并接入到单片机的XTAL1和XTAL2引脚处,使单片机工作于内部振荡模式。此电路在加电后延迟大约10ms振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率决定。电路中两个电容C1、C2的作用使电路快速起振,提高电路的运行速度。5.复位电路复位电路由电阻和极性电容组成,最简单的一
9、种上电复位及按键复位电路如下图所示:上电后,由于电容充电,使RST持续一段时间的高电平,完成复位操作;当单片机处于运行中或死锁时,按下“复位”按钮,也可使单片机进入复位状态。通常选择C=10-30F,R=100-10006.整点报时电路整点报时电路如右图所示,蜂鸣器使用三极管PN5138作为驱动器,当D8输入高电平时,三级管导通,SPEAKER蜂鸣。在软件中,D8在一定的时间段输入矩形波信号,故蜂鸣器间歇蜂鸣。7. 驱动电路 数码管段选采用ULN2803作为驱动元件,该电路为反向输出型,即输入低电平电压,输出端才能导通工作。其引脚图如右图,内部电路图如下图。 数码管位选驱动采用三极管PN513
10、8构成的驱动电路,2.3 器件清单 元件名封装名型号数量单片机DIL40AT89C511石英晶体振荡器XTAL18CRYSTAL1四位八段共阳数码管MPX4-CA4达林顿管DIL16ULN20031三极管TO92PN513817蜂鸣器SPEAKER1按键NULLBUTTON4反相器DIL1474LS047电容CAPC060X3302013A0R5CAT2A3电阻RES18010WATT0R22若干 第3章 软件设计3.1 硬件框图开始系统初始化按下开始键计时开始按下选调键计时暂停,进入调时模式。(每按一次,选调标志位左移一个单元,即可依次选中秒、分、时、日、月、年,再按一次,调时模式结束,计时
11、继续。)按下调节键(每按一次,选调标志位所在单元数值加1,可循环递增时间。)距整点是否还差5秒调节结束,正常计时蜂鸣器鸣叫,每秒一声,整点时蜂鸣声较尖锐,而后截止。精确时钟继续工作 根据以上的电子时钟的设计要求可以分为以下的几个硬件电路模块:单片机模块、显示模块、时钟电路、复位电路与按键电路等,模块之间的关系图如下面得方框电路图所示。3.2 程序流程图 N Y第4章 心得体会本次课程设计是用AT89C51单片机CPU及接口电路设计一个精确时钟,经过两个星期的设计与调试,结果满足要求,验证无误。通过单片机硬件电路的调试,实现了预先设定的功能,设计主要用到了多种芯片,程序也比较长比较麻烦,同时也遇
12、到了不少困难,尤其是关于数码管驱动电路的设计实现。由于我们采用了共16位8段数码管,因此 关于数码管位选驱动元件的选择着实困难。我们先后尝试使用74HCT245、ULN2803、PN5138等元件,尽管前两个可以在Proteus中成功的仿真出来,但实际计算确表明它们的驱动能力不足,无法满足做实物的要求。而三极管尽管合适,但却在仿真时问题重重,无法获得稳定的数码显示,三极管上所串接的电阻也难以确定最佳阻值。我们用了两天的时间查询资料请教学长方才完美解决。通过本次设计,我们系统的了解了精确时钟的设计流程,尤其是硬、软件的设计方法,掌握了键盘显示电路的基本功能及编程方法,掌握了键盘电路和显示电路的一
13、般原理,也进一步掌握并验证了了89C51定时器的使用和中断处理器程序的编程方法,并且加深了对C语言编程的掌握程度。开拓了思路,锻炼了实践动手能力,提高了分工协作能力和分析问题,解决问题的能力,达到了本次课程设计的目的。此次单片机课程设计,从选题到定稿,从理论到实践,在整整两个星期里,学到了很多的东西。同时不仅巩固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合至关重要,而电子产品的设计更要精益求精,无论是C语言编程,还是电路图的设计与仿真,唯有细心谨慎才能获得成功!单片机课程设计虽然结束了,但通过设计所学到的东西将长久存在。相信这次设计
14、带给我们的严谨的学习态度和一丝不苟的科学作风将会给我们未来的工作和学习打下一个更坚实的基础。第5章 附件附录A:源程序清单如下:/* 数码管精确时钟设计程序*/#include / 头文件定义#define dao 523#define uint unsigned int / 数据类型定义#define uchar unsigned char / 数据类型定义uchar mon(uchar month);uchar leap(uchar year);void delayms(uint);void init();void display();void music();void scankey()
15、;void delayms1(uint);void start(); sbit sound=P37;sbit key1=P36;uint num=0,num1=0,num2=0,num3=0,s1num=0;uint bmiaos,bmiaog,bmiao,miaos,miaog,miao,fens,feng,fen,shis,shig,shi,days,dayg,day=1,months,monthg,month=1,yearq,yearb,years,yearg,year=2013,n,m,i,z=1,flag=0;uchar code table=0xc0,0xf9,0xa4,0xb0,
16、0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;/* 主程序main()*/void main() while(1) if(flag=1) init(); flag=0; start(); scankey(); display(); /* 初始化子程序*/void init() /初始子程序TMOD=0x01;TH0=0xd8;TL0=0xf0;EA=1;EX0=1;EX1=1;IT0=1;IT1=1;ET0=1;TR0=1;/* 时钟的年、月、日、时、分、秒、百分秒动态扫描程序*/void display() /七段数码
17、管显示程序 bmiaos=bmiao/10; /百分秒显示程序 bmiaog=bmiao%10; P1=0x7f; delayms(1); P0=tablebmiaog; delayms1(1); P1=0xbf; delayms(1); P0=tablebmiaos; delayms1(1); miaos=miao/10; /秒显示程序 miaog=miao%10; P1=0xdf; delayms(1); P0=tablemiaog; delayms1(1); P1=0xef; delayms(1); P0=tablemiaos; delayms1(1); fens=fen/10; /分显
18、示程序 feng=fen%10; P1=0xf7; delayms(1); P0=tablefeng; delayms1(1); P1=0xfb ; delayms(1); P0=tablefens; delayms1(1); shis=shi/10; /时显示程序 shig=shi%10; P1=0xfd; delayms(1); P0=tableshig; delayms1(1); P1=0xfe; delayms(1); P0=tableshis; delayms1(1); P1=0xff; days=day/10; /天数显示程序 dayg=day%10; P2=0x7f; delay
19、ms(1); P0=tabledayg; delayms1(1); P2=0xbf; delayms(1); P0=tabledays; delayms1(1); P2=0xff; months=month/10; /月数显示程序 monthg=month%10; P2=0xdf; delayms(1); P0=tablemonthg; delayms1(1); P2=0xef; delayms(1); P0=tablemonths; delayms1(1); P2=0xff; yearq=year/1000; /年数显示程序 yearb=year%1000/100; years=year%1
20、00/10; yearg=year%10; P2=0xf7; delayms(1); P0=tableyearg; delayms1(1); P2=0xfb; delayms(1); P0=tableyears; delayms1(1); P2=0xfd; delayms(1); P0=tableyearb; delayms1(1); P2=0xfe; delayms(1); P0=tableyearq; delayms1(1); P2=0xff;/* 模式为零,方式为一定时中断程序*/ void T0_time()interrupt 1 uint n; TH0=0xd8; TL0=0xf0;
21、 bmiao+; if(bmiao=100) bmiao=0; miao+; if(fen=59)&(miao=55) music(); delayms(1); if(miao=60) miao=0; fen+; if(fen=60) fen=0; shi+; if(shi=24) shi=0; day+; n=mon(month); if(day=n) day=1; month+; if(month=13) year+; month=1; /* 计算每年每月份的天数 */ uchar mon(uchar month) switch(month) case 1:case 3:case 5:ca
22、se 7:case 8:case 10: case 12: return 32;break; case 4: case 6: case 11: case 9:return 31;break; case 2:return leap(year);break; /* 计算每年二月份的天数 */ uchar leap(uchar year) year+=2000; if(year%4=0) if(year%100=0) if(year%400=0) return 30; else return 29; else return 30; else return 29; /* 按键中断零扫描程序 */ vo
23、id scankey() if(s1num=1)P1=0xdf;P0=0x7f;delayms(1);if(s1num=2)P1=0xf7;P0=0x7f;delayms(1);if(s1num=3)P1=0xdf;P0=0x7f;delayms(1);P1=0xff;if(s1num=4) P2=0x7f;P0=0x7f;delayms(1);P2=0xff;if(s1num=5)P2=0xdf;P0=0x7f;delayms(1);P2=0xff;if(s1num=6) P2=0xf7;P0=0x7f;delayms(1);P2=0xff;if(s1num=7)TR0=1;s1num=0;
24、/* 中断零程序扫描*/ void T2_time()interrupt 0 z=0; TR0=0; s1num+; /* 中断一程序扫描和加数字循环程序*/ void T1_time()interrupt 2 if(s1num=1) miao+; if(miao=60) miao=0; if(s1num=2) fen+; if(fen=60) fen=0; if(s1num=3) shi+; if(shi=24) shi=0; if(s1num=4) day+; n=mon(month); if(day=n) day=1; if(s1num=5) month+; if(month=13) m
25、onth=1; if(s1num=6) year+; if(year=2100) year=2012; /* 蜂鸣器子程序 */ void music() sound=sound; /* 开始程序 */ void start() if(key1=0) delayms(5); if(key1=0) while(!key1); flag=1; void delayms1(uint kms) /自由时间延时程序 uint i,j; for(i=kms;i0;i-) for(j=110;j0;j-);void delayms(uint kms) /自由时间延时程序1 uint i,j; for(i=kms;i0;i-) for(j=80;j0;j-);附录B:硬件原理图:附录C:参考文献:【1】汪贵平 李登峰 龚贤武 雷旭 新编单片机原理及应用 机械工业出版社 【2】彭伟 单片C语言程序设计实例100例 电子工业出版社【3】郭天祥 10天学会51单片机 教学视频【4】各器件参数均来自互联网。第 29 页 共 29 页