基于51单片机电子万年历的设计方案.docx

上传人:b****8 文档编号:10049304 上传时间:2023-02-08 格式:DOCX 页数:32 大小:1.93MB
下载 相关 举报
基于51单片机电子万年历的设计方案.docx_第1页
第1页 / 共32页
基于51单片机电子万年历的设计方案.docx_第2页
第2页 / 共32页
基于51单片机电子万年历的设计方案.docx_第3页
第3页 / 共32页
基于51单片机电子万年历的设计方案.docx_第4页
第4页 / 共32页
基于51单片机电子万年历的设计方案.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

基于51单片机电子万年历的设计方案.docx

《基于51单片机电子万年历的设计方案.docx》由会员分享,可在线阅读,更多相关《基于51单片机电子万年历的设计方案.docx(32页珍藏版)》请在冰豆网上搜索。

基于51单片机电子万年历的设计方案.docx

基于51单片机电子万年历的设计方案

大连民族学院机电信息工程学院

自动化系

单片机系统课程设计报告

题目:

电子万年历

专业:

自动化

班级:

106

学生姓名:

指导教师:

 

设计完成日期:

2012年11月30日

课程设计任务书

题目:

电子万年历

课程设计时间:

2012.11.12~2012.11.30

一、设计任务

给定时钟芯片(DS12C887)和单片机最小系统,学习使用单片机最小系统,设计万年历电路和闹钟报时电路,完成相关的软件设计并进行万年历显示。

二、设计内容及要求

⒈系统设计的方案;

⒉检测电路和过程通道的设计;

⒊系统软件设计与实现;

⒋需要的详细材料和工具清单;

设计的性能指标;

撰写设计报告;

资料归档。

三、设计重点

检测电路和过程通道设计;

系统软件设计、调试。

四、课程设计进度要求

12.11.12~12.11.14系统方案设计;

⒉12.11.15~12.11.16检测电路和过程通道设计;

12.11.19~12.11.21完成系统硬件设计与实现;

12.11.22~12.11.23完成系统软件编程;

12.11.26~12.11.29系统调试及撰写设计报告;

12.11.30验收答辩。

五、参阅书目

[1]郭天祥.新概念51单片机C语言教程[M].北京:

电子工业出版社,2009.

[2]胡汉才.单片机原理与接口技术[M].北京:

清华大学大学出版社,2004.1-505.

[3]邢国泉.LM35温度传感器的温度特性及其应用[J].医疗设备信息.2007,11,25-28.

1任务分析和性能指标

1.1任务分析

设计一个具有报时功能、停电正常运行(来电无需校时)、闹钟功能、带有年月日、时分秒及星期显示的电子日历。

电子万年历是日常生活中常见的小型电子产品,其形式多种多样,小到带有日期的电子腕表,大到公共场所悬挂的大型电子日历,此外,眼下我们还常能在宾馆、饭店等场所见到一种带有年、月、日、时、分、秒、星期甚至节气等信息的电子日历牌。

电子日历的主要功能是给人们提供时间和日期信息,无论其形式如何,从外部都可分为显示和校准两部分。

为使电子日历协调工作,整个系统从功能上可分为实时时钟、显示和键盘三个模块,分别完成时间和日期的计算以及人机交互的管理等。

1.2性能指标

实时时钟(RTC:

RealTimeClock)是系统的核心,其运行精度直接影响产品质量。

实时时钟的实现有两种方案可选,一是利用单片机系统时钟和中断完成时间和日期的计算;二是利用专用时钟芯片。

前者不用附加芯片,系统简单,但是累计误差较大,只有短时计时才可使用。

长时间计时一般都采用后者。

后者采用32.768KHz晶体振荡器振作为脉冲源,内部的15位计数器刚好产生标准秒脉冲。

该类芯片除时钟计时外,还有年月日和星期的计算功能,并且还可计算闰年。

芯片初始化后可脱离CPU自动运行,有些芯片内部带有电池,出厂时芯片即开始运行。

专用时钟芯片的种类很多,与CPU的通信方式有并行,也有串行。

