资源描述
课程设计材料
39
2020年4月19日
文档仅供参考,不当之处,请联系改正。
天津职业技术师范大学电子工程学院
电子信息工程
课程设计报告
同组学生姓名(学号):石富友()
卢志锋()
王震()
班 级: 电信1001班
任务分工:卢志锋负责电路焊接及调试、石富友和王震负责查找资料、编程序和撰写报告总结
设计时间: 1月7 日 —— 年 1月18日
指导教师: 薛召军、丁学文
目 录
题目:基于单片机的电子万年历设计
一、 课程设计的目的与要求(含设计指标) 3
二、 方案论证选择 3
三、 原理设计(或基本原理) 3
四、 电路仿真 5
五、 方案实现与测试(或调试) 7
六、 课程设计小结
七、 参考文献
个人总结(姓名) 17
一 课程设计的目的和要求(含设计指标)
1、显示年月日时分秒及星期信息。
2、具有可调整日期和时间功能
3、增加闰年计算功能
二 方案论证和选择
(1)单片机芯片的选择方案和论证
方案一:
采用STC89C52,片内ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,因此不会对芯片造成损坏。因此选择采用STC89C52作为主控制系统.
方案二:
采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,可是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。
(2)时钟芯片的选择方案和论证
方案一:
直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,可是,实现的时间误差较大。因此不采用此方案。
方案二:
采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.,但找不到这种芯片,因此本设计不采用这种芯片。
三 原理设计(或基本原理)
(1)微处理器
在设计过程中我使用12MHZ晶振与单片机8052相连接,经过软件编程的方法实现了以24小时为一个周期同时显示小时,分钟和秒的要求,该定时闹钟设有九个按键,使之具备了校时、定时功能。利用单片机定时器及计数器产生定时效果经过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。同时经过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
在PROTEUS软件环境下的8052芯片如图1所示:
图1 PROTEUS软件环境下的8052芯片
(2)按键电路
由于我设计的是电子万年历,需要实现多种功能的显示,并要能够切换显示和调节年月日,因此,在设计过程中按键的设计就显得尤为重要。
在设计过程中我一共采用了4个按键,尽量在小的空间里实现最多的功能。其中K1键是年月日与时间显示切换键,按下一次就能够更换一次显示位。在调整显示环境下K2和K3键是显示调整位的的加1减1键,K4键实现清零,并提高万年历显示的精确性。按键电路如图2所示:
图2 按键电路
(3)电路框图C P U
按键与按钮 电路
复位等辅助电路
数码管显示电路
总体开关
电源系统
四 方案实现
(1)程序流程框图
图-A 主程序流程图
图-B计算阳历程序流程
图-C 时间调整程序流程图
图-D 阴历程序流程图
五 调试
(1)硬件调试
电子万年历的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会刺被带有包皮的导线,则会对电路造成短路现象。
在本成电子万年历的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是能够避免的,以下为主要的问题:
对万年历修改时间或日期时,有时LED数码管被屏蔽掉,造成不亮现象。
解决:根据仪器的测试,发现电路的驱动能力不足,最后在DS1302时钟芯片的/CS、SCLK、RET端接入5.1K的上拉电阻后,电路的驱动能力才能满足,即可解决不亮现象。
(3)软件测试
电子成年历是多功能的数字型,能够看当前日期(阴、阳历),时间,还有温度的仪器。电子成年历功能很多,因此对于它的程序也较为复杂,因此在编写程序和调试时出现了相对较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。在软件的调试过程中主要遇到的问题如下:
1.烧入程序后,LED数码管显示闪动,而且亮度不均匀。
解决:首先对调用的延时进行逐渐修改,能够解决显示闪动问题。其次,由于本作品使作动态扫描方式显示的数字,动态扫描很快,人的肉眼是无法看出,可是调用的显示程序时,如果不在反回时屏蔽掉最后的附值,则会出现很亮的现象,因此在显示的后面加了屏蔽子令,最后解决了此问题。
2.修改时间、日期时没有农历没有自动对应上。
解决:把不相关的程序暂时屏蔽,地农历的子程序独立调试,发现在调用农历自动更新时,对十进制和十六进制处理不好,因此会造成错乱。最后把相应的十进制进行修改,使得能够与十六进制对应,最后解决了此问题.
(4)测试结果分析与结论
1 测试结果分析
1.在测试中遇到发光二极管、LED数码管为不显示时,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏.
2.LED 数码管显示不正常,还有亮度不够,首先使用试测仪对电路进行测试,观察电路是否存在短路现象。查看烧写的程序是否正确无误,对程序进行认真修改。
2 测试结论
经过多次的重复测试与分析,能够对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力.同时在软件的编程方面得到更到的提高,对编程能力得到加强.同时对所学的知识得到很大的提高与巩固.
(5)程序
#include <reg52.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
uchar code scan_cursor[4]={0xf7,0xfb,0xfd,0xfe};
uchar data display[4]={0x3f,0x3f,0x3f,0x3f};
uchar code Seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xffb};
uchar code Segbit[]={~(1<<0),~(1<<1),~(1<<2),~(1<<3)};
uchar data ms50=0x00,con=0x00,con1=0x00,con2=0x00,con3=0x00;
sbit K1=P1^7;
sbit K2=P1^6;
sbit K3=P1^5;
sbit K4=P1^4;
uchar flag;
uint msec;
uint sec;
uint min=41;
uint hour=21;
uint day=15;
uint month=7;
uint yearl=11;
uint yearh=20;
uint tcnt;
uint cursor=0;
uchar a=0xff;
void delay1ms(uint t)
{
uint i;
while(t--)
{for (i=0;i<125;i++);}
}
void Kscan()
{
uchar i,j;
for(i=248;i>0;i--);
for(j=248;j>0;j--);
}
void temp(uchar L1,uchar L2,uchar L3,uchar L4)
{
if (cursor==2&&(flag))
{
P2=Segbit[3]|a;
P0=L1;
delay1ms(1);
}
else
{
P2=Segbit[3];
P0=L1;
delay1ms(1);
}
if (cursor==1&&(flag))
{
P2=Segbit[1]|a;
P0=L3;
delay1ms(1);
}
else
{
P2=Segbit[1];
P0=L3;
delay1ms(1);
}
if (cursor==2&&(flag))
{
P2=Segbit[2]|a;
P0=L2;
delay1ms(1);
}
else
{
P2=Segbit[2];
P0=L2;
delay1ms(1);
}
if (cursor==1&&(flag))
{
P2=Segbit[0]|a;
P0=L4;
delay1ms(1);
}
else
{
P2=Segbit[0];
P0=L4;
delay1ms(1);
}
}
main()
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if (K1==0) {
Kscan();
if(K1==0)
{
while(!K1);
Kscan();
cursor++;
if (cursor>2)
{
cursor=0;
}
}
}
if (cursor) {
if(K2==0)
{
Kscan();
if(K2==0)
{
if (1==flag)
{
if (cursor==1)
{
if (K2==0)
{
while(!K2);
Kscan();
min++;
if(min==60) min=0;
}
}
if (cursor==2)
{
while(!K2);
Kscan();
hour++;
if(hour==24) hour=0;
}
}
else if (2==flag)
{
if (cursor==1)
{
while(!K2);
Kscan();
day++;
if (day==32)day=1;
}
if (cursor==2)
{
while(!K2);
Kscan();
month++;
if (month==13)
month=1;
}
}
else if (3==flag)
if (cursor==1)
{
while(!K2);
Kscan();
yearl++;
if (yearl==100)
yearl=0;
}
}
}
if (K3==0)
{
Kscan();
if (K3==0)
{
while(!K3);
Kscan();
if (1==flag)
{
if (cursor==1)
{
min--;
if (min+1==0)
min=59;
}
if (cursor==2)
{
hour--;
if (hour+1==0)
hour=23;
}
}
else if (2==flag)
{
if (cursor==1)
{
day--;
if (day==0)
day=31;
}
if (cursor==2)
{
month--;
if (month==0)
month=12;
}
}
else if(3==flag)
{
if (cursor==1)
{
yearl--;
if (yearl+1==0)
yearl=99;
}
}
}
}
}
if (K4==0)
{
Kscan();
if (K4==0)
{
while(!K4);
Kscan();
if (++flag>3)
flag=0;
cursor=0;
}
}
if(flag==0) temp(Seg[sec/10],Seg[sec%10],Seg[msec/10],Seg[msec%10]);
else if(flag==1) temp(Seg[hour/10],Seg[hour%10],Seg[min/10],Seg[min%10]);
else if(flag==2) temp(Seg[month/10],Seg[month%10],Seg[day/10],Seg[day%10]);
else if(flag==3) temp(Seg[yearh/10],Seg[yearh%10],Seg[yearl/10],Seg[yearl%10]);
}
}
void t0(void)interrupt 1 using 0
{
tcnt++;
if (tcnt==400)
{
tcnt=0;
msec +=10;
if (msec==100)
{
msec=0;
sec++;
a=~a;
if (sec==60)
{
sec=0;
min++;
if (min==60)
{
min=0;
hour++;
if (hour==24)
{
hour=0;
day++;
if(month==2&&((yearl==0&&yearh%4==0)||(yearl!=0&&yearl%4==0))&&day==30)day=1;
else if(month==2&&day==29)day=1;
else if((month==4||month==6||month==9||month==11)&&day==31)day=1;
else if(day==32)day=1;
if (day==1)
{
month++;
if (month==13)
{
month=1;
yearl++;
if (yearl==100)
{
yearl=0;
yearh++;
if (yearh==100)
{
yearh=20;
}
}
}
}
}
}
}
}
}
}
六 总结
这次课程设计,我们组三个人分工合作。从一开始的选题,然后确定方案、买零件,到最后的设计调试,我们组员都在一起研究讨论。经过这次设计,我们三个人都有了很大的收获,对单片机编程控制有了进一步的了解。
该设计涉及到了单片机的时序控制,数据接口包括并行数据接口以及串行通信接口,同时用到了控制按键、环境信息检测、数据显示处理等。这次设计,基本上涉及到了所有的单片机控制功能模块。因此,经过这次设计,能完全掌握单片机的所有基本控制,这也是我们组选择该题目的一个重要原因。
由于自己经常会做很多电子制作,对硬件电路以及单片机编程都很熟悉,因此在设计本次课程设计时,感觉比较轻松的完成了设计任务。
七 个人总结
个人总结(石富友)
经过了两个星期的课程设计,我们终于完成了单片机万年历课程设计。从开始接到设计要求到万年历的实现,再到报告的完成,每走一步对我来说都是新的尝试与挑战。在这段时间里,我学到了很多知识也有很多感受,我们团队共同查阅相关的资料和书籍,让自己头脑中模糊的概念逐渐清晰,使我们的作品一步步完善起来,每一次改进都是我学习的收获。 这次报告的书写也会使我终身受益,我感受到做报告是要用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破。
经过本次单片机课设,我获得了丰富的理论知识,极大地提高了实践能力,单片机领域这对我今后进一步学习计算机方面的知识有极大的帮助。经过本次课程设计让我很好的理解了电子万年历的组成部分和工作原理,也更加的激发了我学习单片机的兴趣,使我明白了只有自己亲自动手才能真正地深刻理解并掌握课本上的理论知识,把理论付诸于实践才能牢牢的把课本上的知识变成自己的。本次课程设计也使我认识到了认真、仔细的态度在现在的学习和以后的工作中是多么的重要,“细节决定成败”,因此,从现在开始就要逐步培养自己的认真负责的心态,并养成注重细节的良好习惯。回顾起此次单片机课程设计,至今我仍感慨颇多,在整整两星期的日子里,能够说得是苦多于甜,可是能够学到很多很多的的东西,同时又能够巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
在这次课程设计中我和另一位组员主要负责查阅资料以及编写程序以及写最后的报告总结。在设计中遇到了很多编程问题,可是经过我们的共同努力最终顺利完成了我们的任务,因为以前学过一个学期的C语言程序课程,因此在程序问题上我们选择C语言作为编程语言,这样也有助于我们对整个程序的理解,刚开始编程的时候也遇到了很多的问题,可是我们没有放弃,我们组员共同讨论,不懂的东西就主动请教老师和别的同学,这也是我们这个课程设计成功的关键因素。整个设计经过了软件和硬件上的调试。我想这对于自己以后的学习和工作都会有很大的帮助。整个设计过程中大部分时间是用在程序上面的。很多子程序是能够借鉴书本上的,但怎样衔接各个子程序才是关键的问题所在,这需要对系统的结构很熟悉。因此能够说系统的设计是软件和硬件的结合,二者是密不可分的。经过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。 这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。
应该说这是经过我们小组成员的共同努力和动脑完成的,虽然内容并不是很复杂,可是我们觉得设计的过程相当重要,学到了很多,收获了很多。我觉得课程设计反映的是一个从理论到实际应用的过程,可是更远一点能够联系到以后毕业之后从学校转到踏上社会的一个过程。小组人员的配合﹑相处,以及自身的动脑和努力,都是以后工作中需要的。 因此我认为这次的课程设计意义很深,和其它2位同学的共同学习﹑配合﹑努力的过程也很愉快。
石富友
个人总结(卢志峰)
此课题是做一个简单的电子万年历,经过此次做电子万年历使我对单片机更加感兴趣了,虽然我还没有能力自己编写程序,但我将会在以后的学习中更加深刻地学习它。 经过这一周的课程设计,我学到了不少的知识。把以前没有学好的模拟电路的知识进行了补充和加强。这使我受益很大。加深了我对于单片机和数字电路的认识,相信在以后的学习和工作中碰到 这些基础的元器件我会更加得心应手。经过查阅大量的资料,我获得了以前在课堂上学不到的东西,我想这对于以后的毕业设计,或者工作也好,都是很有帮助的。我很认真地对待这个过程中的每一个细节,希望自己能做得更好。希望今后还有这样的机会,能够让我学到更多的知识。在此次的数字钟设计过程中,更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法。
回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从理论到实践,能够说得是苦多于甜,可是能够学到很多很多的的东西,同时不但能够巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。经过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得4出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,能够说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说单片机的动态扫描原理,不懂分得二极管的正负极,不知道数码管是共阴极还是共阳极,对单片机汇编语言掌握得不好……经过这次课程设计之后,一定把以前所学过的知识重新温故.本次课程设计,真可谓是感慨万千,从一开始的一无所知,到后来的轻车熟路,其中所经历的波折真是无以言表。坚持不懈坚持不懈坚持不懈坚持不懈是我最大的收获,在课设过程中我曾一度有想放弃的念头,但理智战胜了冲动,我还是坚持下来了,坚持就是胜利!同时也再一次让我体会了团队协作的重要性,我们分工协作,各显神通,一起讨论,一起攻关,请别的组同学帮忙,遇到不懂的问题,互相提问,互帮互助。
这次课程设计从开始到制作成功前后超过了一个星期。当电子万年历能够成功实现时,那种激动和喜悦只有自己能够体会。 在整个设计过程中,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。较好的完成了设计,达到了预期的目的,完了最初的设想。对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同学讨论,理清了思路,反而得心应手。在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。也练就了我的耐心,做什么事都在有耐心。此次课程设计中学到了很多很多东西,这是最重要的。总之,此次课设使我的能力得到了全方位的提高,使得我的操作能力和专业技能都有了很大的提高。
卢志锋
个人总结(王震)
在整个课程设计过程中,充分发挥我们的团队精、分工合作以及我们的主观能动性,使学习学到了许多没学过的知识,较好的完成了作品,达到了预期的目的。我们组在最初的设计中发挥“三个臭皮匠顶个诸葛亮”的作用,相互学习、相互讨论、研究,完成了最初的设想。在电路焊接时虽然没什么大问题,但从中也知道了焊接在整个作品中的重要性,电路工程量不大但也不能心急,要一个个慢慢来不能急于求成。反而达到事半功倍的效果。对电路的设计、布局要先有一个好的构思才显得电路板美观、大方。程序编写中由于思路不清晰,我们开始时遇到了很多的问题,可是经过静下心来思考和同组员的讨论理清了思路反而得心应手。在此次设计中,我学习到了做事要有一颗平常的心,不要想着走捷径要一步一个脚印。同时也练就了我们的耐心做什么事都在有耐心。此次课程设计中学到了很多很多东西,这是最重要的。
在此次课程设计中,收获颇多。如果说我们以前学的都是一些理论知识和分散的知识,那么在这次课程设计中则是系统的把大学里所学的连贯的灵活运用起来。这次的课程设计对我来说无疑是一次较好的动手动脑的锻炼机会,因此从一开始就抱着一种较认真的态度,无论是从了解电子万年历背景、意义、及其实现原理,还是后来的焊接对我来说都是一种提高。 在此次设计中,我负责的是硬件部分的设计。在方案选择上我花了很大的功夫,比如说:在万年历的显示上到底是用LED数码显示还是用LCD液晶显示,我做了很详细的比较,选出最适合的。这样在硬件设计时有关LCD液晶显示的给、原理都有详细的介绍。硬件部分除了主控制器的介绍还有显示电路、时钟电路、键盘电路的介绍,在介绍时我采用分模块分小点介绍。经过查阅资料和版块设计我不但把以前所学的都回忆了一遍而且灵活得把她们串起来运用。在硬件还有焊接的问题,其要注意不能虚焊、漏焊、短焊。其次就是软件部分和编程部分,虽然这两部分是由我同组的同学负责的,但我也同样参与了,当有我们问题时都互相讨论和学习,经过我们共同的努力和导师的指导我们终于完成了我们的课程设计,并调试成功。 这次的实习使我明白一个道理,做任何一件事都需要互相帮助和学习,任何事只有自己动手了才会学得更多和理解的更透彻。在现代高速发展的今天,仅仅用一些理论知识来武装大脑是不够的,我们还需要用实际动手操作能力来装扮我们的双手,只有如此才不负祖国对我们的培养,做好祖国的接班人,为祖国贡献出自己的一份力量
这次单片机课程设计实验,从最开始的对Keil软件的学习到熟练使用到编程、运行与调试,这些过程都让我学到了很多知识,也让我对单片机及其外围电路的扩展开发有了新的浓厚兴趣。整个课程设计过程中,我和同学们之间的交流,互相帮助指导的融洽气氛,都是这次成功完成设计的法宝。完成这次课程设计让我们对已学的课本知识进一步巩固加强了解,同时在实践应用的角度让我们对单片机有了一个全新体会,这就是我这次课程设计的收获和体会。
王震
七 参考文献
参考书目:
[1]何立民,《单片机高级教程:应用与设计》,北京,北京航空航天大学出版社,
[2]杨子文,《单片机原理及应用》,西安,西安电子科技大学出版社,
[3]王法能,《单片机原理及应用》,北京,科学出版社,
天津职业技术师范大学课程设计评审表
电子工程 学院 电信1001 班 学生 石富友
设计任务完成情况及指导教师评语
答辩情况
评定成绩: 指导教师签字: 日期:
教研室主任: 主任签字:
日期: 日期:
天津职业技术师范大学课程设计评审表
电子工程 学院 电信1001 班 学生 卢志锋
设计任务完成情况及指导教师评语
答辩情况
评定成绩: 指导教师签字: 日期:
教研室主任: 主任签字:
日期: 日期:
天津职业技术师范大学课程设计评审表
电子工程 学院 电信1001 班 学生 王震
设计任务完成情况及指导教师评语
答辩情况
评定成绩: 指导教师签字: 日期:
教研室主任: 主任签字:
日期: 日期:
展开阅读全文