单片机系统课程设计报告.docx
《单片机系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机系统课程设计报告.docx(9页珍藏版)》请在冰豆网上搜索。
单片机系统课程设计报告
安徽经济管理学院
单片机课程设计报告
设计题目:
系别:
专业:
班级:
姓名:
学号:
成绩:
2011年11月4日
一、设计任务和性能指标
1.1设计任务
利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个日历时钟,用LED把日期﹑时间实时显示出来。
要求用Protel画出系统的电路原理图(要求以最少组件,实现系统设计所要求的功能),印刷电路板(要求布局合理,线路清晰),绘出程序流程图,并给出程序清单(要求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。
1.2性能指标
1.日历:
年(2位)、月(2位)、日(2位)
2.时钟:
时(2位)、分(2位)、秒(2位)
3.星期(1位)
4.校对键:
确认键、加键、翻屏键
5.阴历日期推算并显示:
月(2位)、日(2位)、指示阴历闰月(发光二极管一个)
二.设计方案
按照系统设计的功能的要求,初步确定设计系统由主控模块、时钟模块、显示模块、键扫描接口电路共四个模块组成,电路系统构成框图如图1.1所示。
主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。
它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。
时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片DS1302。
采用DS1302作为主要计时芯片、可以做到计时准确。
更重要的是,DS1302可以在很小的电流的后备电源(2.5~5.5V电源,在2.5V时耗电小于300nA)下继续计时,并可编程选择多种充电电流对后备电源进行慢速充电,可以保证后备电源基本不耗电。
采用串行数据传输,与单片机硬件连接简单,如果使用时钟芯片DS12887,将采用并行数据传输,占用更多的硬件资源。
因此为节省单片机端口,时钟芯片采用DS1302。
图2..1日历时钟显示系统构成框图
显示模块采用普通的共阴LED数码管,也可采用LCD显示,但考虑其造价较高浪费资源,故使用LED显示。
键盘采用线性连接,连接方式相对简单,使用查询法实现调整功能。
三、系统硬件设计
3.1单片机的最小系统
ATMEL公司生产的AT89C52单片机它是硬件电路的核心部分,时钟电路晶振使用11.0592MHz,复位电路采取按键复位方式。
具体连接见附录1。
3.2时钟电路DS1302
A.DS1302的性能
�实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数;
�用于高速数据暂存的31*8位的RAM;
�最少引脚的串行I/O;
�2.5-5.5V的电压工作范围;
�2.5V时耗电小于300nA;
�用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方
式;
�简单的3线接口;
�可选的慢速充电(至Vcc1)的能力。
DS1302时钟芯片包括实时时钟/日历和31字节的静态RAM。
它经过一个简单
的串行接口与微处理器通信。
实时时钟/日历提供秒、分、时、日、周、月和年等信息。
对于小于31天的月和月末的日期自动进行调整,还包括闰年校正的功能。
时钟的运行可以采用24h或带AM(上午)/PM(下午)的12h格式。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多字节的时钟信号或RAM数据。
DS1302有主电源和后备电源双电源引脚:
Vcc1在单电源与电池供电的系统中提供低电源,并提供低功率的电池备份;Vcc2在双电源系统中提供主电源,在这种运用方式中,Vcc1连接到备份电源,以便在没有主电源的情况下
能保存时间信息以及数据。
DS1302由较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电;当Vcc2小于Vcc1时,DS1302由Vcc1供电。
B.DS1302数据操作原理
DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被输入。
无论是读周期还是写周期,开始8位指定40个寄存器中哪个被访问到。
在开始8个时钟周期,把命令装入移位寄存器之后,另外的时钟周期在读操作时输出数据,在写操作时
写入数据。
时钟脉冲在单字节方式下为8加8,在多字节方式下为8加字节数,最大可达248个字节数。
如果在传送过程中置RST脚为低电平,则会中止本次数据传送,并且I/O
引脚变为高阻态。
上电运行时,在Vcc≥2.5V之前,RST脚必须保持低电平.只有在SCLK为低电平时,才能将RST置为高电平。
DS1302的引脚及内部结构图如图3.1所示,表3.1为各引脚功能。
图3.1DS1302引脚及内部结构
引脚号
引脚名称
功能
1
Vcc2
主电源
2,3
X1,X2
振荡源,外接32.768KHZ晶振
4
GND
地线
5
RST
复位/片选线
6
I/O
串行数据输入/输出端(双向)
7
SCLK
串行数据输入端
8
Vcc1
后备电源
表3.1DS1302引脚功能
DS1302与单片机的具体连接见附录1,它的控制字如图3.2所示。
控制字的最高有效位(位7)必须是逻辑1;如果为0,则不能把数据写到DS1302中。
位6如果为0,则表示存取日历时钟数据;为1表示存取RAM数据。
位5-1(A4-A0)指示操作单元的地址。
最低有效位(位0)如果为0,表示要进行写操作;为1表示要进行读操作。
控制字节总是从最低位开始输入/输出。
76543210
1
RAMCK
A4
A3
A2
A1
A0
RAMK
图3.2DS1302的控制字
DS1302共有12个寄存器,其中有7个寄存器与日历、时钟有关,存放的数据为BCD码形式。
其日历、时间寄存器及其控制字见表2.2,其中奇数为读操作,偶数为写操作。
DS1302的晶振选用32.768KHz。
3.3显示电路的设计
显示部分采用普通的共阴数码管显示,使用动态扫描,以便减少硬件电路。
考虑到一次扫描7位数码管显示时会出现闪烁情况,设计时采用多次调用显示子程序解决这个问题。
驱动数码管的芯片采用驱动能力较强的74HC373,使用单片机的P0口作为并行输出,74HC373是高电平锁存,用P1.4口作为74HC373时钟控制端口,即置‘1’控制端。
由于数码管采用共阴接法,使用P2.0口-P2.6口作为数码管的位选,同时加入74LS04作为反向驱动。
74HC373在得到高电平后,将8位数据锁存,并行输出送至数码管各段选控制口。
由于P0口内部无上拉电阻,因此需要采用外接上拉电阻的方法,以提高带负载能力,同时还使用发光二极管来指示阴历的闰月。
具体连接见附录1。
3.4键盘接口的设计
键盘只有4个,其中1个用于单片机上电复位,其余三个用普通按键接10KΩ上拉电阻,分别控制移位(对应硬件电路图中的S4键,)、翻屏(对应硬件电路图中的S3)、加一键(对应硬件电路图中的S2),使用查询法来完成读键功能。
其具体连接见附录1。
四、系统软件设计
4.1主程序设计
因为使用了时钟芯片DS1302,阳历只需从DS1302各寄存器中读出年、周、月、日、时、分、秒等数据,再经处理即可。
在首次对DS1302进行操作之前,必须对它进行初始化,然后从DS1302中读出数据,再经过处理后,送给显示缓冲单元。
然后调用阴历更新程序,根据阳历日期推算出阴历日期。
在调用更新阴历程序后,要读取键值。
此时如果控制键有效,则进入时间调整部分。
调整时间用3个调整按键,1个作为移位、控制用,1个定义为控制按键,用于翻屏,另外1个按键用作加1键。
在调整时间过程中,要调整的位与未调整位应有所区别,所以增加了闪烁功能,即调整的位一直在闪烁,直到调整下一位。
闪烁的原理就是,让调整的一位每隔一定时间熄灭一次,利用计数器0,方式1,初值设为0,因为晶振为11.0592MHZ,所以当计数达到60ms左右时会溢出,让计数器T0中断6次,就送给调整位熄灭符,再次中断6次时,再送正常显示的值,不断交替,直到调整该位结束。
此时送正常显示值给该位,再进入下一位调整闪烁程序。
主程序流程图见图4.1。
4.2阴历子程序设计
阴历程序的实现是依靠阳历日期来推算的。
要根据阳历来推算阴历日期,首先要设计算法。
推算的方法是根据阳历当前日期在一年中的天数来计算阴历日期。
计算出的阳历天数为该年的第几天,存放在R2和R3中。
计算出天数后,如果大于#FFH,则把#FFH存放在R2中,余数存放在R3中。
由于整体算法很复杂,需要计算从2000年到2050年阴、阳历之间的关系,制成表格,用DPTR查表的方法来送显示,因此这里只给出流程图解释说明,阴历程序流程图如图4.2和图
4.3所示。
4.3显示子程序设计
为编程方便将翻屏部分放到了显示子程序中,在子程序入口首先判断翻屏键是否有效,如果有效将翻屏标志位加1,取相应的显示缓冲区首地址,即从另一存储单元开始显示,达到翻屏效果。
373为高电平锁存,其CLK端接单片机P1.4,在给它地址锁存信号时只需将P1.4置1,应注意置1后要将其归0,方便锁存。
程序流程图如图4.5所示。
五、调试及性能分析
5.1调试步骤
调试分为硬件调试和软件调试。
硬件调试主要是检测硬件电路是否有短路、断路、虚焊等。
具体步骤及测试
结果如下:
(1)检查电源与地线是否全部连接上,用万用表对照电路原理图测试各导线是否完全连接,测试结果所有连接线都已连接好;
(2)检验DS1302和单片机的晶振是否起振,用示波器观察波形;测试结果波形都很好;
(3)检查各芯片的功能是否正常,检测按键的导通情况。
测试结果正常。
软件调试主要是程序调试,将整个日历时钟显示程序按照实现功能分为各子
模块进行调试,首先都要在实验台上进行调试。
具体步骤如下:
(1)显示程序调试。
在单片机实验课中我们已经做过LED显示实验,所以这部分相对简单,很快便调试无误了。
我们设计的硬件显示部分与实验台虽然并不相同,但相差并不多,经改动后在单路板上也调试通过了;
(2)时间调整程序的调试。
这部分也先在实验台上调试过,此时显示程序已经无误,我们直接观察数码管的显示情况,首先在单片机的内存单元中置成了
当时的时间,然后看时间调整键是否好用,这部分在实验台上调试无误后可直接在电路板上使用;
(3)阴历子程序的调试。
由于阴历程序非常长,我们在敲完程序后就检查
了几便。
其调试方法是在存放阳历的内存单元中置成当天的日期,在程序执行后看转换的是否正确。
阴历子程序主要是根据参考书编写的,在调试过程中发现在
阳历为一月份时转换的不对,经我们在实验台上单步调试找到了错误的原因,阴历子程序调试成功,在电路板上直接使用即可
(4)阳历日期和时间的读取。
实验台中并没有时钟芯片,这部分只能在电
路板焊接完成后才能进行调试,经我们查阅资料后,这部分在电路板上一次性通过。
5.2性能分析
单片机上电复位后,七个数码管显示为全零状态,这是因为还没有给DS1302初值,它此时并没有开始振荡,所以从DS1302读取的值都是0;按下控制键进入时间调整状态,此时在我们调整哪一位时哪一位就会处于闪烁状态,按下加1键被调整的那一位就会加1,而且没有按键抖动现象;在给DS1302写入初值后,它开始振荡,通过移位控制键、翻屏键的作用可以查看显示的年、月、日、周、时、分、秒是否正确,在调试时我们写入的初值是当时的时间:
06年12月21日14点55分,通过翻屏,可以看到数码管显示的很稳定,时间的显示也很准确;在翻到显示阴历那一屏是可以看到当时的阴历日期是十一月二日,阴历转换没有错误;当我们将日期置为2006年9月1日时,因为当天是阴历闰七月的初九,用于指示阴历闰月的发光二极管正常发光。
由于课程设计时间比较短,我们没有大量的时间去观察时钟走的是否精确,在走过一段时间后时间显示上可能会有一定的误差,我们可以再外接GPS,采用GPS授时校正,提高时间的精度。
我们的日历可以把阳历任意置成某一天然后查看当时的阴历是几月初几,实现了阴历的自动转换,星期的自动转换也可以编写
程序实现,这样既可以跳到指定日期查看阴历,也可以查看当天是星期几了,所
以我们的日历在性能上还有不完善的地方,在以后的学习当中,我们将尽力把这些功能也完善好。
六、心得体会
这次课程设计是对我们学习微机原理及单片机课程的检验及实际应用能力的一次提高。
我们所设计的是电子日历时钟显示系统。
所能指示的时间范围从
2000年到2050年。
由于是时间显示系统,因此在时间显示上我们力求做到精准。
时钟芯片DS1302本身并无阴历计数功能,因此我们采用软件实现了阳历到阴历
的部分。
阴历算法十分复杂,我们找到相关资料,实现阳历与阴历的转换。
显示
部分是整个系统的核心部分,因此我们重点集中在这一部分的模块调试上。
由于我们采用的是P0口作为并行输出,但却没有考虑到其内部无上拉电阻,P0口输出电压较低,因此数码管无法显示。
我们在老师的帮助下加入了上拉电阻,数码管开始正常显示,但亮度不够,我们仔细的分析了用于驱动数码管显示的
74HC273,终于找到了其中的原因。
74HC273驱动能力不强,输出电压不够,导
致了数码管显示不清晰,为此我们改变了驱动芯片,使用74HC373作为显示驱动芯片,数码管的显示终于达到了预期的较为理想的效果。
为了更逼近真实的情况,在调整时间时我们又加入了闪烁程序,以示区别。
原理图的设计时我们使用了Protel99SE这个强大的绘图工具,由于一些实际的器件在器件库中无法找到,我们只有自己制作,在这个过程中我们学到了很
多的知识和方法。
在制作PCB印刷电路板的时候,很多器件的封装与实际尺寸存在很大的差别,为了获得准确的封装,我们实际测量了所给器件的大小与规格,自己制作与之匹配的封装库,这让我们明白实践是出真知的唯一途径,只有亲自动手,实际才能测试才能获得最可靠的设计数据。
当然我们也出现了严重的失误,
由于对电源与地的距离估计不足,导致两者过近,出现了短接的危险。
因此我们
不得不重新处理这个问题,这个教训也告诫了我们,对于任何小的细节都不能掉以轻心,小的疏忽也会造成大的损失。
对于电路图和电路板都应当采取科学谨慎的态度,这是保证是的基本实验结果产生的前提,在正式焊接前,对电路板的核查测试应当细心备至,反复检测才不会导致最终的失败。
程序的编写过程也给了我们很大的收获。
在编写程序之前,我们查阅了大量
的相关资料,力求做到规范清晰。
在把握了整体的思路后,我们先从程序流程图着手,将整个程序分成若干模块,分开编写,一边发现问题一边解决问题,并在实验板上检验程序测试情况,根据现象不断修改。
在这个过程中我们体会到编程的技巧,设置子程序的合理性,同时对单片机最小系统的设计有了整体的理解
和深刻的体会,使我们的思维的锻炼与能力培养有了很大的提高和长足的进步。
本次课程设计虽然时间很短,但收获却很大。
首先我们对单片机最小系统的设计有了整体的把握,对程序编写的合理与规范性有了深刻的理解,建立起程序设计的一般思路,以及Protel99SE的使用方法,其强大的功能给我们提供了很大的帮助,通过原理图的设计过程,使我们认识到了这个软件的重要性,我们会以此为契机,在日后的学习中会继续使用它,使其发挥更大的功能。
经过三个星期的课程设计,我们得到了充分的锻炼,不仅对单片机的学习有了深刻的理解,同时也增强了我们的毅力和处理突发问题的能力。
学习是要付出
一定的艰辛与努力的,做事情一定要有不怕困难的吃苦精神,唯有坚持不懈,发
扬团队协作才能够克服困难,取得最后的胜利。
相信本次课程设计对我们以后的学习将会有很大的影响,我们一定会积极地总结经验与教训,改进不足,争取在日后做得更好。
当然要感谢老师和同学们的帮助,在我们束手无策,陷入困境的时候给予热情的帮助,使我们顺利渡过难关。
课程设计是一次很好的实践动手机会,通过实践,我们的知识得到了应用,
真正实现了知识的学以致用,理论联系实际,我们会更加注重实践能力的锻炼,注重动手能力的培养。
参考文献
[1]徐维祥、刘旭敏.单片微型机原理及应用.大连:
大连理工大学出版社,1996[2]李光飞、楼然苗、胡佳文、谢象佐.单片机课程设计与实例指导.北京:
北京航空航天大学出版社,2004
[3]余永权.89系列FLASH单片机原理及应用.北京:
电子工业出版社,2002[4]李群芳,黄建.单片机微型计算机与接口技术.北京:
电子工业出版社,2001
[5]楼然苗、李光飞.51系列单片机设计实例.北京:
北京航空航天大学出版社,2003
附录1系统硬件电路图
附录2程序清单