电子万年历Word格式.docx
- 文档编号:6103604
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:18
- 大小:924.60KB
电子万年历Word格式.docx
《电子万年历Word格式.docx》由会员分享,可在线阅读,更多相关《电子万年历Word格式.docx(18页珍藏版)》请在冰点文库上搜索。
附录2实物图10
一、设计任务和性能指标
1.1设计任务
利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个日历时钟,用LED把日期﹑时间、温度实时显示出来。
要求用Protel画出系统的电路原理图(要求以最少组件,实现系统设计所要求的功能),印刷电路板(要求布局合理,线路清晰),绘出程序流程图,并给出程序清单(要求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。
1.2性能指标
1.日历:
年(4位)、月(2位)、日(2位)
2.时钟:
时(2位)、分(2位)、秒(2位)
3.星期(1位)
4.校对键:
设置键、上调键、下调键、复位键
5.温度(1位)
二、设计方案
按照系统设计的功能的要求,初步确定设计系统由主控模块、时钟模块、显示模块、键扫描接口电路共四个模块组成,电路系统构成框图如图1.1所示。
主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。
它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。
时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片DS1302。
采用DS1302作为主要计时芯片、可以做到计时准确。
更重要的是,DS1302可以在很小的电流的后备电源(2.5~5.5V电源,在2.5V时耗电小于300nA)下继续计时,并可编程选择多种充电电流对后备电源进行慢速充电,可以保证后备电源基本不耗电。
采用串行数据传输,与单片机硬件连接简单,如果使用时钟芯片DS12887,将采用并行数据传输,占用更多的硬件资源。
因此为节省单片机端口,时钟芯片采用DS1302。
编程时我们选择了用C语言编写。
这是因为我们考虑到C语言编属于高级语言,具有可移植性,能够结构化编程。
使用标准C语言的程序,几乎都可以不作改变移植到不同的微机平台上,对于嵌入式等的微控制芯片,属于标准C语言的部分也很少需要修改,而且程序很容易读懂。
另外C语言编写程序结构清晰,移植性好,容易维护和修改。
而汇编语言针对不同的操作系统平台,不同的微控制器,指令都是完全不同的,即使指令相似,也不具有可移植性。
但是汇编语言是针对专门的控制器的,所以运行速度可以精确到一个指令周期。
汇编语言的程序读懂需要借助微控制器的指令手册以及各个寄存器的说明,所以很难读懂。
虽然汇编语言编写代码实时性强,能够直接控制硬件的工作状态,但是不具有可移植性,维护和修改困难。
三、系统硬件设计
3.1单片机的最小系统
图1单片机最小系统
3.2时钟电路DS1302
在以单片机为核心构成的装置中,经常需要一个实时的时钟和日历,以便对一些实时发生事件记录时给予时标,实时时钟芯片便可起到这一作用。
过去多用并行接口的时钟芯片,如MC14688,DS12887等。
它们已能完全满足单片机系统对实时时钟的要求,但是这些芯片与单片机接口复杂、占用地址/数据总线接线多、芯片体积大占用空间多。
近年来串行接口的各种芯片在单片机系统中应用愈来愈多,串行接口的实时时钟芯片也出现了不少,DS1302是一个综合性能较好且价格便宜的串行接口实时时钟芯片。
3.2.1DS1302简介
DS1302原理框图见图2所示。
DS1302包含一个实时时钟/日历和31字节的静态RAM,它和单片机通信经由一个简单的串行接口。
实时时钟/日历提供秒、分、时、日、周、月、年信息,月末日期自动调整,包括闰年的修正。
时钟可工作在24小时格式或12小时(AM/PM)格式,单片机与DS1302接口使用同步串行通信,仅需三根线连接:
(1)/RST(复位),
(2)I/O(串行数据),(3)SCLK(串行时钟)。
数据传送从单片机到实时时钟/RAM或实时时钟/RAM到单片机,可以每次1字节或每次31字节。
它可以工作在很低的耗电状态以保存时钟信息和数据,功耗小于1微瓦。
图2DS1302结构框图
DS1302具有一个可编程的涓流充电器,主电源和备份电源的双电源引脚,7个附加字节的暂存寄存器,包括移位寄存器、控制逻辑、振荡器、实时时钟和RAM。
DS1302引脚图见图3所示,引脚描述如下:
图3DS1302引脚图
1.Vcc2:
5V电源。
当Vcc2>
Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2<
Vcc1时,由Vcc1向DS1302供电。
2.X1,X2:
连接一个标准的32768HZ石英晶体。
DS1302也可用外部振荡器驱动,这时X1引脚连接外部振荡器信号,X2悬浮。
3.GND:
接地端。
4.CE/RST:
复位信号,在一个读写期间必须保持高电平。
5.I/O:
数据输入输出口。
6.SCLK:
串行时钟,输入。
7.Vcc1:
备用电池端。
命令字节:
图4命令字
每次数据传输由命令字节开始,MSB(位7)必须是逻辑1,若该位是0,则禁止操作DS1302,位6为0时选择实时时钟/日历数据,位6为1时选择RAM数据,位5-1选择操作的寄存器,LSB(位0)选择写操作(逻辑0)或读操作逻辑1)。
复位和时钟控制:
数据传输的启动是由/RST置为高电平开始的,/RST启动控制逻辑,允许地址/命令序列进入移位寄存器,一个时钟周期是一个下降沿跟随一个上升沿。
数据输入时,在时钟上升沿数据必须有效,如果/RST变低,所有数据传送即被终止,I/O引脚到一个高阻状态。
在电源上电过程中,/RST必须保持逻辑0,直到Vcc大于0.2V。
在/RST由0变1的过程中,SCLK必须是逻辑0。
数据输入:
输入写命令字节8个时钟周期之后,在下8个时钟周期的上升沿输入数据,若有额外的SCLK周期是不予理睬的,数据输入开始位是位0。
数据输出:
输入读命令字节8个时钟周期之后,在下8个时钟周期的下降沿数据被送出。
注意:
第一个数据位被送出发生在写命令字节最后一位的第一个下降沿,数据输出开始位为位0。
3.2.2DS1302与单片机接口电路
图5DS1302与单片机接口电路
3.3显示电路的设计
3.3.1LCD1602简介
1602液晶也叫1602字符型液晶。
它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5x7或者5x11点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位中间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。
1602的驱动电路带有11条指令,可以很方便的控制液晶的显示效果,如:
清屏、左移右移、光标显示。
而且1602显示的字符在下一条指令没到来之前不会改变,也就是能够维持显示字符,1602液晶占用的系统资源也少。
在编程序时必须注意1602的初始化和三个控制口的编写,确保从DS1302和18B20中读出的数据正确输入。
3.3.2LCD1602相应功能特征介绍
1602LCD采用标14脚(无背光)或16脚(带背光)接口,各引脚功能如表6所示
表6LCD1602引脚及功能
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高。
若对比度过高会产生“鬼影”,使用时可以通过一只10KΩ电阻来调整对比度。
RS为寄存器选择端,RS为高电平时选择数据寄存器,为低电平时选择指令寄存器。
RW为读写信号线,为高电平时进行读操作,为低电平时为写操作。
当RS和RW同为低电平时可以写入指令或者显示地址。
当RS为低电平、RW为高电平时可以读忙信号,当RS为高电平、RW为低电平时可以写入数据。
E为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
D0~D8为位双向数据线。
特点:
1.+5V电压,对比度可调
2.内含复位电路
3.提供各种控制命令,如:
清屏、字符闪烁、光标闪烁、显示移位等多种功能
4.有80字节显示数据存储器DDRAM
5.内建有160个5x7点阵的字符发生器CGRAM
6.8个可由用户自定义的5x7的字符发生器CGRAM
3.2.31602LCD的操作指令说明
1602液晶模块内部的控制器共有11条控制指令,如表7所示。
表71602液晶模块内部的控制器的11条控制指令
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的:
指令1:
清显示,指令码,光标复位到地址位置。
指令2:
光标复位,光标返回到地址00H。
指令3:
光标和显示模式设置。
其中:
I/D:
光标移动方向,高电平右移,低电平左移;
S:
屏幕上所有文字是否左移或者右移,高电平。
指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示;
C:
控制光标的开与关,高电平表示有光标,低电平表示无光标;
B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:
光标或显示移位。
S/C:
高电平时移动显示的文字,低电平时移动光标。
指令6:
功能设置命令。
DL:
高电平时为4位总线,低电平时为8位总线;
N:
低电平时为单行显示,高电平时双行显示;
F:
低电平时显示5×
7的点阵符,高电平时显示5×
10的点阵字符。
指令7:
字符发生器RAM地址设置。
指令8:
DDRAM地址设置。
指令9:
读忙信号和光标地址。
BF:
读忙标志位,高电平表示忙、,此时模块不能接收命令或者数据低电平表示不忙。
指令10:
写数据。
指令11:
读数据。
3.3.3LCD1602液晶与单片机接口电路
图8液晶显示
3.4键盘接口的设计
图9键盘接口电路
四、系统软件设计
4.1系统主程序设计
voidmain(){unsignedchari;
LcdInitiate();
//调用LCD初始化函数delaynms(10);
write_1602com(0x01);
//清显示:
清屏幕指令write_1602com(yh+0x00);
//设置显示位置为第一行的第5个字i=0;
while(string[i]!
='
\0'
){//显示字符write_1602dat(string[i]);
i++;
delaynms(150);
}for(i=0;
i<
4;
i++){delaynms(250);
}lcd_init();
//调用液晶屏初始化子函数ds1302_init();
//调用DS1302时钟的初始化子函数init();
//调用定时计数器的设置子函数led=0;
//打开LCD的背光电源buzzer=0;
//蜂鸣器长响一次delay(80);
buzzer=1;
while
(1)//无限循环下面的语句:
{keyscan();
//调用键盘扫描子函数}}
4.2按键子程序设计
voidkeyscan(){if(key1==0)//---------------key1为功能键(设置键)--------------------{delay(9);
//延时,用于消抖动if(key1==0)//延时后再次确认按键按下{buzzer=0;
//蜂鸣器短响一次delay(20);
while(!
key1);
key1n++;
if(key1n==9)key1n=1;
//设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环switch(key1n){case1:
TR0=0;
//关闭定时器//TR1=0;
write_1602com(er+0x09);
//设置按键按动一次,秒位置显示光标write_1602com(0x0f);
//设置光标为闪烁temp=(miao)/10*16+(miao)%10;
//秒数据写入DS1302write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);
//miaowrite_1302(0x8e,0x80);
break;
case2:
write_1602com(er+6);
//按2次fen位置显示光标break;
case3:
write_1602com(er+3);
//按动3次,shibreak;
case4:
write_1602com(yh+0x0e);
//按动4次,weekbreak;
case5:
write_1602com(yh+0x0a);
//按动5次,ribreak;
case6:
write_1602com(yh+0x07);
//按动6次,yuebreak;
case7:
write_1602com(yh+0x04);
//按动7次,nianbreak;
case8:
write_1602com(0x0c);
//按动到第8次,设置光标不闪烁TR0=1;
//打开定时器temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);
//miao数据写入DS1302write_1302(0x8e,0x80);
break;
}}}//------------------------------加键key2----------------------------if(key1n!
=0)//当key1按下以下。
再按以下键才有效(按键次数不等于零){if(key2==0)//上调键{delay(10);
if(key2==0){buzzer=0;
key2);
switch(key1n){case1:
miao++;
//设置键按动1次,调秒if(miao==60)miao=0;
//秒超过59,再加1,就归零write_sfm(0x08,miao);
//令LCD在正确位置显示"
加"
设定好的秒数temp=(miao)/10*16+(miao)%10;
//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00);
//允许写,禁止写保护write_1302(0x80,temp);
write_1302(0x8e,0x80);
//打开写保护write_1602com(er+0x09);
break;
fen++;
if(fen==60)fen=0;
write_sfm(0x05,fen);
设定好的分数据temp=(fen)/10*16+(fen)%10;
//允许写,禁止写保护write_1302(0x82,temp);
//打开写保护write_1602com(er+6);
break;
shi++;
if(shi==24)shi=0;
write_sfm(2,shi);
//令LCD在正确的位置显示"
设定好的小时数据temp=(shi)/10*16+(shi)%10;
//允许写,禁止写保护write_1302(0x84,temp);
//打开写保护write_1602com(er+3);
week++;
if(week==8)week=1;
write_1602com(yh+0x0C);
//指定'
加'
后的周数据显示位置write_week(week);
//指定周数据显示内容temp=(week)/10*16+(week)%10;
//允许写,禁止写保护write_1302(0x8a,temp);
//打开写保护write_1602com(yh+0x0e);
ri++;
if(ri==32)ri=1;
write_nyr(9,ri);
设定好的日期数据temp=(ri)/10*16+(ri)%10;
//允许写,禁止写保护write_1302(0x86,temp);
//打开写保护write_1602com(yh+10);
yue++;
if(yue==13)yue=1;
write_nyr(6,yue);
设定好的月份数据temp=(yue)/10*16+(yue)%10;
//允许写,禁止写保护write_1302(0x88,temp);
//打开写保护write_1602com(yh+7);
nian++;
if(nian==100)nian=0;
write_nyr(3,nian);
设定好的年份数据temp=(nian)/10*16+(nian)%10;
//允许写,禁止写保护write_1302(0x8c,temp);
//打开写保护write_1602com(yh+4);
}}}//------------------减键key3,各句功能参照'
加键'
注释---------------if(key3==0){delay(10);
//调延时,消抖动if(key3==0){buzzer=0;
key3);
switch(key1n){case1:
miao--;
if(miao==-1)miao=59;
//秒数据减到-1时自动变成59write_sfm(0x08,miao);
//在LCD的正确位置显示改变后新的秒数temp=(miao)/10*16+(miao)%10;
case2:
fen--;
if(fen==-1)fen=59;
write_sfm(5,fen);
temp=(fen)/10*16+(fen)%10;
breacase3:
shi--;
if(shi==-1)shi=23;
temp=(shi)/10*16+(shi)%10;
case4:
week--;
if(week==0)week=7;
write_1602com(yh+0x0C);
//指定周数据显示内容temp=(week)/10*16+(week)%10;
case5:
ri--;
if(ri==0)ri=31;
temp=(ri)/10*16+(ri)%10;
case6:
yue--;
if(yue==0)yue=12;
temp=(yue)/10*16+(yue)%10;
//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;
case7:
nian--;
if(nian==-1)nian=99;
temp=(nian)/10*16+(nian)%10;
//允许写,禁止写保护write_1302(0x8c,t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 万年历