




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计(论文)说明书题 目: 电子时钟课程设计 院 (系): 电子工程与自动化学院 专 业: 测控技术与仪器 学生姓名: 学 号: 09008 指导教师: 职 称: 2012年 12 月 27 日 摘要钟表作为一种定时工具被广泛的使用在生产生活的各方面。人类最初依靠太阳的角度来进行定时,所以受天气的影响比较大,为了克服依靠自然现象定时的缺点人们发明的机器钟表,电子钟表一系列的定时工具。而电子钟表具有价格便宜,质量轻,定时误差小等优点,被广泛的应用在生产,生活的各个方面。由于电子钟的能提供精确定时又被广泛的运用在测量之中。此电子钟采用单片机进行设计,8段数码通过单片机进行刷新显示。其设计的产品除了单片机之外没有用到其他集成块,使其成本可以大大降低,而其便于维修。成品可以被广泛的用于公共场所,匾额装饰,以及教学等方面。关键字: 电子时钟 ;51单片机; 数码管- 1 - 目录摘要- 1 -目录- 2 -第一章 课程设计题目描述和要求- 1 -第二章 方案的选择和论证- 1 -2.1系统总原理框图- 1 -2.2单片机芯片的选择方案和论证:- 1 -2.3显示器的选择- 2 -2.4计时部分的选择- 2 -第三章 硬件电路和软件的设计- 2 -3.1时钟电路- 2 -3.2 复位电路工作原理- 3 -3.3 键盘电路的设计- 3 -3.4 显示驱动电路- 4 -3.5蜂鸣器驱动电路- 4 -第四章 软件设计- 5 -4.1主程序模块- 5 -4.2子程序模块- 6 -第五章 组装与调试- 7 -5.1 使用的主要仪器和仪表- 8 -5.2 调试电路的方法与技巧- 8 -5.3 调试过程中出现的故障原因及排除方法- 8 -第六章 总结设计及调试体会- 8 -辞谢- 9 -参考文献- 10 -附录- 10 -程序代码- 10 -表1 元件清单- 18 -原理图- 19 -PCB- 20 -表2 M1,M0控制的四种工作模式- 21 - 2 - 第一章 课程设计题目描述和要求一.课程设计题目描述和要求:1、方案论证,确定总体电路原理图。 2、元器件选择,设计PCB图。3、绘制程序流程图,编写C语言源程序。4、安装调试,实现数字时钟的基本功能,即能正确显示时、分、秒;能显示年、月、日;可调整时间;秒闪功能。5、扩展功能:闹铃,倒计时等。 第二章 方案的选择和论证2.1系统总原理框图蜂鸣器 单片机模块驱动模块按键模块LED显示模块下载口晶振秒闪 图2.1 系统总框图2.2单片机芯片的选择方案和论证: 方案一: 采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。 方案二:采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。所以选择采用AT89S52作为主控制系统.2.3显示器的选择方案一:液晶显示器。如果选择此方案,将会降低系统的功耗,这样就可以用电池供电,便于携带。但液晶显示器的驱动电路复杂,使用起来有一定的难度。方案二:用数码管作为显示器。数码管的驱动电路简单,使用方便,如果选择了此方案,那么在夜间看时间的时候就不需要有光源,非常方便。其缺点是功耗较大。由于数码管使用起来较为方便,在夜间看时间也很方便,因此我选择了方案二。2.4计时部分的选择可采用单片机自带的定时计数来实现计时部分。假设系统使用的晶振频率为12MHZ,即每个机器周期为1us。如使用方式1,则定时时间最长是2161us=65536us=65.536ms,小于1s。故必须设置一个软件计数单元,即假设定时器定时中断时间为50ms,则必须定时中断20次才达到1s并对秒计时单元加1,20即为软件计数次数。最后再把秒计时单元的值转成显示数码送显示缓冲区。时钟输出频率取决于振荡器频率和T2捕获重装载寄存器RCAP2H、RCAP2L的值。第三章 硬件电路和软件的设计3.1时钟电路本设计晶振电路采用12M的晶振。晶振的作用是给单片机正常工作提供稳定的时钟信号。单片机的晶振并不是只能用12M,只要不超过20M就行,在准许的范围内,晶振越大,单片机运行越快,还有用12M的就是好算时间,因为一个机器周期为1/12时钟周期,所以这样用12M的话,一个时钟周期为12us,那么定时器计一次数就是1us了,电容范围在20-40pF之间,这里连接的是30pF的电容。图3.1 时钟电路3.2 复位电路工作原理 图所示为复位电路原理图,复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序,并使其它功能单元处于一个确定的初始状态。本复位电路采用的是按键复位,它是通过复位端经电阻与VCC电源接通而实现的,它兼具上电复位功能。 图3.2 复位电路3.3 键盘电路的设计键盘采用4个独立按键实现对时钟、闹钟、日期、倒计时的设定及修改.按键1,2,3,4分别与P1前四位相连。它软件是采用查询式结构,首先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。 图3.3功能按键电路图3.4 显示驱动电路由于通过数码管公共及的电流较大且避免烧毁LED,采用了一个470欧姆的8个电阻的排阻来限流,段码接P0口。用于动态扫描。首先P0口作为段码输出。由于P0口输出级无上拉电阻,故需添加一排阻为其上拉电阻。其次采用共阳极数码管。段码端为低电平时导通LED,此时数码管向89S52片P0口灌电流,为防止芯片烧坏,还需加1个1 K的限流电阻。考虑到数码管的亮度问题,采用了PNP三极管做驱动电路。基极接上1 K电阻后再与P2口相连(P2.0P2.3)进行位选。发射极接5V电源,集电极接数码管位选。图3.41段码驱动电路图图3.42位驱动电路图3.5蜂鸣器驱动电路蜂鸣器接P3.7口。由于使用的是有源蜂鸣器,代码的编写简单化了。只需对P3.7口清零与置位。其中电阻R1在电路里起分压限流的作用,PNP三极管起到模拟开关的作用。 图3.5蜂鸣器第四章 软件设计4.1主程序模块主程序主要用于系统初始化:设置计时缓冲区的位置及初值,T0、T2的工作方式、定时器的工作方式和计数初值等参数。主程序流程如下图所示。1)主程序流程图 开始 初始化及初赋值函数 键盘扫描子程序 选择显示状态 状态=0 状态=1 状态=2 状态=3 状态=4 时间函数闹铃函数日期函数年函数倒计时数码管扫描函数 响铃函数返回图4.1 主程序流程图4.2子程序模块 (1)计时、倒计时模块。即定时器0,2中断子程序,完成刷新计时,倒计时缓冲区的功能。 开始重装定时器初值循环次数减1否满20次?是秒单元加1否60s到?是秒单元清0,分单元加1否60分到?是分单元清0,时单元加1否24小时到?是时单元清0恢复现场返回 图4.21 计时程序流程图(2) 时间设置,日期设置、闹铃和倒计时设置函数的流程图由于篇幅有限,只给出时间设置函数流程图。其它函数可通过附录中程序代码详见。 开始 时间设置有效否 否 是 判断键值key=1 key=2 key=3设置加减返回图4.22时间设置流程图第五章 组装与调试5.1 使用的主要仪器和仪表本设计使用到的仪器仪表有:数字万用表。5.2 调试电路的方法与技巧制作好PCB电路板,在组装元器件前,用数字万用表检测电路板有无断线、短接线,确定所有的连接线完好无误后,再进行元器件的组装与焊接工作。根据电路原理图及PCB图组装焊接好电路后,再次用数字万用表检测有无因虚焊造成的断线或短接线,确定无误后,外接电源检测晶振是否起振,最后再编写简单的程序来测试显示、控制部分是否能正常工作。经过测试,整个系统的各个部分能正常工作,即硬件电路无错误。5.3 调试过程中出现的故障原因及排除方法1. 编写好完整的功能程序后下载到单片机中,然后观察验证电子时钟是否能达到预期功能,在此过程中发现电子时钟能够正常走时,说明电子时钟能够正常准确的计时,但是在调整改变显示的时间,年、月、日、星期时,其显示的数值不能带到预期要求,时、分和月、日之间不能正常进位,造成显示错误。(1)故障原因:用按键调整设定时间时没有考虑到进位的问题。(2)排除方法:在进行程序编写时,基本上是按照结构化程序设计、子程序化、模块化设计的,因此找到对应的模块进行修改即可。经过认真分析并加以修改后达到了预期的结果。至此,软件程序调试完毕,完成了电子时钟设计,并能实现其功能。 第六章 总结设计及调试体会硬件设计部分:首先要通过计算与参考资料等决定参数。而后通过仿真软件等调试,确定参数无误后再开始用Protel2009 画原理图,进而生成PCB进行布板。软件设计部分:设计软件首先要考虑要做的功能,确定出合理的算法。合理的算法不仅要可以实现功能,而且在添加功能的时候要方便灵活。有的人为了实现某种功能用了各种各样的方法来实现,结果程序结构吃死,当想要添加功能或者修改其他功能的时候,将修改程序大部分结构,也就是说要破坏程序现有的结构。关于调试:Keil软件调试单片机程序的时候,编译通过并不代表程序是正确的。编译通过只能说明程序没有语法上的错误。进行软件仿真或者下载到开发板上进行调试,经常会出现各种各样的错误。许多超出预期效果的现象往往是一些微小错误引起的。例如没有现场保护跟恢复现场等,所以养成良好的编程习惯也很重要。有些想达成某些功能而添加的语句,实际上确一点效果也没有。举个编程中的小问题:当有按键按下时,我们都要有软件防抖。正常的方法是调用一个延时。在实际调试中,要跳过这个抖动,需要100MS左右。如果使用正常的延时,会导致按键按下时CPU100MS内无法进行其他操作,也就是说。平均1S内100MS不调用显示子程序,这样就会导致亮度降低。这时候,考虑到显示子程序一次有十几毫秒,就特别写了一个调用7次显示的子程序来作为按键防抖的延时,实际上效果也是很不错的。这个想法就是在修改了多次程序未达到想要的效果(有按键按下时显示亮度不降低)后最终想出来的办法。最后在做完板,焊完电路后,在接通电源之前,要用万用表仔细检查电路是否有连接错,以免烧坏芯片和数码管。2周以来我认为:态度要积极,不要认为很简单就不紧不慢。很多东西并不是自己设想的那么顺利,有时候一个小问题可以花上你半天甚至一天的时间。虽然自己在程序上并没遇到太大的问题,但是因为态度不够积极,对于没画过的PCB图迟迟不去下手,在周四晚上才解决。本以为周五一天可以做完板并完成整机调试,可是各种突发事件让自己措手不及。发现板来不及做完后才将程序功能进行扩展。这是我在这次实验中的一个教训,也让我明白了对于自己不能太过于自信,态度决定一切。辞谢首先要感谢我的指导老师陈老师,他指引我论文的写作的方向和架构,并对本文初稿进行仔细批阅,指正出其中不当之处,使我有了思考的方向,他的循循善诱的教导和不拘一格的思路给予我无尽的启迪,他的严谨细致、一丝不苟的作风,将一直是我工作、学习中的榜样。通过此次的论文,我学到了很多知识,在论文的写作过程中,我不仅收集到了论文所需的资料数据,而且学到了很多书本上没有的知识。并且由原先的被动的接受知识转换为主动的寻求知识,我想这可以说是学习方法上的一个很大的突破。总之,此次论文的写作过程,我收获了很多,为大学四年划上了一个完美的句号,也为将来的人生之路做一个很好的铺垫。再次感谢我的大学和所有帮助过我并给我鼓励的老师和同学,谢谢你们!参考文献1李全利、迟荣强,单片机原理及接口技术M,北京:高等教育出版社,20042凌玉华,单片机原理及应用系统设计M,长沙:中南大学出版社,20063张毅刚,MCS-51单片机应用设计M,哈尔宾:哈尔宾工业大学出版社,19974胡汉才,单片机原理及应用M,北京:清华大学出版社,20045何立明,单片机应用系统设计M,北京:北京航空航天大学出版社,1990附录程序代码- 18 - #include #define uchar unsigned char#define uint unsigned int#define DispOFF 10;/显示关#define POINT 21;/显示小点#define F 22;#define H 23;#define M 24;#define N 25;#define O 26;sbit buzzer=P34;/蜂鸣器控制脚sbit led=P37; /leduchar T2Count;uint T0Count;uchar key,key_new,key_old,KeyPressTime;uchar status;uchar month,day,hour,min,sec,AlarmHr,AlarmMin;uchar LastDay;uchar AlmTime,AlmCount,DispTime;uchar CountHr,CountMin,CountSec,CountSetSta=0;uint year;bit TimeAdj,AlarmAdj,AlarmSta;bit adjust,DigiBit;/数码管显示代码uchar code LedCode=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff, 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f, 0x8e,0x89,0xc8,0xab,0xa3 ;uchar Disp4;void LedScan(void);void KeyScan(void);void years(void);void date(void);void timer(void);void alarmClock(void);void CountDown(void);void ring(void);uchar DaysCount(void);void Init(void) TH2=0x3c;TL2=0xb0; RCAP2H=0x3c;RCAP2L=0xb0; EA=1;ET2=1; TR2=1; TMOD=0x01; ET0=1; P1=0xff; year=2011; month=1; day=1; hour=0; min=0; status=2; buzzer=1;/*主函数*/void main(void) Init(); while(1) KeyScan(); LastDay=DaysCount();switch(status)/显示状态 case 0:years();break;/显示年 case 1:date();break;/显示日期 case 2:timer();break;/显示时间 case 3:alarmClock();break;/显示闹钟时间 case 4:CountDown();break;/显示倒计时 LedScan(); ring(); /*定时器T0中断函数,用于倒计时*/void timer0(void) interrupt 1 using 2TH0=0x3c;/TH0 = (65536-50000) / 256 TL0=0xb0;/TL0 = (65536-50000) % 256 T0Count+; if(CountHr|CountMin|CountSec) if(T0Count=20) CountSec-;T0Count=0; if(CountSec=60) CountSec=59;CountMin-; if(CountMin=60) CountMin=59;CountHr-; if(T0Count=1200) TR0=0; T0Count=0;/*定时器T2中断函数,用于计时*/void timer2(void) interrupt 5 using 1 TF2=0;led=1; if(+T2Count=20) sec+;T2Count=0;led=0; if(!TimeAdj)/时间调整时,暂停计时 if(sec=60) min+;sec=0; if(min=60) hour+;min=0; if(hour=24) day+;hour=0; if(dayLastDay) month+;day=1; if(month12) year+;month=1;void delay(uchar x) uchar k; while(x-) for(k=0;k123;k+);/*数码管扫描显示函数*/void LedScan(void) uchar i; uchar temp=0x08; for(i=0;i=1;/LED显示位控制 delay(3);/延时 P2=0xff;/关显示 /*按键扫描程序*/void KeyScan(void) if(P1&0x0f)!=0x0f) /如果按下按键 if(KeyPressTime0)/延时 switch(P1|0xf0)/判断键值 case 0x01:key_new=1;break; case 0x02:key_new=2;break; case 0x04:key_new=3;break; case 0x08:key_new=4;break; KeyPressTime+;/按键时间加1 else/没有按键按下 key_new=0;/键值清零 KeyPressTime=0;/按键时间清零 if(key_new!=key_old)/前后两次键值不同 key=key_new;/键值等于本次键值 else/相同(按住按键未释放) key=0;/键值清零 if(KeyPressTime100)/按键时间大100,差不多1秒(作长按键处理) KeyPressTime-=30;/按键时间减30,当累加到100再次动作,相当于300毫秒按键一次, key=key_new;/得到本次键值 key_old=key_new; /记住本次键值/*计算本月有多少天*/uchar DaysCount(void)if(month=4|month=6|month=9|month=11) return 30;else if(month!=2) return 31;if(month=2) if(year%4=0&year%100!=0)|(year%400=0) return 29;/闰年 else return 28;/非闰年2月 /*年函数*/void years(void) if(adjust)/设置,调整年 switch(key)/处理按键case 1: year+;/年加1 break; case 2: year-;/年减1 break; case 3: adjust=0;/退出设置 DispTime=0; break; else if(key=2) status+;if(key=3) adjust=1;if(+DispTime=200) status=2; DispTime=0; Disp0=year/1000;/年份千位 Disp1=year/100%10;/年份百位 Disp2=year/10%10;/年份十位 Disp3=year%10;/年份个位 if(T2Count12) month=1; if(dayLastDay) day=1; break; case 2: if(DigiBit=0) month-; else day-; if(month=0) month=12; if(day=0) day=LastDay; break; case 3: DigiBit=DigiBit; if(DigiBit=0) adjust=0; DispTime=0; break; else if(key=1) status-;DispTime=0; if(key=2) status+;if(key=3) adjust=1;if(+DispTime=200) status=2; DispTime=0; Disp0=month/10; Disp1=month%10; Disp2=day/10; Disp3=day%10+11; if(T2Count=24) hour=23; if(min=60) min=59; break; case 3: DigiBit=DigiBit; if(DigiBit=0) sec=0; TR2=0; TH2=0x3c;TL2=0xb0; T2Count=0; TR2=1; TimeAdj=0; break; else if(key=1) status-;DispTime=0; if(key=2) status+;DispTime=80;if(key=3) TimeAdj=1; Disp0=hour/10; Disp1=hour%10; Disp2=min/10+11; Disp3=min%10+11; if(T2Count=10) if(TimeAdj) if(!DigiBit) Disp0=DispOFF; Disp1=DispOFF; else Disp2=POINT; Disp3=POINT; else Disp2=min/10; Disp3=min%10; /*闹钟函数*/void alarmClock(void)Disp0=AlarmHr/10; Disp1=AlarmHr%10; Disp2=AlarmMin/10+11; Disp3=AlarmMin%10+11; if(DispTime=24) AlarmHr=23; if(AlarmMin=60) AlarmMin=59; break; case 3: DigiBit=DigiBit; if(DigiBit=0) AlarmAdj=0; DispTime=80; break; if(T2Count=10) if(!DigiBit) Disp0=DispOFF; Disp1=DispOFF; else Disp2=POINT; Disp3=POINT; else if(key=1) status-; if(key=2) status+; DispTime=0;if(key=3) AlarmAdj=1;if(key=4)/闹钟开关按键if(DispTime100) CountHr=99; Disp0=H; Disp1=DispOFF; Disp2=CountHr/10; Disp3=CountHr%10; break; case 1:/设置倒数分钟 if(key=1) CountMin+; if(key=2) CountMin-; if(key=3) CountSetSta+; if(CountMin=60) CountMin=0; if(CountMin60) CountMin=59; Disp0=M; Disp1=DispOFF; Disp2=CountMin/10; Disp3=CountMin%10; break; case 2:/设置倒数秒 if(key=1) CountSec+; if(key=2) CountSec-; if(key=3) /设置键 if(CountHr|CountMin|CountSec)TH0=0x3c; TL0=0xb0; T0Count=0; TR0=1;/开始 CountSetSta=0; adjust=0; DispTime=0; if(CountSec=60) CountSec=0; if(CountSec60) CountSec=59; Disp0=5; Disp1=DispOFF; Disp2=CountSec/10; Disp3=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生产力和生产关系新质生产力
- 新护士岗前培训心得体会模版
- 科室护理工作汇报材料
- 银行营销面试题目及答案
- 银行内聘面试题目及答案
- 医院消防试题知识及答案
- 一级消防工程师模拟试题及答案
- 湿疹的护理常规
- 跨国度假紧急医疗援助服务补充协议
- 全球化市场拓展人员招聘与派遣合同
- 2025年高考化学三轮冲刺:实验综合大题 刷题练习题(含答案解析)
- 肠梗阻课件教学课件
- 宁夏银川市2023−2024学年高一下学期期中考试 数学试卷(含解析)
- 浙江浙达环境科技有限公司年收集、贮存及转运危险废物5000吨的搬迁项目环评报告
- 抗凝剂皮下注射技术临床实践指南(2024版)解读
- 2024年全球及中国一次性喉镜片和手柄行业头部企业市场占有率及排名调研报告
- 湖南张家界事业单位招聘考试高频题库带答案2025年
- 2025-2030中国智慧港口行业市场深度调研及竞争格局与发展趋势研究报告
- 2025四川眉山市国有资本投资运营集团有限公司招聘50人笔试参考题库附带答案详解
- 2024年新疆喀什公务员录用考试《行测》真题及答案
- 主体结构及装饰装修D类复习试题有答案
评论
0/150
提交评论