多功能电子日历设计制作_第1页
多功能电子日历设计制作_第2页
多功能电子日历设计制作_第3页
多功能电子日历设计制作_第4页
多功能电子日历设计制作_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

多功能电子日历设计制作

本设计介绍一种以单片机AT89S52为核心的多功能电子日

历进行了探讨,在实现了电子日历的主要功能的同时还具备时钟和

温度计的功能,采纳的时钟芯片和温度传感器都是新型的产品,具

有较高的好用价值和探讨意义。

*

单片机DS1302DS18B20LCD16021.单片机部分,包

括电源,晶体振荡器,复位电路,通讯电路。

2.时钟芯片和温度传感器,包括时钟芯片和单片机之间

进行数据和吩咐传输的电路,温度传感器电路。

3.LCD与单片机之间的数据传输和字符显示。

4.用Protues对局部电路和软件进行仿真测试,刚好

进行修改,避开资源奢侈,提高设计效率和精确性。

二.系统的电路简图如上所示,整个系统采纳AT89S52

作为中心处理芯片,用于数据处理,初值设定,显示限制等。

单片机上电复位后,从头起先执行程序,时钟频率有外部晶振

频率供应。

单片机对整个系统运行的限制包括:

检测按键信号,推断是否更新时间,分值等;对LCD初始

化,写入数据或吩咐,字符输出到液晶显示等。

AT89S52时钟芯片DS1302晶体振荡器复位电

路温度传感器D18B20LCD1602图表1硬件设计电路图表

1为实现电子日历系统所运用的电子元件芯片及详细的连接电路。

AT89S52单片机内带有程序寄存器,无须外扩程序存储器,外

接12MHz晶振电路和复位电路。

按键电路由四个微动按键组成,分别由P2口的

P2.0,P2.1,P2.2,P2.3限制,通过按键可进行日历年/月/日和时间的

时/分/秒的的切换和修改。

DS18B2是单总线温度传感器,与单片机通信只要一根I/O

线,因而运用便利。

本系统利用P1.0口作为I/O口线干脆读取温度值。

这种方式比其他温度传感器省去了信号调理、标度转换、A/D

转换等前向通道电路,使电路简化,编程简单,另外它采纳低电

压供电,测温范围为-55~+125度,在-10度到+85度范围内误差

为0.5度,这些特点满意在测量室温方面的要求。

DS1302是串行接口实时时钟芯片,其内部具有实时时钟、日

历和用户可用RAM,可依据月份和闰年的状况自动调整月份的结束日

期,与单片机通信只须要3根连线,无论是从DS1302中读一个数

据还是写进一个字节数据,都要先写一个吩咐字到DS1302.

即通过SCLK引脚输入8个脉冲,写入I/O引脚上的吩咐字。

为了启动数据传输,5号引脚应为高电平。

在将0置1的过程中,SCLK引脚必需为逻辑0,然后才能

进行读写操作I/O引脚的数据在SCLK的上升沿串行输入,在

SCLK的下降沿串行输出。

软件是单片机应用系统的灵魂,时间日期的修改是电子日历

系统的难点。

本方案选择AT89S52内部RAM的一个单元作为位选择标记,

该标记为0时,为时钟日历显示状态,不为0时进入修改状态。

由位选择按键触发外部中断1,调用中断程序修改该RAM单

元的值。

每按位选择按键一次,该RAM单元值加一,用来确定详细修

改哪一位显示器。

该电子日历系统硬件主要由AT89S52单片机,时钟

芯片DS1302,温度传感器DS18B20,LCD1602等元器件组成,系

统仿真原理图如下所示:

图表2模拟仿真界面:

运行Protues后出现主程序窗口界面,鼠标左键单击窗口工

具栏File选择Newdesign,再点击窗口左侧的元器件选择区的

PickDevices按钮,在Category栏里点击MicroprocessorICs,

在Results栏里就会出现各种类型的CPU器件,找到AT89S52后

双击,就会添加到当前窗口左侧的元器件列表区了。

用同样的方法一次找DS1302,DS18B20,LCD1602,晶振以

及多个电阻电容也添加到器件列表区。

然后再单击左键把它们依次放到绘图区,右键选中元件,并

编辑其属性,合理布局后进行连线,全部导线画完后再连上电源和

接地符号原理图绘制就完成了,保存起来。

软件部分采纳汇编语言编写,包括时钟,温度和LCD液晶