常见的芯片有DALLAS公司生产的DS1302和DS12C887,前者为串行,需要外加后备电池;后者为并行,芯片内置锂电池和晶体振荡器,无外加电源的情况下可运行10年。

此外,还有许多时钟芯片,如Epson、Holtek、深圳兴威帆等公司都推出自己的时钟芯片。

这次我们选用的芯片是DS12C887。

1.3显示部分

简单的数据显示常采用液晶显示或数码管显示。

液晶显示有耗电低、外形美观的优点,并且,点阵液晶可显示较复杂的字符或图案。

其缺点是通用液晶显示器的显示方案构建不够灵活,在较暗的环境下液晶需要背光,而且,液晶显示成本较高。

相对液晶显示器来讲,由于数码管种类繁多,其显示方案构建灵活,成本较低。

由于本身即是发光体,所以,数码管显示无需额外光源。

数码管的缺点是功耗较大,字符较多时,必须交流供电,而且,数码管不能显示复杂字型。

所以,液晶和数码管两个方案的选择要根据显示的具体情况而定。

值得一提的是,数码管串行静态显示和并行动态显示在位数较多时都会出现显示不稳定现象。

所以这次我们选用LED1602液晶。

1.4键盘部分

时钟的设置虽包含数字,但是我们不建议使用数字键盘,应为数字键盘将增加系统的复杂程度。

为使系统尽可能简化,键盘部分的设计在能够完成系统要求的前提下,越简单越好。

所以,时钟系统的键盘可以设置四个键:

功能选择键、加1键、减1键,闹钟键。

2总体方案设计

2.1硬件方案如图:

单片机

显示系统

DS12C887

键盘

图1电子万年历的系统框图

 

2.2设计过程

⒈认真领会设计要求:

确定系统功能,包括显示信息、按键个数、报时功能、闹钟功能等;

⒉样品外观设:

确定系统显示信息,显示器种类(液晶、数码管)、显示器尺寸等;

⒊硬件初步设计:

选定DS12C887芯片、选定显示方式(动态、静态、串行、并行)、按键个数;

⒋系统原理图设计按照前几步规划,设计系统原理图:

此时应认真研究学习DS12C887芯片的使用方法,正确连接DS12C887芯片,设计键盘及显示电路。

⒌系统软件设计

系统软件可分为键盘管理、显示管理、报时管理和DS12C887管理三部分。

软件可由汇编语言完成,也可由C语言完成,我选择C语言。

2.3合理分配内存

内存是系统宝贵的资源之一,为合理利用内存,应对内存使用通盘考虑,并反复修改使用方案,使之达到最合理利用。

应尽量少使用全局变量,以提高内存的利用率。

有效利用CPU内存和外围器件内存,一般情况下不建议扩展系统内存。

2.4整个系统流程图

 

 

2.5软件方案

C语言编属于高级语言,具有可移植性,能够结构化编程。

使用标准C语言的程序,几乎都可以不作改变移植到不同的微机平台上,对于嵌入式等的微控制芯片,属于标准C语言的部分也很少需要修改,而且程序很容易读懂。

C语言编写程序结构清晰,移植性好,容易维护和修改。

汇编语言针对不同的操作系统平台,不同的微控制器,指令都是完全不同的,即使指令相似,也不具有可移植性。

但是汇编语言是针对专门的控制器的,所以运行速度可以精确到一个指令周期。

汇编语言的程序读懂需要借助微控制器的指令手册以及各个寄存器的说明,所以很难读懂。

汇编语言编写代码实时性强,能够直接控制硬件的工作状态,但是不具有可移植性,维护和修改困难。

经过我们三人的讨论我们决定使用c语言来编写程序,因为c语言程序容易学,也很容易读懂,编写程序结构清晰,易于我们组员之间的讨论和学习。

而且相对于汇编我们更加擅长c语言。

3硬件设计与实现

由于DS12C887能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部又增加了世纪寄存器,从而利用硬件电路解决子“千年”问题;DS12C887中自带有锂电池,外部掉电时,其内部时间信息还能够保持10年之久;对于一天内的时间记录,有12小时制和24小时制两种模式。

