万年历(时钟芯片和液晶显示)
单片机实训报告万年历
一、实训目的随着科技的发展,单片机在各个领域的应用越来越广泛。
本次实训旨在通过万年历的设计与实现,让学生深入了解单片机的编程与应用,提高学生的实践能力和创新意识。
通过万年历的设计,使学生掌握单片机的基本原理、编程技巧以及相关外设的使用。
二、实训内容本次实训以AT89C51单片机为核心,结合DS1302时钟芯片、LCD1602液晶显示屏和独立键盘,设计并实现一个具有年、月、日、星期、时分秒显示以及闰年判断功能的万年历。
三、实训步骤1. 需求分析- 显示当前日期和时间,包括年、月、日、星期、时分秒。
- 判断闰年,正确显示2月的天数。
- 允许用户通过按键调整日期和时间。
- 具有电源掉电保护功能,保证数据不丢失。
2. 硬件设计- 核心模块:AT89C51单片机- 时钟模块:DS1302时钟芯片,提供精确的日期和时间。
- 显示模块:LCD1602液晶显示屏,用于显示日期、时间和星期。
- 按键模块:独立键盘,用于调整日期和时间。
- 电源模块:锂电池,提供稳定的电源。
3. 软件设计- 主程序:负责初始化硬件、读取时间、显示时间和日期、处理按键输入等。
- 时钟模块:读取DS1302芯片中的时间,并进行处理。
- 显示模块:将时间、日期和星期显示在LCD1602液晶显示屏上。
- 按键处理模块:根据按键输入调整日期和时间。
4. 程序编写- 使用C语言进行程序编写,利用Keil软件进行编译和烧录。
5. 调试与测试- 对程序进行调试,确保功能正常。
- 对万年历进行测试,验证其准确性。
四、实训结果经过设计、编程、调试和测试,成功实现了万年历的功能。
万年历能够准确显示当前日期和时间,并具有闰年判断功能。
用户可以通过按键调整日期和时间,且在电源掉电的情况下,万年历仍能保持时间。
五、实训心得1. 实践出真知:通过本次实训,深刻体会到理论知识与实践应用相结合的重要性。
只有将所学知识运用到实际项目中,才能真正掌握单片机的编程与应用。
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主控板连接到电脑,并根据需要选择正确的端口和板类型。
基于51单片机的1602万年历
●功能描述:本设计完成基于DS1307作为时钟芯片,以HD44780为控制器的LCD万年历显示。
●原理概述:如图一,时钟信号由DS1307模块串行发送到单片机,单片机处理后,将内容通过并行通讯发送到LCD液晶DDRAM 上显示,此过程一直在主函数中循环,从而实现了将“年”、“月”、“日”、“时”、“分”、“秒”在液晶上显示的功能。
●端口说明单片机的P0作为LCD的并行通讯数据端口、P3口的P2.0、P2.1、P2.2作为LCD的控制端口,来控制LCD显示模式、功能以及内容;P1.0、P1.1、P1.2作为DS1302的串行通讯的数据端时钟端以及复位端,来获取时钟信息到单片机。
●效果显示●图一(电路总图及万年历仿真结果)●图二(DS1302时钟电路仿真结果)●图三(LCD1602液晶电路仿真结果)●图四(DS1302与液晶显示数据仿真结果)●程序清单/*************** writer:shopping.w ******************/#include <reg52.h>#include <intrins.h>#include <string.h>#define uint unsigned int#define uchar unsigned charsbit IO = P1^0;sbit SCLK = P1^1;sbit RST = P1^2;sbit RS = P2^0;sbit RW = P2^1;sbit EN = P2^2;uchar *WEEK[]={"SUN","***","MON","TUS","WEN","THU","FRI","SAT"};uchar LCD_DSY_BUFFER1[]={"DA TE 00-00-00 "};uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00 "};uchar DateTime[7];void DelayMS(uint ms){uchar i;while(ms--){for(i=0;i<120;i++);}}void Write_A_Byte_TO_DS1302(uchar x){uchar i;for(i=0;i<8;i++){IO=x&0x01;SCLK=1;SCLK=0;x>>=1;}}uchar Get_A_Byte_FROM_DS1302(){uchar i,b=0x00;for(i=0;i<8;i++){b |= _crol_((uchar)IO,i);SCLK=1;SCLK=0;}return b/16*10+b%16;}uchar Read_Data(uchar addr){uchar dat;RST = 0;SCLK=0;RST=1;Write_A_Byte_TO_DS1302(addr);dat = Get_A_Byte_FROM_DS1302();SCLK=1;RST=0;return dat;}void GetTime(){uchar i,addr = 0x81;for(i=0;i<7;i++){DateTime[i]=Read_Data(addr);addr+=2;}}uchar Read_LCD_State(){uchar state;RS=0;RW=1;EN=1;DelayMS(1);state=P0;EN = 0;DelayMS(1);return state;}void LCD_Busy_Wait(){while((Read_LCD_State()&0x80)==0x80);DelayMS(5);}void Write_LCD_Data(uchar dat){LCD_Busy_Wait();RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0; }void Write_LCD_Command(uchar cmd){LCD_Busy_Wait();RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0; }void Init_LCD(){Write_LCD_Command(0x38);DelayMS(1);Write_LCD_Command(0x01);DelayMS(1);Write_LCD_Command(0x06);DelayMS(1);Write_LCD_Command(0x0c);DelayMS(1);}void Set_LCD_POS(uchar p){Write_LCD_Command(p|0x80);}void Display_LCD_String(uchar p,uchar *s){uchar i;Set_LCD_POS(p);for(i=0;i<16;i++){Write_LCD_Data(s[i]);DelayMS(1);}}void Format_DateTime(uchar d,uchar *a){a[0]=d/10+'0';a[1]=d%10+'0';}void main(){Init_LCD();while(1){GetTime();Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]]);Format_DateTime(DateTime[2],LCD_DSY_BUFFER2+5);Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+8);Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+11);Display_LCD_String(0x00,LCD_DSY_BUFFER1);Display_LCD_String(0x40,LCD_DSY_BUFFER2);}}。
多功能电子万年历设计
多功能电子万年历设计作者:刘秀娟李朋龙邵娟王雪娜梁莉莉逯玉兰来源:《计算机时代》2022年第05期摘要:选用STC89C52单片机为核心元件,结合DS12C887时钟芯片、DHT11数字温湿度传感器和LCD1602液晶顯示屏等电子器件,采用模块化设计方法,完成整体功能设计。
利用Proteus仿真软件和Keil编译软件进行仿真,实现了集年、月、日、时、分、秒、农历、星期、温度、湿度、闹钟功能于一体的电子万年历。
关键词:电子万年历; STC89C52单片机; 时钟芯片; 温湿度传感器中图分类号:TP368.1 文献标识码:A 文章编号:1006-8228(2022)05-73-03Design of multi-function electronic calendarLiu Xiujuan, Li Penglong, Shao Juan, Wang Xuena, Liang Lili, Lu YulanAbstract: In this system, STC89C52 microcontroller was selected as the core component. Combined with electronic devices such as DS12C887 clock chip, DHT11 digital temperature and humidity sensor and LCD1602 liquid crystal display screen, the overall functional design was completed in the modular design method. Using Proteus simulation software and Keil compilation software for simulation, an electronic calendar with year, month, day, hour, minute,second, lunar calendar, week, temperature, humidity, and alarm clock functions was realized.Key words: electronic calendar; STC89C52 microcontroller; clock chip; temperature and humidity sensor引言近年来微电子技术发展迅速,以单片机为核心的智能电子产品层出不穷。
基于51单片机的万年历设计
基于51单片机的万年历设计一、系统设计方案本万年历系统主要由 51 单片机、时钟芯片、液晶显示屏、按键等部分组成。
51 单片机作为核心控制器,负责整个系统的运行和数据处理。
时钟芯片用于提供精确的时间信息,液晶显示屏用于显示万年历的相关内容,按键则用于设置时间和功能切换。
二、硬件设计1、单片机选型选用常见的 51 单片机,如 STC89C52 单片机,它具有性能稳定、价格低廉、易于编程等优点。
2、时钟芯片选择 DS1302 时钟芯片,该芯片能够提供高精度的实时时钟,具有闰年补偿功能,并且可以通过串行接口与单片机进行通信。
3、液晶显示屏采用 1602 液晶显示屏,能够清晰地显示字符和数字,满足万年历的显示需求。
4、按键电路设计四个按键,分别用于时间设置、功能切换、加和减操作。
三、软件设计1、主程序流程系统上电后,首先进行初始化操作,包括单片机端口初始化、时钟芯片初始化、液晶显示屏初始化等。
然后读取时钟芯片中的时间数据,并在液晶显示屏上显示出来。
接着进入循环,不断检测按键状态,根据按键操作执行相应的功能,如时间设置、功能切换等。
2、时钟芯片驱动程序通过单片机的串行接口向 DS1302 发送命令和数据,实现对时钟芯片的读写操作,获取准确的时间信息。
3、液晶显示屏驱动程序编写相应的函数,实现对1602 液晶显示屏的字符和数字显示控制。
4、按键处理程序采用扫描方式检测按键状态,当检测到按键按下时,执行相应的按键处理函数,实现时间设置和功能切换等操作。
四、时间设置功能通过按键操作进入时间设置模式,可以分别设置年、月、日、时、分、秒等信息。
在设置过程中,液晶显示屏会显示当前设置的项目和数值,并通过加、减按键进行调整。
设置完成后,将新的时间数据保存到时钟芯片中。
五、显示功能万年历的显示内容包括年、月、日、星期、时、分、秒等信息。
通过合理的排版和显示控制,使这些信息在液晶显示屏上清晰、直观地呈现给用户。
六、系统调试在完成硬件和软件设计后,需要对系统进行调试。
基于51单片机的12864液晶显示的万年历
附录程序
/*****************说明*********************************** 基于 51 单片机的 12864 液晶显示的万年历
版权所有,如需转载请通知本人,不得用于商业用途 ,仅限学习交流之用
*****************************************************************/
3
图-1 主控制系统
2.3.2 时钟电路模块的设计 DS1302 是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、
时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进 行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一 个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容, 但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
//延时 1MS/次
unsigned char
{
sec,min,hour,day,month,year,cen,week,
unsigned char i;
next,aa,bb,cc,dd,mm,temp0,LunarMonth,
while(--a)
LunarDay,LunarYear;
{
int temp;
9三三系统的软件设计系统的软件设计3131程序流程框图程序流程框图图图aa主程序流程图主程序流程图10图b计算阳历程序流程图计算阳历程序流程图1112图图cc时间调整程序流程图时间调整程序流程图yynnyynnyy图图dd设置温度报警闹钟的数据保存到设置温度报警闹钟的数据保存到at24c02at24c02中中是否进入温度报警上下限温度设置设置是否进入设置闹钟时间设置报警温度上下限开始设置闹钟的时间开始报警闹钟的开关是否开起at24c02存设置的功能保蜂鸣器开启闹钟报警功能开启结束设置13五五作品功能实现作品功能实现通过硬件的焊接与程序的编写本电子万年历终于完成了实现的功能如下
51单片机万年历实验原理
51单片机万年历实验原理1. 概述51单片机万年历实验是一项基于51单片机的实验项目,用于模拟和显示日期和时间信息,使其具备一定的时钟和日历功能。
本文将详细介绍该实验的原理和实现方法。
2. 实验所需材料完成51单片机万年历实验需要以下材料: - 51单片机开发板 - LCD显示屏 - 时钟芯片(如DS1302) - 电容 - 电阻 - 键盘模块 - 连接线等3. 实验原理本实验的原理主要包括三个方面:51单片机的控制逻辑、时钟芯片的数据存储和显示屏的信息展示。
3.1 51单片机的控制逻辑在51单片机中,首先需要定义和初始化各个引脚和功能模块。
通过引脚的输入输出控制、时钟和定时器的设置,实现对时钟芯片和LCD显示屏的控制和数据传输。
3.2 时钟芯片的数据存储时钟芯片一般具有独立的电源供应和存储空间,用于储存日期和时间等信息。
通过与51单片机的通讯接口,读取和写入时钟芯片中的数据,实现对日期和时间信息的读取和更新。
3.3 显示屏的信息展示LCD显示屏作为用户界面,用于展示日期和时间等信息。
通过51单片机的输出控制,将读取到的日期和时间信息通过LCD显示屏进行展示。
具体的显示方式可以根据需求设计,如以年、月、日的格式显示,或者以星期和时间的格式显示等。
4. 实验步骤基于以上原理,可以按照以下步骤进行51单片机万年历实验:4.1 硬件连接按照实验所需材料,将51单片机开发板、LCD显示屏和时钟芯片等进行正确的连接。
根据引脚功能和电平要求,通过连接线将它们连接在一起。
4.2 编写程序使用合适的集成开发环境(如Keil)编写51单片机的程序。
程序主要包括引脚和功能模块的初始化设置、时钟芯片数据的读写和LCD显示屏信息的输出等。
4.3 载入程序将编写好的程序通过USB下载线或其他方式,将程序载入到开发板中。
确保程序可以正确地运行在51单片机上。
4.4 测试实验接通电源,观察LCD显示屏是否正常显示日期和时间信息。
万年历(DS1302+LCD1602【程序仿真完整】)
万年历(DS1302+LCD1602【程序、仿真、完整】) 基于52单片机的万年历显示(采用实时芯片DS1302芯片+LCD1602液晶显示)仿真图:项目名称:Real_TimerLM016LLCD1VSSVDDVEERSRWEC122pF+5VC222pFD0D1D2D3D4D5D6D7RP11234567891 011121314+5VX11912MHzU1XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0 .6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3 .0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221 22232425262728101112131415161712345678910K+5V18XTAL2C320uF1k9RST+5V+5V1.5V1.5V 293031PSENALEEAAT89C52R1RV110kU22X1VCC1VCC281+5VX23X2RSTSCLKI/O57612345678P1.0 /T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.732768DS1302说明:用ds1302和lcd1602显示实时时钟 x x x x x x 程序: LCD1602的H文件:/************************************************************ -- THE LCD1602 DISPLAY LIB --COPYRIGHT (C) 2021 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) 2021 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; sbitACC0=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]; uchartime_str[9]; }date_time;/**************写数据定义*****************/ #define DS1302_SECOND 0x80#define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK0x8A #define DS1302_DAY 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C #define ST 0x00/*************单字节写数据子程序**************/ voidsingle_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(ucharaddr,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); //写入当前时间数据 } }感谢您的阅读,祝您生活愉快。
显示可调闹钟万年历设计
带温度显示可调闹钟万年历摘要本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。
系统最大的特点是体现了较强的人机交互和独立的模块化程序设计。
温度采集选用DS18B20芯片,数据显示采用1602A液晶显示模块,在第一行显示年月日、星期以及当前的状态,第二行显示温度和时间,合理的利用液晶显示区域。
51主芯片利用定时中断产生时间,控制着液晶的显示更新、温度的实时变化以及按键的读取处理,而对于闹钟,实际上就是时间里的一个嵌套程序。
时间和闹钟的值由按键调整设置,采用通用的二十四小时制。
该电路采用51单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。
综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
关键字:万年历;温度计;闹钟;液晶显示一、方案设计与论证根据要求,系统分为四个模块进行方案设计:1.数据显示模块方案一:数据采集处理后采用六位数码管动态扫描,循环依次显示年月日(如09.01.01)、当前时间(如12.00.00)和温度星期(如+23.5_1),数码管用74LS164芯片驱动,硬件电路复杂且显示略显混乱,在软件方面,扫描部分由于要显示的数据太多而显的不清晰。
方案二:考虑到要显示的内容颇多,故运用1602A显示实时数据,第一行显示状态以及年月日星期(如S 2009—01—01 THU),第二行显示温度和实时时间(22.0C12:00:00),在处理按键设置时,第二行暂时屏蔽温度的显示而显示设置的内容。
这样虽然在程序方面多了1602A的一些初始化和读写子函数的定义,但程序的模块化却更加的清楚。
而且采用1602A LCM的液晶显示模块后不仅满足了大量数据的显示,,系统的硬件电路变的十分简单清晰明朗。
本设计采用了这种方案。
2 温度采集模块采用常用的温度采集芯片DS18B20单线数字温度传感器进行温度的采集。
万年历说明书
万年历说明书摘要:本作品以STC89C52单片机为控制核心,利用DALLAS公司的DS1302时钟芯片和1602液晶作为显示屏,是一款成本低廉的实用的万年历。
概述:一、主控电路采用STC89C52单片机作为主控芯片。
STC89C52单片机采用51内核,有3个定时器,四个并行端口,一个串口,5个中断源,内部资源丰富。
51单片机具有位操作能力,特别适合控制串行接口的器件。
STC单片机采用在系统编程技术,利用单片机自带的串口对其编程,简化了编程工作,缩短了开发周期。
二、时钟电路本作品的时钟计时部分单独设计了时钟电路,而没有采用一般的单片机计时的方法。
采用单片机计时的方法具有很明显的缺点:单片机断电后就不能继续计时,不能保存时间信息;为了能正常的使用,需在每次给单片机上电后重新给单片机设定时间。
为了克服以上的缺点,本作品采用DS1302时钟芯片作为计时电路。
DS1302时钟芯片具有成本低,与单片机的接口电路简单,操作简单的特点,只需配上一个32.768K的手表晶振和一节纽扣电池就可以工作。
纽扣电池作为备用电源。
DS1302内含有一个实时时钟/日历和31 字节静态RAM。
手表晶振实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM 指示决定采用24或12小时格式。
三、显示显示部分采用1602 液晶,具有美观,显示的信息量大,操作方便的特点。
1602液晶内带英文字库和各种图形符号,大大的简化了编程工作。
四、电源本作品采用USB供电,USB电压是标准的5V电压,手机充电器,MP3充电器等都能够提供,省去了电池供电所必须的稳压电路,使电路简化。
作品原理图:部分程序代码:#include<reg52.h>#include"1602.h"#include"DS1302.h"sbit LED = P2^0;/***********主函数**************/void main(void){SYSTEMTIME CurrentTime;unsigned char Second;LCD_init();delay_nms(100)DS1302_Initial();LCD_dsp_string(0,1,"Date: ");LCD_dsp_string(0,2,"Time: ");//LCD_dsp_string(1,1,"LCDTEST");//在第一行第一列显示"LCDTEST"//LCD_dsp_string(1,2,"SUCCESSFUL");//在第二行第一列显示"SUCCESSFUL"CurrentTime.Year = 9;CurrentTime.Month = 10;CurrentTime.Day = 21;CurrentTime.Week = 3;CurrentTime.Hour = 10;CurrentTime.Minute = 28;CurrentTime.Second = 27;DS1302_SetTime(&CurrentTime);while(1){DS1302_GetTime(&CurrentTime);if(Second!=CurrentTime.Second) {Second=CurrentTime.Second;LED = ~LED;}LCD_dsp_string(6,1,"20");LCD_dsp_char(8,1,(CurrentTime.Year%100)/10+0x30);LCD_dsp_char(9,1,(CurrentTime.Year%10)+0x30);LCD_dsp_string(10,1,"-");LCD_dsp_char(11,1,(CurrentTime.Month/10)+0x30);LCD_dsp_char(12,1,(CurrentTime.Month%10)+0x30);LCD_dsp_string(13,1,"-");LCD_dsp_char(14,1,(CurrentTime.Day/10)+0x30);LCD_dsp_char(15,1,(CurrentTime.Day%10)+0x30);LCD_dsp_char(6,2,(CurrentTime.Week)+0x30);LCD_dsp_char(8,2,(CurrentTime.Hour%100)/10+0x30);LCD_dsp_char(9,2,(CurrentTime.Hour%10)+0x30);LCD_dsp_string(10,2,":");LCD_dsp_char(11,2,(CurrentTime.Minute/10)+0x30);LCD_dsp_char(12,2,(CurrentTime.Minute%10)+0x30);LCD_dsp_string(13,2,":");LCD_dsp_char(14,2,(CurrentTime.Second/10)+0x30);LCD_dsp_char(15,2,(CurrentTime.Second%10)+0x30);}}。
【完美升级版】多功能电子万年历设计_毕业论文设计
论文题目:多功能电子万年历的设计学院电气工程学院多功能电子万年历设计专业:自动化姓名:指导老师:摘要随着科学技术的快速发展,纵观太阳、摆钟到现在电子钟,人类不断研究,不断创新进步。
目前,单片机技术的应用产品已经走进了千家万户。
多功能电子万年历的出现给人们的生活带来了诸多方便。
此产品是基于STC89C52RC单片机的日历显示系统,它能显示公历年、月、日,以及时、分、秒、温度、星期等信息,而且还具有调整时间,温度采集,闹钟及个性化的闹铃等功能。
系统所用的时钟日历芯片DS1302具有高性能、低功耗、接口简单的特点,使本系统电路简化,编程方便,同时功能也很强。
采用STC89C52RC单片机的万年历系统可以很好的改善传统采用模拟电路引起的计时不准确,不可靠,一致性差等问题。
此系统计时精确,价格低廉,可以广泛应用在生活,学习和工作等任何领域,并且起到重要作用。
关键词:万年历,单片机,时钟芯片,温度芯片ABSTRACTAlong with the technical fast development, time passing, to from the view sun, the pendulum clock to the present electron clock, the humanity studies unceasingly, innovates unceasingly the record. At present, the monolithic integrated circuit technology's application product already entered everyone. The electronic ten thousand calendar's appearances have brought conveniently many for people's life.This design is one based on STC89C52RC single-chip microcomputer calendar display system, it can demonstrate years, the month, the date of the Gregorian calendar, and hour, minute, second, temperature, week and so on. Moreover it has also provided the lunar calendar information, adjustable time pattern, temperature sample, alarm system, individual quarter-bell and so on. The system clock calendar DS1302 with high performance, low power consumption and simple interface features Circuit enable the system to streamline programming convenience, but also highly functional. The problems of inaccurate, unreliable, and the uniform inferior can be come up when you use the analogous circuit. However, it can be improved when you use the clock system based on STC89C52RC single-chip microcomputer. The system time accurate, low cost and can be widely applied to the life, study and work in any field, and has played an important role.Key words:The Electronic Calendar Clock, Single-chip Microcomputer, The Time Calendar Clock, Temperature Chip目录ABSTRACT (3)1 绪论 (8)1.1多功能电子万年历的研究背景与意义 (8)1.2多功能电子万年历的发展现状 (9)1.3论文研究的内容 (9)1.4 本设计进行的主要工作 (10)1.5本多功能电子万年历系统主要要实现的功能 (10)2单片机的简介 (11)2.1单片机的介绍 (11)3 方案设计与论证 (13)3.1单片机芯片设计与论证 (13)3.2 电源模块设计与论证 (14)3.3 按键控制模块设计与论证 (14)3.4 时钟模块设计与论证 (15)3.5 温度采集模块的设计与论证 (15)3.6 显示模块设计与论证 (15)4 系统的硬件设计 (17)4.1 主控芯片STC89C52RC与复位电路和时钟振荡电路 (17)4.1.1 STC89C52RC的概述 (17)4.1.2复位电路和时钟振荡电路 (19)4.2 时钟芯片DS1302接口设计和性能分析 (20)4.2.1 DS1302性能简介 (20)4.2.2 DS1302接口电路设计 (21)4.3 温度芯片DS18B20接口设计和性能分析 (25)4.3.1 DS18B20的性能介绍 (25)4.3.2 DS18B20的接口电路设计 (26)4.4 闹钟模块系统设计于性能分析 (26)4.4.1 AT24C02器件分析 (27)4.4.2 接口电路的设计 (28)4.5 LCD显示模块 (28)4.5.1 LCM1602的特性及使用说明 (28)4.5.2 LCM1602与STC89C52RC单片机的接口电路 (30)4.6 按键模块设计 (31)4.7蜂鸣器设计 (32)5 软件设计 (34)5.1 软件总体部分的设计 (34)5.2 LCD驱动及液晶显示 (36)5.3 按键识别及处理 (36)5.4 温度数据采集 (36)5.5 时间数据采集 (38)5.6 闹钟程序 (40)6 系统的测试 (42)总结 (45)致谢 (46)参考文献 (47)附录 (48)1 绪论1.1多功能电子万年历的研究背景与意义伴随着单片机和电子技术的快速发展,人类不断研究,不断创新纪录。
多功能电子万年历讲解
兰州理工大学第六届大学生电子设计竞赛题目:多功能电子万年历学院:计算机与通信学院班级:xxxxxxxx12级1班姓名:xxxx、xxxxxx、xxxxxx学号:12xx0xxx、12xx01xx、12xx01xx兰州理工大学目录摘要 (2)1 系统方案 (3)1.1比较与选择 (3)1.1.1 界面显示和语音提示: (3)1.1.2 时间的实现 (3)1.1.3 处理器的选择 (3)1.2方案描述 (4)2 理论分析与计算 (4)2.1日程设定与日期计算 (4)2.1.1 日期计算 (4)3 电路与程序设计 (7)3.1硬件设计 (7)3.1.1 硬件系统分析 (7)3.1.2 硬件描述 (7)3.2软件系统设计 (12)3.2.1 软件流程图 (12)3.2.2 各模块功能主程序设计 (14)4 测试方案与测试结果 (17)4.1各模块调试方案 (17)4.1.1 STC89C52主芯片调试 (17)4.1.2 DS1302时钟芯片调试 (18)4.1.3 蜂鸣器调试 (19)4.1.4 AT24C08数据存储器调试 (20)4.1.5 12864LCD显示模块调试 (20)4.1.6 总体调试 (21)结论 (22)系统功能 (22)操作说明: (23)参赛总结 (23)参考文献 (24)附录 (25)附录一系统原理图 (25)附录二原程序代码 (26)多功能电子万年历摘要电子万年历是一种非常广泛日常计时工具。
它可以对年、月、日、周日、时、分、秒进行精确计时,同时可显示闰年农历温度信息,在日常生活中极为实用,DS1302是常用的时钟芯片,价格低廉,精度高且对于数字电子万年历采用直观的数字显示,还具有时间校准等功能。
该系统以STC89C52单片机作为系统控制处理器,采用具有涓细电流充电能的低功耗实时时钟电路DS1302。
它可以对年、月、日、周日、时、分、秒进行计时。
同时通过蜂鸣器进行半整点报时和闹钟提示,并采用AT24C08数据存储器实现掉电数据存储功能.系统各个界面通过LCD12864显示。
电子万年历工作原理
电子万年历工作原理
电子万年历的工作原理主要是通过内置的时钟芯片、显示屏和计算电路来实现的。
1. 时钟芯片:电子万年历内置了一个高精度的时钟芯片,通常是基于石英振荡器的晶体振荡器。
这个时钟芯片可以提供准确的时间和日期信息。
2. 计算电路:电子万年历中的计算电路可以根据当前的时间和日期计算出其他相关的信息。
例如,根据年份可以计算出当前是否是闰年,根据日期可以计算出当前是星期几等等。
3. 显示屏:电子万年历通常使用液晶显示屏或LED显示屏来
显示日期、时间和其他相关信息。
这些显示屏可以根据计算电路提供的数据来显示相应的信息。
4. 按键和控制电路:电子万年历通常配有一些按键,用户可以通过按键来调整显示的日期和时间,以及进行其他操作。
控制电路负责接收按键的输入,并根据用户的操作实现相应的功能。
总的来说,电子万年历的工作原理就是通过内部的时钟芯片提供准确的时间和日期信息,计算电路根据这些时间和日期数据计算出其他相关信息,并将结果通过显示屏展示给用户。
用户还可以通过按键和控制电路来操作电子万年历。
电子万年历制作实习报告
实习报告:电子万年历制作实习时间:2023年2月24日至2023年3月10日实习单位:XX科技有限公司实习内容:电子万年历制作一、实习目的本次实习的主要目的是通过制作电子万年历,使我能够更好地理解和掌握电子技术的基本知识和技能,提高我的实际操作能力和创新能力。
二、实习内容1. 学习电子万年历的基本原理和工作原理。
2. 学习电子万年历的主要组成部分,包括单片机、时钟芯片、液晶显示屏等。
3. 学习如何使用相关工具和设备进行电子万年历的制作。
4. 完成电子万年历的制作,并进行测试和调试。
三、实习过程1. 学习阶段:在这个阶段,我通过阅读相关资料和向工程师请教,了解了电子万年历的基本原理和工作原理,以及其主要组成部分。
2. 制作阶段:根据所学知识,我开始进行电子万年历的制作。
首先,我进行了电路的设计,然后进行了PCB板的焊接,最后进行了电路的调试。
3. 测试阶段:制作完成后,我对电子万年历进行了测试。
测试内容包括日期的显示、时间的显示、星期的一周循环、闹钟功能等。
四、实习收获通过这次实习,我不仅学到了关于电子万年历的相关知识,还提高了我的实际操作能力和创新能力。
在制作过程中,我学会了如何使用相关工具和设备,掌握了电子万年历的制作技巧。
在测试过程中,我学会了如何对电子万年历进行调试和故障排除。
此外,我还学会了如何与团队成员合作,共同完成任务。
在制作过程中,我与团队成员积极沟通,共同解决问题,取得了良好的团队合作效果。
五、实习反思虽然我完成了电子万年历的制作,但在制作过程中还存在一些问题。
首先,我的电路设计能力还有待提高,有时会出现一些不必要的错误。
其次,我的焊接技术还不够熟练,有时会出现焊接不良的情况。
最后,我在调试过程中有时会忽略一些细节,导致调试效果不理想。
为了提高我的电子技术能力,我决定加强学习和实践。
一方面,我将深入学习电子技术的相关知识,提高我的理论水平。
另一方面,我将多参加实践项目,提高我的实际操作能力。
基于液晶显示的万年历
基于液晶显示的万年历毕业设计(论文)报告题目基于液晶显示的万年历系别专业班级学生姓名学号指导教师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转换等原理.该系统能够显示年,月,日,小时,分钟,秒,星期,农历,温度,通过按键可以修改时间等功能.此系统结构简单,功能齐全,具有一定的推广价值。
万年历ds1302
1 引言随着微电子技术和超大规模集成电路技术的不断发展,家用电子产品不但种类日益丰富,而且变得更加经济实用,单片微型计算机体积小、性价比高、功能强、可靠性高等独有的特点,在各个领域得到了广泛的应用。
电子万年历是一种应用非常广泛的日常计时工具,数字显示的日历钟已经越来越流行,特别是适合在家庭居室、办公室、大厅、会议室、车站和广场等使用。
LED数字显示的日历钟显示清晰直观、走时准确、可以进行夜视,并且还可以扩展出多种功能。
功能也越来越齐全,除了公历年月日、时分秒、星期显示及闹铃。
但通过我们对各种电子钟表、历的不断观察总结发现目前市场的钟、历都存在一些不足之处,比如:时钟不精确、产品成本太高、无环境温度显示等,这都给人们的使用带来了某些不便。
为此设计了一种功能全面、计时准确、成本低廉的基于51单片机的万年历。
2 功能要求1. 万年历能用数码管显示阳历年、月、日、星期、[小]时、分、秒并设置指定时间的闹铃。
2. 数字式温度计要求测温范围-50~100°C,LED数码管直读显示。
3 方案论证与设计3.1 控制部分的方案选择1. 用可编程逻辑器件设计。
可采用ALTERA公司的FLEX10K系列PLD器件。
设计起来结构清晰,各个模块,从硬件上设计起来相对简单,控制与显示的模块间的连接也会比较方便。
但是考虑到本设计的特点,EDA在功能扩展上比较受局限,而且EDA占用的资源也相对多一些。
从成本上来讲,用可编程逻辑器件来设计也没有什么优势。
2. 用凌阳16位单片机设计。
凌阳16位单片机有丰富的中断源和时基,方便本实验的设计。
它的准确度相当高,并且C语言和汇编兼容的编程环境也很方便来实现一些递归调用。
I/O口功能也比较强大,方便使用。
用凌阳16位单片机做控制器最有特色的就是它的可编程音频处理,可完成语音的录制播放和识别。
这些都方便对设计进行扩展,使设计更加完善。
成本也相对低一些。
但是,在控制与显示的结合上有些复杂,显示模组资源相对有限,而且单片机的稳定性不是很高。
单片机万年历的实训报告
一、实训背景随着科技的不断发展,单片机技术在各个领域得到了广泛的应用。
单片机具有体积小、功耗低、成本低、可靠性高等优点,因此在智能仪表、工业控制、家用电器等领域具有很高的应用价值。
万年历作为一种时间记录工具,在日常生活中有着广泛的应用。
本实训旨在通过单片机万年历的设计与实现,提高学生对单片机编程和硬件应用能力的培养。
二、实训目的1. 熟悉单片机的基本原理和编程方法;2. 掌握万年历的设计与实现方法;3. 提高学生的动手能力和实践能力;4. 培养学生的创新意识和团队协作精神。
三、实训内容1. 单片机万年历硬件设计(1)单片机核心:选用AT89C51单片机作为核心控制器,其具有丰富的I/O接口,便于与其他外围电路连接。
(2)时钟芯片:选用DS1302时钟芯片,用于存储和提供系统时间,具有年、月、日、时、分、秒等信息。
(3)显示模块:选用LCD1602液晶显示屏,用于显示年、月、日、时、分、秒、星期等信息。
(4)按键模块:选用独立按键,用于设置和调整时间、日期、星期等信息。
(5)温度传感器:选用DS18B20数字温度传感器,用于检测环境温度。
2. 单片机万年历软件设计(1)系统初始化:对单片机进行初始化,设置时钟频率、I/O端口等。
(2)时钟读取与显示:从DS1302时钟芯片读取时间,并在LCD1602显示屏上显示。
(3)按键处理:对按键进行扫描和处理,实现时间、日期、星期等信息的设置和调整。
(4)温度检测与显示:从DS18B20温度传感器读取温度,并在LCD1602显示屏上显示。
(5)温度报警:当温度超过设定值时,通过蜂鸣器发出报警信号。
3. 单片机万年历功能实现(1)显示年、月、日、时、分、秒、星期等信息。
(2)设置和调整时间、日期、星期等信息。
(3)显示环境温度。
(4)温度报警功能。
四、实训结果与分析1. 硬件电路搭建成功,实现了万年历的基本功能。
2. 软件编程完成,实现了万年历的时间显示、按键处理、温度检测与显示、温度报警等功能。
基于MCS-51单片机的万年历设计
基于MCS-51单片机的万年历设计摘要】:基于MCS-51单片机的万年历设计,利用时钟芯片DS1302,单片机的I/O口外接液晶12864,通过软件模拟的方法,从而使得液晶12864显示所需的字符。
【关键词】单片机时钟芯片DS1302 液晶128641、引言单片机是一种可通过编程控制的微处理器,单片机芯片自身不能单独运用于某项工程或者产品上,它必须要依靠外围数字器件或模拟器件的协调才可以发挥其自身的强大功能,本文介绍如何使用DS1302,实现显示万年历的效果。
2、硬件组成液晶12864显示系统实际是由51单片机最小系统、液晶12864、DS1302等构成,如下图1所示。
3、程序设计#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit clk=P3^5; //7sbit io=P3^7; //6sbit rst=P3^6; //5sbit cs=P2^0; //4脚sbit sid=P2^1; //5脚sbit sclk=P2^2; //6脚void read_time()//读1302全部时间{ uchar temp;temp=read_1302(0x81);//读秒.bcd编码curr.sec=(((temp>>4)&0x07)*10+(temp&0x0f));temp=read_1302(0x83);//读分.bcd编码curr.min=((temp>>4)&0x07)*10+(temp&0x0f);//秒钟显示temp=read_1302(0x85);//读时.bcd编码24小时curr.hr=((temp>>4)&0x03)*10+ (temp&0x0f);temp=read_1302(0x87);//读日.bcd编码24小时curr.date=((temp>>4)&0x03)*10+ (temp&0x0f);temp=read_1302(0x89);//读月.bcd编码24小时curr.mon=((temp>>4)&0x01)*10+ (temp&0x0f);temp=read_1302(0x8b);//读周.bcd编码24小时curr.week= (temp&0x0f);temp=read_1302(0x8d);//读年.bcd编码24小时curr.year=((temp>>4))*10+ (temp&0x0f);}void show_time(){ uchar buf[9];LCD_drive(0,0x91); //年LCD_drive(1,(curr.year)/10+48);LCD_drive(1,(curr.year)%10+48);LCD_drive(0,0x93);//月LCD_drive(1,(curr.mon)/10+48);LCD_drive(1,(curr.mon)%10+48);LCD_drive(0,0x95); //日LCD_drive(1,(curr.date)/10+48);LCD_drive(1,(curr.date)%10+48);//LCD_drive(0,0x87); //小时,分中,秒钟buf[0]=(curr.hr)/10+48;buf[1]=(curr.hr)%10+48;buf[2]=':';buf[3]=(curr.min)/10+48;buf[4]=(curr.min)%10+48;buf[5]=':';buf[6]=(curr.sec)/10+48;buf[7]=(curr.sec)%10+48;buf[8]=0;show_string(0x88,buf); //???LCD_drive(0,0x9a);LCD_drive(1,(curr.week)+48); //星期}void show_static()//静态部分显示{ show_string(0x80,"实时时钟");show_string(0x90,"20 年月日");show_string(0x98,"星期");}void main(){ uchar temp;uchar sec;//真正的秒钟LCD_init();show_string(0x80,"DS1302时钟");spi_portinit();//端口初始化write_1302(0x8e,0);//取消DS1302的写保护write_1302(0x80,0x12);//秒钟初值show_static();while(1){ read_time();show_time();}}4、结束当上述程序编写好之后,我们需要使用编译软件对其编译,得到单片机能识别的二进制代码,然后再用编程器将二进制代码烧写到单片机中,就能看到液晶12864的显示万年历。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Write_Ds1302(0x8E,0X00);//关闭写保护
Write_Ds1302(write_add[0],l_tmpdate[0]);
Write_Ds1302(0x8E,0x80);//打开写保护
}
write_com(0x80+0x40+11);
}
void write_lcd()//写时间函数
{
static uchar i,temp[2];
switch(i)
{
case 0: write_com(0x80+0x40+0x0b);break;//秒
case 1: write_com(0x80+0x40+8);break;//分
case 2: write_com(0x80+0x40+5);break;//时
}//写time0
write_com(0x80+0x40);
for(num=0;num<13;num++)
{
write_data(time1[num]);
delay(5000);
}//写time1
}
void Write_Ds1302_Byte(uchar temp) //写一个字节
{
uchar i;
void Write_Ds1302(uchar add,uchar dat )//向寄存器写数据
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;//启动
_nop_();
Write_Ds1302_Byte(add); //发送地址
Write_Ds1302_Byte(dat); //发送数据
write_com(0x0f);//显示光标并且闪烁
}
if(setn==4)
{
write_com(0x80+15);
write_com(0x0f);
}
if(setn==5)
{
write_com(0x80+12);
write_com(0x0f);
}
if(setn==6)
{
write_com(0x80+9);
if(set==0)
{
//flag=1;//时间停止
delay(5000);//去键盘按下抖动
if(set==0)
{
delay(500);
while(!set);
delay(500);//去键盘抬起时抖动
while(!set);
delay(500);
flag=1;
setn++;
if(setn==1)
sbit set=P1^0;//定义按键端口
sbit s1=P1^1;
sbit s2=P1^2;
sbit s3=P1^3;
void keyscan1();void keyscan();
/************液晶口定义*******/
sbit RS=P2^0;//RS为数据/指令选择1/0
sbit RW=P2^1;//读写
Write_Ds1302(0x8E,0x80);//打开写保护
flag=0;//时钟正常运行
write_com(0x0c);//光标停止闪烁
}
}
}
if(setn!=0)//更改时间
{
if(s1==0)//增加时间
{
delay(5000);
if(s1==0)
{
while(!s1);
delay(5000);//去键盘抬起时抖动
extern uchar data dis_buf2[16];
void delay(uint z)
{
while(--z);
}
void write_com(uchar com)//液晶写命令函数
{
RS=0;//写命令使能
RW=0;//写
delay(5000);
/****在高脉冲下命令输入*****/
E=0;
case 3: write_com(0x80+0x0b);break;//日
case 4: write_com(0x80+8);break;//月
case 5: write_com(0x80+0x0e);break;//星期
case 6: write_com(0x80+5);break;//年
}
temp[0]=l_tmpdate[i]/16;//数据的转换
l_tmpdate[1]++;
if(l_tmpdate[1]==60)
l_tmpdate[1]=0;
{
tp=l_tmpdate[1]/10;
l_tmpdate[1]=l_tmpdate[1]%10;
l_tmpdate[1]=l_tmpdate[1]+tp*16;
}
uchar Read_Ds1302(uchar address )//从寄存器读数据
{
uchar date;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
date=Read_Ds1302_Byte();
RST=0;
void Set_RTC(void) //设定日历
{
uchar i,*p,tmp;
for(i=0;i<7;i++)
{ //BCD处理,将十六进制转换成十进制
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]%10;
l_tmpdate[i]=l_tmpdate[i]+tmp*16;
_nop_(); //以下为DS1302复位的稳定时间
RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return (date);
}
/*********************************************************/
}
Write_Ds1302(0x8E,0x00);//关闭写保护
p=write_add;//传要写的寄存器地址
for(i=0;i<7;i++) //7次写入秒分时日月周年
{
Write_Ds1302(*p,l_tmpdate[i]);
p++;
}
Write_Ds1302(0x8E,0x80);//打开写保护
write_com(0x06);//光标移动设置整屏不移动
write_com(0x0c);//屏幕开、光标不闪(0)不显示(0)
delay(5000);
write_com(0x80);
for(num=0;num<16;num++)
{
write_data(time0[num]);
delay(5000);
write_com(0x0f);
}
if(setn==7)
{
write_com(0x80+6);
write_com(0x0f);
}
if(setn==8)
{
setn=0;
Write_Ds1302(0x8E,0X00);//关闭写保护
Write_Ds1302(write_add[0],l_tmpdate[0]); //写秒
RST=0; //恢复
}
uchar Read_Ds1302_Byte()//读一个字节
{
uchar i,temp=0x00;
for (i=0;i<8;i++) //循环8次读取数据
{
if(SDA)
temp|=0x80; //每次传输低字节
SCK=0;
temp>>=1; //右移一位
SCK=1;
}
return(temp);
{
write_com(0x80+0x40+12);//将光标移动到秒个位
write_com(0x0f);//显示光标并且闪烁
}
if(setn==2)
{
write_com(0x80+0x40+9);//将光标移动到分个位
write_com(0x0f);//显示光标并且闪烁
}
if(setn==3)
{
write_com(0x80+0x40+6);//将光标移动到时个位
{
write_data(dis_buf2[j]);
}
}
delay(500);
while(!s3);
delay(500);//去键盘抬起时抖动
while(!s3);
delay(500);
init();
Read_RTC();
write_lcd();
}
}
void keyscan()
{
uchar tem[2],tp,flag;//存储要更改的时间数据
P0=com;
delay(500);
E=1;
delay(500);
E=0;
}
void write_data(uchar dat)//液晶写数据函数
{பைடு நூலகம்
RS=1;//写数据使能