智能万年历1Word格式.docx
- 文档编号:20012477
- 上传时间:2023-01-15
- 格式:DOCX
- 页数:30
- 大小:760.63KB
智能万年历1Word格式.docx
《智能万年历1Word格式.docx》由会员分享,可在线阅读,更多相关《智能万年历1Word格式.docx(30页珍藏版)》请在冰豆网上搜索。
and
alarmsettings
together,
meetthebasicrequirementof
thecalendar.
Keywords:
IntelligenceMUCDS1302LCD
1系统设计方案
1.1方案的提出
万年历是我国古代传说中最古老的一部太阳历。
为纪念历法编撰者万年功绩,便将这部历法命名为“万年历”。
而现在所使用的万年历,实际上就是记录一定时间范围内的具体阳历或阴历的日期的年历,方便有需要的人查询使用,与原始历法并无直接联系。
万年历已在各个平台有相关的应用。
现在人们的生活几乎离不开万年历。
但是,普通的纸质万年历比较不方便,需要人们不断的修正。
基于这种情况,我们想到了运用普通器件,设计智能万年历。
它具有不在人为干预的情况下正常显示时间,任意设置初始时间和闹钟的功能,方便人们的生活。
1.2系统方案介绍
本项目的设计思想来源于生活,所具有的功能也是为万年历使用的方便性及智能化而设置。
针对目前普通万年历存在的使用不方便,功能单一等问题进行系统分析与研究,以单片机AT89C51为控制核心,用DS1302作为万年历的“储存器件”,用LCD作为显示器件,用按键作为设置元件,主要利用5V电源供电。
综合运用传感技术,光检测技术,实现万年历的正常显示,初始时间设置和闹钟设置等功能。
当用户在使用万年历时,在初始设置后,不需人为干涉,就能随时间正常显示。
人性化设计,添加用户初始值设置和闹钟功能,让用户使用更加方便。
本项目的创新点是:
第一,智能。
以DS1302作为时间的储存元件,实现时间自动显示,达到智能控制的目的;
按键时间初始设置,而且外加闹钟功能,也能进行初始化设置。
第二,多功能。
此设计不仅能实现时间的正常显示,时间初始化,还具有闹钟,满足人们对多功能的需求。
1.3功能
(1)时间的正常显示
(2)时间的初始值设置
(3)闹钟及其初始值设置
1.4实现原理
1.4.1时间的正常显示
通过DS1302确定的地址读取年月日时分秒星期,然后送给LCD确定的地址显示,完成时间的自动显示。
1.4.2时间的初始值设置
设置两个按键,一个按键用于在年月日时分秒星期间选择切换,另一个按键用于数值加一。
1.4.3闹钟及其初始值设置
通过三极管驱动蜂鸣器完成闹钟到点响的功能,通过两个按键完成闹钟初始值设置,一个按键用于由正常显示切换到闹钟设置,另一个按键用于由闹钟设置切换到正常显示。
1.5硬件框图
系统硬件框图如图
(1)所示
单片机
DS1302
显示模块
蜂鸣器
Lcd1602
闹钟及其设置模块
按键
初始值
设置模块
图
(1)系统硬件框图
1.5.1显示模块
(1)DS1302
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
DS1302的外部引脚分配如图1所示。
DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。
各引脚的功能为:
Vcc1:
主电源;
Vcc2:
备份电源。
当Vcc2>
Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2<
Vcc1时,由Vcc1向DS1302供电。
SCLK:
串行时钟输入,控制数据的输入与输出;
I/O:
三线接口时的双向数据线;
CE:
输入信号,在读、写数据期间,必须为高。
该引脚有两个功能:
第一,CE开始控制字访问移位寄存器的控制逻辑;
其次,CE提供结束单字节或多字节数据传输的方法。
DS1302有下列几组寄存器:
DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch),存放的数据格式为BCD码形式,如图3所示。
图3DS1302有关日历、时间的寄存器
小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。
当为高时,选择12小时模式。
在12小时模式时,位5是
,当为1时,表示PM。
在24小时模式时,位5是第二个10小时位。
秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。
当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;
当该位置为0时,时钟开始运行。
控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。
在任何的对时钟和RAM的写操作之前,WP位必须为0。
当WP位为1时,写保护位防止对任一寄存器的写操作。
(2)LCD1302
1602采用标准的16脚接口,其中:
第1脚:
VSS为地电源
第2脚:
VDD接5V正电源
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15~16脚:
空脚
指令图
它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:
1为高电平、0为低电平)
指令1:
清显示,指令码01H,光标复位到地址00H位置
指令2:
光标复位,光标返回到地址00H
指令3:
光标和显示模式设置
I/D:
光标移动方向,高电平右移,低电平左移
S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效
指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示
C:
控制光标的开与关,高电平表示有光标,低电平表示无光标
B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁
指令5:
光标或显示移位
S/C:
高电平时移动显示的文字,低电平时移动光标
指令6:
功能设置命令
DL:
高电平时为4位总线,低电平时为8位总线
N:
低电平时为单行显示,高电平时双行显示
F:
低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符
指令7:
字符发生器RAM地址设置
指令
8:
DDRAM地址设置
指令9:
读忙信号和光标地址
BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据
指令11:
读数据
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。
1.5.2初始值设置模块
(1)按键
四个按键,一个用于设置项的选择,一个用于数值加一,一个用于将正常显示状态切换到闹钟设置状态,另一个键用于将闹钟显示状态切换到正常显示状态。
1.5.3闹钟及其设置模块
(1)蜂鸣器
蜂鸣器要外加9012作为驱动,使其定点提醒。
1.6软件流程
1.6.1编程算法思想
程序采用模块化设计思想。
以主程序为核心设置功能模块子程序,简化了设计结构。
运行过程中通过主程序调用各功能模块子程序。
该系统的工作软件主要完成以下功能:
单片机不断读取DS1302的数值送给LCD显示,并通过按键设置时间和闹钟的初始值,达到控制时间的目的,实现智能万年历的目的。
1.6.2程序框图
主程序流程图
中断服务流程图
2.系统测试
2.1仿真调试
仿真图
通过软件仿真验证程序的正确性,并对软件程序进行优化,进而完成程序的优化。
2.2硬件焊接的检测
在电路的焊接过程中,不断检测焊接的正确性,并用万用表检测焊接点之间是否导通。
2.3总体调试
将程序下载到硬件单片机中,检测是否可用,当出现问题时,寻找和问题相关的硬件,进而一步步解决问题。
3.结论
本项目本着智能,多功能,人性化的设计理念,智能地实现了万年历的显示、设置和闹钟功能,项目达到了初定的目标。
4.附录
元器件明细表
序号
元器件名称
元器件型号
数量
1
STC89S51
2
时钟芯片
3
显示芯片
1602
4
零散元件
电阻电容
5
6
7
放大器
9012
8
变位器
103
电路图图纸
系统总电路原理图
程序清单
#include<
reg52.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineDEC2BCD(X)((X/10)<
<
4|(X%10))//用于将十进制转成BCD码的宏
#defineBCD2DEC(X)(((X&
0x70)>
>
4)*10+(X&
0x0F))//用于将BCD码转成十进制的宏
voidwrite_com(ucharcom);
voidwrite_data(uchardat);
voidinit();
voidwrite_time(ucharadd,uchardat);
voidwrite_riqi(ucharadd,uchardat);
voidwrite_xingqi(uchardat);
voidwrite_byte(uchardat);
ucharread_byte();
voids_write(ucharadd,uchardat);
uchars_read(ucharadd);
voidset_ds1302(uchar*pClock);
voidrw_ds1302();
voidkeyscan();
uchardatatable[]="
2009-01-01Mon."
;
uchardatatable1[]="
00:
00:
00"
ucharcodexingqi[]="
Mon.Tue.Wed.Thu.Fri.Sat.Sun."
ucharcodetime[]={0x00,0x00,0x00,0x01,0x01,0x01,0x09};
//sec,min,hour,date,month,week,year
uchardatatime1[]={0x00,0x00,0x00,0x01,0x01,0x01,0x09};
ucharhour,min,sec,week,day,month,year,num,sfcount=0,flag;
ucharclock_sec=30,clock_min,clock_hour;
uchardisplay_flag;
//0显示当前时间1显示闹钟时间
sbitds1302_sclk=P3^4;
sbitds1302_io=P3^5;
sbitds1302_ce=P3^6;
sbitacc0=ACC^0;
sbitacc7=ACC^7;
sbitlcdrs=P1^5;
//端口定义
sbitlcdrw=P1^6;
sbitlcde=P1^7;
sbitbeep=P3^7;
sbitfunctionk1=P1^0;
//选择设置的项
sbitsup=P1^1;
//key2
sbitkey3=P1^2;
//加1
sbitkey4=P1^4;
voiddelay(uinta);
voidchoose();
voidbeepp();
voidmain()//main函数
{
s_write(0x8e,0x80);
init();
P0=0xff;
while
(1)
{
keyscan();
choose();
beepp();
if(flag==0){
rw_ds1302();
}
}
voidbeepp()
if((hour==clock_hour)&
&
(min==clock_min)&
(sec==clock_sec))
{
beep=0;
delay(100);
}
if((hour!
=clock_hour)||(min!
=clock_min)||(sec!
=clock_sec))
beep=1;
voidchoose()//控制显示的内容
{
if(key3==0)
delay
(2);
if(key3==0)
{
display_flag=1;
if(key4==0)
if(key4==0)
display_flag=0;
voidwrite_byte(uchardat)//写入一个字节ds1302
uchari;
ACC=dat;
for(i=8;
i>
0;
i--)
ds1302_io=acc0;
ds1302_sclk=1;
ds1302_sclk=0;
ACC=ACC>
1;
ucharread_byte()//读出一个字节ds1302
acc7=ds1302_io;
return(ACC);
voids_write(ucharadd,uchardat)//单字节写入子函数ds1302写入确定地址确定内容
ds1302_ce=0;
ds1302_ce=1;
write_byte(add);
write_byte(dat);
}
uchars_read(ucharadd)//单字节读出子函数ds1302写入地址读出数据十进制
uchartemp;
temp=read_byte();
temp=BCD2DEC(temp);
return(temp);
voidset_ds1302(uchar*pClock)//设置ds1302的时间将时间写入1302
ucharadd=0x80;
s_write(0x8e,0x00);
//能够写入ds1302
for(i=7;
s_write(add,*pClock);
//将时间写入1302
pClock++;
add+=2;
//禁止写入1302
voidrw_ds1302()//读写ds1302
if(display_flag==0)
sec=s_read(0x81);
//读出秒
write_time(8,sec);
//写入时间子函数add=0x80lcd
write_com(0x80+0x40+9);
min=s_read(0x83);
//读出分
write_time(5,min);
write_com(0x80+0x40+6);
hour=s_read(0x85);
write_time(2,hour);
write_com(0x80+0x40+3);
week=s_read(0x8b);
write_xingqi(week);
write_com(0x80+0x0d);
day=s_read(0x87);
write_riqi(8,day);
write_com(0x80+9);
month=s_read(0x89);
write_riqi(5,month);
write_com(0x80+6);
year=s_read(0x8d);
//读出年
write_riqi(2,year);
write_com(0x80+3);
if(display_flag==1)
{//sec=clock_sec;
write_time(8,clock_sec);
//min=clock_min;
write_time(5,clock_min);
//hour=clock_hour;
write_time(2,clock_hour);
voidwrite_com(ucharcom)//写命令子函数lcd
lcde=0;
lcdrw=0;
lcdrs=0;
delay
(1);
lcde=1;
P2=com;
voidwrite_data(uchardat)//写数据子函数lcd
lcdrs=1;
P2=dat;
voidinit()//LCD1602初始化
s_write(0x90,0xa5);
set_ds1302(time);
delay(5);
write_com(0x38);
write_com(0x38);
//设置显示模式:
8位2行5x7点阵
delay(50);
delay(10);
write_com(0x08);
//关
write_com(0x01);
//清屏
write_com(0x0c);
//开0x08关
write_com(0x80);
//能写
for(num=0;
num<
15;
num++)//在第一行显示“2009-01-01Mon.”
write_data(table[num]);
write_com(0x80+0x40);
10;
num++)//在第二行末尾显示“00:
00”
write_data(table1[num]);
voidwrite_time(ucharadd,uchardat)//写入时间子函数lcd
ucharshi,ge;
shi=dat/10;
ge=dat%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
voidwrite_riqi(ucharadd,uchardat)//写入日期子函数lcd
uchar
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 万年历