在12小时制模式中,用AM和PM区分上午和下午;时间的表示方法也有两种,一种用二进制数表示,一种是用BCD码表示;DS12C887中带有128字节RAM,其中有11字节RAM用来存储时间信息,4字节RAM用来存储DS12C887的控制信息,称为控制寄存器,113字节通用RAM使用户使用;此外用户还可对DS12C887进行编程以实现多种方波输出,并可对其内部的三路中断通过软件进行屏蔽。

使用其于单片机89C52控制DS12C877就能很好的实现时钟需要的基本功能。

而显示部分我们采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示文字,图形,显示多样,清晰可见,而其体积较小,使用方便,可以使电路更加简洁,所以选择了液晶显示器。

3.1显示电路如图:

图3LED液晶显示

3.2控制电路

图4单片机最小系统原理图

图5时钟芯片原理图

图6按键原理图

3.3芯片功能特性简述

图7单片机引脚

STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。

使用高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。

片上Flash允许程序存储器在系统可编程,亦适于常规编程器。

在单芯片上,拥有灵巧的8位CPU和在线系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

STC89C52具有以下标准功能:

8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。

另外,STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

8位微控制器8K字节在系统可编程Flash。

4软件设计与实现

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitS1=P1^0;

sbitS2=P1^1;

sbitS3=P1^2;

sbitS4=P1^3;

sbitrs=P3^5;//数据/命令选择端(H/L)

sbitlcden=P3^4;//使能信号

sbitbeep=P3^6;

sbitdscs=P1^4;//片选端,低电平有效

sbitdsas=P1^5;

sbitdsrw=P1^6;

sbitdsds=P1^7;//数据选择或读输入引脚

sbitdsirq=P3^3;//中断请求输出,低电平有效

bitflag1,flag_ri;//定义两个变量

ucharcount,s1num,flag,t0_num;

charmiao,shi,fen,year,month,day,week,amiao,afen,ashi;

ucharcodetable[]="2012-11-16";

ucharcodetable1[]="20:

06:

12";

voidwrite_ds(uchar,uchar);

voidset_alarm(uchar,uchar,uchar);

voidread_alarm();

voidset_time();

ucharread_ds(uchar);

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

voiddi()//蜂鸣器报警声音

{

beep=0;

delay(100);

beep=1;

}

voidwrite_com(ucharcom)//写液晶命令函数

{

rs=0;

lcden=0;

P2=com;

delay(3);

lcden=1;

delay(3);

lcden=0;

}

voidwrite_date(uchardate)//写液晶数据函数

{

rs=1;

lcden=0;

P2=date;

delay(3);

lcden=1;

delay(3);

lcden=0;

}

voidinit()//初始化函数

{

ucharnum;

EA=1;//总中断

EX1=1;//外部中断1

IT1=1;//负跳变沿触发中断

flag1=0;//变量初始化

t0_num=0;

s1num=0;

week=1;

lcden=0;

write_ds(0x0a,0x20);//打开振荡器

write_ds(0x0b,0x26);//设置24小时模式,数据二进制格式,开启闹铃中断

//set_time();

write_com(0x38);//1602液晶初始化

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80);

for(num=0;num<15;num++)//写入液晶固定部分显示

{

write_date(table[num]);

delay

(1);

}

write_com(0x80+0x40);

for(num=0;num<10;num++)

{

write_date(table1[num]);

delay

(1);

}

}

voidwrite_sfm(ucharadd,chardate)//1602液晶刷新时分秒函数2为时,5为分,8为秒

{

charshi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+0x40+add);

write_date(0x30+shi);

write_date(0x30+ge);

}

voidwrite_nyr(ucharadd,chardate)//1602液晶刷新年月日函数3为年,6为月,9为日

{

charshi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+add);

write_date(0x30+shi);

write_date(0x30+ge);

}

voidwrite_week(charwe)//1602液晶刷新星期函数