显示三部分,将系统软件编译成Hex文件后就可以进行系统模拟仿

真在ISI的原理图中,右键点击AT89S52将其选中,然后单击左

键打开它的EditComponent对话框,如图表3所不,在

Program文件中选择对应文件,单击0K就可以进行仿真设置。

图表3Editcomponent本次设计对单片机软硬件资源和接

口扩展都有了较深化的学习,也了解时钟芯片DS1302和

温度传感器DS18B20的基本原理和运用方法。

由于时间日期和温度都是通过特定的芯片获得的,单片机只起

到限制和转换的作用,在精度方面不受单片机性能和程序的限制,

故简单保障其精度和效率。

1代启化基于Protues的电路设计与仿真现代电子技

术20062沈德金单片机试验与实践教程北京航空航天高校

出版社20013耿长青单片机应用技术北京化工出版社2002

#includeREG51.H#includeintrins.h//ftincludeLCD1602.h

//#includeDS1302.h#defineuintunsignedint#defineuchar

unsignedcharsbitDS1302CLK=Pl;//sbit

DS1302_10=Pl;//sbitDS1302_RST=Pl;

//sbitwirelessl=P3;sbitwireless_2=P3;sbit

wireless3=P3;sbitwireless_4=P3;sbitACCO=ACC;

sbitACC7=ACC;char

hide_sec,hide_min,hide_hour,hide_day,hide_week,hidejnonth,h

ide_year;//,,,,sbitSet=P2;//sbitUp=P2;

//sbitDown=P2;//sbitout=P2;//

sbitDQ=Pl;//char

done,count,temp,flag,upflag,downflag;uchartempvalue;

//ucharTempBuffer[5],weekvalue[2];voidshowtime();

///***********1602//Port

Definitions************************************************

**********sbitLcdRs=P2;sbitLcdRw=P2;sbitLcdEn=

P2;sfrDBPort=0x80;//P0=0x80,Pl=0x90,P2=0xA0,P3=0xB0.

//slzslzsixslzslzslzslzslz

ff^7>^1*<1%

*****************unsignedcharLCDWait(void){LcdRs=0;

LcdRw=l;nop();LcdEn=l;nop();LcdEn=0;

returnDBPort;}

//\fI

/IIII*7*zfsztszT^

******ttdefineLCD_COMMAND0//Commandftdefine

LCD_DATA1//Data#defineLCD_CLEAR_SCREEN0x01

//^defineLCD_H0MTNG0x02//voidLCDJVrite(bit

style,unsignedcharinput){LcdEn=0;LcdRs=style;

LcdRw=0;nop_();DBPort=input;_nop_();//LcdEn=l;

nop();//LcdEn=0;nop();LCDWait();}10

■卜■「,广■广■广■广.卜■广■I[.

/I'1,■,/K!^、1.xf>K!>XIXK!^K!*KJ>■[/KI>K^<>|>\],K£>

fIz^z?sz^zT^z^z^zTsz^z^z?sz^

***ttdefineLCD_SHOW0x04//ftdefineLCD_HTDE0x00

//#defineLCD_CURSOR0x02//ttdefineLCD_N0_CURS0R0x00

//#defineLCD_FLASI10x01//#defineLCD_N()_FLASH0x00

//voidLCDSetDisplay(unsignedcharDisplayMode)

{LCDWrite(LCDCOMMAND,0x081DisplayMode);}

//*x**>L**x**i**>1**x**A**1**4**J**x**>L**4*

//*T^*T^*g**T**T*

***#defineLCD_AC_UP0x02#defineLCD_AC_DOWN0x00

//default#defineLCDJfOVE0x01//ttdefine

LCD_N0_M0VE0x00//defaultvoid

LCDSetInput(unsignedcharInputMcde)

{LCDJVrite(LCD_COMMAND,0x04|InputMode);)

ff\fI

//I1II(、*TxxT**y**T**T**T*>T**v**T**T»*T**T**y**7**v**T**T**y**7**T**r**v**T**v**7**T**T*.<、*7**r**Y**T**TX*v**T**v**T**r**v**T**T**7**T**7**T*/v**r*

******voidLCDInitial(){LcdEn=0;

LCDJVrite(LCD_COMMAND,0x38);//8,5*7

LCDJVrite(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SH0W|LCD_NO_CURSOR);//

LCDJVrite(LCD_COMMAND,LCD_CLEAR_SCREEN);//

LCD_SetInput(LCD_AC_UP|LCD_N0_M0VE);

//AC},2,,//voidGotoXY(unsigned

charx,unsignedchary)if(y==0)

LCDWrite(LCDCOMMAND,0x801x);if(y=l)

LCD_Write(LCD_COMMAND,0x801(x-0x40));}//void

Print(unsignedchar*str){while(*str!=,\(T)

{LCD_Write(LCD_DATA,*str);str++;}}

/***********DS1302typedefstruct_SYSTEMTIME_{unsigned

charSecond;unsignedcharMinute;unsignedcharHour;

unsignedcharWeek;unsignedcharDay;unsignedcharMonth;

unsignedcharYear;unsignedcharDateString[ll];

unsignedcharTimeString[9];}SYSTEMTIME;//SYSTEMTIME

CurrentTime;^defineAM(X)X#definePM(X)(X+12)

//#defineDS1302_SEC0ND0x80//#define

DS1302J1INUTE0x82ttdefineDS1302_H0UR0x84#define

DS1302_WEEK0x8AftdefineDS1302_DAY0x86#define

DS13O2_MONT110x88ttdefineDS1302_YEAR0x8C

******************************************/24,void

DS1302InputByte(unsignedchard)//{unsignedchari;

ACC=d;for(i=8;iO;i—){DS1302_I0=ACCO;

//DS1302_CLK=1;DS1302_CLK=0;ACC

=ACC1;}}unsignedcharDS13020utputByte(void)

//{unsignedchari;for(i=8;iO;i-)

{ACC=ACC1;//ACC7=DS1302_10;

DS1302CLK=1;DS1302CLK=0;}

return(ACC);}voidWritel302(unsignedcharucAddr,

unsignedcharucDa)//ucAddr:DS1302,ucData:

{DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;

DS1302InputByte(ucAddr);//

DS1302InputByte(ucDa);//IByteDS1302_CLK=1;

DS1302RST=0;}unsignedcharReadl302(unsignedchar

ucAddr)//{unsignedcharucData;DS1302RST=0;

DS1302_CLK=0;DS1302_RST=1;()RRC()RRCDS1302

DS1302InputByte(ucAddr10x01);//ucData=

DS13020utputByte();//IByteDS1302_CLK=1;

DS1302_RST=0;return(ucData);}void

DS1302_GetTime(SYSTEMTIME*Time)//{unsignedchar

ReadValue;ReadValue=Read1302(DS1302_SEC0ND);

7

Time-Second二((ReadValue0x70)4)*10+(ReadValueOxOI);

ReadValue=Read1302(DS1302MINUTE);Time-Minute二

((ReadValue0x70)4)*10+(ReadValueOxOF);ReadValue=

Read1302(DS1302_H0UR);Time-Hour二((ReadValue0x70)4)*10+

(ReadValueOxOF);ReadValue=Readl302(DS1302_DAY);

Time-Day=((ReadValue0x70)4)*10+(ReadValueOxOF);

ReadValue=Read1302(DS1302JVEEK);Time-Week=

((ReadValue0x70)4)*10+(ReadValueOxOF);ReadValue=

Read1302(DS1302MONTH);Time-Month二((ReadValue0x70)4)*10

+(ReadValueOxOF);ReadValue=Readl302(DS1302YEAR);

Time-Year=((ReadValue0x70)4)*10+(ReadValueOxOF);}void

DateToStr(SYSTEMTIME*Time)//,DateString[]

