电子万年历课程设计报告.docx
《电子万年历课程设计报告.docx》由会员分享,可在线阅读,更多相关《电子万年历课程设计报告.docx(24页珍藏版)》请在冰豆网上搜索。
电子万年历课程设计报告
民族学院机电信息工程学院
自动化系
单片机系统课程设计报告
题目:
电子万年历
专业:
自动化
班级:
114
学生:
学亮怀宇马建龙
指导教师:
凤强艳
设计完成日期:
2013年10月15日
课程设计任务书
题目:
电子万年历
课程设计时间:
2013.9.24~2013.10.19
一、设计任务
给定1602液晶显示器和单片机最小系统,学习使用单片机最小系统,设计在1602上显示年月日、时间和星期并能更改,完成相关的软件。
二、设计容与要求
⒈系统设计的方案;
⒉检测电路和过程通道的设计;
⒊系统软件设计与实现;
⒋需要的详细材料和工具清单;
设计的性能指标;
撰写设计报告;
资料归档。
三、设计重点
检测电路和过程通道设计;
系统软件设计、调试。
四、课程设计进度要求
13.9.25~13.9.28系统方案设计;
⒉13.9.29~13.10.5检测电路和过程通道设计;
13.10.6~13.10.7完成系统硬件设计与实现;
13.10.8~13.10.13检测电路和过程通道设计;
13.10.13~13.10.15撰写设计报告;
13.10.19验收答辩。
五、参阅书目
[1]祁伟,亭,单片机C51程序设计教程与实验[M]。
:
航空航天大学,2006.1
[2]徐科军,传感器与检测技术[M]。
:
电子工业,2010.11
[3]方彦军,健,智能仪器技术与其应用[M]。
:
化学工业,2004.4
[4]徐爱钧,智能化测量控制仪表原理与设计[M]。
:
航空航天大学,2004.9
1任务分析和性能指标
1.1任务分析
电子万年历是日常生活中常见的小型电子产品,其形式多种多样,小到带有日期的电子腕表,大到公共场所悬挂的大型电子日历,此外,眼下我们还常能在宾馆、饭店等场所见到一种带有年、月、日、时、分、秒、星期甚至节气等信息的电子日历牌。
电子日历的主要功能是给人们提供时间和日期信息,无论其形式如何,从外部都可分为显示和校准两部分。
为使电子日历协调工作,整个系统从功能上可分为实时时钟、显示和键盘三个模块,分别完成时间和日期的计算以与人机交互的管理等。
1.2性能指标
实时时钟(RTC:
Real Time Clock)是系统的核心,其运行精度直接影响产品质量。
实时时钟的实现有两种方案可选,一是利用单片机系统时钟和中断完成时间和日期的计算;二是利用专用时钟芯片。
前者不用附加芯片,系统简单,但是累计误差较大,只有 短时计时才可使用。
长时间计时一般都采用后者。
后者采用32.768KHz晶体振荡器振作 为脉冲源,部的15位计数器刚好产生标准秒脉冲。
该类芯片除时钟计时外,还有年 月日和星期的计算功能,并且还可计算闰年。
芯片初始化后可脱离CPU自动运行,有 些芯片部带有电池,出厂时芯片即开始运行。
专用时钟芯片的种类很多,与CPU的 通信方式有并行, 也有串行。
常见的芯片有DALLAS 公司生产的DS1302和DS12C887, 前者为串行,需要外加后备电池;后者为并行,芯片置锂电池和晶体振荡器,无外加 电源的情况下可运行10年。
此外,还有许多时钟芯片,如Epson、Holtek、兴威帆 等公司都推出自己的时钟芯片.因为我们具备单片机相关知识的基础,所以我们利用单片机系统时钟和中断完成时间和日期的计算。
2总体方案设计
2.1硬件方案
显示部分
数据显示常采用液晶,液晶显示有耗电低、外形美观的优点,并且,点阵液晶可显示较复杂的字符或图案。
键盘部分
时钟系统的键盘设置三个键:
确认键、加1键、减1键。
实时时钟部分
利用单片机系统时钟和中断完成时间和日期的计算。
2.2软件方案
C语言编属于高级语言,具有可移植性,能够结构化编程。
使用标准C语言的程序,几乎都可以不作改变移植到不同的微机平台上,对于嵌入式等的微控制芯片,属于标准C语言的部分也很少需要修改,而且程序很容易读懂。
C语言编写程序结构清晰,移植性好,容易维护和修改。
汇编语言针对不同的操作系统平台,不同的微控制器,指令都是完全不同的,即使指令相似,也不具有可移植性。
但是汇编语言是针对专门的控制器的,所以运行速度可以精确到一个指令周期。
汇编语言的程序读懂需要借助微控制器的指令手册以与各个寄存器的说明,所以很难读懂。
汇编语言编写代码实时性强,能够直接控制硬件的工作状态,但是不具有可移植性,维护和修改困难。
经过我们三人的讨论我们决定使用c语言来编写程序,因为c语言程序容易学,也很容易读懂,编写程序结构清晰,易于我们组员之间的讨论和学习。
而且相对于汇编我们更加擅长c语言。
3硬件设计与实现
由于单片机系统时钟和中断能完成年、月、日、时、分、秒等时间信息,对于一天的时间记录,有12小时制和24小时制两种模式。
在12小时制模式中,用AM和PM区分上午和下午;时间的表示方法也有两种,一种用二进制数表示,一种是用BCD码表示。
而显示部分我们采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示文字,图形,显示多样,清晰可见,而其体积较小,使用方便,可以使电路更加简洁,所以选择了液晶显示器。
3.11602显示电路
3.2键盘电路
3.3晶振电路
3.4复位电路
3.5单片机电路
4软件设计与实现
4.1主程序
voidmain()
{
init();
while
(1)
{
anjian();
}
}
4.2子程序
4.2.1按键程序
voidanjian()//按键函数
{
rd=0;
if(s1==0)
{
delay(5);
if(s1==0)
{s1num++;
while(!
s1);
if(s1num==1)
{
TR0=0;
write_(0x80+0x40+12);
write_(0x0f);
}
}
if(s1num==2)
{
write_(0x80+0x40+9);
}
if(s1num==3)
{
write_(0x80+0x40+6);
}
if(s1num==4)
{
write_(0x80+15);
}
if(s1num==5)
{
write_(0x80+9);
}
if(s1num==6)
{
write_(0x80+6);
}
if(s1num==7)
{
write_(0x80+1);
}
if(s1num==8)
{
s1num=0;
write_(0x0c);
TR0=1;
if(yue==1)
{
tian=ri-ri4;
}
if(yue==2)
{
tian=31+ri-ri4;
}
if(yue==3)
{
tian=59+ri-ri4;
}
if(yue==4)
{
tian=90+ri-ri4;
}
if(yue==5)
{
tian=120+ri-ri4;
}
if(yue==6)
{
tian=151+ri-ri4;
}
if(yue==7)
{
tian=181+ri-ri4;
}
if(yue==8)
{
tian=212+ri-ri4;
}
if(yue==9)
{
tian=243+ri-ri4;
}
if(yue==10)
{
tian=272+ri-ri4;
}
if(yue==11)
{
tian=304+ri-ri4;
}
if(yue==12)
{
tian=334+ri-ri4;
}
ri4=0;
}
}
if(s1num!
=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!
s2);
if(s1num==1)
{
miao++;
if(miao==60)
miao=0;
write_sfm(12,miao);
write_(0x80+0x40+12);
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(9,fen);
write_(0x80+0x40+9);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(6,shi);
write_(0x80+0x40+6);
}
if(s1num==4)
{
xingqi++;
if(xingqi==8)
xingqi=1;
write_xq(15,xingqi);
write_(0x80+15);
}
if(s1num==5)
{
ri++;
if(ri==32)
ri=1;
write_yr(9,ri);
write_(0x80+9);
}
if(s1num==6)
{
yue++;
if(yue==13)
{
yue=1;
tian=1;
}
write_yr(6,yue);
write_(0x80+6);
}
if(s1num==7)
{
nian++;
write_n(1,nian);
write_(0x80+1);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!
s3);
if(s1num==1)
{
miao--;
if(miao==-1)
miao=59;
write_sfm(12,miao);
write_(0x80+0x40+12);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(9,fen);
write_(0x80+0x40+9);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(6,shi);
write_(0x80+0x40+6);
}
if(s1num==4)
{
xingqi--;
if(xingqi==0)
xingqi=7;
write_xq(15,xingqi);
write_(0x80+15);
}
if(s1num==5)
{
ri--;
ri4++;
if(ri==0)
{
ri=31;
}
write_yr(9,ri);
write_(0x80+9);
}
if(s1num==6)
{
yue--;
if(yue==0)
{
yue=12;
tian=334+ri;
}
write_yr(6,yue);
write_(0x80+6);
}
if(s1num==7)
{
nian--;
write_n(1,nian);
write_(0x80+1);
}
}
}
}
}
4.2.2中断程序
voidtimer0()interrupt1//开中断1(定时器中断0)包括时间的算法程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(t0==20)
{
t0=0;
miao++;
}
if(miao==60)
{
miao=0;
fen++;
}
write_sfm(12,miao);//调用函数write-()都为调用上边的显示子函数下同
if(fen==60)
{
fen=0;
shi++;
}
write_sfm(9,fen);
if(shi==24)
{
shi=0;
xingqi++;
tian++;
}
write_sfm(6,shi);
if(xingqi==8)
{
xingqi=1;
}
write_xq(15,xingqi);
if(tian!
=0)
{
ri=tian;
if(tian<=31)
{
yue=1;
}
write_yr(6,yue);
if(tian>=32&&tian<=59)
{
yue=2;
ri=tian-31;
}
write_yr(6,yue);
if(60<=tian&&tian<=90)
{
yue=3;
ri=tian-59;
}
write_yr(6,yue);
if(91<=tian&&tian<=120)
{
yue=4;
ri=tian-90;
}
write_yr(6,yue);
if(121<=tian&&tian<=151)
{
yue=5;
ri=tian-120;
}
write_yr(6,yue);
if(152<=tian&&tian<=181)
{
yue=6;
ri=tian-151;
}
write_yr(6,yue);
if(182<=tian&&tian<=212)
{
yue=7;
ri=tian-181;
}
write_yr(6,yue);
if(213<=tian&&tian<=243)
{
yue=8;
ri=tian-212;
}
write_yr(6,yue);
if(244<=tian&&tian<=273)
{
yue=9;
ri=tian-243;
}
write_yr(6,yue);
if(274<=tian&&tian<=304)
{
yue=10;
ri=tian-273;
}
write_yr(6,yue);
if(305<=tian&&tian<=334)
{
yue=11;
ri=tian-304;
}
write_yr(6,yue);
if(335<=tian&&tian<=365)
{
yue=12;
ri=tian-334;
}
write_yr(6,yue);
if(tian==366)
{
tian=1;
yue=01;
ri=1;
nian++;
}
write_n(1,nian);
}
write_yr(9,ri);
}
4.2.3显示年
voidwrite_n(ucharadd,uintdate)//液晶显示年
{
uintshi,ge,bai,qian;
qian=date/1000;
bai=date/100%10;
shi=date/10%10;
ge=date%10;
write_(0x80+add);
write_date(0x30+qian);
write_date(0x30+bai);
write_date(0x30+shi);
write_date(0x30+ge);
}
4.2.4显示星期
voidwrite_xq(ucharadd,uchardate)//液晶显示星期
{
write_(0x80+add);
write_date(0x30+date);
}
4.2.5显示月日
voidwrite_yr(ucharadd,uchardate)//液晶显示月日
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
4.2.6显示时分秒
voidwrite_sfm(ucharadd,uchardate)//液晶显示时分秒
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_(0x80+0x40+add);//液晶屏第二行的选着地址
write_date(0x30+shi);
write_date(0x30+ge);//液晶屏显示数字的方式
}
4.2.7程序初始化
voidinit()//函数初始化一些相应的变量
{
miao=53;
fen=59;
shi=23;
xingqi=5;
ri4=0;
tian=284;
nian=2013;
dula=0;
wela=0;
lcden=0;
write_(0x38);//显示模式设置,设置16乘2显示,5×7点阵,八位数据接口
write_(0x0c);//显示状态为整体显示
write_(0x06);//光标的设定当读或写一个字符后地址指针加一,光标加一
write_(0x80);//液晶屏第一行选着地址
write_(0x01);//清除显示否则后面出现黑一块
for(num=0;num<17;num++)
{
write_date(table1[num]);
delay(5);
}
write_(0x80+0x40);
for(num=0;num<13;num++)
{
write_date(table2[num]);
delay(5);
}
TMOD=0x01;//中断初始化定时器0的工作方式一
EA=1;
ET0=1;
TR0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
4.2.8写数据到液晶显示器
voidwrite_date(uchardate)//液晶屏数据指令
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
4.2.9写指令到液晶显示器
voidwrite_(uchar)//液晶屏控制指令
{
rs=0;
lcden=0;
P0=;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
4.2.10延时子函数
voiddelay(ucharz)//延时程序
{
ucharx,y;
for(x=z;x>0;x--);
for(y=116;y>0;y--);
}
5调试与性能分析
5.1调试分析
5.1.1软件调试
软件调试