{

write_com(0x80+12);

switch(we)

{

case1:

write_date('M');delay(5);

write_date('O');delay(5);

write_date('N');

break;

case2:

write_date('T');delay(5);

write_date('U');delay(5);

write_date('E');

break;

case3:

write_date('W');delay(5);

write_date('E');delay(5);

write_date('D');

break;

case4:

write_date('T');delay(5);

write_date('H');delay(5);

write_date('U');

break;

case5:

write_date('F');delay(5);

write_date('R');delay(5);

write_date('I');

break;

case6:

write_date('S');delay(5);

write_date('A');delay(5);

write_date('T');

break;

case7:

write_date('S');delay(5);

write_date('U');delay(5);

write_date('N');

break;

}

}

voidkeyscan()//取消时钟报警,按任意键取消报警

{

if(flag_ri==1)

{

if((S1==0)||(S2==0)||(S3==0)||(S4==0))

{

delay(5);

if((S1==0)||(S2==0)||(S3==0)||(S4==0))

{

while((S1==0)||(S2==0)||(S3==0)||(S4==0));

di();

flag_ri=0;//清除报警标志

}

}

}

if(S1==0)//检测S1

{

delay(5);

if(S1==0)

{

s1num++;

if(flag1==1)

if(s1num==4)

s1num=1;

flag=1;

while(S1==0);

di();

switch(s1num)//光标闪烁点定位

{

case1:

write_com(0x80+0x40+8);

write_com(0x0f);

break;

case2:

write_com(0x80+0x40+5);

break;

case3:

write_com(0x80+0x40+2);

break;

case4:

write_com(0x80+12);

break;

case5:

write_com(0x80+9);

break;

case6:

write_com(0x80+6);

break;

case7:

write_com(0x80+3);

break;

case8:

s1num=0;

write_com(0x0c);

flag=0;

write_ds(0,miao);

write_ds(2,fen);

write_ds(4,shi);

write_ds(6,week);

write_ds(7,day);

write_ds(8,month);

write_ds(9,year);

break;

}

}

}

if(s1num!

=0)//只有当S1按下后,才检测S2和S3

{

if(S2==0)

{

delay

(1);

if(S2==0)

{

while(S2==0);

di();

switch(s1num)//根据功能键次数调节相应数值

{

case1:

miao++;

if(miao==60)

miao=0;

write_sfm(8,miao);

write_com(0x80+0x40+8);

break;

case2:

fen++;

if(fen==60)

fen=0;

write_sfm(5,fen);

write_com(0x80+0x40+5);

break;

case3:

shi++;

if(shi==24)

shi=0;

write_sfm(2,shi);

write_com(0x80+0x40+2);

break;

case4:

week++;

if(week==8)

week=1;

write_week(week);

write_com(0x80+12);

break;

case5:

day++;

if(day==32)

day=1;

write_nyr(9,day);

write_com(0x80+9);

break;

case6:

month++;

if(month==13)

month=1;

write_nyr(6,month);

write_com(0x80+6);

break;

case7:

year++;

if(year==100)

year=0;

write_nyr(3,year);

write_com(0x80+3);

break;

}

}

}

if(S3==0)

{

delay

(1);

if(S3==0)

{

while(S3==0);

di();

switch(s1num)

{

case1:

miao--;

if(miao==-1)

miao=59;

write_sfm(8,miao);

write_com(0x80+0x40+8);

break;

case2:

fen--;

if(fen==-1)

fen=59;

write_sfm(5,fen);

write_com(0x80+0x40+5);

break;

case3:

shi--;

if(shi==-1)

shi=23;

write_sfm(2,shi);

write_com(0x80+0x40+2);

break;

case4:

week--;

if(week==0)

week=7;

write_week(week);

write_com(0x80+12);

break;

case5:

day--;

if(day==0)

day=31;

write_nyr(9,day);

write_com(0x80+9);

break;

case6:

month--;

if(month==0)

month=12;

write_nyr(6,month);

write_com(0x80+6);

break;

case7:

year--;

if(year==-1)

year=99;

write_nyr(3,year);

write_com(0x80+3);

break;

}

}

}

}

if(S4==0)

{

delay(5);

if(S4==0)

{

flag1=~flag1;

while(S4==0);

di();

if(flag1==0)

{

flag=0;

write_com(0x80+0x40);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1