智能万年历1.docx

上传人:b****5 文档编号:6990783 上传时间:2023-01-15 格式:DOCX 页数:30 大小:760.63KB
下载 相关 举报
智能万年历1.docx_第1页
第1页 / 共30页
智能万年历1.docx_第2页
第2页 / 共30页
智能万年历1.docx_第3页
第3页 / 共30页
智能万年历1.docx_第4页
第4页 / 共30页
智能万年历1.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

智能万年历1.docx

《智能万年历1.docx》由会员分享,可在线阅读,更多相关《智能万年历1.docx(30页珍藏版)》请在冰豆网上搜索。

智能万年历1.docx

智能万年历1

1系统设计方案2

1.1方案的提出2

1.2系统方案介绍2

1.3功能3

1.4实现原理3

1.5硬件框图4

1.5.1显示模块4

1.5.2初始值设置模块9

1.5.3闹钟及其设置模块9

1.6软件流程10

1.6.1编程算法思想10

1.6.2程序框图10

2.系统测试13

2.1仿真调试13

2.2硬件焊接的检测13

2.3总体调试13

3.结论14

4.附录14

附1:

元器件明细表14

附2:

电路图图纸15

附3:

程序清单15

 

摘要

本项目针对万年历的功能性和智能性进行了设计与研究,以单片机为核心,结合了DS1302和LCD等器件,设计制作出智能型多功能万年历。

该万年历具有显示年月日时分秒星期、任意设置初始值和闹钟设置等功能。

实现对万年历显示和调节的智能控制。

本项目很好地将万年历的显示、调节和闹钟设置结合在了一起,满足了人们对万年历的基本要求。

关键词:

智能单片机DS1302LCD

Abstract

Theproject designandresearch forthecalendarfunctionandintelligence,bysinglechipprocessoras

thecore,comprehensiveuseofDS1302andLCD,designakindofintelligentcalendar.The calendar candisplaythe

date,thehour,theminute,thesecondandtheweek,

arbitrarilysettheinitialvalueandthealarmsetting

function.Theproject canbeachievedonthe calendar 

displayandadjustment ofintelligentcontrol.Theprojectwillbegoodto calendar display,control 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

      

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:

元器件明细表

序号

元器件名称

元器件型号

数量

1

单片机

STC89S51

1

2

时钟芯片

DS1302

1

3

显示芯片

1602

1

4

零散元件

电阻电容

5

按键

5

6

蜂鸣器

1

7

放大器

9012

1

8

变位器

103

1

附2:

电路图图纸

系统总电路原理图

附3:

程序清单

#include

#include

#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};//sec,min,hour,date,month,week,year

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);

voidkeyscan();

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;

beep=1;

}

}

 

if(key4==0)

{

delay

(2);

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

{

uchari;

for(i=8;i>0;i--)

{

ACC=ACC>>1;

acc7=ds1302_io;

ds1302_sclk=1;

ds1302_sclk=0;

}

return(ACC);

}

voids_write(ucharadd,uchardat)//单字节写入子函数ds1302写入确定地址确定内容

{

ds1302_ce=0;

ds1302_sclk=0;

ds1302_ce=1;

write_byte(add);

write_byte(dat);

ds1302_sclk=1;

ds1302_ce=0;

}

uchars_read(ucharadd)//单字节读出子函数ds1302写入地址读出数据十进制

{

uchartemp;

ds1302_ce=0;

ds1302_sclk=0;

ds1302_ce=1;

write_byte(add);

temp=read_byte();

ds1302_sclk=1;

ds1302_ce=0;

temp=BCD2DEC(temp);

return(temp);

}

voidset_ds1302(uchar*pClock)//设置ds1302的时间将时间写入1302

{

uchari;

ucharadd=0x80;

s_write(0x8e,0x00);//能够写入ds1302

for(i=7;i>0;i--)

{

s_write(add,*pClock);//将时间写入1302

pClock++;

add+=2;

}

s_write(0x8e,0x80);//禁止写入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);//写入时间子函数add=0x80lcd

write_com(0x80+0x40+9);

//min=clock_min;//读出分

write_time(5,clock_min);

write_com(0x80+0x40+6);

//hour=clock_hour;

write_time(2,clock_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);

}

}

voidwrite_com(ucharcom)//写命令子函数lcd

{

lcde=0;

lcdrw=0;

lcdrs=0;

delay

(1);

lcde=1;

delay

(1);

P2=com;

delay

(1);

lcde=0;

}

voidwrite_data(uchardat)//写数据子函数lcd

{

lcde=0;

lcdrw=0;

lcdrs=1;

delay

(1);

lcde=1;

delay

(1);

P2=dat;

delay

(1);

lcde=0;

}

voidinit()//LCD1602初始化

{

s_write(0x90,0xa5);

set_ds1302(time);

delay(5);

write_com(0x38);

delay(100);

write_com(0x38);//设置显示模式:

8位2行5x7点阵

delay(50);

write_com(0x38);

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);

for(num=0;num<10;num++)//在第二行末尾显示“00:

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

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

当前位置:首页 > 初中教育 > 语文

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

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