电子设计大赛培训第二阶段第**组报告《基于利用时钟芯片DS1302实现万年历,1602LCD显示电子表》成员姓名:***学号:******成员姓名:HG**学号:******成员姓名:***学号:*******一、主要功能1、在1602液晶上显示年、月、日、星期、时、分、秒以及实时温度,并且实时更新显示;2、通过按键随时调节各显示参数,分别实现光标定位、数值增大、数值减小、闹钟和温度上下限查看的功能;3.在时间出现乱码的情况下,具有一键初始化时间的功能。二、电路图三、实物图1.开关模块2、显示模块3、at89c52模块4、总体连接图四、心得体会本次设计是我们遇到过的较大的设计,所以遇到的问题也比较的多,尤其是以前没有接触过如此复杂的硬件电路以及软件编程,在软、硬件设计和调试中遇到了不少的困难,在同学的帮助才逐一克服了难题,学习到了不少的专业知识。在整个设计过程之前,我已经在网上找了相关方面的资料,万事开始难,一开始不知道从哪里下手。后来慢慢学会分析系统,将系统模块化,各个模块可以在软件或者硬件上实现。在确保各个模块的硬件电路和与之相搭配的程序能够正常工作后在把它们组成一个系统。在今后的日子里,我会进一步加强自己的动手能力,丰富自己的知识面。总之,这次设计给我的最大感触就是,在以后的学习中勤动脑,多动手。附录:1、元件清单AT89C52一块LCD一个排阻3个DS1302一个DS18B20一个开关5个晶振2个瓷片电容2个,30PF电解电容一个,33Uf插针若干杜邦线若干2、程序#includeREG51.H#includeintrins.h//#includeLCD1602.h//#includeDS1302.h#defineuintunsignedint#defineucharunsignedcharsbitDS1302_CLK=P1^7;//实时时钟时钟线引脚sbitDS1302_IO=P1^6;//实时时钟数据线引脚sbitDS1302_RST=P1^5;//实时时钟复位线引脚sbitwireless_1=P3^0;sbitwireless_2=P3^1;sbitwireless_3=P3^2;sbitwireless_4=P3^3;sbitACC0=ACC^0;sbitACC7=ACC^7;charhide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;//秒,分,时到日,月,年位闪的计数sbitSet=P2^0;//模式切换键sbitUp=P2^1;//加法按钮sbitDown=P2^2;//减法按钮sbitout=P2^3;//立刻跳出调整模式按钮sbitDQ=P1^0;//温度传送数据IO口chardone,count,temp,flag,up_flag,down_flag;uchartemp_value;//温度值ucharTempBuffer[5],week_value[2];voidshow_time();//液晶显示程序/***********1602液晶显示部分子程序****************///PortDefinitions**********************************************************sbitLcdRs=P2^5;sbitLcdRw=P2^6;sbitLcdEn=P2^7;sfrDBPort=0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口//内部等待函数**************************************************************************unsignedcharLCD_Wait(void){LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();LcdEn=0;returnDBPort;}//向LCD写入命令或数据************************************************************#defineLCD_COMMAND0//Command#defineLCD_DATA1//Data#defineLCD_CLEAR_SCREEN0x01//清屏#defineLCD_HOMING0x02//光标返回原点voidLCD_Write(bitstyle,unsignedcharinput){LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();//注意顺序LcdEn=1;_nop_();//注意顺序LcdEn=0;_nop_();LCD_Wait();}//设置显示模式************************************************************#defineLCD_SHOW0x04//显示开#defineLCD_HIDE0x00//显示关#defineLCD_CURSOR0x02//显示光标#defineLCD_NO_CURSOR0x00//无光标#defineLCD_FLASH0x01//光标闪动#defineLCD_NO_FLASH0x00//光标不闪动voidLCD_SetDisplay(unsignedcharDisplayMode){LCD_Write(LCD_COMMAND,0x08|DisplayMode);}//设置输入模式************************************************************#defineLCD_AC_UP0x02#defineLCD_AC_DOWN0x00//default#defineLCD_MOVE0x01//画面可平移#defineLCD_NO_MOVE0x00//defaultvoidLCD_SetInput(unsignedcharInputMode){LCD_Write(LCD_COMMAND,0x04|InputMode);}//初始化LCD************************************************************voidLCD_Initial(){LcdEn=0;LCD_Write(LCD_COMMAND,0x38);//8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//开启显示,无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC递增,画面不动}//液晶字符输入的位置************************voidGotoXY(unsignedcharx,unsignedchary){if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}//将字符输出到液晶显示voidPrint(unsignedchar*str){while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}/***********DS1302时钟部分子程序******************/typedefstruct__SYSTEMTIME__{unsignedcharSecond;unsignedcharMinute;unsignedcharHour;unsignedcharWeek;unsignedcharDay;unsignedcharMonth;unsignedcharYear;unsignedcharDateString[11];unsignedcharTimeString[9];}SYSTEMTIME;//定义的时间类型SYSTEMTIMECurrentTime;#defineAM(X)X#definePM(X)(X+12)//转成24小时制#defineDS1302_SECOND0x80//时钟芯片的寄存器位置,存放时间#defineDS1302_MINUTE0x82#defineDS1302_HOUR0x84#defineDS1302_WEEK0x8A#defineDS1302_DAY0x86#defineDS1302_MONTH0x88#defineDS1302_YEAR0x8CvoidDS1302InputByte(unsignedchard)//实时时钟写入一字节(内部函数){unsignedchari;ACC=d;for(i=8;i0;i--){DS1302_IO=ACC0;//相当于汇编中的RRCDS1302_CLK=1;DS1302_CLK=0;ACC=ACC1;}}unsignedcharDS1302OutputByte(void)//实时时钟读取一字节(内部函数){unsignedchari;for(i=8;i0;i--){ACC=ACC1;//相当于汇编中的RRCACC7=DS1302_IO;DS1302_CLK=1;DS1302_CLK=0;}return(ACC);}voidWrite1302(unsignedcharucAddr,unsignedcharucDa)//ucAddr:DS1302地址,ucData:要写的数据{DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302InputByte(ucAddr);//地址,命令DS1302InputByte(ucDa);//写1Byte数据DS1302_CLK=1;DS1302_RST=0;}unsignedcharRead1302(unsignedcharucAddr)//读取DS1302某地址的数据{unsignedcharucData;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302InputByte(ucAddr|0x01);//地址,命令ucData=DS1302OutputByte();//读1Byte数据DS1302_CLK=1;DS1302_RST=0;return(ucData);}voidDS1302_GetTime(SYSTEMTIME*Time)//获取时钟芯片的时钟数据到自定义的结构型数组{unsignedcharReadValue;ReadValue=Read1302(DS1302_SECOND);Time-Second=((ReadValue&0x70)4)*10+(ReadValue&0x0F);ReadValue=Read1302(DS1302_MINUTE);Time-Minute=((ReadValue&0x70)4)*10+(ReadValue&0x0F);ReadValue=Read1302(DS1302_HOUR);Time-Hour=((ReadValue&0x70)4)*10+(ReadValue&0x0F);ReadValue=Read1302(DS1302_DAY);Time-Day=((ReadValue&0x70)4)*10+(ReadValue&0x0F);ReadValue=Read1302(DS1302_WEEK);Time-Week=((ReadValue&0x70)4)*10+(ReadValue&0x0F);ReadValue=Read1302(DS1302_MONTH);Time-Month=((ReadValue&0x70)4)*10+(ReadValue&0x0F);Rea