{if(hide_year2)//,2,

{Time-DateString[O]=

,2';Time-DateString[1]=,0';Time-DateString[2]

二Time-Year/10+'O';Time-DateString[3]=Time-Year%10

+,0';}else{Time-DateString[O]='

Time-DateString[1]二,';Time-DateString[2]=

'Time-DateString[3]='}

Time-DateString[4]='/';,,,if,else,22007/07/22

if(hide_month2){Time-DateString[5]=Time-Month/10+

;Time-DateString[6]=Time-Month%10+<0,;}

else{Time-DateString[5]=(

Time-DateString[6]=,';}Time-DateString[7]=,/';

if(hide_day2){Time-DateString[8]=Time-Day/10+40,;

Time-DateString[9]=Time-Day%10+,0';}else

{Time-DateString[8]='Time-DateString[9]=

16;}if(hide_week2){weokvalue[0]=

Time-Week%10+;//week_value[],,}else

{week_value[0]='}weekvalue[1]='\0';

Time-DateString[10]='\0';//}voidTimeToStr(SYSTEMTIME

*Time)//TimeString[];{if(hide_hour2)

Time-TimeString[O]Time-Hour/10+'O';

Time-TimeString[l]=Time-Hour%10+;}else

{,,<\0,,,,Time-TimeString[O]=

Time-TimeString[1]=}Time-TimeString[2]=

if(hidemin2)Time-TimeString[3]=Time-Minute/10+

"O';Time-TimeString[4]Time-Minute%10+'O';}

else{Time-TimeString[3]='

Time-TimeString[4]=''}Time-TimeString[5]=

;if(hide_sec2){Time-TimeString[6]=

Time-Second/10+'O'Time-TimeString[7]=

Time-Second%10+'O';}else

(Time-TimeString[6]='

Time-TimeString[7]Time-DateString[8]=

'\0';}voidInitialDS1302(void)//{unsigned

charSecond=Read1302(DS1302_SEC0ND);if(Second0x80)

//{Writel302(0x8e,0x00);//Writel302(0x8c,0x07);

//23:59:55Writel302(0x88,0x07);Writel302(0x86,0x25);

Writel302(0x8a,0x07);Writel302(0x84,0x23);

Writel302(0x82,0x59);Writel302(0x80,0x55);

Writel302(0x8e,0x80);//:07/07/25.:3.:}}

/***********dsl8tt20/***********dsl8b20void

delay_18B20(unsignedinti){while(i一);}

/**********dsl8b20voidInit_DS18B20(void){unsigned

charx=0;DQ=1;//DQdelay_18B20(8);//DQ=

0;//delay_18B20(80);//DQ=1;//

delay_18B20(14);x=DQ;//delay_18B20(20);}

/***********dsl8b20unsignedcharReadOneChar(void){uchar

i=0;uchardat=0;for(i=8;iO;i-){DQ=0;//

dat=l;DQ=1;//if(DQ)dat|=0x80;

delay_18B20(4);}*************************/12MHz

*******/**********************/DQ480USX=0

X=1**************/return(dat);}

/*************dsl8b20voidWriteOneChar(uchardat)

{unsignedchari=0;for(i=8;iO;i-){DQ=0;

DQ二datOxOl;delay_18B20(5);DQ=1;dat=l;}}

/**************voidReadTemp(void){unsignedchara=0;

unsignedcharb=0;unsignedchart=0;Init_DS18B20();

WriteOneChar(OxCC);//WriteOneChar(0x44);//

delay_18B20(100);//thismessageisweryimportant

Init_DS18B20();WriteOneChar(OxCC);//WriteOneChar(OxBE);

//delay_18B20(100);a=Read()neChar();//

b=ReadOneChar();//temp_value=b4;

tempvalue+=(aOxfO)4;}****************/

ds18b20************/9voidtemp_to_str()

//{TempBuffer[0]=temp_value/10+?O';//

TempBuffer[1]=temp_value%l0+?O';//TempBuffer[2]=0xdf;

//TempBuffer[3]=<C,;TempBuffer[4]='\0';}void

Delaylms(unsignedintcount){unsignedinti,j;

for(i=0;icount;i++)for(j=0;jl20;j++);}/**/void

mdelay(uintdelay){uinti;for(;delayO;delay—)

{for(i=0;i62;i++)//1ms{;}}}voidoutkey()

//{ucharSecond;if(out==0||wireless_l==l)

{mdelay(8);count=0;

hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hi

de_month=0,hide_year=0;Second=Readl302(DS1302SEC0ND);

Writel302(0x8e,0x00);//Writel302(0x80,Second0x7f);

Writel302(0x8E,0x80);//done=0;

while(out=0);while(wireless_1=1);}}

////////////////////////////I///////1///////////////////!//

/////////////////////////////////////////////////void

Upkey()//{Up=l;.,if(Up==0||wireless_2==l)

{mdelay(8);switch(count)

{case1:

temp二Read1302(DS1302_SEC0ND);//temp=temp+1;

//up_flag=l;//

if((temp0x7f)0x59)//

temp=O;break;case2:

temp=Read1302(DS1302_MINUTE);//temp=temp+l;

//up_flag=l;

if(temp0x59)//temp=0;break;

case3:

temp=Read1302(DS1302HOUR);//temp=temp+l;//

up_flag=l;if(temp0x23)//temp=0;

break;case4:

temp=Read1302(DS1302_WEEK);//temp=temp+l;//

up_flag=l;if(temp0x7)temp=l;

break;case5:

temp二Read1302(DS1302_DAY);//temp=temp+l;//

upflag=l;if(temp0x31)temp=1;

break;159,159,123,11case6:

temp=Read1302(DS1302_M0NTH);//temp=temp+1;//

up_flag=l;if(tempOx12)temp=l;

break;case7:

temp=Read1302(DS1302_YEAR);//temp=temp+l;//

up_flag=l;if(temp0x85)temp=0;

break;default:break;}

while(Up==O);

while(wireless_2=1);}}

///////////////////////////////////////////////////////////

/////////////////////////////////////////////////void

Downkey()//{Down=1;if(Down==0|wireless_3==l)

{mdelay(8);switch(count)

{case1:

temp=Read1302(DS1302SECOND);//temp=temp-l;

//Idown_flag=l;//

if(temp==0x7f)//temp=0x59;break;

case2:

temp=Readl302(DS1302_MINUTE);//I10,59

temp=temp-l;//

down_f1ag=1;if(temp==-1)temp=0x59;

//break;case3:

temp=Read1302(DS1302HOUR);//temp=temp-l;//

down_flag=l;if(temp==-l)temp=0x23;

break;case4:

temp=Read1302(DS1302_WEEK);//temp=temp-l;//

down_flag=l;if(temp-0)tomp=0x7;;

break;case5:

temp二Read1302(DS1302_DAY);//temp=temp-l;//

down_flag=l;if(temp==0)temp=31;

break;case6:

temp=Readl302(DS1302_M0NTH);//temp二temp-1;//

down_flag=l;if(temp==O)temp=12;

break;case7:

temp=Readl302(DS1302YEAR);//temp=temp-l;//

downflag=l;if(temp==-l)10,5911111

temp=0x85;break;

default:break;}while(Down==0);

while(wireless_3==l);}}voidSetkey()//{Set=l;

if(Set-0|wireless_4==l){mdelay(8);

count=count+l;//Setkeydone=l;//

while(Set==0);while(wireless_4==l);}}

voidkeydone()//{ucharSecond;if(flag==0)//

{Writel302(0x8e,0x00);//temp=Readl302(0x80);

Write1302(0x80,tempi0x80);Writel302(0x8e,0x80);//

flag=l;}Setkey();//

switch(count){case1:do//count=l,

{outkey0;//Upkey();

//Downkoy();//

if(up_f1ag==1|down_f1ag==1)//

{Writel302(0x8e,0x00);//,countl,

Writel302(0x80,temp0x80);//Writel302(0x8e,0x80)://

up_flag=0;down_flag=0;}hide_sec++;

//if(hide_sec3)hide_sec=0;

show_time();//}while(count==2);break;

case2:do//count=2,

{hide_sec=0;outkey();Upkey();

Downkey();if(temp0x60)temp=0;

if(upflag==l||downflag==l)

(Writel302(0x8e,0x00);//

Writel302(0x82,temp);//Writel302(0x8e,0x80);//

up_f1ag=0;down_f1ag=0;}hide_min++;

if(hide_min3)hide_min=0;

show_time();}while(count==3);break;case3:do

//count=3,hide_min=0;

outkey();L'pkey();Downkey();

if(up_flag==l||down_flag==l)

(Writel302(0x8e,0x00);//

Writel302(0x84,temp);//Writel302(0x8e,0x80);//

up_flag=0;down_flag=0;}

hide_hour++;if(hide_hour3)hide_hour=0;

showtime();}while(count==4);break;case4:do

//count=4,(hidehour=0;

outkey();L'pkey();Downkey();

if(up_flag==l||down_flag==l)

Writel302(0x8e,0x00);//

Writel302(0x8a,temp);//Writel302(0x8e,0x80);//

up_flag=O;down_flag=0;}hide_week++;

if(hide_week3)hide_week=0;

showtime();}while(count==5);break;case5:do

//count=5,(hideweek=0;

outkey();Upkey();Downkey();

if(up_flag==l|down_flag-l)

(Writel302(0x8e,0x00);//

Writel302(0x86,temp);//Writel302(0x8e,0x80);//

up_f1ag=0;down_f1ag=0;}hide_day++;

if(hide_day3)hide_day=0;

showtime();}while(count==6);br

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论