大连民族学院机电信息工程学院
自动化系
单片机系统课程设计报告
题目:电子万年历
专业:自动化
班级:114
学生姓名:曹学亮张怀宇马建龙
指导教师:赵凤强张艳
设计完成日期:2013年10月15日
目录
1任务分析和性能指标 (1)
1.1任务分析 (1)
1.2性能指标 (1)
2 总体设计方案 (1)
2.1硬件方案 (1)
2.2软件方案 (1)
3 系统硬件设计 (2)
3.1检测电路 (2)
3.2控制电路 (2)
4 系统软件设计 (2)
4.1主程序设计 (2)
4.2数据采集程序设计 (2)
4.3监控程序设计 (2)
5 调试及性能分析 (2)
5.1调试分析 (2)
5.1.1 软件调试 (2)
5.1.2 硬件调试 (2)
5.1.3 系统功能调试 (3)
5.2性能分析 (3)
总结 (3)
参考文献 (4)
附录1 元器件清单 (5)
附录2 调试系统照片 (6)
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.1 1602显示电路
3.2键盘电路
3.3 晶振电路
3.4复位电路
3.5单片机电路
4软件设计与实现4.1 主程序
void main()
{
init();
while(1)
{
anjian();
}
}
4.2子程序
4.2.1按键程序
void anjian() 按键函数
{
rd=0;
if(s1==0)
{
delay(5);
if(s1==0)
{ s1num++;
while(!s1);
if(s1num==1)
{
TR0=0;
write_com(0x80+0x40+12);
write_com(0x0f);
}
}
if(s1num==2)
{
write_com(0x80+0x40+9);
}
if(s1num==3)
{
write_com(0x80+0x40+6);
}
if(s1num==4)
{
write_com(0x80+15);
}
if(s1num==5)
{
write_com(0x80+9);
}
if(s1num==6)
{
write_com(0x80+6);
}
if(s1num==7)
{
write_com(0x80+1);
}
if(s1num==8)
{
s1num=0;
write_com(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_com(0x80+0x40+12);
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(9,fen);
write_com(0x80+0x40+9);
}
{
shi++;
if(shi==24)
shi=0;
write_sfm(6,shi);
write_com(0x80+0x40+6);
}
if(s1num==4)
{
xingqi++;
if(xingqi==8)
xingqi=1;
write_xq(15,xingqi);
write_com(0x80+15);
}
if(s1num==5)
{
ri++;
if(ri==32)
ri=1;
write_yr(9,ri);
write_com(0x80+9);
}
{
yue++;
if(yue==13)
{
yue=1;
tian=1;
}
write_yr(6,yue);
write_com(0x80+6);
}
if(s1num==7)
{
nian++;
write_n(1,nian);
write_com(0x80+1);
}
}
}
if(s3==0)
{
delay(5);