{推荐}基于利用时钟芯片DS实现万年历,LCD显示电子表
基于51单片机的液晶显示万年历设计
基于51单片机的液晶显示万年历设计摘要随着社会的进步和发展,电子万年历作为日常计时工具被广泛地应用。
此电子万年历在硬件方面主要采用STC89C51单片机作为主控核心,由DS1302时钟芯片提供时钟及1602LCD液晶显示屏显示。
STC89C51单片机是由宏晶公司公司生产的,功耗小,电压可选用3.4v~5.5v电压供电;DS1302时钟芯片是美国DALLAS公司推出的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,而且DS1302的使用寿命长,误差小;对于数字电子万年历采用直观的数字显示,数字显示是采用的1602LCD液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒、温度等信息。
此外,该电子万年历在软件方面主要包括日历程序、时间调整程序,显示程序等。
所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,烧写到单片机上进行测试。
本次课程设计主要由时钟芯片DS1302和温度传感器DS18B20采集数据到单片机进行处理再通过LCD1602显示出来,本设计主要研究了液晶显示器LCD及时钟芯片DS1302,温度传感器DS18B20与单片机之间的硬件互联及通信,对数种硬件连接方案进行了详尽的比较。
关键词:单片机;DS1302;DS18B20;LCD1602ABSTRACTWith the social progress and development, Electronic calendar is widely used as a daily timing tool. The electronic calendar in hardware using STC89C51 microcontroller as the main control center, provided by the DS1302 clock chip and 1602LCD LCD display. STC89C51 microcontroller is produced by the macro crystal company, small power consumption, the voltage can be choosen among 3.4V ~ 5.5V for power supply; DS1302 clock chip is a low power real-time clock chip produced by DALLAS, it can be a time of years,months,days,weeks,hours,minutes,seconds, and DS1302 has a long service life. The error is small; for the digital electronic calendar using visual digital display, 1602LCD digital display is used to display LCD screen that can display years, months, days, weeks, hours, minutes and seconds, temperature and other information. In addition, the electronic calendar mainly includes calendar program,time to adjust procedures,display program etc in sofeware. After the completion of all the procedures, in the Keil software debugging, determine no problem after, and burning to the microcontroller test.The curriculum design mainly by the clock chip DS1302 and temperature sensor DS18B20 collecting data to the microcontroller for processing and then through the LCD1602 display, this design mainly studies the liquid crystal display LCD and the clock chip DS1302, the hardware connection and communication between the temperature sensor DS18B20 and the MCU, a number of hardware connection scheme for a detailed comparison.Key words:SCM,DS1302,DS18B20,LCD1602目录第一章绪论 ------------------------------------------------------------------------------------------------------------ - 1 -1.1 单片机的概述------------------------------------------------------------------------------------------------- - 1 -1.1.1 单片机的概念 --------------------------------------------------------------------------------------- - 1 -1.1.2 单片机的特点 --------------------------------------------------------------------------------------- - 1 -1.2 课题背景 ------------------------------------------------------------------------------------------------------- - 1 -1.3 课题内容 ------------------------------------------------------------------------------------------------------- - 2 - 第二章设计要求和方案 --------------------------------------------------------------------------------------------- - 3 -2.1 设计要求 ------------------------------------------------------------------------------------------------------- - 3 -2.2 设计方案 ------------------------------------------------------------------------------------------------------- - 3 -2.2.1 单片机芯片的选择--------------------------------------------------------------------------------- - 3 -2.2.2 各模块方案选择 ------------------------------------------------------------------------------------ - 3 -2.3 工作原理 ------------------------------------------------------------------------------------------------------- - 4 - 第三章系统的硬件设计及实现------------------------------------------------------------------------------------ - 7 -3.1 电路设计原理框图 ------------------------------------------------------------------------------------------ - 7 -3.2 STC89C51单片机的介绍 ----------------------------------------------------------------------------------- - 7 -3.2.1 主要功能及性能参数 ----------------------------------------------------------------------------- - 7 -3.2.2单片机的引脚功能说明 --------------------------------------------------------------------------- - 8 -3.3 各模块电路的设计及原理图 ----------------------------------------------------------------------------- - 9 -3.3.1 时钟电路模块的设计 ----------------------------------------------------------------------------- - 9 -3.3.2 温度采集模块的设计及原理图 --------------------------------------------------------------- - 11 -3.3.3 显示模块的设计及原理 ------------------------------------------------------------------------- - 11 - 第四章系统的软件设计 -------------------------------------------------------------------------------------------- - 13 -4.1 程序流程框图------------------------------------------------------------------------------------------------ - 13 -4.2 时间调整程序流程图 -------------------------------------------------------------------------------------- - 14 - 第五章系统测试 ------------------------------------------------------------------------------------------------------ - 15 -5.1 硬件测试 ------------------------------------------------------------------------------------------------------ - 15 -5.2 软件测试 ------------------------------------------------------------------------------------------------------ - 15 - 第六章总结与致谢 --------------------------------------------------------------------------------------------------- - 17 -6.1 总结------------------------------------------------------------------------------------------------------------- - 17 -6.2 致谢------------------------------------------------------------------------------------------------------------- - 18 - 参考文献 ------------------------------------------------------------------------------------------------------------------- - 19 - 附录 ------------------------------------------------------------------------------------------------------------------------ - 21 - 附录一:实物图 --------------------------------------------------------------------------------------------------- - 21 - 附录二:源程序 --------------------------------------------------------------------------------------------------- - 23 -第一章绪论1.1 单片机的概述1.1.1 单片机的概念单片机即单片微型计算机,是把中央处理器、存储器、定时/计数器、输入输出接口都集成在一块集成电路芯片上的微型计算机。
基于stc51单片机的LCD1602显示时间的电子万年历(显示
1 课设所需软件简介1.1 Keil uVision4的简要介绍2009年2月发布Keil μVision4,Keil μVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。
新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来开发应用程序。
新版本支持更多最新的ARM芯片,还添加了一些其他新功能。
2011年3月ARM公司发布最新集成开发环境RealView MDK开发工具中集成了最新版本的Keil uVision4,其编译器、调试工具实现与ARM器件的最完美匹配。
Keil C51开发系统基本知识Keil C51开发系统基本知识1. 系统概述Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
下面详细介绍Keil C51开发系统各部分功能和使用。
2. Keil C51单片机软件开发系统的整体结构C51工具包的整体结构,uVision与Ishell分别是C51 for Windows和for Dos 的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。
开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。
然后分别由C51及C51编译器编译生成目标文件(.OBJ)。
目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。
ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
使用独立的Keil仿真器时,注意事项:* 仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。
6、用DS1302与LCD1602可调数字万年历实验设计报告
利用时钟芯片DS1302实现万年历系别电子通信工程系组别第十组专业名称电子信息工程指导教师组内成员2013年8月19日用DS1302与LCD1602设计的可调式电子日历时钟一、总体设计1.1、设计目的为巩固所学的单片机知识,把所学理论运用到实践中,用LCD1602与DS1302 设计可调式电子日历时钟。
1.2、设计要求(1)显示:年、月、日、时、分、秒和星期;(2)设置年、月、日、时、分、秒和星期的初始状态;(3)能够用4个按键调整日历时钟的年、月、日、时、分、秒和星期;完成可调式电子日历时钟的硬件和软件的设计,包括单片机的相关内容;日历时钟模块的设计,液晶显示模块的设计,按键模块的设计。
控制程序的编写等。
备注:本程序另外添加了每到上午8:10和下午2:10的闹钟提醒功能。
1.3、系统基本方案选择和论证1.3.1、单片机芯片的选择方案方案一:采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容。
方案二:采用STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
但造价较高。
1.3.2 、显示模块选择方案和论证:方案一:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用显示数字显得太浪费,且价格也相对较高。
所以不用此种作为显示。
方案二:采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,显示出来的只是拼音,而不是汉字。
所以也不用此种作为显示。
方案三:采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量字符,且视觉效果较好,外形美观。
基于PCF8563时钟芯片的万年历制作
万年历是一种能够显示日期、星期和时间的工具,它不仅能够告诉我们当天是几号,还能显示星期几和当前时间。
在这个项目中,我们将使用PCF8563时钟芯片来制作一个基于PCF8563的万年历。
PCF8563是一种CMOS实时时钟和日历芯片,它可以提供年、月、日、星期和小时、分钟、秒的数据。
它具有电源管理功能,可以通过一个电源低于2V脉冲输入来切换系统电源供电方式。
为了制作这个基于PCF8563的万年历,我们需要以下材料和工具:1. Arduino主控板2.PCF8563时钟芯片3.16x2液晶显示屏4.面包板5.杜邦线6.10k电阻接下来,我们将按照以下步骤来制作基于PCF8563的万年历:第一步:连接电路首先,将Arduino主控板插入面包板。
接着,连接PCF8563时钟芯片到Arduino主控板上的I2C总线。
将SDA引脚连接到A4引脚,将SCL引脚连接到A5引脚。
此外,还需要使用10k电阻将VCC引脚连接到VCC引脚上。
接下来,将16x2液晶显示屏连接到面包板。
连接液晶屏的RS引脚到Arduino主控板的D12引脚,RW引脚到GND引脚,和E引脚到D11引脚。
将液晶屏的D4到D7引脚连接到Arduino主控板的D5到D2引脚。
第二步:编写代码打开Arduino IDE并创建一个新的项目。
然后,编写以下代码:#include <Wire.h>#include <LiquidCrystal_I2C.h>//定义PCF8563的地址#define PCF8563_ADDR 0x51//定义显示屏的尺寸#define LCD_COLUMNS 16#define LCD_ROWS 2LiquidCrystal_I2C lcd(0x27, LCD_COLUMNS, LCD_ROWS);void setup//初始化I2C总线Wire.begin(;//设置时钟芯片为24小时模式Wire.beginTransmission(PCF8563_ADDR);Wire.write(0x02);Wire.write(0x00);Wire.endTransmission(;//初始化液晶显示屏lcd.begin(LCD_COLUMNS, LCD_ROWS);lcd.setCursor(0, 0);lcd.print("Date: ");lcd.setCursor(0, 1);lcd.print("Time: ");void loop//读取PCF8563的日期和时间Wire.beginTransmission(PCF8563_ADDR); Wire.write(0x02);Wire.endTransmission(;Wire.requestFrom(PCF8563_ADDR, 7);int second = bcdToDec(Wire.read( & 0x7F); int minute = bcdToDec(Wire.read();int hour = bcdToDec(Wire.read( & 0x3F); int dayOfWeek = bcdToDec(Wire.read();int dayOfMonth = bcdToDec(Wire.read();int month = bcdToDec(Wire.read( & 0x1F); int year = bcdToDec(Wire.read();//显示日期和时间lcd.setCursor(6, 0); printWithLeadingZero(dayOfMonth);lcd.print("/");printWithLeadingZero(month);lcd.print("/");lcd.print(2000 + year);lcd.setCursor(6, 1); printWithLeadingZero(hour);lcd.print(":");printWithLeadingZero(minute);lcd.print(":");printWithLeadingZero(second);delay(1000);//将BCD码转换为十进制int bcdToDec(int bcd)return (bcd / 16 * 10) + (bcd % 16);//打印带有前导零的数字void printWithLeadingZero(int number)if (number < 10)lcd.print('0');}lcd.print(number);第三步:上传代码将Arduino主控板连接到电脑,并根据需要选择正确的端口和板类型。
(完整word版)万年历(DS1302+LCD1602【程序、仿真、完整】)
基于52单片机的万年历显示(采用实时芯片DS1302芯片+LCD1602液晶显示)仿真图:/************************************************************-- THE LCD1602 DISPLAY LIB -—COPYRIGHT (C) 2014 BY LLH-— ALL RIGHTS RESERVED —-ATTENTION:延时不能过长,否则无法与DS1302同步(最好小于1ms)*************************************************************/#ifndef __LCD1602_DIS_H__#define __LCD1602_DIS_H__#define uint unsigned int#define uchar unsigned charsbit lcd_rs=P2^0;sbit lcd_rw=P2^1;sbit lcd_en=P2^2;/**********延时子程序************/void delay(uint z){uint x,y;for(x=z;x〉0;x—-)for(y=65;y〉0;y--);//60刚好和DS1302同步}/***********写命令子程序**********/void write_com(uchar com){lcd_rs=0;lcd_rw=0;P0=com;delay(1);lcd_en=1;delay(1);lcd_en=0;}/***********写数据子程序**********/void write_data(uchar date){lcd_rs=1;lcd_rw=0;P0=date;delay(1);lcd_en=1;delay(1);lcd_en=0;}/**********初始化子程序************/void init_LCD1602(){lcd_en=0;write_com(0x38); //显示模式设置:16*2显示,5*7点阵,8位数据接口write_com(0x0c); //开显示,不显示光标write_com(0x06); //指针、光标自动加一,整屏不移动write_com(0x80); //初始位置设置}/*********显示子程序***********/void display(uchar *str){while(*str!='\0’){write_data(*str);str++;}}#endifDS1302的H文件:/******************************************************************—— THE DS1302 REAL_TIME LIB —-COPYRIGHT (C) 2014 BY LLH-- ALL RIGHTS RESERVED ——ATTENTION:不能使用(i=0;i<8;i++),否则,液晶无法显示确切的时间(???);星期的显示多了一天(???)********************************************************************/#ifndef __DS1302_REAL_TIME_H__#define __DS1302_REAL_TIME_H__#define uint unsigned int#define uchar unsigned charsbit DS1302_RST=P1^5;sbit DS1302_SCLK=P1^6;sbit DS1302_IO=P1^7;sbit ACC0=ACC^0;sbit ACC7=ACC^7;typedef struct{uchar second;uchar minute;uchar hour;uchar week;uchar day;uchar month;uchar year;uchar date_str[11];uchar time_str[9];}date_time;/**************写数据定义*****************/#define DS1302_SECOND 0x80#define DS1302_MINUTE 0x82#define DS1302_HOUR 0x84#define DS1302_WEEK 0x8A#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8C#define ST 0x00/*************单字节写数据子程序**************/void single_byte_write(uchar date){uchar i;ACC=date;for(i=8;i〉0;i--) //不能使用(i=0;i〈8;i++),否则,液晶只显示00000{DS1302_IO=ACC0;DS1302_SCLK=1;DS1302_SCLK=0;ACC=ACC>>1;}}/*************单字节读数据子程序**************/uchar single_byte_read( ){uchar i;for(i=8;i>0;i--){ACC=ACC>〉1;ACC7=DS1302_IO;DS1302_SCLK=1;DS1302_SCLK=0;}return ACC;}/**************控制字的写入****************/void write_command(uchar addr,uchar dat){DS1302_SCLK=0;DS1302_RST=0;DS1302_RST=1;single_byte_write(addr);single_byte_write(dat);DS1302_SCLK=1;DS1302_RST=0;}/**************读取芯片内部的数据****************/uchar read_data(uchar address){uchar r_data;DS1302_SCLK=0;DS1302_RST=0;DS1302_RST=1;single_byte_write(address|0x01);//若没加(或0x01)ds1302和lcd1602都无法正常显示(?)r_data=single_byte_read();DS1302_SCLK=1;DS1302_RST=0;return r_data;}/************初始化子程序************/void init_DS1302(){uchar temp;temp=read_data(DS1302_SECOND);if(temp&0x80){write_command(0x8e,0x00); //启动读写write_command(0x84,0x00);//设置24小时模式write_command(DS1302_SECOND,ST); //写入当前时间数据}}/*************读取时间、并实现BCD和十进制间的转化***************//****************************************************************十进制转8421编码:32/10 = 3*16= 48(十进制)= 30(16进制)32%10 = 230+2 = 32 * 16 + 32 % 10 = 32(8421编码)(即:a/10*10+a%10)8421编码转十进制:51 / 16 = 5 * 10(16进制) = 50(十进制)51 % 16 = 150 + 1 = 51 / 16 + 51 % 16 = 51(十进制)(即:a/16*10+a%16)*****************************************************************/void get_time(date_time *Time){uchar value;value=read_data(DS1302_SECOND);Time—〉second=(value/16)*10+(value%16);value=read_data(DS1302_MINUTE);Time—〉minute=(value/16)*10+(value%16);value=read_data(DS1302_HOUR);(完整word版)万年历(DS1302+LCD1602【程序、仿真、完整】) Time-〉hour=(value/16)*10+(value%16);value=read_data(DS1302_WEEK);Time—〉week=(value/16)*10+(value%16-1);//星期的显示数值比正确值多一value=read_data(DS1302_DAY);Time-〉day=(value/16)*10+(value%16);value=read_data(DS1302_MONTH);Time—>month=(value/16)*10+(value%16);value=read_data(DS1302_YEAR);Time-〉year=(value/16)*10+(value%16);}/**************年-月-日-星期“字符”显示***************/void date_to_str(date_time *Time){Time-〉date_str[0]=Time-〉year/10+’0’; //加’0’转化成字符Time—〉date_str[1]=Time—〉year%10+’0';Time->date_str[2]='—’;Time->date_str[3]=Time->month/10+'0';Time->date_str[4]=Time-〉month%10+'0’;Time—>date_str[5]=’—’;Time-〉date_str[6]=Time-〉day/10+'0';Time—>date_str[7]=Time—>day%10+’0’;Time-〉date_str[8]=’-’;Time->date_str[9]=Time—〉week%10+’0’;Time-〉date_str[10]='\0';}/**************时-分-秒“字符”显示***************/void time_to_str(date_time *Time){Time—>time_str[0]=Time->hour/10+’0';Time-〉time_str[1]=Time—〉hour%10+’0';Time—>time_str[2]=’-';Time—>time_str[3]=Time—>minute/10+'0’;Time—>time_str[4]=Time—>minute%10+'0’;Time->time_str[5]='—';Time->time_str[6]=Time->second/10+'0';Time->time_str[7]=Time—>second%10+'0';Time-〉time_str[8]=’\0';}#endif万年历C文件:/********************************************************* TITLE: 实时时钟FUNCTION: DS1302+LCD1602显示实时时钟WRITER: LINLIANHUO(完整word版)万年历(DS1302+LCD1602【程序、仿真、完整】) TIME: 2014-07-30REMARK: matters need attention**********************************************************/#include 〈reg51.h〉#include <string.h〉#include ”DS1302。
基于利用时钟芯片DS实现万年历LCD显示电子表
基于利用时钟芯片DS实现万年历LCD显示电子表电子设计大赛培训第二阶段第^组报告《基于利用时钟芯片DS1302实现万年历,1602LCD显示电子表》成员姓名:槿学号: ******成员姓名:HG**学号:******成员姓名:槿学号:一、主要功能1 v在1602液晶上显不年\月、日\星期' 时、分' 秒以及实时温度,并且实时更新显示;2、通过按键随时调节各显示参数,分别实现光标定位、数值增大、数值减小、闹钟和温度上下限查看的功能;3•在时间出现乱码的情况下,具有一键初始化时间的功能。
路图三、实物图1 •开关模块2、显ZE模块3、at89c52 模块4、总体连接图四、心得体会本次设计是我们遇到过的较大的设计,所以遇到的问题也比较的多,尤其是以前没有接触过如此复杂的硬件电路以及软件编程,在软' 硬件设计和调试中遇到了不少的困难,在同学的帮助才逐一克服了难题,学习到了不少的专业知识。
在整个设计过程之前,我已经在网上找了相关方面的资料,万事开始难,一开始不知道从哪里下手。
后来慢慢学会分析系统,将系统模块化,各个模块可以在软件或者硬件上实现。
在确保各个模块的硬件电路和与之相搭配的程序能够正常工作后在把它们组成一个系统。
在今后的日子里,我会进一步加强自己的动手能力,丰富自己的知识面。
总之,这次设计给我的最大感触就是,在以后的学习中勤动脑,多动手。
附录: 1、元件清单AT89C52 —块LCD —个排阻3个DS1302 —个DS18B20 一个开关5个晶振2个瓷片电容2个,30PF电解电容一个,33Uf插针若干杜邦线若干2、程序#include<REG51 .H> #include<intrins.h> //#include H LCD1602.h"//#include M DS1302.h n#defi neuint unsignedint #defi neuchar unsign edcharsbitDS1302_CLK=PM7; 〃sbitDS1302 J 0=PM6; 〃sbitDS1302_RST=PM5; 〃sbitwireless_ 仁P3A0; 实时时钟时钟线引脚sbitwireless_2=P3A1; 实时时钟数据线引sbitwireless_3=P3A2;sbitwireless_4=P3A3;sbitACC0=ACC9 sbitACC7=AC f,7;charhide_sec5hide_mi n,hide_hour,hide_day,hide_week,hide_month,hide_year;//秒,分,时到日月,年位闪的计数模式切换键加法按钮sbitSet=P2A0;//减法按钮立刻跳出调整模式按钮温度传送数据sbitUp=P2M; 〃10 口sbitDowchard on e,co un t,temp,flag,up_flag,down_flag;n=P2A2; 〃uchartemp_value;// 温度值sbitout=P2A3;//ucharT empBuffer[5],week_value[2];voidshow_time();// 液晶显ZF程序//PortDefinitions*/** 1602 液晶显示部分子程序****************/sbitLcdRs=P2A5;sbitLcdRw=P2A6;sbitLcdEn=P2A7;数据端口sfrDBPort=0x80;//P0=0x805P1=0x90,P2=0xA0,P3=0xB0.〃内部等待函*********************************************************************** unsignedcharLCD_Wait(void){ _LcdRs=0;LcdRw=1 ;_nop_();LcdEn=1 ;_nop_();LcdEn=O;returnDBPort;}〃向LCD写入命令或数★it**********************************************************#defineLCD_COMMANDO//Command#defineLCD_DATA1//Data#defineLCD_CLEAR_SCREEN0x01// 清屏#defineLCD_HOMING0x02// 光标返回原点voidLCD_Write(bitstyle,u nsign edchari nput){LcdE n=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();// 注意顺序LcdEn=1 ;_nop_();// 注意顺序LcdEn=0;_ nop_();LCD_Wait();}〃设置显示#defineLCD_SHOW0x04// 显示开#defineLCD_HIDEOxOO// 显示关#defineLCD_CURSOR0x02// 显示光标#defineLCD_NO_CURSOROxOO// 无光标#defineLCD_FLASHOxO1// 光标闪动#defineLCD_NO_FLASHOxOO// 光标不闪动voidLCD_SetDisplay(unsignedcharDisplayMode)(LCD_Write(LCD_COMMAND,0x08|DisplayMode);}〃设置输入************************************************************#defineLCD_AC_UP0x02#defineLCD_AC_DOWNOxOO//default#defineLCD_MOVE0x01// 画面可平移#defineLCD_NO_MOVEOxOO//default voidLCD_Setl nput(un signedcharl nputMode) 模式 模式LCD_Write(LCD_COMMAND,0x04|lnputMode);//D ************************************************************LcdEn=0;LCD_Write(LCD_COMMAND,Ox38);//8 位数据端口LCD_Write(LCD_COMMAND5Ox38);,2行显示月7点LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);// 阵LCD_Write(LCD_COMMAND 丄CD_CLEAR_SCREEN);〃LCD_Setlnput(LCD_AC_UP|LCD_NO_MOVE);//AC开启显示,无光voidPri nt(un signedchar*str) 标清屏〃液晶字符输入的位晝一voidGotoX Y(un signedcharx,u nsignedchary){if(y==O)LCD_Write(LCD_COMMAND50x80|x);if(y==i)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}〃将字符输出到液晶显示while(*str!=,\O,)LCD_Write(LCD_DATA,*str);str++;}}/***********DS1302 时钟咅E分子稈库typedefstruct_SYSTEMTIME_{unsignedcharSecond; unsignedcharMinute; unsignedcharHour; unsignedcharWeek; unsignedcharDay; unsignedcharMonth; unsignedcharYear; unsignedcharDateString[11]; unsignedcharTimeString[9];}SYSTEMTIME;//定义的时间类型SY STEMTIMECurrentTime;#defineAM(X)X #definePM(X)(X+12)// 转成24 小时制#defineDS1302_SECOND0x80//时钟芯片的寄存器位置,存放时间#defineDS1302_MINUTE0x82#defineDS1302_HOUR0x84#defineDS1302_WEEK0x8A#defineDS1302_DAY0x86#defineDS1302_MONTH0x88#defineDS1302_YEAR0x8CvoidDS1302lnputByte(unsignedchard)// 实时时钟写入一字节(内部函数){un signedchari;ACC=d;for(i=8;i>0;i-){DS1302_IO=ACC0;//相当于汇编中的RRCDS1302_CLK=1;DS1302_CLK=0;ACC=ACC»1;}}unsignedcharDS1302OutputByte(void)// 实时时钟读取一字节(内部函数) un signedchari;for(i=8;i>0;i-)ACC=ACC»1;//相当于汇编中的RRCACC7=DS1302JO;DS1302_CLK=1;DS1302_CLK=0;)return(ACC);>voidWrite1302(u nsign edcharucAddr,u nsignedcharucDa)〃ucAddr:DS 1302地址.ucData:要写的数据{DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302lnputByte(ucAddr);// 地址,命令DS1302lnputByte(ucDa);// 写1Byte 数据DS1302_CLK=1;DS1302_RST=0;unsignedcharReadl 302(u nsignedcharucAddr)//读取DS1302某地址的数据{un signedcharucData;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302lnputByte(ucAddr|0x01);// 地址,命令ucData=DS1302OutputByte();// 读 1 Byte 数据DS1302_CLK=1;DS1302_RST=0;return(ucData);}voidDS1302_GetTime(SYSTEMTIME*Time)//获取时钟芯片的时钟数据到自定义的结构型数组{un signedcharReadValue;ReadValue=Read1302(DS1302_SECOND);Time->Second=((ReadValue&0x70)»4)*10+(ReadValue&OxOF);ReadValue=Read1302(DS1302_MINUTE);Time->Hour=((ReadValue&0x70)»4)*10+(ReadValue&0x0F); ReadValue=Read1302(DS1302_DA Y);Time->Week=((ReadValue&0x70)»4)*10+(ReadValue&0x0F);ReadValue=Read1302(DS1302_MONTH);Time->Month=((ReadValue&0x70)»4)*10+(ReadValue&0x0F);ReadValue=Read1302(DS1302_YEA 旳;Time-> Year=((ReadValue&0x70)>>4 门O+(ReadValue&OxOF);}voidDateToStr(SYSTEMTIME*Time)//将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]{if(hide_year<2)//这里的if.else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为2007/07/22{Time->DateString[0]=,2';Time->DateString[1 ]=f0';Time->DateString[2]=Time-> Year/10+'0‘;Time->DateString[3]=Time-> Year%10+0;}elseTime->DateString[O]=n;Time->DateString[2]=n;}Time->DateString[4]=7,;if(hide_ mon th<2){Time->DateString[5]=Time->Month/10+,0'; Time->DateString[6]=Time->Month%10+'0'; }else{Time->DateString[5]=n;Time->DateString [6]=H;}Time->DateString[7]=7,;if(hide_day<2)Time->DateString[8]=Time->Day/10+,0'; Time->DateString[9]=Time->Day%10+,0,; else{Time->DateString [8]=H;Time->DateString[9]=n;> if(hide_week<2)week_value[0]=Time->Week%10+,0,;// 星期的数据另夕卜放到week_value[]数组里,跟年月,日的分开存放,因为等一下要在最后显示}else{week_value[O]=";}week_value[1]='\0*;Time->DateString[10]=,\0,;//字符串末尾加9,判断结束字符}voidTimeToStr(SYSTEMTIME*Time)//将时,分,秒数据转换成液晶显示字符放到数组TimeString[];{if(hide_hour<2){Time・>TimeString[0]=Time・>Hour710+'0‘;Time->TimeString[1]=Time->Hour%10+0;}else{Time->TimeString[O]=H;Time->TimeString[1 ]=H;}Time->TimeString[2]=,:';Time->TimeString[3]=Time->Minute/10+,0';Time->TimeString[4]=Time->Minute%10+,0,;}else{Time->TimeString[3]=H;Time->TimeString[4]=H;}Time->TimeString[5]=,:';if(hide_sec<2)Time・>TimeString[6]=Time・>Second/10+'0:Time->TimeString[7]=Time->Second%10+,0,;}elseTime->TimeString[6]=H;Time->TimeString[7]=H;}Time->DateString [8]=,\0,;> voidlnitial_DS1302(void)// 时钟芯片初始化{unsignedcharSecond=Read1302(DS1302_SECOND); if(Second&0x80)//判断时钟芯片是否关闭Write1302(0x8e,0x00);// 写入允许Write1302(0x8c,0x07);//以下写入初始化时间日期:07/07/25.星期:3•时I、可:23:59:55Writel 302(0x88,0x07);Writel 302(0x86,0x25);Writel 302(0x8a,0x07);Writel 302(0x84,0x23);Writel 302(0x82,0x59);Writel 302(0x80,0x55);Writel302(0x8e,0x80);// 禁止写入>}/***********ds18b20了不早*************************//***********ds18b20 延迟子函数(晶振12MHz)*******/voiddelay_18B20(unsignedinti){while(i-);}y**********^jg-| g[^20 ^71 力台d" 孝(7 **********************/ voidlnit_DS18B20(void) unsig nedcharx=O;DQ=1;//DQ 复位delay_18B20(8);// 稍做延时DQ=O;//单片机将DQ拉低delay_18B20(80);// 精确延时大于480usDQ=1;//拉高总线delay_18B20(14);x=DQ;〃稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);**********读一个字节ds[ 8b20**★*★*★*★*★*** IunsignedcharReadOneChar(void) uchari=0;uchardat=O;for(i=8;i>0;i-) DQ=0;//给脉冲信号dat»=1;DQ=1;//给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4);return (dat);voidWriteOneChar(uchardat) unsign edchari=0;for(i=8;i>0;i-)*********** *ds 〔 8b20 写一个字节 ***************DQ=O;DQ=dat&OxO1; delay_18B20(5);DQ=1;dat»=1;}/** 读取ds18b20 当前温度************/voidReadTemp(void) unsig nedchara=O;unsig nedcharb=O;unsign edchart=0;lnit_DS18B20();WriteOneChar(OxCC);//跳过读序号列号的操作WriteOneChar(Ox44);// 启动温度转换delay_18B20(100);//thismessageisweryimportantlnit_DS18B20();WriteOneChar(OxCC);//跳过读序号列号的操作WriteOneChar(OxBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(100);a=ReadOneChar();//读取温度值低位b=ReadOneChar();//读取温度值高位temp_value=b«4;temp_value+=(a&0xf0)>>4;}voidtemp_to_str()//温度数据转换成液晶字符显示{ TempBuffer[0]=temp_value/10+'O*;// 十位TempBuffer[1 ]=temp_value%10+'0*;// 个位TempBuffer[2]=0xdf;// 温度符号TempBuffer[3]=C*;TempBuffer[4]=,\0,;}voidDelayl ms(un signedi ntcount){unsig nedin tij;for(i=0;i<co un t;i++)for(j=0;j<120;j++);}/* 延时子程序7 voidmdelay(uintdelay) {uinti;for(;delay>0;delay-){for(i=0;i<62;i++)//1 ms 延时,{:}}}voidoutkey()//跳出调整模式,返回默认显示{ucharSecond;if(out==0||wireless_1 ==1){mdelay(8);count=0;hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=05hide_ mon th=O,hide_year=O;Second=Read1302(DS1302_SECOND);Writel 302(0x8e,0x00);// 写入允许Writel 302(0x80,Second&0x7f);Writel302(0x8E,0x80);// 禁止写入done=0;while(out==0);while(wireless_1 ==1);}lllllllllllllllllllllllllllllllllll/////////////////////////////////////////////////////////////////////////voidllpkey()// 升序按键{Up=1;if(Up==O| |wireless_2==1)< mdelay(8);switch (count){easel:temp=Read1302(DS1302_SECOND);// 读取秒数temp=temp+1;// 秒数力口 1 up_flag=1;//数据调整后更新标志if((temp&0x7f)>0x59)//超过59秒,清零temp=0;break;case2:temp=Read1302(DS1302_MINUTE);// 读取分数temp=temp+1;// 分数力口 1 up_flag=1;if(temp>0x59)// 超过59 分,清零temp=0;break;case3:temp=Read1302(DS1302_HOUR);// 读取小时数temp=temp+1;// 小时数加 1up_flag=1;if(temp>0x23)// 超过23小时,清temp=O;break;case4:temp=Read1302(DS1302_WEEK);// 读取星期数temp=temp+1;// 星期数加 1 up_flag=1;if(temp>0x7)temp=1;break;case5:temp=Read1302(DS1302_DAY);// 读取日temp=temp+1;// H 数加 1 数up_flag=1; if(temp>0x31) temp=1;break;se 。
简析基于DS1302和LCD1602的万年历系统设计论文
简析基于DS1302和LCD1602的万年历系统设计论文简析基于DS1302和LCD1602的万年历系统设计论文0引言在日常生活中,无论哪一行业,哪一领域,时间授时都是不可或缺的。
从古老的钟表到现代的电子设备都提供时间授时的功能。
因此,对于单片机学习者来说,设计并实现一款低成本的,有操作性的,提供年,月,日,小时,分,秒,星期等基本计时功能的万年历系统,显得特别实用,特别有意义。
1总体设计及原理图万年历的基本功能一是要提供年月日等基本时间项的授时;二是可以修改时间项。
基于以上两个功能,我们万年历总体设计方案。
万年历有时钟计时模块,显示模块,调整时钟模块和控制器4部分组成。
接下来的任务就是对以上模块进行选型。
低成本,可操作是选型的标准。
对于控制器,选择最常用的C51系列单片机STC89C52。
STC89C52是由宏品科技生产的是一种低功耗8位基于经典C51内核的微处理器,具有8 KhyteFLASH存储器,512 byte RAM , 4 KByte EEPROM , 32位通用IO接口,可以直接用串口下载程序。
时钟模块选择由dallas公司生产的时钟芯片DS1302,DS1302是一款支持年月日,小时分秒,星期,闰年补偿的实时时钟芯片;其简单三线结构可以很方便地与单片机通用IO相连,进行串行总线读写传输。
显示模块选择16x2的字符点阵模块LCD 16020LC D 1602的控制器以Hitachi公司生产的HD44780芯片最为常见。
LC D 1602引脚主要包括3类,第1类是电源。
第2类是8位数据I/0通道,用于读写LC D 1602。
第3类是3根控制线,RS,R/W和E,其中,RS和R/W是用于实现LCD不同操作的。
E是作为读写的启动信号,有点类似一个时钟信号,数据要写人LC D 1602或从LCD 1602读出数据均需要首先置E信号为高至少1 s,然后置低。
调整时钟模块设计了4个轻触开关,用于设定和修改时间项。
基于时钟日历芯片DS1302的万年历设计
基于时钟日历芯片DS1302的万年历设计黄豪民摘要随着科学技术的发展,万年历的设计也层出不穷。
本设计以单片机AT89C51和DS1302为核心,结合译码器74HC154和驱动芯片74LS244,以及模拟键盘,LED 显示电路等构成一个可控及显示精确的万年历时间系统。
DS1302为一个实时时钟芯片,具有较高时间精度,它与单片机进行串口通信,单片机通过与它的通信,取出其时间寄存器中的值,再通过相应的电路,把时间值通过LED显示,如果显示的值与标准时间不同,此系统就经过模拟键盘灵活控制,调节DS1302中时间寄存器中的值,达到与标准时间同步。
关键词AT89C51,DS1302ABSTRACTAlong with science and technology's development, the designs of the perpetual calendar have many meanings. This design uses the microprocessor AT89C51 and the chip DS1302, with the decoder chip 74HC154, the drive chip 74LS244, the simulative keyboard, the LED display and so on to constitute the perpetual calendar system which can control and display precisely.DS1302 is a real-time clock chip and has the high time precision, it communicates with the microprocessor via the serial interface. The microprocessor takes out DS1302’s time register value by the communication, at last the LED displays the time value by the corresponding circuit. If the time value is different from the standard time, the simula tion keyboard can adjust conveniently DS1302’s time register value, achieving with the standard time synchronously.Keywords AT89C51,DS1302目录摘要 (I)ABSTRACT (II)1 绪论 (1)2 功能要求 (3)3 方案论证 (3)3.1 显示器的选择 (3)3.1.1 VFD显示器 (3)3.1.2 LED显示器 (3)3.1.3 LCD液晶显示器 (4)3.2 编程语言的选择 (4)3.2.1 单片机汇编语言 (4)3.2.2 单片机C语言 (4)3.3 微处理器的选择 (5)4 硬件电路 (6)4.1 DS1302时钟芯片 (7)4.1.1 DS1302简介 (7)4.1.2 DS1302的控制字节 (8)4.1.3 数据的输出 (9)4.1.5 DS1302的寄存器 (9)4.1.6 DS1302的读写方式 (11)4.1.7 DS1302时序图 (12)4.1.8 DS1302电路 (13)4.2 单片机AT89C51 (14)4.2.1 单片机AT89C51简介 (14)4.2.2 单片机引脚简介 (15)4.2.3 低功耗模式 (18)4.3 模拟键盘的设计 (19)4.4 LED显示器的设计 (20)4.5 74LS244芯片 (21)5 软件设计 (25)5.1 系统软件设计原理 (25)5.2 键盘扫描子程序 (25)5.3 显示子程序 (26)5.4 DS1302控制子程序 (27)5.5 主函数 (27)6 软件平台 (28)6.1 Proteus软件 (28)6.2 KEIL软件 (31)7 结论 (33)参考文献 (34)附录A:部分单片机源程序 (35)致谢 (38)1 绪论在科技日新月异发展的今天,人们对时间概念的认识显得尤为深刻,“时间就是金钱”,“时间就是生命”等警句更是激励着人们努力工作,把握时间。
基于DSLCD的数字万年历具有按键可调功能
基于DS+LCD的数字万年历,具有按键可调功能基于DS1302+LCD1602的数字万年历,具有按键可调功能基于DS1302+LCD1602的数字万年历,具有按键可调功能主程序流程图:按键扫描过程中,用了三个键:key0(功能键)key1(增大键)key2(减小键)用变量num记录功能键按下次数switch(num){ case 1: flag=1;//修改时间,禁止液晶从DS1302读数据LCD_WRITE_COM(0x0f);//光标开始闪烁LCD_WRITE_COM(0x80+3);//第一次按下,光标定位到年位置break;case 2: LCD_WRITE_COM(0x80+6);//第二次按下,光标定位到月位置break;case 3: LCD_WRITE_COM(0x80+9);//第三次按下,光标定位到日位置break; case 4: LCD_WRITE_COM(0x80+12);//第四次按下,光标定位到星期位置break; case 5:LCD_WRITE_COM(0x80+0x40+4);//第五次按下,光标定位到时位置break;case 6: LCD_WRITE_COM(0x80+0x40+7);//第六次按下,光标定位到分位置break;case 7: LCD_WRITE_COM(0x80+0x40+10);//第七次按下,光标定位到秒位置break;case 8: num=0;//第八次按下,记录清零LCD_WRITE_COM(0x0c);//不显示光标WRITE_1302(WRITE_PROTECT,0x00);//禁止写保护WRITE_1302(0x80,(second/10*16)+second%10);//将调节后的秒写入DS1302 WRITE_1302(0x82,(minute/10*16)+minute%10);//将调节后的分写入DS1302 WRITE_1302(0x84,(hour/10*16)+hour%10);//将调节后的时写入DS1302 WRITE_1302(0x8a,(week/10*16)+week%10);//将调节后的星期写入DS1302 WRITE_1302(0x86,(day/10*16)+day%10);//将调节后的日写入DS1302WRITE_1302(0x88,(month/10*16)+month%10);//将调节后的月写入DS1302WRITE_1302(0x8c,(year/10*16)+year%10);//将调节后的年写入DS1302WRITE_1302(WRITE_PROTECT,0x80);//开写保护flag=0;//时间修改完毕,允许液晶从DS1302读数据break;}仿真时的现象:。
用DS与LCD设计的可调式电子日历时钟的设计与实现PPT课件
7 D0 数据
15 BLA 背光源正极
8 D1 数据
16 BLK 背光源负极
第12页/共22页
LCD1
LM016L
R2
10k
K1
第13页/共22页
1 2 3
VSS VDD VEE
RS 4 RW 5 EN 6
RS RW E
D0 7 D1 8 D2 9 D3 10 D4 11 D5 12 D6 13 D7 14
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
39 D0 38 D1 37 D2 36 D3 35 D4 34 D5 33 D6 32 D7
21
RS
22
RW
23
EN
24
25
26
27
28
10 11 12 13 14 15 16 17
U3
AND_4
R2
10k
K1 K2 K3 K4
RS 4 RW 5 EN 6
VSS VDD VEE
D0 7 D1 8 D2 9 D3 10 D4 11 D5 12 D6 13 D7 14
RS 4 RW 5 EN 6
1 2 3
R2
10k
K1
第2页/共22页
RP1
1
D0 2 D1 3 D2 4 D3 5 D4 6 D5 7 D6 8 D7 9
RESPACK-8
(2)显示日历时钟初始值:年、月、日、星期、时、分、秒
第9页/共22页
第10页/共22页
◆液晶显示模块
LCD是一种功耗极低的显示器件,广泛应 用于便携式电子产品中。它不仅省电,而且能 够显示大量的信息,是一种专门用于显示字母、 数字、符号等点阵式LCD,目前常用16*1, 16*2,20*2和40*2行等模块。
电子万年历(DS1302)(LCD1602显示)程序
LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //写入低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1;//写入时序
LCD1602_DATAPINS = com;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
//Lcd1602_Delay1ms(1);
LCD1602_DATAPINS = com << 4; //发送低四位
* 函数功能: 主函数
* 输入 : 无
* 输出: 无
*******************************************************************************/
void main()
{
unsigned char i;
Int0Configuration();
LcdWriteData('-');
LcdWriteData('0'+TIME[4]/16);//月
LcdWriteData('0'+(TIME[4]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[3]/16);//日
基于LCD1602液晶显示屏的电子万年历设计【两个C程序】
二,ISD1420P与单片机的连接
ISD1420P的电路图如图 2-9所示,图中LED用做录音和放音的指示灯;R8、R10和C6起到上拉的作用;通过R14和C11的时间常数来决定自动增益控制的释放时间,470KΩ和 的标称值在绝对大多数场合下可获得满意的效果;C7为电源和地之间的去耦电容;C9和C10为话筒的耦合电容.
市场上有许多电子钟的专用芯片如:LM8363、LM8365等,但它们功能单一,电路连接复杂,不便于调试制作!但是考虑到用单片机配合时钟芯片,可制成功能任意的电子钟,而且可以做到硬件简单、成本低廉。所以本系统采用了以广泛使用的单片机AT89C51技术为核心,配合时钟芯片DS1302。软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LED显示电路、键盘电路,使人机交互简便易行,此外结合音乐闹铃电路、看门狗和供电电路。本方案设计出的数字钟可以显示时间、设置闹铃功能之外。
本设计中我重点研究实现了单片机+时钟芯片这种模式的万年历,从原理上对单片机和时钟芯片有了深一步的认识,这些基本功能完成后,在软件基础上实现世界时,农历功能。
本设计在很多场合都能用到,可以把此万年历装在镜框中或其它工艺品中,以便更加实用。
第一章 概论 系统总体框图
本设计的核心部分为单片机控制器,系统的各项功能由其它各部分单元电路来完成,单元电路主要包括:时钟电路部分、显示部分、语音部分、人机交互控制接口部分等,单片机通过程序来控制其它各部分统一协调地来完成系统的各项功能,本设计硬件电路较简单,但软件部分较复杂,所有功能都要通过软件来实现,系统总体设计如图1-1所示。
采用AT89C55,它是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含20kbytes 的可反复擦写的Flash只读程序存储器(ROM)和256*8bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8 位中央处理器(CPU)和Flash存储单元,功能强大AT89C55单片机适合于许多较为复杂控制应用场合。
基于利用时钟芯片DS1302实现万年历,1602LCD显示电子表
电子设计大赛培训第二阶段第**组报告《基于利用时钟芯片DS1302实现万年历,1602LCD显示电子表》成员姓名:*** 学号:******成员姓名:HG**学号:******成员姓名:*** 学号:*******一、主要功能1、在1602液晶上显示年、月、日、星期、时、分、秒以及实时温度,并且实时更新显示;2、通过按键随时调节各显示参数,分别实现光标定位、数值增大、数值减小、闹钟和温度上下限查看的功能;3.在时间出现乱码的情况下,具有一键初始化时间的功能。
二、电路图三、实物图1.开关模块2、显示模块3、at89c52模块4、总体连接图四、心得体会本次设计是我们遇到过的较大的设计,所以遇到的问题也比较的多,尤其是以前没有接触过如此复杂的硬件电路以及软件编程,在软、硬件设计和调试中遇到了不少的困难,在同学的帮助才逐一克服了难题,学习到了不少的专业知识。
在整个设计过程之前,我已经在网上找了相关方面的资料,万事开始难,一开始不知道从哪里下手。
后来慢慢学会分析系统,将系统模块化,各个模块可以在软件或者硬件上实现。
在确保各个模块的硬件电路和与之相搭配的程序能够正常工作后在把它们组成一个系统。
在今后的日子里,我会进一步加强自己的动手能力,丰富自己的知识面。
总之,这次设计给我的最大感触就是,在以后的学习中勤动脑,多动手。
附录:1、元件清单AT89C52一块LCD 一个排阻 3个DS1302一个DS18B20一个开关 5个晶振2个瓷片电容2个, 30PF电解电容一个,33Uf插针若干杜邦线若干2、程序#include <REG51.H>#include <intrins.h>//#include "LCD1602.h"//#include "DS1302.h"#define uint unsigned int#define uchar unsigned charsbit DS1302_CLK = P1^7; //实时时钟时钟线引脚sbit DS1302_IO = P1^6; //实时时钟数据线引脚sbit DS1302_RST=P1^5; //实时时钟复位线引脚sbitwireless_1 = P3^0;sbit wireless_2=P3^1;sbit wireless_3 = P3^2;sbit wireless_4 = P3^3;sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数sbit Set = P2^0; //模式切换键sbit Up = P2^1; //加法按钮sbitDown = P2^2;//减法按钮sbit out = P2^3; //立刻跳出调整模式按钮sbit DQ =P1^0; //温度传送数据IO口char done,count,temp,flag,up_flag,down_flag;uchar temp_value;//温度值uchar TempBuffer[5],week_value[2];void show_time(); //液晶显示程序/***********1602液晶显示部分子程序****************///Port Definitions**********************************************************sbitLcdRsﻩ= P2^5;sbit LcdRwﻩ= P2^6;sbitLcdEn = P2^7;sfr DBPort = 0x80;ﻩ//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口//内部等待函数**************************************************************************unsignedchar LCD_Wait(void){ﻩLcdRs=0;ﻩLcdRw=1;ﻩ_nop_();LcdEn=1; _nop_();ﻩﻩﻩﻩLcdEn=0;ﻩreturnDBPort;}//向LCD写入命令或数据************************************************************#define LCD_COMMAND ﻩﻩ0 // Command#define LCD_DATAﻩ 1 //Data#defineLCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING ﻩ0x02// 光标返回原点void LCD_Write(bit style, unsigned char input){LcdEn=0;ﻩLcdRs=style;LcdRw=0; ﻩ_nop_();DBPort=input;ﻩ_nop_();//注意顺序LcdEn=1; ﻩ_nop_();//注意顺序ﻩLcdEn=0; ﻩ_nop_();ﻩLCD_Wait();}//设置显示模式************************************************************#define LCD_SHOW ﻩﻩ0x04 //显示开#defineLCD_HIDEﻩ0x00 //显示关#define LCD_CURSORﻩ0x02 ﻩ//显示光标#define LCD_NO_CURSORﻩﻩ0x00 //无光标#define LCD_FLASH ﻩ0x01//光标闪动#define LCD_NO_FLASH ﻩ0x00 //光标不闪动void LCD_SetDisplay(unsignedchar DisplayMode){ﻩLCD_Write(LCD_COMMAND, 0x08|DisplayMode);ﻩ}//设置输入模式************************************************************#define LCD_AC_UP ﻩ0x02#define LCD_AC_DOWNﻩﻩ0x00 // default#define LCD_MOVEﻩﻩ0x01 // 画面可平移#define LCD_NO_MOVE ﻩ0x00 //defaultvoid LCD_SetInput(unsigned char InputMode){ﻩLCD_Write(LCD_COMMAND, 0x04|InputMode);}//初始化LCD************************************************************void LCD_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递增, 画面不动}//液晶字符输入的位置************************void GotoXY(unsigned char x,unsigned char y){ﻩif(y==0)ﻩﻩLCD_Write(LCD_COMMAND,0x80|x);ﻩif(y==1)ﻩLCD_Write(LCD_COMMAND,0x80|(x-0x40));}//将字符输出到液晶显示void Print(unsigned char *str){while(*str!='\0')ﻩ{ﻩLCD_Write(LCD_DATA,*str);ﻩstr++;}}/***********DS1302时钟部分子程序******************/typedef struct __SYSTEMTIME__{ﻩunsigned char Second;ﻩunsigned char Minute;ﻩunsigned char Hour;unsigned char Week;ﻩunsigned char Day;ﻩunsigned char Month;ﻩunsigned char Year;ﻩunsigned char DateString[11];unsigned charTimeString[9];}SYSTEMTIME;//定义的时间类型SYSTEMTIME CurrentTime;#defineAM(X)ﻩX#define PM(X)ﻩ(X+12) // 转成24小时制#define DS1302_SECONDﻩ0x80 //时钟芯片的寄存器位置,存放时间#define DS1302_MINUTEﻩ0x82#define DS1302_HOUR ﻩ0x84#define DS1302_WEEKﻩ0x8A0x86#define DS1302_DAYﻩﻩ#define DS1302_MONTH 0x88#define DS1302_YEARﻩ 0x8Cvoid DS1302InputByte(unsigned char d) ﻩ//实时时钟写入一字节(内部函数){unsigned char i;ACC = d;for(i=8; i>0;i--){DS1302_IO = ACC0; ﻩ//相当于汇编中的RRC DS1302_CLK = 1;DS1302_CLK = 0;ACC = ACC >> 1;}}unsignedchar DS1302OutputByte(void) //实时时钟读取一字节(内部函数){unsigned char i;for(i=8;i>0; i--){ACC = ACC>>1; ﻩﻩ//相当于汇编中的RRCACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK = 0;}return(ACC);}void Write1302(unsigned char ucAddr, unsigned char ucDa)//ucAddr: DS1302地址, ucData: 要写的数据{DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); ﻩ// 地址,命令DS1302InputByte(ucDa); ﻩ//写1Byte数据DS1302_CLK = 1;DS1302_RST = 0;}unsignedchar Read1302(unsigned char ucAddr) //读取DS1302某地址的数据{unsignedchar ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr|0x01); // 地址,命令ucData = DS1302OutputByte(); // 读1Byte数据DS1302_CLK = 1;DS1302_RST =0;return(ucData);}void DS1302_GetTime(SYSTEMTIME *Time)//获取时钟芯片的时钟数据到自定义的结构型数组{unsigned char ReadValue;ﻩReadValue = Read1302(DS1302_SECOND);ﻩTime->Second = ((ReadValue&0x70)>>4)*10+ (ReadVal ue&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);ﻩReadValue = Read1302(DS1302_YEAR);Time->Year = ((ReadValue&0x70)>>4)*10 +(ReadValu e&0x0F);}void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]{ if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22 {ﻩ Time->DateString[0]= '2';ﻩTime->DateString[1] = '0';Time->DateString[2] = Time->Year/10 + '0';Time->DateString[3] = Time->Year%10 + '0';}else{ﻩ Time->DateString[0] = ' ';Time->DateString[1] = ' ';ﻩﻩﻩ Time->DateString[2] = ' ';ﻩTime->DateString[3] = ' ';ﻩ}ﻩTime->DateString[4]= '/';ﻩif(hide_month<2)ﻩ{ﻩ Time->DateString[5] =Time->Month/10+ '0';Time->DateString[6] =Time->Month%10 + '0';ﻩ}else{ﻩ Time->DateString[5] = ' ';Time->DateString[6] = '';}Time->DateString[7] = '/';if(hide_day<2){Time->DateString[8] = Time->Day/10+'0';Time->DateString[9] =Time->Day%10 +'0';}ﻩelse{ﻩTime->DateString[8]= ' ';ﻩTime->DateString[9]= ' ';}if(hide_week<2)ﻩ{week_value[0] = Time->Week%10 + '0'; //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示ﻩ}ﻩelseﻩ {week_value[0] = ' ';ﻩ}week_value[1] = '\0';ﻩTime->DateString[10] = '\0'; //字符串末尾加'\0' ,判断结束字符}void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];{ if(hide_hour<2){ﻩ Time->TimeString[0] = Time->Hour/10 + '0';ﻩ Time->TimeString[1]= Time->Hour%10 + '0';ﻩ}else{ﻩ Time->TimeString[0] = ' ';ﻩ Time->TimeString[1] = ' ';}Time->TimeString[2] = ':';if(hide_min<2)ﻩ{Time->TimeString[3]= Time->Minute/10 + '0';Time->TimeString[4] =Time->Minute%10 + '0';}ﻩ elseﻩ{Time->TimeString[3] = ' ';ﻩTime->TimeString[4] =' ';ﻩ }ﻩTime->TimeString[5] = ':';if(hide_sec<2){ﻩTime->TimeString[6] = Time->Second/10 + '0';ﻩ Time->TimeString[7] = Time->Second%10 + '0';}else{Time->TimeString[6] = ' ';ﻩTime->TimeString[7] = ' ';}Time->DateString[8] = '\0';}void Initial_DS1302(void) //时钟芯片初始化{unsigned char Second=Read1302(DS1302_SECOND);ﻩif(Second&0x80)//判断时钟芯片是否关闭{ﻩWrite1302(0x8e,0x00); //写入允许Write1302(0x8c,0x07);//以下写入初始化时间日期:07/07/25.星期: 3. 时间: 23:59:55ﻩWrite1302(0x88,0x07);ﻩWrite1302(0x86,0x25);Write1302(0x8a,0x07);ﻩWrite1302(0x84,0x23);Write1302(0x82,0x59);Write1302(0x80,0x55);ﻩWrite1302(0x8e,0x80); //禁止写入}}/***********ds18b20子程序*************************//***********ds18b20延迟子函数(晶振12MHz )*******/void delay_18B20(unsignedint i){while(i--);}/**********ds18b20初始化函数**********************/void Init_DS18B20(void){ﻩ unsigned char x=0;DQ=1;//DQ复位ﻩdelay_18B20(8); //稍做延时ﻩDQ = 0; //单片机将DQ拉低ﻩ delay_18B20(80); //精确延时大于 480usDQ = 1; //拉高总线delay_18B20(14);ﻩ x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);}/***********ds18b20读一个字节**************/unsigned char ReadOneChar(void){uchar i=0;ﻩuchardat = 0;for (i=8;i>0;i--){DQ = 0;// 给脉冲信号dat>>=1;ﻩDQ=1; //给脉冲信号ﻩ if(DQ)ﻩ dat|=0x80;ﻩ delay_18B20(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(uchar dat){unsigned char i=0;for(i=8; i>0; i--){ﻩDQ = 0;ﻩDQ= dat&0x01;ﻩdelay_18B20(5);ﻩﻩDQ = 1;ﻩdat>>=1;}}/**************读取ds18b20当前温度************/void ReadTemp(void){unsigned char a=0;ﻩunsignedchar b=0;ﻩunsigned char t=0;ﻩInit_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); ﻩ//启动温度转换ﻩdelay_18B20(100); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); ﻩ//跳过读序号列号的操作ﻩWriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度ﻩdelay_18B20(100);a=ReadOneChar();//读取温度值低位ﻩb=ReadOneChar();ﻩﻩ//读取温度值高位ﻩtemp_value=b<<4;temp_value+=(a&0xf0)>>4;}void temp_to_str() //温度数据转换成液晶字符显示{TempBuffer[0]=temp_value/10+'0'; //十位TempBuffer[1]=temp_value%10+'0'; //个位TempBuffer[2]=0xdf; //温度符号TempBuffer[3]='C';TempBuffer[4]='\0';}void Delay1ms(unsigned intcount){unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++);}/*延时子程序*/void mdelay(uint delay){ﻩuint i;for(;delay>0;delay--)ﻩﻩ{for(i=0;i<62;i++) //1ms延时.ﻩ{;}ﻩ}}void outkey() //跳出调整模式,返回默认显示{ uchar Second;if(out==0||wireless_1==1){ mdelay(8);ﻩcount=0;ﻩhide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80); //禁止写入done=0;ﻩwhile(out==0);while(wireless_1==1);}}//////////////////////////////////////////////////////////////////////////////////////////////////////////// void Upkey()//升序按键{ﻩUp=1;if(Up==0||wireless_2==1)ﻩﻩ {ﻩﻩﻩ mdelay(8);ﻩ switch(count)ﻩﻩﻩ{case1:temp=Read1302(DS1302_SECOND); //读取秒数ﻩﻩﻩﻩﻩﻩtemp=temp+1; //秒数加1up_flag=1;//数据调整后更新标志if((temp&0x7f)>0x59) //超过59秒,清零temp=0; ﻩﻩﻩﻩﻩﻩ break;ﻩﻩ case 2:temp=Read1302(DS1302_MINUTE); //读取分数ﻩﻩﻩﻩﻩ temp=temp+1;//分数加1up_flag=1;ﻩﻩﻩﻩ if(temp>0x59) //超过59分,清零ﻩﻩtemp=0;ﻩﻩﻩbreak;ﻩﻩﻩcase 3:temp=Read1302(DS1302_HOUR); //读取小时数ﻩﻩﻩ temp=temp+1; //小时数加1up_flag=1;ﻩﻩﻩﻩﻩﻩif(temp>0x23) //超过23小时,清零ﻩﻩﻩﻩﻩﻩtemp=0;ﻩﻩﻩﻩbreak;ﻩﻩﻩﻩcase 4:temp=Read1302(DS1302_WEEK); //读取星期数ﻩﻩﻩﻩ temp=temp+1; //星期数加1up_flag=1;ﻩﻩﻩ if(temp>0x7)ﻩﻩﻩﻩ temp=1;ﻩﻩﻩﻩﻩﻩ break;ﻩcase 5:temp=Read1302(DS1302_DAY); //读取日数ﻩﻩﻩ temp=temp+1; //日数加1up_flag=1;ﻩﻩﻩﻩ if(temp>0x31)ﻩﻩﻩﻩﻩﻩ temp=1;ﻩﻩﻩﻩ break;ﻩﻩcase 6:temp=Read1302(DS1302_MONTH); //读取月数ﻩﻩﻩﻩtemp=temp+1; //月数加1up_flag=1;ﻩﻩﻩﻩﻩﻩﻩif(temp>0x12)ﻩﻩﻩﻩ temp=1;ﻩﻩﻩﻩ break;ﻩcase 7:temp=Read1302(DS1302_YEAR);//读取年数ﻩﻩﻩﻩﻩﻩﻩ temp=temp+1; //年数加1up_flag=1;ﻩﻩﻩﻩif(temp>0x85)ﻩﻩﻩﻩﻩ temp=0;ﻩﻩ break;ﻩﻩﻩﻩdefault:break;ﻩ }ﻩﻩﻩ while(Up==0);ﻩ while(wireless_2==1);}}////////////////////////////////////////////////////////////////////////////////////////////////////////////void Downkey()//降序按键{ﻩﻩﻩDown=1;if(Down==0||wireless_3==1)ﻩ {ﻩﻩﻩmdelay(8);ﻩﻩ switch(count)ﻩﻩ {case 1:temp=Read1302(DS1302_SECOND); //读取秒数ﻩﻩﻩﻩﻩtemp=temp-1;ﻩ//秒数减1down_flag=1; //数据调整后更新标志ﻩﻩﻩﻩ if(temp==0x7f) //小于0秒,返回59秒ﻩﻩtemp=0x59;ﻩﻩbreak;ﻩﻩﻩ case2:temp=Read1302(DS1302_MINUTE); //读取分数ﻩﻩﻩtemp=temp-1; //分数减1down_flag=1;ﻩﻩﻩﻩ if(temp==-1)ﻩﻩﻩﻩﻩﻩ temp=0x59; //小于0秒,返回59秒ﻩﻩﻩﻩﻩ break;case 3:temp=Read1302(DS1302_HOUR); //读取小时数ﻩﻩﻩtemp=temp-1; //小时数减1down_flag=1;ﻩﻩﻩﻩ if(temp==-1)ﻩtemp=0x23;ﻩﻩ break;ﻩ case 4:temp=Read1302(DS1302_WEEK);//读取星期数ﻩﻩﻩﻩ temp=temp-1; //星期数减1down_flag=1;ﻩﻩﻩﻩ if(temp==0)ﻩﻩﻩﻩﻩ temp=0x7;;ﻩﻩﻩ break;ﻩ case 5:temp=Read1302(DS1302_DAY); //读取日数ﻩﻩﻩﻩﻩ temp=temp-1; //日数减1down_flag=1;ﻩﻩﻩﻩ if(temp==0)ﻩﻩﻩtemp=31;ﻩﻩ break;ﻩﻩﻩ case 6:temp=Read1302(DS1302_MONTH); //读取月数ﻩﻩﻩﻩﻩﻩ temp=temp-1; //月数减1down_flag=1;ﻩif(temp==0)ﻩﻩﻩﻩﻩ temp=12;ﻩﻩﻩﻩﻩﻩ break;ﻩﻩcase 7:temp=Read1302(DS1302_YEAR);//读取年数ﻩﻩﻩﻩ temp=temp-1; //年数减1down_flag=1;ﻩﻩﻩﻩ if(temp==-1)ﻩﻩﻩtemp=0x85;ﻩﻩﻩﻩﻩﻩﻩ break;ﻩﻩ default:break;ﻩ}ﻩﻩﻩﻩwhile(Down==0);ﻩﻩwhile(wireless_3==1);ﻩ}}void Setkey()//模式选择按键{ﻩSet=1;ﻩif(Set==0||wireless_4==1)ﻩ{mdelay(8);count=count+1; //Setkey按一次,count就加1 done=1; ﻩﻩ//进入调整模式while(Set==0);while(wireless_4==1);ﻩ }}void keydone()//按键功能执行{ uchar Second;ﻩ if(flag==0) //关闭时钟,停止计时{ Write1302(0x8e,0x00); //写入允许temp=Read1302(0x80);Write1302(0x80,temp|0x80);ﻩWrite1302(0x8e,0x80); //禁止写入flag=1;}Setkey(); ﻩ//扫描模式切换按键ﻩswitch(count)ﻩﻩ {case 1:do ﻩ //count=1,调整秒{outkey();ﻩﻩ //扫描跳出按钮ﻩﻩﻩUpkey(); //扫描加按钮ﻩﻩ Downkey(); //扫描减按钮ﻩﻩﻩﻩif(up_flag==1||down_flag==1) //数据更新,重新写入新的数据{ﻩﻩ Write1302(0x8e,0x00); //写入允许ﻩﻩﻩWrite1302(0x80,temp|0x80); //写入新的秒数ﻩﻩﻩWrite1302(0x8e,0x80); //禁止写入ﻩﻩﻩ up_flag=0;ﻩﻩﻩﻩ down_flag=0;ﻩﻩ}ﻩhide_sec++; //位闪计数ﻩﻩif(hide_sec>3)ﻩﻩ hide_sec=0;show_time(); //液晶显示数据ﻩﻩﻩﻩ}while(count==2);break;ﻩ case 2:doﻩﻩ//count=2,调整分ﻩ {ﻩﻩhide_sec=0;ﻩ outkey();ﻩﻩﻩ Upkey();ﻩﻩ Downkey();ﻩﻩ if(temp>0x60)ﻩﻩ temp=0;ﻩﻩﻩ if(up_flag==1||down_flag==1)ﻩﻩ {ﻩWrite1302(0x8e,0x00); //写入允许ﻩﻩﻩ Write1302(0x82,temp); //写入新的分数ﻩWrite1302(0x8e,0x80);//禁止写入ﻩ up_flag=0;ﻩ down_flag=0;ﻩﻩﻩ }ﻩﻩ hide_min++;ﻩﻩ if(hide_min>3)ﻩﻩﻩhide_min=0;show_time();ﻩﻩ }while(count==3);break;ﻩ case 3:doﻩﻩﻩﻩ//count=3,调整小时ﻩﻩ{hide_min=0;ﻩoutkey();ﻩUpkey();ﻩ Downkey();ﻩﻩﻩ if(up_flag==1||down_flag==1)ﻩﻩ{ﻩﻩﻩ Write1302(0x8e,0x00); //写入允许ﻩ Write1302(0x84,temp); //写入新的小时数ﻩﻩ Write1302(0x8e,0x80); //禁止写入ﻩﻩﻩ up_flag=0;ﻩ down_flag=0;ﻩ}hide_hour++;ﻩﻩif(hide_hour>3)hide_hour=0;show_time();ﻩﻩ }while(count==4);break;case 4:doﻩﻩﻩﻩ //count=4,调整星期ﻩ {hide_hour=0;outkey();Upkey();ﻩﻩDownkey();ﻩ if(up_flag==1||down_flag==1)ﻩﻩ{ﻩ Write1302(0x8e,0x00); //写入允许ﻩﻩﻩﻩ Write1302(0x8a,temp); //写入新的星期数ﻩﻩWrite1302(0x8e,0x80); //禁止写入ﻩﻩ up_flag=0;ﻩﻩ down_flag=0;ﻩﻩ}ﻩhide_week++;ﻩﻩ if(hide_week>3)ﻩﻩﻩ hide_week=0;show_time();ﻩﻩﻩ }while(count==5);break;ﻩ case 5:doﻩﻩﻩﻩﻩ//count=5,调整日ﻩ {ﻩﻩﻩﻩ hide_week=0;ﻩoutkey();ﻩﻩﻩﻩ Upkey();ﻩﻩ Downkey();ﻩﻩﻩ if(up_flag==1||down_flag==1)ﻩﻩ{ﻩ Write1302(0x8e,0x00); //写入允许Write1302(0x86,temp); //写入新的日数ﻩﻩﻩ Write1302(0x8e,0x80); //禁止写入ﻩﻩﻩ up_flag=0;ﻩ down_flag=0;ﻩ}ﻩﻩﻩ hide_day++;ﻩﻩﻩif(hide_day>3)ﻩ hide_day=0;show_time();ﻩﻩ }while(count==6);break;ﻩﻩcase 6:doﻩﻩﻩﻩﻩ//count=6,调整月{hide_day=0;ﻩﻩﻩﻩ outkey();ﻩﻩ Upkey();ﻩﻩ Downkey();ﻩﻩ if(up_flag==1||down_flag==1)ﻩﻩ {ﻩﻩ Write1302(0x8e,0x00); //写入允许ﻩﻩ Write1302(0x88,temp); //写入新的月数ﻩ Write1302(0x8e,0x80); //禁止写入ﻩup_flag=0;ﻩﻩﻩ down_flag=0;ﻩﻩ}ﻩﻩ hide_month++;ﻩﻩif(hide_month>3)ﻩﻩﻩ hide_month=0;show_time();ﻩ }while(count==7);break;ﻩﻩ case 7:doﻩ//count=7,调整年{hide_month=0;ﻩﻩﻩ outkey();ﻩﻩUpkey();ﻩﻩDownkey();ﻩ if(up_flag==1||down_flag==1)ﻩﻩ {ﻩ Write1302(0x8e,0x00); //写入允许ﻩﻩWrite1302(0x8c,temp); //写入新的年数Write1302(0x8e,0x80); //禁止写入ﻩﻩ up_flag=0;ﻩﻩdown_flag=0;ﻩﻩﻩﻩ }ﻩﻩﻩhide_year++;ﻩif(hide_year>3)ﻩﻩﻩ hide_year=0;show_time();ﻩﻩ}while(count==8);break;ﻩ case 8: count=0;hide_year=0; //count8,跳出调整模式,返回默认显示状态ﻩSecond=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许ﻩ Write1302(0x80,Second&0x7f);ﻩ Write1302(0x8E,0x80); //禁止写入ﻩﻩﻩ done=0;ﻩﻩ break; //count=7,开启中断,标志位置0并退出ﻩ default:break;ﻩ }}void show_time() //液晶显示程序{DS1302_GetTime(&CurrentTime);//获取时钟芯片的时间数据TimeToStr(&CurrentTime); //时间数据转换液晶字符DateToStr(&CurrentTime); //日期数据转换液晶字符ReadTemp(); //开启温度采集程序temp_to_str(); //温度数据转换成液晶字符GotoXY(12,1); //液晶字符显示位置Print(TempBuffer); //显示温度GotoXY(0,1);Print(CurrentTime.TimeString); //显示时间GotoXY(0,0);Print(CurrentTime.DateString); //显示日期GotoXY(15,0);Print(week_value); //显示星期GotoXY(11,0);Print("Week");ﻩ//在液晶上显示字母 weekDelay1ms(400); //扫描延时}main(){flag=1; //时钟停止标志LCD_Initial(); //液晶初始化Init_DS18B20( ) ; //DS18B20初始化Initial_DS1302(); //时钟芯片初始化up_flag=0;down_flag=0;ﻩdone=0; //进入默认液晶显示ﻩwireless_1=0;wireless_2=0;ﻩwireless_3=0;wireless_4=0;while(1){while(done==1)keydone(); //进入调整模式while(done==0)ﻩ{show_time(); //液晶显示数据flag=0;ﻩﻩ Setkey(); ﻩﻩ //扫描各功能键ﻩﻩ}}}。
基于51单片机的LCD万年历
●功能描述:本设计完成基于DS1307作为时钟芯片,以HD44780为控制器的LCD万年历显示。
●原理概述:如图一,时钟信号由DS1307模块串行发送到单片机,单片机处理后,将内容通过并行通讯发送到LCD液晶DDRAM 上显示,此过程一直在主函数中循环,从而实现了将“年”、“月”、“日”、“时”、“分”、“秒”在液晶上显示的功能。
●端口说明单片机的P0作为LCD的并行通讯数据端口、P3口的P3.5、P3.6、P3.7作为LCD的控制端口,来控制LCD显示模式、功能以及内容;P1.2、P1.3作为DS1307的串行通讯的数据端以及时钟端,来获取时钟信息到单片机。
●效果显示●图一(电路总图及万年历仿真结果)图二(DS1307时钟电路仿真结果)图三(LCD液晶电路仿真结果)●图四(DS1307与液晶显示数据仿真结果)●程序清单●(一)init.h和init.c/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: init.h** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 总初始化函数,引入所有头文件,定义特殊脚****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-11** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ #ifndef INIT_H#define INIT_H/*--------------------------------------------------包含系统头文件---------------------------------------------------*/#include<reg52.h>#include <stdio.h>#include<intrins.h>#include<string.h>#include<stdio.h>/*--------------------------------------------------宏定义---------------------------------------------------*/#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define fosc 11059200 // 晶振为11.0592MHZ/*--------------------------------------------------包含自定义头文件---------------------------------------------------*/#include"lcd12864.h"#include"delay.h"//#include"table.c"//#include"da.h"//#include"MAX197.h"//#include"zlg.h"#include"ds1307.h"/*--------------------------------------------------定义特殊脚---------------------------------------------------*/sbit BELL=P1^4; //蜂鸣器/*--------------------------------------------------蜂鸣器函数---------------------------------------------------*/extern void didifast(uint i);extern void didislow(uint i);#endif/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: init.c** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 定义调试过程中用到的蜂鸣器标志****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-14** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ #include"init.h"void didislow(uint i){for(;i>0;i--){BELL=~BELL;delay15ms();BELL=~BELL;delay15ms();}}void didifast(uint i){for(;i>0;i--){BELL=~BELL;delaynms(7);BELL=~BELL;delaynms(7);}}(二)delay.h和delay.c/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: delay.h** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 用于存放工程中用到的延时函数****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-14** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ #include"delay.h"void delay100ms() //@11.0592MHz{unsigned char i, j;i = 180;j = 73;do{while (--j);} while (--i);}void delay10us() //@11.0592MHz{unsigned char i;i = 2;while (--i);}void delay125us(void){uint idata n;for(n=0;n<60*12;n++);//60*12 stc12c5a60s2}void delay20us(void){uchar idata n;for(n=0;n<120;n++);//10*12 stc12c5a60s2}void delay15ms(void){uint idata n;for(n=0;n<4000*12;n++);//4000*12 stc12c5a60s2 }void delaynms(unsigned int k) //@11.0592MHz {unsigned char i, j;for(;k>0;k--){_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i);}}/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: delay.h** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 存放所有用于延时的外部函数****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-11** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ #ifndef DELAY_H#define DELAY_H/*--------------------------------------------------包含头文件---------------------------------------------------*/#include"init.h"/*--------------------------------------------------外部函数定义---------------------------------------------------*/extern void delay100ms();extern void delay10us();extern void delay125us(void);extern void delay20us(void);extern void delay15ms(void);extern void delaynms(uint k);#endif(三)DS1307.C和DS1307.H/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: ds1307.c** Last modified Date: 2014-12-27** Last Version: 2.1** Description: ds1307的底层驱动函数****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-14** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ #include"init.h"sbit rtscl=P1^2;sbit rtsda=P1^3;uint tt=0;//uchar code table[]="0123456789";uchar time_receive[8];uchar convert_begin;uint t_click,tp;//**********************************************//over//**********************************************//********************************************///ds1307相关操作函数//传送与接收数据都是先高位//********************************************/void rt_delay() //操作延时,等待信号稳定{uchar i=10;while(i>0)i--;}/*void delay() // 操作之间的时间间隔{uchar i=200;while(i>0)i--;}*/void init_1307() //初始化1307{rtscl = 1; rt_delay(); rtsda = 1; rt_delay();}void start_1307() // 开始信号{rtsda = 1; rtscl = 1; rt_delay(); rtsda = 0; rt_delay();}void stop_1307() // 结束信号{rtsda = 0; rtscl = 1; rt_delay(); rtsda = 1; rt_delay();}void write_1307(uchar d ) //写1307{uchar i,j; rtscl = 0;for(i = 0;i < 8; i++){rtsda = (d >> 7);rtscl = 1;rt_delay();d = d << 1;rtscl = 0;}rtsda = 1;rtscl = 1;while((rtsda == 1) && (j < 255))j++;rtscl=0;}uchar read_1307(uchar b) //读1307{uchar d ,i;rtsda = 1; rtscl = 0;for(i = 0; i < 8; i++){rtscl = 1;rt_delay();d = d << 1;d = d | rtsda;rtscl=0;}rtsda = b;rt_delay();rtscl = 0;rtscl = 1;return d;}read_8byte_1307(){uchar i;start_1307( );write_1307( 0xd0 );write_1307( 0x00 );stop_1307( );for(i = 0;i < 8; i++){start_1307();write_1307(0xd1);time_receive[i]=read_1307(1);stop_1307();}}//********************************************** //over//********************************************** //**********************************************//**********************************************void ds1307init(){TMOD=0x01;TH0=(65536-1000)/256;TL0=(65536-1000)%256; //定时器初始化EA=1;ET0=1;TR0=1;delay15ms();init_1307();start_1307();write_1307(0xd0);write_1307(0x00);write_1307(0x00);write_1307(0x59);write_1307(0x12);write_1307(0x05);write_1307(0x14);write_1307(0x12);write_1307(0x27);stop_1307();}//**************************************************************** //over//*************************************************************** //*************************************************************** //中断服务子程序//***************************************************************void time0() interrupt 1 using 1{TH0=(65536-1000)/256;TL0=(65536-1000)%256;if(convert_begin)t_click++;if(tt>=100){// read_8byte_1307();tt=0;tt++;}/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: ds1307.h** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 引入ds1307的外部函数,供主函数调用****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-14** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ #ifndef DS1307_H#define DS1307_Hextern uchar time_receive[8];extern void ds1307init();extern read_8byte_1307();#endif(四)lcd12864.C和lcd12864.H/*******************************************************程序功能:显示字符*******************************************************//*******************************************************///////指令集//////write_cmd(0x30);//基本指令操作//1.设定DDRAM地址命令write_Cmd(0x90);//设定DDRAM地址,因为此时DDRAM地址已经溢出//2.显示状态命令write_Cmd(0x08);//整体显示关,游标关,游标位置关write_Cmd(0x0c);//整体显示开,游标关,游标位置关write_Cmd(0x0e);//整体显示开,游标开,游标位置write_Cmd(0x0f);//整体显示开,游标开,游标位置开//3.位址归位write_Cmd(0x02);//位址归位,游标回到原点write_Cmd(0x84); //将DDRAM地址设为0x88,游标在此闪烁//4.点设定指令//(以下四个命令是控制写入字符以后光标及整屏显示的移动)write_Cmd(0x07); //光标右移整体显示左移write_Data(0x20); //写入两个空格write_Data(0x20);write_Cmd(0x05); //光标左移整体显示右移write_Data(0x20); //写入两个空格write_Data(0x20);write_Cmd(0x06); //光标右移整体显示不移动write_Data(0x20); //写入两个空格write_Data(0x20);write_Cmd(0x04); //光标左移整体显示不移动write_Data(0x20); //写入两个空格write_Data(0x20);//5.游标和显示移位控制//(以下四个命令无需写入显示数据,直接控制光标和整屏显示的移动)write_Cmd(0x10); //光标左移write_Cmd(0x14); //光标右移write_Cmd(0x18); //整体显示左移,光标跟随write_Cmd(0x1c); //整体显示右移,光标跟随write_Cmd(0x0c); //关闭光标//6.进入扩展功能模式命令write_Cmd(0x34); //打开扩展功能模式,绘图显示关闭//7.反白命令write_Cmd(0x04); //同时反白1、3行write_Cmd(0x04); //再次反白1、3行,相当于关闭1、3行反白write_Cmd(0x05); //同时反白2、4行write_Cmd(0x05); //再次反白2、4行,相当于关闭2、4行反白//8.睡眠模式命令write_Cmd(0x08); //进入睡眠模式write_Cmd(0x0c); //退出睡眠模式//9.待命模式命令write_Cmd(0x01); //进入待命模式//10.打开GDRAM显示write_Cmd(0x36); //打开扩展功能模式,打开绘图显示Draw_TX(0x80,0x84,laba); //设置16*16大小图形Clear_GDRAM(); //清除上电复位后RAM中的随机数值Draw_TX(0x80,0x84,laba);//重新显示设置16*16大小图形//11.关闭GDRAM显示write_Cmd(0x34); //打开扩展功能模式,关闭绘图显示//12.设定基本指令集write_Cmd(0x30); //回到基本指令集//13.清除显示命令write_Cmd(0x01);//清屏*********************************************************/ #include"lcd12864.h"/*写指令到LCD*//*输入:指令输出:无*/void write_cmd(uchar cmd){lcd12864_rs=0;lcd12864_rw=0;lcd12864_cs=0;lcd12864_data=cmd;delay20us();lcd12864_cs=1;delay20us();lcd12864_cs=0;}/*写显示数据到LCD*//*输入:数据输出:无*/void write_data(uchar dat){lcd12864_rs=1;lcd12864_rw=0;lcd12864_cs=0;lcd12864_data=dat;delay20us();lcd12864_cs=1;delay20us();lcd12864_cs=0;/*设定显示位置*//*输入:坐标输出:无*/void lcd_pos(uchar x,uchar y){uchar pos;if(x==0){x=0x80;}else if(x==1){x=0x90;}else if(x==2){x=0x88;}else if(x==3){x=0x98;}pos=x+y;write_cmd(pos);//显示地址}/*LCD初始化设定*//*输入:无输出:无*/void lcd_init(){write_cmd(0x38); //基本指令操作delay125us();write_cmd(0x06); //运行方式delay125us();write_cmd(0x0c); //开显示,关光标delay125us();write_cmd(0x01); //清除lcd的显示内容delay15ms();}/*测试程序:显示相应的字符*/ /*void main(){uchar i;delay15ms();lcd_init();lcd_pos(0,0);i=0;while(dis1[i]!='\0'){write_data(dis1[i]);i++;}i=0;lcd_pos(1,0);while(dis2[i]!='\0'){write_data(dis2[i]);i++;}lcd_pos(2,0);i=0;while(dis3[i]!='\0'){write_data(dis3[i]);i++;}lcd_pos(3,0);i=0;while(dis4[i]!='\0'){write_data(dis4[i]);i++;}} *//*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: lcd12864.h** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 液晶的外部函数以及引脚定义****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-14** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/#ifndef LCD12864_H#define LCD12864_H/*--------------------------------------------------包含头文件---------------------------------------------------*/#include"init.h"//定义I/O接口sbit lcd12864_rs=P3^7;sbit lcd12864_rw=P3^6;sbit lcd12864_cs=P3^5;#define lcd12864_data P0//定义P0口为lcd12864的数据口/*写指令到LCD*//*输入:指令输出:无*/extern void write_cmd(uchar cmd);/*写显示数据到LCD*//*输入:数据输出:无*/extern void write_data(uchar dat);/*设定显示位置*//*输入:坐标输出:无*/extern void lcd_pos(uchar x,uchar y);/*LCD初始化设定*//*输入:无输出:无*/extern void lcd_init();#endif●(五)table.c/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: table.c** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 用于存放在液晶显示的内容****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-14** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ unsigned char dis1[]={" _LV AN_ "};unsigned char dis2[]={"date:**** / ** / ** "};unsigned char dis3[]={"time: ** / ** / ** "};unsigned char dis4[]={" by:13990513 "};●(一)main.c/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: main.c** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 基于HD44780控制器的LCD万年历显示****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-14** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ #include"init.h"#include"table.c"void display(){uchar i;delay15ms();lcd_pos(0,0);i=0;while(dis1[i]!='\0'){write_data(dis1[i]);i++;}i=0;lcd_pos(1,0);while(dis2[i]!='\0'){write_data(dis2[i]);i++;}lcd_pos(2,0);i=0;while(dis3[i]!='\0'){write_data(dis3[i]);i++;}lcd_pos(3,0);i=0;while(dis4[i]!='\0'){write_data(dis4[i]);i++;}}void display1307(){uint nian;//显示日期信息nian=time_receive[7]/16*10+time_receive[7]%16;dis2[5]='2';dis2[6]=(time_receive[4]/100)+0x30;dis2[7]=(time_receive[4]%100/10)+0x30;dis2[8]=(time_receive[4]%10)+0x30;//显示月份dis2[12]=time_receive[5]/16%2+0x30;dis2[13]=time_receive[5]%16+0x30;//显示日期dis2[17]=time_receive[6]/16%4+0x30;dis2[18]=time_receive[6]%16+0x30;// //星期// write_data(' ');// write_data(table[time_receive[3]%16]);//显示小时dis3[7]=time_receive[2]/16%4+0x30;dis3[8]=time_receive[2]%16+0x30;//显示分钟dis3[12]=time_receive[1]/16%8+0x30;dis3[13]=time_receive[1]%16+0x30;//显示秒dis3[17]=time_receive[0]/16%8+0x30;dis3[18]=time_receive[0]%16+0x31;didifast(1);}void main(){lcd_init();ds1307init();display();delaynms(10);while(1){didifast(2); //蜂鸣器,不用可注释read_8byte_1307();display1307();display();}}。
基于DS1302的电子万年历设计说明
基于DS1302的电子万年历设计摘要:本文介绍了一种智能一体化的电子万年历系统,该设计采用DS1302时钟芯片,主控芯片STC89C52型单片机,显示器件NOKIA 5110 LCD,外部手动设置模块键盘组成了电子万年历小系统,NOKIA 5110 LCD能一目了然地显示出年月日星期小时分秒,满足了人们在读取时更加直接的需要。
电子万年历集时间,日期,温度,闹钟于一体,且电路简洁,成本低廉,显示准确,符合了人们对时间的各种需求,使人们生活更加方便快捷。
关键词:万年历 STC89C52 DS1302 NOKIA 5110The Design of Electronic Calendar Based on DS1302 Name:Zhang qianqian Student Id:2 Advisor:Wang zhongxinAbstract: This paper introduces a kind of intelligent electronic calendar system, this calendar small system is made up of the DS1302 clock chip, main control chip microcontroller STC89C52 , NOKIA 5110 LCD display device, external manual setup module keyboard. NOKIA 5110 LCD can clearly show whole time to meet people every need for time request. Electronic calendar include time, date, temperature, the alarm clock module in one system, the system circuit is simple, the cost is low but it can display accurate time, it can meet the different needs of people to time and help people’ life become more convenient and efficient..Keywords: calendar STC89C52 DS1302 NOKIA 5110目录1.论序 (1)1.1课题背景 (1)1.2基于DS1302的电子万年历设计的目的和意义 (1)1.2.1设计目的 (1)1.2.2设计意义 (1)1.3现代电子万年历系统设计的发展状况 (1)1.4课题容 (1)1.5本章小结 (1)2.基于DS1302的电子万年历系统总体设计方案 (2)2.1总体设计框图 (2)2.2系统设计的功能要求 (2)2.3系统设计的方案论证 (2)2.3.1单片机控制模块的选择 (2)2.3.2时钟芯片的选择 (3)2.3.3键盘电路的选择 (3)2.3.4 显示电路的选择 (3)2.4本章小结 (3)3.基于DS1302的电子万年历设计系统硬件电路设计 (4)3.1系统硬件电路设计 (4)3.2系统核心电路——单片机STC89C52 (4)3.2.1 STC89C52主要功能 (4)3.2.2 STC89C52主要引脚及其功能 (5)3.3时钟电路设计 (6)3.3.1 DS1302的性能特征 (6)3.3.2 DS1302的工作原理及数据操作 (7)3.4键盘和显示电路的设计 (9)3.4.1键盘接口设计 (9)3.4.2显示电路设计 (9)3.5本章小结 (11)4. 基于DS1302的电子万年历软件设计 (11)4.1基于DS1302的电子万年历设计系统程序设计要求 (11)4.2基于DS1302的电子万年历设计系统主程序设计 (11)4.2.1液晶模块初始化程序 (11)4.2.2DS1302时钟控制模块初始化程序 (11)4.2.3定时器T0初始化程序 (11)4.2.4时钟程序和中断程序 (11)4.3N OKIA5110液晶显示模块的程序设计 (11)4.4DS1302时间控制模块的程序设计 (11)4.5闹钟程序设计 (13)4.6本章小结 (14)5.总结 (14)1.1课题背景随着科技的发展社会的进步,人类从观太阳、摆钟到现在电子钟得知时间,不断的研发新的计时产品。
单片机时钟芯片DS1302在LCD1602上显示年月日时分秒..
单片机设计实验内容摘要:单片机实验是通过Proteus仿真并且与Keil相结合使用控制单片机使其在仿真中完成一系列所设计的程序。
我们这个小组所做的实验是仿真一个数字时钟,通过DS130这个芯片从计算机上读取时间信息,再由51单片机对数据进行处理、分配,将其输出在LCD160上,实现简单的数字时钟的功能。
设计内容及要求:(1)根据设计课题的技术指标和给定条件,在教师指导下,能够独立而正确地进行方案论证和设计计算,要求概念清楚、方案合理、方法正确、步骤完整;(2)要求学生掌握单片机的设计内容、方法和步骤;(3)要求会查阅有关参考资料和手册等;(4)要求学会选择有关元件和参数;(5)要求学会绘制有关电路图和设计流程图;(6)要求学会编写设计说明书。
系统框图:硬件选择:1、AT89C51AT89C5是一种带 4K字节 FLASH存储器(FPEROMFIash Programmable and Erasable Read Only Memory )的低电压、高性能 CMOS位微处理器,俗称单片机。
AT89C205是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次o该器件采用ATMEI高密度非易失存储器制造技术制造,与工业标准的MCS-5指令集和输出管脚相兼容。
由于将多功能8位 CPU和闪烁存储器组合在单个芯片中,ATMEL勺AT89C5是一种高效微控制器, AT89C205是它的一种精简版本。
AT89C5单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
AT89C51 外形及引脚排列主要特性:•与MCS-51兼容•4K字节可编程FLASH存储器•寿命:1000写 /擦循环•数据保留时间:10年•全静态工作:0Hz-24MHz•三级程序存储器锁定•128X 8位内部RAM•32可编程I/O线•两个16位定时器/计数器•5个中断源•可编程串行通道•低功耗的闲置和掉电模式•片内振荡器和时钟电路特性概述:AT89C51提供以下标准功能:4k字节Flash闪速存储器,128字节内部RAM 32个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
基于液晶显示的万年历
基于液晶显示的万年历毕业设计(论文)报告题目基于液晶显示的万年历系别专业班级学生姓名学号指导教师2013年4 月基于液晶显示的万年历摘要:本设计应用AT89S52芯片作为核心,采用C语言进行编程,实现以下功能:小时、分、秒、年、月、日、星期的显示和实时温度检测。
该设计的电子时钟系统由时钟电路、LCD显示电路、按键调整电路和温度检测电路四部分组成。
使用时钟芯片DS1302完成时钟日期的功能,以LCD1602为显示器,同时利用温度传感器DS18B20测量周围环境温度,并且可以依靠按键随时对日期时间进行调整。
我们共设计四个按键,一个模式键,也就是我们用来选定被修改的数字的,两个调整键,一个“加”键和一个“减”键,当按下模式键,选定要调整的数字的时候,“加”、“减”可以帮我们调到所需的状态,还有一个复位键,显示精度为1秒。
设计还提供三位实时温度检测并显示,其显示精度为0.1℃。
关键词:AT89S52、时钟日历芯片DS1302、温度传感器DS18B20、LCD1602目录前言 (1)第一章方案选择与万年历研究情况 (2)1.1 方案选择 (2)1.1.1时钟芯片选择 (2)1.1.2键盘选择 (3)1.1.3显示模块选择 (3)1.2电子万年历的研究情况 (4)第二章主要硬件描述 (5)2.1 AT89S52 (5)2.1.1主要性能 (5)2.1.2引脚说明 (5)2.2 LCM1602 (8)2.2.1工作原理 (8)2.2.2端口引脚第二功能 (9)2.2.3管脚功能 (10)2.3 芯片DS1302 (11)2.3.1工作原理 (11)2.3.2引脚功能及结构 (12)2.4 数字温度传感器DS18B20 (12)2.4.1DS18B20工作原理 (12)2.4.2DS18B20 引脚定义 (13)第三章硬件设计与实现 (14)3.1 单片机最小系统的设计 (14)3.2 时钟电路的设计 (15)3.3 温度采集模块的设计 (15)3.4 LCDM1602显示模块设计 (16)第四章系统软件设计与实现 (17)4.1主程序设计 (17)4.2实时时钟日历子程序设计 (17)4.3环境温度采集子程序设计 (18)4.4按键子程序设计 (20)第五章测试结果分析与结果 (21)5.1 测试结果分析 (21)5.2 测试总结 (21)结束语 (22)致谢 (23)参考文献 (24)附录一:原理图 (25)附录二:源程序 (26)前言万年历,就是记录一定时间范围内(比如100年或更多)的具体阳历与阴历的日期的年历, 方便有需要的人查询使用.万年只是一种象征,表示时间跨度大.这次设计通过对万年历系统的设计, 详细介绍AT89S52单片机应用中的按键处理,数码管显示原理,动态和静态显示原理,定时中断,A/D转换等原理.该系统能够显示年,月,日,小时,分钟,秒,星期,农历,温度,通过按键可以修改时间等功能.此系统结构简单,功能齐全,具有一定的推广价值。
基于实时钟芯片的万年历设计
基于实时钟芯片的万年历设计作者:莫玉华来源:《电子世界》2013年第14期【摘要】随着科技日新月异的发展,由原始的时钟发展到今天的电子万年历,不断改进创新,给人们生活带来了很多的方便。
这次设计的电子万年历以AT89S52单片机为控制核心,功耗小,能在3V的低压下工作,电压可选用3~5V电压供电。
采用Dallas公司推出的低功耗DS1302实时钟芯片构成计时电路,电子万年历采用直观的数字显示,能够同时显示秒、分、时、周、日、月、年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM 指示决定采用24或12小时格式。
时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。
实时钟芯片DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW,而且DS1302的使用寿命长,误差小。
【关键词】万年历;单片机;DS1302实时钟芯片;功耗1.引言电子万年历在家庭居室、学校、公司、剧院、码头、车站和广场使用越来越广泛,给人们的生活、学习、工作带来极大的方便。
针对以往的电子万年历断电后需重新调整时间与日期,且计时误差大的现象,本次设计是基于实时钟设计的万年历设计,本系统设计采用实时钟芯片(DS1302)作为计时器件,DS1302与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线:(1)RES (复位)。
(2)I/O(数据线)。
(3)SCLK(串行时钟)。
DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW。
该芯片内部自带晶体振荡器,这样就有效的保证了计时的精确性,它能够准确地显示年、月、日、星期、时、分、秒,在断电情况能继续更新时间信息,包括自动调整每月的天数和闰年的天数。
采用AT89S52作为主控制器,功耗小,实用性更强。
2.实时钟芯片万年历设计2.1 课题设计的总体要求1)实时时钟具有能准确显示年、月、日、星期、时、分、秒的功能;2)断电后及时更新时间,具备时间校准功能;3)具备每月的天数和闰年的天数可自动调整的功能;4)存储器主要是对LED数码管等数据进行存储;5)显示采用LED显示屏。
基于DS1302与LCD1602的电子日历时钟的设计与实现
武汉纺织大学高职学院毕业设计(论文)2014— 2015学年第1 学期题目:基于DS1302与LCD1602的电子日历时钟的设计与实现学生姓名曹强学号 1218092183指导教师王骏评阅教师时间 2014年10月武汉纺织大学高职学院毕业设计(论文)开题报告课题名称(来源、类型):基于DS1302与1602LCD电子日历时钟的设计与实现指导教师:王骏学生姓名:曹强开题报告内容:(调研资料的准备,设计/论文的目的、要求、思路与预期成果;任务完成的阶段内容及时间安排;完成设计(论文)所具备的条件因素等.)1.目的:实现日历和时钟的显示并且能够调整2.要求:完成电子日历和时钟的软件和硬件的设计,包括单片机的相关内容;日历时钟模块的设计,液晶显示模块的设计,控制程序的编写等。
3.预期成果:仿真成功,做出实物。
(1)显示初始值日历时钟初始值;4.时间安排:第3周:熟悉课题的基本要求,查阅相关资料,初步拟定设计的整体方案,完成开题报告。
第4—5周:自学这次课题所涉及的相关内容,包括器件基础知识、单片机,DS1302时钟芯片工作原理和相关软件的使用以及LCD1602液晶显示屏的相关内容。
并设计一些简单的实际电路,熟练所学内容并加以巩固。
第6—8周:设计DS1302时钟模块的控制电路、LCD1602液晶显示电路、电源电路等硬件电路,并用Proteus仿真第8—10周:焊接调试电路,根据个部分的作用对硬件进行调试,最后联机调试。
第10—12周:写毕业设计论文,作品展示,完成全部毕业设计指导教师签名:日期: 2014年目录摘要 0关键词 0Abstract (1)Key Words (1)第一章设计要求与方案论证 (2)1.1 设计要求: (2)1。
2 系统基本方案选择和论证 (2)1.2。
1 单片机芯片的选择方案和论证 (2)1.2.2 显示模块选择方案和论证 (2)1.2。
3 时钟芯片的选择方案和论证 (2)1。
基于DS1302和LCD1602的万年历系统设计
基于DS1302和LCD1602的万年历系统设计
任志敏
【期刊名称】《电脑开发与应用》
【年(卷),期】2015(000)003
【摘要】This paper introduces the design of a calendar system that contained C51 single-chip, calendar chip DS1302, display module LCD1602 and touch switches. The system is low cost, universal, and easy to implement. The system scheme, hardware scheme, software are also designed.%以低成本、通用性、可操作性为原则,设计了以C51单片机为控制器,集时钟芯片DS1302,显示屏LCD1602,轻触开关为一体的万年历系统。
在设计
该系统总体方案的基础上,完成了该系统的原理图、软件和实物设计。
【总页数】3页(P28-30)
【作者】任志敏
【作者单位】常州纺织服装职业技术学院机电工程系,江苏常州 213164
【正文语种】中文
【中图分类】N945.23
【相关文献】
1.LCD1602汉字显示技术在万年历中的应用及Proteus仿真 [J], 李建波
2.基于CPLD的LCD1602显示系统设计与实现 [J], 陈海峰;丁丽丽
3.基于STM32的电子万年历系统设计 [J], 刘磊
4.基于时钟芯片DS1302的万年历的设计 [J], 李伟跃
5.万年历芯片DS1302功能测试方法研究 [J], 张春宇
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于利用时钟芯片DS 实现万年历,LCD显示电子表电子设计大赛培训第二阶段第**组报告《基于利用时钟芯片DS1302实现万年历,1602LCD显示电子表》成员姓名:***学号:******成员姓名:HG**学号:******成员姓名:***学号:*******一、主要功能1、在1602液晶上显示年、月、日、星期、时、分、秒以及实时温度,并且实时更新显示;2、通过按键随时调节各显示参数,分别实现光标定位、数值增大、数值减小、闹钟和温度上下限查看的功能;3.在时间出现乱码的情况下,具有一键初始化时间的功能。
二、电路图三、实物图1.开关模块2、显示模块3、at89c52模块4、总体连接图四、心得体会本次设计是我们遇到过的较大的设计,所以遇到的问题也比较的多,尤其是以前没有接触过如此复杂的硬件电路以及软件编程,在软、硬件设计和调试中遇到了不少的困难,在同学的帮助才逐一克服了难题,学习到了不少的专业知识。
在整个设计过程之前,我已经在网上找了相关方面的资料,万事开始难,一开始不知道从哪里下手。
后来慢慢学会分析系统,将系统模块化,各个模块可以在软件或者硬件上实现。
在确保各个模块的硬件电路和与之相搭配的程序能够正常工作后在把它们组成一个系统。
在今后的日子里,我会进一步加强自己的动手能力,丰富自己的知识面。
总之,这次设计给我的最大感触就是,在以后的学习中勤动脑,多动手。
附录:1、元件清单AT89C52一块LCD一个排阻3个DS1302一个DS18B20一个开关5个晶振2个瓷片电容2个,30PF电解电容一个,33Uf插针若干杜邦线若干2、程序#include<REG51.H>#include<intrins.h>//#include"LCD1602.h"//#include"DS1302.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,hi de_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;i>0;i--){DS1302_IO=ACC0;//相当于汇编中的RRCDS1302_CLK=1;DS1302_CLK=0;ACC=ACC>>1;}}unsignedcharDS1302OutputByte(void)//实时时钟读取一字节(内部函数){unsignedchari;for(i=8;i>0;i--){ACC=ACC>>1;//相当于汇编中的RRCACC7=DS1302_IO;DS1302_CLK=1;DS1302_CLK=0;}return(ACC);}voidWrite1302(unsignedcharucAddr,unsignedcharucDa)//ucAddr:DS 1302地址,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); ReadValue=Read1302(DS1302_YEAR);Time->Year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);}voidDateToStr(SYSTEMTIME*Time)//将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]{if(hide_year<2)//这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为2007/07/22{Time->DateString[0]='2';Time->DateString[1]='0';Time->DateString[2]=Time->Year/10+'0';Time->DateString[3]=Time->Year%10+'0';}else{Time->DateString[0]='';Time->DateString[1]='';Time->DateString[2]='';Time->DateString[3]='';}Time->DateString[4]='/';if(hide_month<2){Time->DateString[5]=Time->Month/10+'0'; Time->DateString[6]=Time->Month%10+'0'; }else{Time->DateString[5]='';Time->DateString[6]='';}Time->DateString[7]='/';if(hide_day<2){Time->DateString[8]=Time->Day/10+'0'; Time->DateString[9]=Time->Day%10+'0'; }else{Time->DateString[8]='';Time->DateString[9]='';}if(hide_week<2){week_value[0]=Time->Week%10+'0';//星期的数据另外放到week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示}else{week_value[0]='';}week_value[1]='\0';Time->DateString[10]='\0';//字符串末尾加'\0',判断结束字符}voidTimeToStr(SYSTEMTIME*Time)//将时,分,秒数据转换成液晶显示字符放到数组TimeString[];{if(hide_hour<2){Time->TimeString[0]=Time->Hour/10+'0';Time->TimeString[1]=Time->Hour%10+'0'; }else{Time->TimeString[0]='';Time->TimeString[1]='';}Time->TimeString[2]=':';if(hide_min<2){Time->TimeString[3]=Time->Minute/10+'0'; Time->TimeString[4]=Time->Minute%10+'0'; }else{Time->TimeString[3]='';Time->TimeString[4]='';}Time->TimeString[5]=':';if(hide_sec<2){Time->TimeString[6]=Time->Second/10+'0';。