单片机原理及应用设计报告
题 目 电子时钟的设计 专 业 物理学
院 部 物理与电子工程学院 学 号 ----------- 姓 名 ----------- 指 导 教 师 -----------
答 辩 时 间 二0一二年五月
工作时间:2012年5月
- -可修编.
. -
基于单片机的电子时钟系统的设计
指导教师:--- 学生:---
关键词:单片机;电子时钟;键盘控制器;
目录
第一章 总体设计2
第二章 系统硬件设计3
2.1 硬件电路3
2.1.1 单片机最小系统5 2.1.2 键盘电路6 2.1.3 显示电路7 第三章 系统软件设计7
3.1主程序流程图7
3.2 主要子程序的流程图9 第四章 系统仿真10
第五章 综合调试与问题的解决11
5.1 硬件调试11
5.2 软件调试问题及解决11 结 论12 参考文献12 附 录13
- -可修编.
. -
第一章 总体设计
1.1 设计要求
电子时钟的计时X围00时00分00秒至23时59分59秒,由按键来调节时钟时间,时分秒都可以调整。
1.2 设计思路
根据设计的要求可确定如下的设计思路:利用AT89C52系统单片机,LCD液晶显示器,键盘等一些辅助元件来生成时钟电路已达到设计要求,然后通过编写相应的程序来实现对时钟的调试和控制。
1.3 电路的设计方案
随着单片机技术的飞速发展,通过单片机对控制对象的控制日益成为今后自动控制领域的一个发展方向 。采用MCS--52单片机来对时间进行控制,不仅具有控时方便,组太简单和灵和性大等优点,而且可以大幅度的提高控制时间的技术指标。从而可以大大提高产品的质量和数量,因此单片机对时间的控制问题是一个工业生产上经常会遇到的问题。 经过设计和元器件的功能,设计要求和设计思路,确定相应的设计方案,该电路有多部分组成,如控制键盘的输入电路,单片机的时钟电路,LCD液晶显示时间电路等。所以根据上述条件作出相应的实时时钟电路总的框图,然后开始设计内部驱动程序,是各种芯片按照相应的程序实现特定的功能,之后按照程序的设计,将相应的管脚连接调试,看是够能实现特定的功能。
硬件框图如下:
图1-1 硬件框图
- -可修编.
AT89C52 单片机 时钟显示 元件 蜂鸣器 键盘控制 . -
主程序设计的流程图如下:
显示子程序实现各功能的子程序参数初始化开始
图1-2 主程序设计流程图
第二章
系统硬件设计
系统硬件是整个系统的基础,需要考虑多个方面,除了实现显示和闹钟的基本功能外,还要注意系统的稳定度、器件的通用性、软件编程的以实现性、系统其它功能及性能指标。
2.1 硬件电路
本设计以单片机为控制核心,采用模块化设计,共分以下几个功能模块:单片机控制系统、键盘及时间显示、及调时模块等。 其硬件图如下:
- -可修编.
. -
图2-1数字电子时钟硬件设计图 液晶电路图:
图2--2
单片机作为整个硬件系统的核心,它既是协调整机工作的控制器,又是数据处理器。
- -可修编.
. -
时钟的00时00分00秒显示设为程序的默认值,当时钟的时间走到10点时,蜂鸣器就打开并开始发出生音。
可以通过手动调节s1和s2以及s3调节时钟时间。
2.1.1 单片机最小系统
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对52系列单片机来说,最小系统一般应该包括:单片机、时钟电路、复位电路。
其中时钟电路电路图如下:
图2-3时钟电路
XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择。电容取30PF左右。系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。AT89单片机内部有一个用于构成振荡器的高增益反相放大器。引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为22μF。在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地[1-3]。
复位电路电路图如下:
- -可修编.
. -
图2-4复位电路图
在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引腿时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。复位后P0-P3口均置1引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。当复位脚由高电平变为低电平时,芯片为ROM的00H处开始运行程序。复位是由外部的复位电路来实现的。片内复位电路是复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,它的输出在每个机器周期的S5P2,由复位电路采样一次。复位电路通常采用上电自动复位和按钮复位两种方式,此电路系统采用的是上电与按钮复位电路。当时钟频率选用6MHz时,C取22μF,Rs约为200Ω,Rk约为1K。复位操作不会对内部RAM有所影响。
复位电路:由电容串联电阻构成,由图并结合“电容电压不能突变”的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.一般教科书推荐C 取10u,R取8.2K.当然也有其他取法的,原则就是要让RC组合可以在RST脚上产生不少于2个机周期的高电平[1-3]。
2.1.2 键盘电路
单片机键盘有独立键盘和矩阵式键盘两种:独立键盘每一个I/O 口上只接一个按键,按键的另一端接电源或接地(一般接地),这种接法程序比较简单且系统更加稳定;而矩阵式键盘式接法程序比较复杂,但是占用的I/O少。根据本设计的需要这里选用了独立式键盘接法。
独立式键盘的实现方法是利用单片机I/O口读取口的电平高低来判断是否有键按下。将常开按键的一端接地,另一端接一个I/O 口,程序开始时将此I/O口置于高电平,平时无键按下时I/O口保护高电平。当有键按下时,此I/O 口与地短路迫使I/O 口为低电平。按键释放后,单片机内部的上拉电阻使I/O口仍然保持高电平。我们所要做的就是在程序中查寻此I/O口的电平状态就可以了解我们是否有按键动作了[7]。
在用单片机对键盘处理的时候涉及到了一个重要的过程,那就是键盘的去抖动。这里说的抖动是机械的抖动,是当键盘在未按到按下的临界区产生的电平不稳定正常现象,并不是我们在按键时通过注意可以避免的。这种抖动一般10~200毫秒之间,这种不稳定电平的抖
- -可修编.
. -
动时间对于人来说太快了,而对于时钟是微秒的单片机而言则是慢长的。为了提高系统的稳定,我们必须去除或避开它。目前的技术有硬件去抖动和软件去抖动,硬件去抖动就是用部分电路对抖动部分加之处理,但是实现的难度较大又会提高了成本。软件去抖动不是去掉抖动,而是避抖动部分的时间,等键盘稳定了再对其处理。所以这里选择了软件去抖动,实现法是先查寻按键当有低电平出现时立即延时10~200毫秒以避开抖动(经典值为20毫秒),延时结束后再读一次I/O 口的值,这一次的值如果为1 表示低电平的时间不到10~200 毫秒,视为干扰信号。当读出的值是0时则表示有按键按下,调用相应的处理程序。
2.1.3 显示电路
显示器普遍地用于直观地显示数字系统的运行状态和工作数据,按照材料及产品工艺,单片机应用系统中常用的显示器有: 发光二极管LED显示器、液晶LCD显示器、CRT显示器等。发光二极管(LED)由特殊的半导体材料砷化镓、磷砷化镓等制成,可以单独使用,也可以组装成分段式或点阵式LED显示器件。分段式显示器(LED数码管)由7条线段围成8字型,每一段包含一个发光二极管。外加正向电压时二极管导通,发出清晰的光。只要按规律控制各发光段亮、灭,就可以显示各种字形或符号。LED数码管有共阳、共阴之分。
本次设计使用LCD液晶显示来显示时间,采用动态显示的方法,其中P3.0—P3.2为键盘控制端,调节显示的时间,P1.0—P1.7为液晶输出口,控制时间的显示,P2.0是控制蜂鸣器的输出口。
第三章 系统软件设计
软件在硬件平台上构筑,完成各部分硬件的控制和协调。系统功能是由硬件和软件共同实现的,由于软件的可伸缩性,最终实现的系统功能可强可弱,差别可能很大。因此,软件是本系统的灵魂。软件采用模块化设计方法,不仅易于编程和调试,也可减小软件故障率和提高软件的可靠性。同时,对软件进行全面测试也是检验错误排除故障的重要手段。
3.1主程序流程图
系统一开始,首先程序初始化,时间显示00时00分00秒,时间一秒一秒地继续往前走,通过按键s1,s2,s3调节时间的时分秒调节,当时间显示的时分秒等于10点时,蜂鸣器就打开,发出声音,一段时间后自动关闭声音。程序不断扫描键盘看是否有s1键按下,如果没有继续走时,如果扫描键盘时有按键按下,则执行中断程序,可以通过s2,s3调时。主程序流程图如下:
- -可修编.
. -
是 否 有 N
Y
设置时分秒 键按下 扫描键盘 关闭蜂鸣器 显示初始时间 Y 启动走时 打开蜂鸣器 系统初始化 N 判断时间是否为10点 开始 走时 - -可修编.
. -
图3-1 主程序流程图
3.2 主要子程序的流程图
中断子程序:当按下S1和S4按下时,运行中断程序,通过S2,S3调节时间,其流程图
如下:
图3-2 中断子程序流程图
按键子程序流程图:按下S1时即可实现时间的调节,通过按S2时间加,S3时间减,再按S1回到走时。按键子程序流程图如下:
- -可修编.
开始 主程序 S1键按下 中断服务 返回 . -
N S1按下
Y
图3-3按键子程序流程图
返回 通过S2,S3,调时 键盘扫描 开始 第四章 系统仿真
Proteus软件是Labcenter Electronics公司的一款电路设计与仿真软件,它包括ISIS、ARES等软件模块,ARES模块主要用来完成PCB的设计,而ISIS模块用来完成电路原理图的布图与仿真。Proteus的软件仿真基于VSM技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如MCS-51系列、PIC系列等等,以及单片机外围电路,比如键盘、LED、LCD等等。通过Proteus软件的使用我们能够轻易地获得一个功能齐全、实用方便的单片机实验室。
下图是截取的是时钟仿真图:
- -可修编.
. -
图4-1 时钟的仿真图
第五章 综合调试与问题的解决
单片机应用系统的调试包括硬件和软件两部分,但是他们并不能完全分开。一般的方法是排除明显的硬件故障,再进行综合调试,排除可能的软/硬件故障。这次由于时间紧迫的关系没有做实物,但是对硬件调试还是有一定的了解。
5.1 硬件调试
拿到电路板后,首先要检查加工质量,并确保没有任何方面的错误,如短路和断路,尤其要避免电源短路;元器件在安装前要逐一检查,用万用表测其数值,看是否与所用相同;完成焊接后,应先空载上电(芯片座上不插芯片),并检查各引脚的电位是否正确。若一切正常,方可在断电的情况下将芯片插入,再次检查各引脚的电位及其逻辑关系。将万用表的探针放到单片机接电源的引脚上检测一下,看是否符合要求。
5.2 软件调试问题及解决
软件程序的调试一般可以将重点放在分模块调试上,统调是最后一环。软件调试可以采取离线调试和在线调试两种方式。前者不需要硬件仿真器,可借助于软件仿真器即可;后者一般需要仿真系统的支持。本次设计,用Keil软件来调试程序,通过各个模块程序的单步或跟踪调试,使程序逐渐趋于正确,最后统调程序。
仿真部分采用proteus 6 professional软件,此软件功能强大且操作较为简单,可以很容易的实现各种系统的仿真。
- -可修编.
. -
首先打开proteus 6 professional软件,在元件库中找到要选用的所有元件,然后进行原理图的绘制;绘制好后再选择wave6000已经编译好的*.hex文件,选择运行,观察显示结果,根据显示的结果和课题的要求再修改程序,再运行查,直到满足要求为止。
结 论
本设计以单片机为核心,以LCD液晶作为显示,该设计很好地完成了设计的各项要求,主要体现如下:
手动键盘的控制时间和闹钟,以及准确地走时稳定性好等特点。
在毕业设计的整个过程中,我深切地体会到:实践是理论运用的最好检验。毕业设计是对我们4年所学知识的一次综合性测试和考验,无论是在动手能力方面还是理论知识的运用能力方面,都使得我有了很大的提高。通过这次毕业设计,使我得到了一次用专业知识、专业技能分析和解决问题全面的系统的锻炼。使我在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧,特别是对C语言的掌握方面都能向前迈了一大步,为日后成为合格的应用型人才打下良好的基础。
经过总结和分析,我意识到在设计程序之前,一定要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。 本次毕业设计为我的大学生活画上了圆满的句号,为我即将的工作和生活奠定了坚实的基础。
参考文献
[1] 王静霞.单片机应用技术[M].:电子工业,2009:20—150.
[2] 何立民.单片机高等教程[M].:航空航天大学,2000:150—210
[3] 何立民.单片机应用系统设计系统配置与接口技术[M].:航空航天大学,2001:1—494. [4] 雄建云.Protel99 se EDA技术及应用[M].:机械工业,2007:141—176. [5] 林春方.电子线路学习指导与实训[M].:电子工业,2004:118—164. [6] 杨宝清,宋文贵.实用电路手册[M].:机械工业, 2002:1—300. [7] 曾屹.单片机原理与应用[M]. :中南大学,2009:18—154.
[8] 杨立.微型计算机原理与接口技术[M].中国水利水电,2005:165—180. [9] 李杨帮.实用电源电路集锦[M].:电子工业,1998:26—59. [10] X运利.单片机技术应用[M].:械工业,2005:80—127.
[11] 胡健.单片机原理及接口技术实践教程[M].:机械工业,2004:12—116. [12] 李华.MCS-51单片机接口技术与运用[M].:航天航空大学,2000:44—191. [13] 胡汉才.单片机接口技术与运用[M]. :机械工业,2005:104—225. [14] 唐俊翟,许雷.单片机原理与应用[M]. :冶金工业,2003:69—143.
- -可修编.
. -
致
在学院各位领导以及指导教师彭老师的大力支持下,我基本完成了这次设计任务。我在这一次毕业设计过程中,很是受益匪浅。通过对自己在大学四年时间里所学的知识的回顾,并充分发挥对所学知识的理解和对毕业设计的思考及书面表达能力,最终完成了。这为自己今后进一步深化学习,积累了一定宝贵的经验。撰写论文的过程也是专业知识的学习过程,它使我运用已有的专业基础知识,对其进行设计,分析和解决一个理论问题或实际问题,把知识转化为能力的实际训练。在同学及指导教师彭老师的一些指点和引导下,真正培养了我运用所学知识解决实际问题的能力。
通过这次设计我发现,只有理论水平提高了才能够将课本知识与实践相整合,理论知识服务于教学实践,以增强自己的动手能力。这个设计在现实社会中也存在着一定的价值和意义,从中我获得很深刻的经验。通过这次设计,我知道了理论和实际的距离,也知道了理论和实际想结合的重要性,也从中得知了很多书本上无法得知的知识。
我们的学习不但要立足于书本,以解决理论和实际教学中的实际问题为目的,还要以实践相结合,理论问题即实践课题,解决问题即课程研究,学生自己就是一个专家,通过自己的手来解决问题比用脑子解决问题更加深刻。学习就应该采取理论与实践结合的方式,理论的问题,也就是实践性的课题。这种做法既有助于完成理论知识的巩固,又有助于带动实践,解决实际问题,加强我们的动手能力和解决问题的关键。
附 录
系统软件设计程序代码 #include #define uchar unsigned char #define uint unsigned int sbit rs=P3^5; sbit rw=P3^6; sbit lcden=P3^4; sbit s1=P3^0; sbit s2=P3^1; sbit s3=P3^2; sbit buzzer=P2^0; uchar n,s1num; char miao,shi,fen; uchar code table[]=\" 00:00:00\"; void delay(uint z) { void write_(uchar ) { rs=0; lcden=0; P1=; delay(5); lcden=1; delay(5); lcden=0; uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } } - -可修编. . - void write_date(uchar date) { rs=1; lcden=0; P1=date; delay(5); lcden=1; delay(5); lcden=0; } void init() { uchar num; lcden=0; rw=0; write_(0x38); write_(0x0c); write_(0x06); write_(0x01); write_(0x80); for(num=0;num<15;num++) { write_date(table[num]); delay(5); } TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void write_shifenmiao(uchar - add,uchar date) { uchar shi,ge; shi=date/10; ge=date%10; write_(0x80+add); write_date(0x30+shi); write_date(0x30+ge); } void naozhong() { buzzer=0; if(shi==10&fen==00&miao==00) { buzzer=1; delay(100); buzzer=0; delay(100); } } void keyscan() { if(s1==0) { delay(5); if(s1==0) { s1num++; while(!s1); if(s1num==1) { TR0=0; write_(0x80+10); write_(0x0f); } } if(s1num==2) { -可修编. . - write_(0x80+7); } if(s1num==3) { write_(0x80+4); } } if(s1num==4) { s1num=0; write_(0x0c); TR0=1; } if(s1num!=0) { if(s2==0) { delay(5); if(s2==0) { while(!s2); if(s1num==1) { miao++; if(miao==60) miao=0; write_shifenmiao(10,miao); write_(0x80+10); } if(s1num==2) { fen++; if(fen==60) fen=0; - write_shifenmiao(7,fen); write_(0x80+7); } if(s1num==3) { shi++; if(shi==24) shi=0; write_shifenmiao(4,shi); write_(0x80+4); } } } if(s3==0) { delay(5); if(s3==0) { while(!s3); if(s1num==1) { miao--; if(miao==-1) miao=59; write_shifenmiao(10,miao); write_(0x80+10); } if(s1num==2) { fen--; if(fen==-1) fen=59; -可修编. . - write_shifenmiao(7,fen); write_(0x80+7); } if(s1num==3) { shi--; if(shi==-1) shi=23; write_shifenmiao(4,shi); write_(0x80+4); } } } } } void main() { init(); while(1) { keyscan(); naozhong(); } } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; n++; if(n==20) { n=0; - miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; } write_shifenmiao(4,shi); } write_shifenmiao(7,fen); } write_shifenmiao(10,miao); } } n=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) -可修编. . - { shi=0; } write_shifenmiao(4,shi); } write_shifenmiao(7,fen); } write_shifenmiao(10,miao); } } - -可修编. 因篇幅问题不能全部显示,请点此查看更多更全内容