总 结
通过自己的不懈努力,我终于完成了毕业设计任务书上的任务要求。功能上基本达标:时钟的显示,调时功能、校时功能、闹铃功能、闹钟设功能。其精确度完全可以满足日常生活显示时间的需要;调时功能,方便快捷;校时功能保证了时钟准确和可靠性,闹钟响铃还有扩展成音乐闹钟的余地。硬件设施合乎要求,软件设计可以配合硬件实现要求的功能。但是由于时间比较短,前期设计出现部分不足:如位选闪烁功能不能实现、闹钟的开启与关闭、间断蜂鸣声等。这些只是软件设计时相应功能部分还不完善造成。不过经仔细思考和程序的完善,最终将软件设计改进,并完全可以很好实现所有要求的功能。
可见技术在不断进步,机械式时钟已经被淘汰,取而代之的是具有高度准确性和直观性且无机械装置,具有更长的使用寿命等优点的数字时钟。数字时钟更具人性化,更能提高人们的生活质量,更受人们欢迎。
无可否认机械时代已经过去,电子时代已经到来。做为新时代的我们,更应该提高自身能力,适应新时代的发展。知识来自实践,多去生活中探询所需要的。对于上述所提到的研究课题,我们应尽量考虑到人的因素,增强时钟的实用性和操作性,为使用者提供切实的方便,营造一种舒适的生活氛围。所以,在设计的时候,应该从多方面、多角度去考虑问题,而且应该进一步提高时钟的质量。
另外,在本次设计的过程中,我发现很多的问题,虽然以前没有做过这样的设计但通过这次设计我学会了很多东西,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,比如写一个程序看其功能很少认为编写程序简单,但到编程的时候才发现一些细微的知识或低级错误经常犯做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解的,更谈不上掌握。
从这次的课程设计中,我们真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高,我想这就是我在这次课程设计中的最大收获。
12
致 谢
经过几个月的实习调查收集数据资料、整理材料、写作论文,我终于可以顺利的完成论文了。
首先要感谢我的指导老师陈老师,他指引我论文的写作的方向和架构,并对本文初稿进行仔细批阅,指正出其中不当之处,使我有了思考的方向,他的循循善诱的教导和不拘一格的思路给予我无尽的启迪,他的严谨细致、一丝不苟的作风,将一直是我工作、学习中的榜样。
通过此次的论文,我学到了很多知识,在论文的写作过程中,我不仅收集到了论文所需的资料数据,而且学到了很多书本上没有的知识。并且由原先的被动的接受知识转换为主动的寻求知识,我想这可以说是学习方法上的一个很大的突破。
在论文的写作过程中也学到了做任何事情所要有的态度和心态,首先做学问要一丝不苟,对于发展过程中出现的任何问题和偏差都不要轻视,要通过正确的途径去解决,在做事情的过程中要有耐心和毅力,不要一遇到困难就打退堂鼓,只要坚持下去就可以找到思路去解决问题的。
总之,此次论文的写作过程,我收获了很多,为大学四年划上了一个完美的句号,也为将来的人生之路做一个很好的铺垫。
再次感谢我的大学和所有帮助过我并给我鼓励的老师和同学,谢谢你们!
2010年6月
13
参考文献
[1]李全利、 迟荣强,单片机原理及接口技术[M],北京:高等教育出版社,2004 [2]凌玉华,单片机原理及应用系统设计[M],长沙:中南大学出版社,2006 [3]张毅刚,MCS-51单片机应用设计[M],哈尔宾:哈尔宾工业大学出版社,1997 [4]胡汉才,单片机原理及应用[M],北京:清华大学出版社,2004
[5]何立明,单片机应用系统设计[M],北京:北京航空航天大学出版社,1990 [6]王荣良,计算机接口技术[M],北京:电子工业出版社,2003
[7]陈光东,单片机微型计算机原理与接口技术[M],武汉:华中理工大学出版社,1998 [8]王幸之、钟爱琴、王雷、王闪,AT89系列单片机原理与接口技术[M],北京:北京航空航天大学出版社,2004
[9]张道德,单片机接口技术(C51版)[M],北京:中国水利水电出版社,2007 [10]王为青、程国钢,单片机Keil CX51应用开发技术[M],北京:人民邮电出版社,2007
[11]张靖武、周灵彬,单片机系统的Proteus设计与仿真[M],北京:电子工业出版社,2007
[12]ATMEL. 8-bit Microcontroller with 4K Bytes Flash AT89C51.2000 [13]ATMEL.8-bit Microcontroller with 32K Bytes Flash AT89C51RC.2000
14
附 录
相关的程序代码:
//****************************头文件******************************** #include
//****************************宏定义******************************** #define uchar unsigned char #define uint unsigned int
//****************************位声明******************************** sbit key1=P1^0; sbit key2=P1^1; sbit key3=P1^2; sbit key4=P1^3; sbit fmq=P2^1;
//************************数码管显示的数值************************** uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, // 0 1 2 3 4 5 0x82,0xf8,0x80,0x90,0xbf,0x0ff}; // 6 7 8
9 - 灭
//****************************函数声明****************************** void jia(); void jian();
//********************数组定义,数组内含有8个数值****************** uchar table1[8],table2[8],table3[8],table4[8];
//**************************时间显示初始值************************** uchar shi=12,fen=0,miao=0;
//**************************定义全局变量**************************** uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3; uchar shi4,fen4,miao4;
15
uchar flag, flag1, wss, cnt, cnt1, alm1, alm2, alm3; // 1秒 等时 位闪 次数 校时 闹1 闹2 闹3 uint flag2; // 蜂鸣
//*********************延时函数,用于动态扫描数码管***************** void delay(uchar i) { uchar x,y; for(x=i;x>0;x--) for(y=120;y>0;y--); }
//*******************************初始化函数************************* void init()
{ TMOD=0x01; //工作方式1
TH0=0x3c; //定时时间为:50ms (65536-50000)/256 TL0=0x0b0; //(65536-50000)%6 ET0=1; //打开定时器 EA=1; //开总中断 TR0=1; //启动定时器 }
//********************显示子函数,用于显示时间数值***************** void display() { uchar i,j;
if(cnt!=10||wss==0)
{ table1[0]=miao; //分离秒的个位与十位 table1[1]=miao/10;
} else
{ table1[0]=table1[1]=11;} if(cnt!=11||wss==0)
{ table1[3]=fen; //分离分的个位与十位
table1[4]=fen/10;
}
16