用DS1302+LCD1602制作的时钟
DS1302与液晶1602简单时钟

《单片机原理实验》考试报告题目:DS1302和1602时钟姓名:学号:班级:专业:电子信息工程指导老师:提交时间:DS1302和1602时钟***(**学院电子信息工程 ***班 **********)摘要:关键词:DS1302 ,液晶1602,89C51。
1.引言我们在日常生活中常常用到时钟来记录时间,有时候还不能准确的记录下时间,这就要用到芯片DS1302了。
时间还远远不够,因为人性化的设计自然是要清楚的显示年、月、日、星期、时间。
而在此用到的DS1302非常好的与时间进行同步,并且在掉电时不会对时间有影响,较理的考虑到了人们的思维模式,从而简单的控制了时钟,结合了常理的理论。
2.原理DS1302引脚X1 X2 32.768KHz 晶振管脚GND 地CE 复位脚I/O 数据输入/输出引脚SCLK 串行时钟Vcc1,Vcc2 电源供电管脚各引脚的功能为:Vcc1:主电源;Vcc2:备份电源。
当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。
SCLK:串行时钟,输入,控制数据的输入与输出;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期间,必须为高。
该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。
DS1302控制字:控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1(A4~A0):指示操作单元的地址;位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。
控制字总是从最低位开始输出。
在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。
同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。
基于DS1302和LCD1602的可调数字钟

学习情境2-可调式数字钟之基于DS1302和LCD1602的可调数字钟☆点名,复习1、DS1302的引脚及其功能,以及DS1302与单片机的硬件连接?2、如何对DS1302读写数据,如何得到DS1302的时钟?☆新课讲授2.3 基于DS1302与LCD1602设计的可调数字钟上堂课程我们学会了使用DS1302,知道了如何在单片机系统中的连接,也详细的学习了如何得到DS1302的时钟,并且我们使用了16个数码管把年月日和时分秒实时地显示出来。
但数码管的显示毕竟有其自身的缺陷,现在在工业控制的各个环节,都使用液晶进行人机联系。
在日常生活中,我们对液晶显示器并不陌生。
液晶显示模块已作为很多电子产品的通用器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED 数码管、液晶显示器。
发光管和LED数码管比较常用,软硬件都比较简单,在单片机系统中应用液晶显示器作为输出器件有以下几个优点:(1)显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
(2)数字式接口,液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
(3)体积小、重量轻,液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
(4)功耗低,相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
2.3.1 LCD1602技术资料2.3.1.1 液晶显示简介1、液晶显示原理:液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟

实验目的:1、能够以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计一款电子钟2、熟悉DS1302芯片的工作过程3、熟悉CD1602芯片的工作过程4、可以进行必要的扩展,如用第三DS18B20新品进行温度采集和显示5、熟悉掌握51的c程序的编写6、掌握用Proteus进行系统设计仿真验证实验仪器、仪表目录1、DS1302实时时钟芯片1片2、LCD1602液晶显示屏1个,3、80C52芯片1片5、DS18B20芯片一片6、晶振、电容、电阻、开关各若干等7、proteus仿真软件8、Keil C51、PC机实验设计任务以DS1302实时时钟芯片和液晶显示屏LCD1602为基础设计一个电子钟,要求:时间和日期可调整,按键采用3个按键;至少在Proteus上调试通过。
扩展:闹钟和重要日期提醒功能(增加蜂鸣器),闹铃音乐功能实验步骤1、打开Keil软件,新建一个工程文件,选择好芯片,并记得在“Options for Target 1”的Output 选项中,将Create HEX Fil选项勾起来。
2、将编写的程序保存成“.C”的形式3、编译保存好的C文件,并根据提示修改程序中的错误,直到编译成功为止4、打开proteus软件,画出实验电路图5、在89C52中,载入原来已生成的HEX文档6、按下运行键,对Proteus进行软件仿真,观察运行结果原理、结果及分析一、设计方案原理与设计特点分析电子钟总的设计模块:各个模块电路原理分析:1、DS1302时钟采集模块:1.1电路原理图:1.2 DS1302分析:首先DS1302是DALLAS公司推出的涓流充电时钟芯片。
内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作。
DS1302芯片广脚介绍:X1、X2为32.768KHz晶振管脚。
GND 为地。
单片机时钟芯片DS1302在LCD1602上显示年月日时分秒

单片机设计实验内容摘要:单片机实验是通过Proteus仿真并且与Keil相结合使用控制单片机使其在仿真中完成一系列所设计的程序。
我们这个小组所做的实验是仿真一个数字时钟,通过DS1302这个芯片从计算机上读取时间信息,再由51单片机对数据进行处理、分配,将其输出在LCD1602上,实现简单的数字时钟的功能。
设计内容及要求:(1)根据设计课题的技术指标和给定条件,在教师指导下,能够独立而正确地进行方案论证和设计计算,要求概念清楚、方案合理、方法正确、步骤完整;(2)要求学生掌握单片机的设计内容、方法和步骤;(3)要求会查阅有关参考资料和手册等;(4)要求学会选择有关元件和参数;(5)要求学会绘制有关电路图和设计流程图;(6)要求学会编写设计说明书。
系统框图:硬件选择:1、AT89C51AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
AT89C51外形及引脚排列主要特性:·与MCS-51 兼容·4K字节可编程FLASH存储器·寿命:1000写/擦循环·数据保留时间:10年·全静态工作:0Hz-24MHz·三级程序存储器锁定·128×8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路特性概述:AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
基于DS1302和LCD1602的数字电子钟设计

关键词:单片机;DS1302;LCD1602;数字时钟
1
Abstract
This paper mainly introduces the hardware and software design of digital electronic clock which is made up of the AT89S52 MCU ,DS1302 clock chip and LCD1602 module .It can accurately adjust the information of the year,month,day,hour,minutes and seconds.This electronic clock has the characteristics of working accurately,keeping the time date when system losing power, and low power consumptions. Keywords: singlechip;DS1302;LCD1602;Digital clock
图(3)系统硬件连接原理图
8
三.系统软Leabharlann 设计[3]软件是单片机应用系统的灵魂,是整个系统的核心部分。如果把硬件比作人的手臂那么 软件就是人的大脑,手臂的一切动作的执行都要受控于大脑。同样,对 DS1302 时钟芯片和 1602 液晶显示模块的操作都是通过相应的软件程序来控制的。 3.1 DS1302 读写程序 任何一款数字芯片都有自己的操作时序,只有完全按照芯片厂商提供的操作时序进行编 程才可以使其正常工作。DS1302 的读写时序如图(4)所示。 按照此时序图编制的写操作程序如下:
2
一.引言
1.DS1302 时钟芯片简介[1]
LCD1602显示DS1302时钟时间

/******************************************************************* DS1302ºÍLCD1602£¬C51µ¥Æ¬»úCÓïÑÔ*****************************************************************/ #include<AT89x51.h>#define uchar unsigned char/**********DS1302******************/#define write_second 0x80#define write_minute 0x82#define write_hour 0x84#define read_second 0x81#define read_minute 0x83#define read_hour 0x85#define write_day 0x86#define read_day 0x87#define write_month 0x88#define read_month 0x89#define write_week 0x8A#define read_week 0x8B#define write_year 0x8C#define read_year 0x8D#define write_protect 0x8E/******DS1302*************/sbit ACC_7=ACC^7;sbit SCLK =P1^2;sbit DIO =P1^3;sbit CE =P1^4;sbit P3_add=P3^0;sbit P3_OK =P3^1;//////LCD1602//////////////#define LCD_DB P0sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_E=P2^2;/******¶¨Ò庯Êý****************/#define uchar unsigned char#define uint unsigned intvoid LCD_init(void);//ÉùÃ÷³õʼ»¯º¯Êývoid LCD_write_command(uchar command);//дָÁÊývoid LC D_write_data(uchar dat);//дÊý¾Ýº¯Êývoid delay_n40us(uint n);//ÑÓʱº¯Êý//*******³õʼ»¯º¯Êý***************void LCD_init(void){LCD_write_command(0x38);//ÉèÖÃ8λ¸ñʽ£¬2ÐУ¬5x7LCD_write_command(0x0c);//ÕûÌåÏÔʾ£¬¹Ø¹â±ê£¬²»ÉÁ˸LCD_write_command(0x06);//É趨ÊäÈ뷽ʽ£¬ÔöÁ¿²»ÒÆλ--------------LCD_write_command(0x01);//Çå³ýÆÁÄ»ÏÔʾ----------------delay_n40us(100);//ʵ¼ùÖ¤Ã÷£¬ÎÒµÄLCD1602ÉÏ£¬ÓÃfor Ñ»·200 ´Î¾ÍÄÜ¿É¿¿Íê³ÉÇåÆÁÖ¸Áî¡£}//********дָÁÊý***********ÉèÖÃÏÈÏò1602дÈëµÄÊý¾ÝΪµØÖ·*void LCD_write_command(uchar dat){LCD_DB=dat;LCD_RS=0;//Ö¸ÁîLCD_RW=0;//дÈëLCD_E=1;//ÔÊÐíLCD_E=0;//²úÉúϽµÑØdelay_n40us(1);//ʵ¼ùÖ¤Ã÷£¬ÎÒµÄLCD1602 ÉÏ£¬ÓÃfor Ñ»·1 ´Î¾ÍÄÜÍê³ÉÆÕͨдָÁî¡£}//дÈë×Ö·û´®º¯Êývoid writeDataLcd(unsigned ch ar dat)// дÈëÊý¾Ý{LCD_RS=1;LCD_RW=0;LCD_E=0;LCD_DB = dat;LCD_E=1;delay_n40us(10);LCD_E=0;}//********ÑÓʱº¯Êý***************void delay_n40us(uint n){ uint i;uchar j;for(i=n;i>0;i--)for(j=0;j<2;j++); //ÔÚÕâ¸öÑÓʱѻ·º¯ÊýÖÐÎÒÖ»×öÁË2´ÎÑ»·}//**********DS1302*************************//void write1302(unsigned char addr,dat){unsigned char i,temp;CE=0;SCLK=0;CE=1;for(i=0;i<8;i++) //????{SCLK=0;temp=addr;if(temp&0x01==0x01)DIO=1;elseDIO=0;addr>>=1;SCLK=1;}for(i=0;i<8;i++) //????{SCLK=0;temp=dat;if(temp&0x01==0x01)DIO=1;elseDIO=0;dat>>=1;SCLK=1;}}unsigned char read1302(unsigned char addr) {unsigned char i,temp;CE=0;SCLK=0;CE=1;for(i=8;i>0;i--)//?????????{SCLK =0;temp =addr;if(temp&0x01==0x01)DIO=1;elseDIO=0;addr>>=1;SCLK=1;}for(i=8;i>0;i--)//???{ACC_7=DIO;SCLK=1;ACC>>=1;SCLK=0; //???????}CE=0;return(ACC);}///////////////////////////////////// void Initial(void){write1302(write_protect,0x00);write1302(write_second,0x56);write1302(write_minute,0x34);write1302(write_hour,0x12);write1302(write_protect,0x80);}//*********Ö÷º¯Êý*****************void main(void){uint i;uchar sec,min,hour,week,year,month,day;EA=1;EX0=1;Initial();LCD_init();write1302(write_hour,0x23);write1302(write_minute,0x58);write1302(write_year,15);write1302(write_month,11);write1302(write_day,20);write1302(write_week,5);while(1){sec=read1302(read_second);min=read1302(read_minute);hour=read1302(read_hour);week= read1302(read_week);year =read1302(read_year);month= read1302(read_month);day=read1302(read_day);LCD_write_command(0x80);writeDataLcd(0x00);if(hour<12)writeDataLcd(0x41);elsewriteDataLcd(0x70);writeDataLcd(0x6d);writeDataLcd(0x3a);writeDataLcd(0x30+(0x03 & (hour>>4))); writeDataLcd(0x30+(0x0f & hour)); writeDataLcd(0x3a);writeDataLcd(0x30+(0x07 & (min>>4)));writeDataLcd(0x30+(0x0f & min));writeDataLcd(0x3a);writeDataLcd(0x30+(0x07 & (sec>>4))); writeDataLcd(0x30+(0x0f & sec)); writeDataLcd(0x00);writeDataLcd(0x00);writeDataLcd(0x30+week);for(i=0;i<49;i++)writeDataLcd(0x00);writeDataLcd(0x00);writeDataLcd(0x00);writeDataLcd(0x00);writeDataLcd(0x32);writeDataLcd(0x30);writeDataLcd(0x30+year/10); writeDataLcd(0x30+year%10); writeDataLcd(0x2d);writeDataLcd(0x30+month/10);writeDataLcd(0x30+month%10);writeDataLcd(0x2d); writeDataLcd(0x30+day/10); writeDataLcd(0x30+day%10);}}void intsvr0(void) interrupt 0 using 3 {}。
DS1302_LCD1602的万年历时钟_不可调

uchar DS_Read_date(uchar command) //DS1302 '读'子函数,有返回值
{
uchar i,K;
K=0;
DS_RST=1; //允许读写
for(i=0;i<8;i++) //先写入要操作的寄存器地址
{
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar Table []= //为LCD1602定义的数组
{
'0',
'1',
'2',
'3',
'4',
'5',
'6',
LCD_Write_com(0x01); //清显示
}
void LCD_Write_com(uchar com) //LCD1602写命令子函数
{
LCD_RS=0; //选择'命令'
LCD_RW=0; //选择'写'
P0=com; //写入命令
Delay(1); //延时
void DS_Init(); //DS1302初始化函数
uchar DS_Read_date(uchar command); //DS1302读数据函数,带返回值,返回值为读到的数
void DS_Write_date(uchar command, uchar date); //DS1302写数据函数
以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟

以DS1302实时时钟芯片和液晶显示屏CD1602实验目的:1、能够以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计一款电子钟2、熟悉DS1302芯片的工作过程3、熟悉CD1602芯片的工作过程4、能够进行必要的扩展,如用第三DS18B20新品进行温度采集和显示5、熟悉把握51的c程序的编写6、把握用Proteus进行系统设计仿真验证实验仪器、外表名目1、DS1302实时时钟芯片1片2、LCD1602液晶显示屏1个,3、80C52芯片1片5、DS18B20芯片一片6、晶振、电容、电阻、开关各若干等7、proteus仿真软件8、Keil C51、PC机实验设计任务以DS1302实时时钟芯片和液晶显示屏LCD1602为基础设计一个电子钟,要求:时刻和日期可调整,按键采纳3个按键;至少在Proteus上调试通过。
扩展:闹钟和重要日期提醒功能(增加蜂鸣器),闹铃音乐功能实验步骤1、打开Keil软件,新建一个工程文件,选择好芯片,并记得在“Opti ons for Target 1”的Output选项中,将Create HEX Fil选项勾起来。
2、将编写的程序储存成“.C”的形式3、编译储存好的C 文件,并按照提示修改程序中的错误,直到编译成功为止4、打开proteus 软件,画出实验电路图5、在89C52中,载入原先已生成的HEX 文档6、按下运行键,对Proteus 进行软件仿真,观看运行结果 原理、结果及分析一、设计方案原理与设计特点分析 电子钟总的设计模块:各个模块电路原理分析: 1、DS1302时钟采集模块: 1.1电路原理图:1.2 DS1302分析:第一DS1302是DALLAS 公司推出的涓流充电时钟芯片。
内含有一个实时时钟/日历和31字节静态RAM 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作。
DS1302芯片广脚介绍:X1、X2为32.768KHz 晶振管脚。
基于51单片机与DS1302时钟芯片和LCD1602液晶显示的数字时钟

unsigned char DS1302OutputByte(void) {
unsigned char i; for(i=8; i>0; i--) {
ACC = ACC >>1; ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; } return(ACC); }
P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
D1 LC
SD E
S V
VD
E V
S R
RW E
0 1 2 3 4 5 67 D D D D D D DD
D N +5V G 39 38
37
36 35
34
33 32
GotoXY(0,0); Print(" tian ma dian zi"); GotoXY(0,1); Print("Time: ");
Word 文档
.
while(1) {
DS1302_GetTime(&CurrentTime); TimeToStr(&CurrentTime); GotoXY(6,1); Print(CurrentTime.TimeString);
unsigned char i; ACC = d; for(i=8; i>0; i--) {
DS1302_IO = ACC0; DS1302_CLK = 1;
// 实时时钟写入一字节 (部函数 ) // 相当于汇编中的 RRC
Word 文档
.
DS1302_CLK = 0; ACC = ACC >> 1; } }
基于DS1302和LCD1602的可调数字钟

学习情境2-可调式数字钟之基于DS1302和LCD1602的可调数字钟☆点名,复习1、DS1302的引脚及其功能,以及DS1302和单片机的硬件连接?2、如何对DS1302读写数据,如何得到DS1302的时钟?☆新课讲授2.3 基于DS1302和LCD1602设计的可调数字钟上堂课程我们学会了使用DS1302,知道了如何在单片机系统中的连接,也详细的学习了如何得到DS1302的时钟,并且我们使用了16个数码管把年月日和时分秒实时地显示出来。
但数码管的显示毕竟有其自身的缺陷,现在在工业控制的各个环节,都使用液晶进行人机联系。
在日常生活中,我们对液晶显示器并不陌生。
液晶显示模块已作为很多电子产品的通用器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED 数码管、液晶显示器。
发光管和LED数码管比较常用,软硬件都比较简单,在单片机系统中使用液晶显示器作为输出器件有以下几个优点:(1)显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
(2)数字式接口,液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
(3)体积小、重量轻,液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
(4)功耗低,相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
2.3.1 LCD1602技术资料2.3.1.1 液晶显示简介1、液晶显示原理:液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛使用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
用DS1302与LCD1602设计可调数字万年历课程设计

数字开发与实践课程设计题目:用DS1302与LCD1602设计可调式电子日历时钟班级:姓名:学号:学院:年月日用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液晶显示屏,液晶显示屏的显示功能强大,可显示大量字符,且视觉效果较好,外形美观。
DS1302+LCD1602时钟

DS1302+LCD1602时钟1.实验目的效果:做一个不怕掉电的LCD显示时钟。
学习DS1302时钟芯片的读写,加强字符型液晶LCD1602的应用。
在LCD屏上显示格式:1)按一下SW1进入时间调整,关标会闪烁2)按一下SW2光标会在年份上闪烁,表明可以对年份进行调整,接着按SW3年份将加一,按SW4年份将减一;2)再按一下SW2,光标闪烁移到月份上,同样按SW3月份加一,按SW4月份减一;3)再按一下SW2,光标有下移到星期上,同样按SW3星期加一,按SW4星期减一;4)同样的道理可以调整时,分,秒。
5)调整完毕按一下SW1,光标闪烁退出,时间调整结束。
DS1302:1)读写时序:2)DS1302相关寄存器:(详细DS1302资料请查看ds1302.pdf文档)2.原理图:DS1302连接原理图LCD1602连接原理图3.实验板上操作:1)用三个短路冒将SCLK-P3.5,I/O-P3.6,CE-P3.7短接起来。
2)将板上的相应拨码开关拨到拨到ON上。
(建议把原来做过数码管显示的那个拨码开关全部拨到OFF那边)3)把LCD1602液晶插到实验板上的LCD1602液晶插槽上。
(提示:程序烧进单片机后,液晶上没有显示,请调节板子上左上角那个电位器)4)按一下SW1进入时间调整,关标会闪烁按一下SW2光标会在年份上闪烁,表明可以对年份进行调整,接着按SW3年份将加一,按SW4年份将减一;再按一下SW2,光标闪烁移到月份上,同样按SW3月份加一,按SW4月份减一;再按一下SW2,光标有下移到星期上,同样按SW3星期加一,按SW4星期减一;同样的道理可以调整时,分,秒。
调整完毕按一下SW1,光标闪烁退出,时间调整结束。
4.实物连接图如下:5.C语言程序:#include "A T89X51.h"#include "intrins.h"#define HIGH 1#define LOW 0#define TRUE 1#define ZERO 0#define MSB 0x80#define LSB 0x01// ds1302 PreDefinition#define DS1302_WP0x8E#define DS1302_RESET RST=LOW;SCL=LOW;RST=HIGH#define DS1302_WP_ENABLE Write_Ds1302(DS1302_WP,0X00)#define DS1302_WP_DISENABLE Write_Ds1302(DS1302_WP,0x00) #define LCDPORT P0sbit SCL = P3^5;// DS1302 Serial-Clock Input pin 5sbit SDA = P3^6;// DS1302 Serial-Data Input pin 6sbit RST = P3^7;// DS1302 Chip-Seclet Input pin 7sbit RS=P1^0;sbit RW=P1^1;sbit EN=P1^2;code unsigned char set_rtc_code[7]={0x07,0x03,0x29,0x02,0x21,0x07,0x40};code unsigned char write_rtc_address[7]={0x8c,0x88,0x86,0x8a,0x84,0x82,0x80};code unsigned char read_rtc_address[7]={0x8d,0x89,0x87,0x8b,0x85,0x83,0x81}; unsigned char read_rtc_code[7]; //DS1302读出信息(年份,星期,时间)暂存数组,/********1ms延时子程序***********/delay_nms(unsigned int n){unsigned int i;unsigned char j;for(i=0;i<n;i++)for(j=0;j<120;j++); //空操作}//*************LCD1602驱动程序***************************//void lcd_delay(unsigned char delaytime){while(delaytime)delaytime--;}void write_lcd_command(unsigned char write_command){lcd_delay(40);RS=0;RW=0;LCDPORT=write_command;EN=1;EN=0;}void write_lcd_data(unsigned char write_data){lcd_delay(40);RS=1;RW=0;LCDPORT=write_data;EN=1;EN=0;}void LCD_write_char( unsigned x,unsigned char y,unsigned char dat) //x表示行,y表示该行的位置(也就是列){//LCD_set_xy( x, y );switch(x){case 0:write_lcd_command(0x80+y);break;case 1:write_lcd_command(0xc0+y);break;}// LCD_en_dat(dat);write_lcd_data(dat|0x30); //dat或上0x30,就时把数字0123456789转换成ASIIC码}void lcd_displaystr(unsigned char x,unsigned char y,unsigned char code *str){switch(x){case 0:write_lcd_command(0x80+y);break;case 1:write_lcd_command(0xc0+y);break;}while (*str){write_lcd_data(*str);str++;}}void initial_lcd1602(void) //初始化LCD1602{unsigned char i;EN=0;for(i=200;i>0;i--)lcd_delay(248);write_lcd_command(0x38);for(i=4;i>0;i--)lcd_delay(248);write_lcd_command(0x38);for(i=4;i>0;i--)lcd_delay(248);write_lcd_command(0x0f);for(i=4;i>0;i--)lcd_delay(248);write_lcd_command(0x06);for(i=4;i>0;i--)lcd_delay(248);write_lcd_command(0x01);for(i=4;i>0;i--)lcd_delay(248);}//********************lcd1602驱动程序到此完********************/////////////////////////////////////////////////////////////////////////**************ds1302读写程序*************************//void Write_Ds1302_Byte(unsigned char temp) //写一个字节{unsigned char i;for (i=0;i<8;i++){SCL=LOW;SDA=temp&LSB;temp>>=1;SCL=HIGH;}}/****************************************************************************/ void Write_Ds1302( unsigned char address,unsigned char dat ) //写ds1302{DS1302_RESET;Write_Ds1302_Byte(address);Write_Ds1302_Byte(dat);RST=LOW;}/****************************************************************************/ unsigned char Read_Ds1302 ( unsigned char address ) //读ds1302{unsigned char i,temp=0x00,temp_temp;DS1302_RESET;Write_Ds1302_Byte(address);for (i=0;i<8;i++){if(SDA)temp|=0x80;SCL=LOW;temp>>=1;SCL=HIGH;}RST=LOW;temp_temp=temp/16;temp=temp%16;temp=temp+temp_temp*10;return (temp);}/****************************************************************************/ void Read_RTC(void) //读出DS1302里的相关信息,存放在read_rtd_code[]数组中{unsigned char i,*p;p=read_rtc_address;for(i=0;i<7;i++){read_rtc_code[i]=Read_Ds1302(*p);p++;}}/***********************************************************************/void Set_RTC(void) //初始化设置DS1302{unsigned char i,*p;p=write_rtc_address;for(i=0;i<7;i++){Write_Ds1302(*p,set_rtc_code[i]);p++;}}/******************************************************/void initial_ds1302(void) //初始化ds1302{DS1302_WP_ENABLE;Set_RTC();}/**************ds1302读写程序到此完************************//////////////////////////////////////////////////////系统初始化void system_initial(void){initial_ds1302();initial_lcd1602();}/****************************************************************************/void main(void){unsigned char count,staus;system_initial();//输出显示lcd_displaystr(0,0x00,"20");delay_nms(10);lcd_displaystr(0,0x04,"-");delay_nms(10);lcd_displaystr(0,0x07,"-");lcd_displaystr(0,0x0b,"Week:");lcd_displaystr(1,0x00,"Time:");lcd_displaystr(1,0x07,":");lcd_displaystr(1,0x0a,":");while(1){//按键扫描,实现对时间的调整,对应实验板的独立按钮//开始时间设置,staus=1if(P2_0==0){delay_nms(10);if(P2_0==0){staus^=1;count=0;while(P2_0==0);}}if(P2_1==0){delay_nms(10);if(P2_1==0){count++; //光标移位if(count==8)count=1;while(P2_1==0);}}if(P2_2==0) //加按钮{delay_nms(10);if(P2_2==0){switch(count){case 0x01:read_rtc_code[0]++;DS1302_WP_ENABLE;Write_Ds1302(write_rtc_address[0],(read_rtc_code[0]+(read_rtc_code[0]/10)*6));LCD_write_char(0,0x02,(read_rtc_code[0]/10)); //年十位LCD_write_char(0,0x03,(read_rtc_code[0]%10)); //年个位break;case 0x02:read_rtc_code[1]++;if(read_rtc_code[1]==13)read_rtc_code[1]=1;DS1302_WP_ENABLE;Write_Ds1302(write_rtc_address[1],(read_rtc_code[1]+(read_rtc_code[1]/10)*6));LCD_write_char(0,0x05,(read_rtc_code[1]/10)); //月十位LCD_write_char(0,0x06,(read_rtc_code[1]%10)); //月个位break;case 0x03:read_rtc_code[2]++;if(read_rtc_code[2]==31)read_rtc_code[2]=1;DS1302_WP_ENABLE;Write_Ds1302(write_rtc_address[2],(read_rtc_code[2]+(read_rtc_code[2]/10)*6));LCD_write_char(0,0x08,(read_rtc_code[2]/10)); //日十位LCD_write_char(0,0x09,(read_rtc_code[2]%10)); //日个位break;case 0x04:read_rtc_code[3]++;if(read_rtc_code[3]==8)read_rtc_code[3]=1;DS1302_WP_ENABLE;Write_Ds1302(write_rtc_address[3],(read_rtc_code[3]+(read_rtc_code[3]/10)*6));LCD_write_char(0,0x0f,(read_rtc_code[3]%10)); //星期break;case 0x05:read_rtc_code[4]++;if(read_rtc_code[4]==25)read_rtc_code[4]=0;DS1302_WP_ENABLE;Write_Ds1302(write_rtc_address[4],(read_rtc_code[4]+(read_rtc_code[4]/10)*6));LCD_write_char(1,0x05,(read_rtc_code[4]/10)); //时十位LCD_write_char(1,0x06,(read_rtc_code[4]%10)); //时个位break;case 0x06:read_rtc_code[5]++;if(read_rtc_code[5]==60)read_rtc_code[5]=0;DS1302_WP_ENABLE;Write_Ds1302(write_rtc_address[5],(read_rtc_code[5]+(read_rtc_code[5]/10)*6));LCD_write_char(1,0x08,(read_rtc_code[5]/10)); //分十位LCD_write_char(1,0x09,(read_rtc_code[5]%10)); //分个位break;case 0x07:read_rtc_code[6]++;if(read_rtc_code[6]==60)read_rtc_code[6]=0;DS1302_WP_ENABLE;Write_Ds1302(write_rtc_address[6],(read_rtc_code[6]+(read_rtc_code[6]/10)*6));LCD_write_char(1,0x0b,(read_rtc_code[6]/10)); //秒十位LCD_write_char(1,0x0c,(read_rtc_code[6]%10)); //秒个位break;default:break;}while(P2_2==0);}}if(P2_3==0) //减按钮{delay_nms(10);if(P2_3==0){switch(count){case 0x01:if(read_rtc_code[0]==0){lcd_displaystr(0,0x00,"19");read_rtc_code[0]=99;}elseread_rtc_code[0]--;DS1302_WP_ENABLE;Write_Ds1302(write_rtc_address[0],(read_rtc_code[0]+(read_rtc_code[0]/10)*6));LCD_write_char(0,0x02,(read_rtc_code[0]/10)); //年十位LCD_write_char(0,0x03,(read_rtc_code[0]%10)); //年个位break;case 0x02:if(read_rtc_code[1]==1)read_rtc_code[1]=12;elseread_rtc_code[1]--;DS1302_WP_ENABLE;Write_Ds1302(write_rtc_address[1],(read_rtc_code[1]+(read_rtc_code[1]/10)*6));LCD_write_char(0,0x05,(read_rtc_code[1]/10)); //月十位LCD_write_char(0,0x06,(read_rtc_code[1]%10)); //月个位break;case 0x03:if(read_rtc_code[2]==1)read_rtc_code[2]=30;elseread_rtc_code[2]--;DS1302_WP_ENABLE;Write_Ds1302(write_rtc_address[2],(read_rtc_code[2]+(read_rtc_code[2]/10)*6));LCD_write_char(0,0x08,(read_rtc_code[2]/10)); //日十位LCD_write_char(0,0x09,(read_rtc_code[2]%10)); //日个位break;case 0x04:if(read_rtc_code[3]==1)read_rtc_code[3]=7;elseread_rtc_code[3]--;DS1302_WP_ENABLE;Write_Ds1302(write_rtc_address[3],(read_rtc_code[3]+(read_rtc_code[3]/10)*6));LCD_write_char(0,0x0f,(read_rtc_code[3]%10)); //星期break;case 0x05:if(read_rtc_code[4]==0)read_rtc_code[4]=24;elseread_rtc_code[4]--;DS1302_WP_ENABLE;Write_Ds1302(write_rtc_address[4],(read_rtc_code[4]+(read_rtc_code[4]/10)*6));LCD_write_char(1,0x05,(read_rtc_code[4]/10)); //时十位LCD_write_char(1,0x06,(read_rtc_code[4]%10)); //时个位break;case 0x06:if(read_rtc_code[5]==00)read_rtc_code[5]=59;elseread_rtc_code[5]--;DS1302_WP_ENABLE;Write_Ds1302(write_rtc_address[5],(read_rtc_code[5]+(read_rtc_code[5]/10)*6));LCD_write_char(1,0x08,(read_rtc_code[5]/10)); //分十位LCD_write_char(1,0x09,(read_rtc_code[5]%10)); //分个位break;case 0x07:if(read_rtc_code[6]==0)read_rtc_code[6]=59;elseread_rtc_code[6]--;DS1302_WP_ENABLE;Write_Ds1302(write_rtc_address[6],(read_rtc_code[6]+(read_rtc_code[6]/10)*6));LCD_write_char(1,0x0b,(read_rtc_code[6]/10)); //秒十位LCD_write_char(1,0x0c,(read_rtc_code[6]%10)); //秒个位break;default:break;}while(P2_3==0);}}if(staus==0){//读出DS1302寄存器里的时间信息RST=HIGH;Read_RTC();LCD_write_char(0,0x02,(read_rtc_code[0]/10)); //年十位LCD_write_char(0,0x03,(read_rtc_code[0]%10)); //年个位LCD_write_char(0,0x05,(read_rtc_code[1]/10)); //月十位LCD_write_char(0,0x06,(read_rtc_code[1]%10)); //月个位LCD_write_char(0,0x08,(read_rtc_code[2]/10)); //日十位LCD_write_char(0,0x09,(read_rtc_code[2]%10)); //日个位LCD_write_char(0,0x0f,(read_rtc_code[3]%10)); //星期LCD_write_char(1,0x05,(read_rtc_code[4]/10)); //时十位LCD_write_char(1,0x06,(read_rtc_code[4]%10)); //时个位LCD_write_char(1,0x08,(read_rtc_code[5]/10)); //分十位LCD_write_char(1,0x09,(read_rtc_code[5]%10)); //分个位LCD_write_char(1,0x0b,(read_rtc_code[6]/10)); //秒十位LCD_write_char(1,0x0c,(read_rtc_code[6]%10)); //秒个位}else{RST=LOW;switch(count){case 0x01:write_lcd_command(0x83);break;case 0x02:write_lcd_command(0x86);break;case 0x03:write_lcd_command(0x89);break;case 0x04:write_lcd_command(0x8f);break;case 0x05:write_lcd_command(0xc6);break;case 0x06:write_lcd_command(0xc9);break;case 0x07:write_lcd_command(0xcc);break;default:break;}}}}。
基于DS1302和LCD1602的万年历-闹钟-时钟-用开发版直接显示的程序---副本

实时时钟芯片DS1302应用,DS18B20应用实例——可调时钟,LCD1602显示:(时间+温度)说明:需要按程序中定义的接口。
按自己接口,只要在程序中修改接口定义即可。
1、DS1302引脚排列:如下图引脚说明:1)Vcc1:后备电源,VCC2:主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
2)X1、X2:振荡源,外接32.768kHz 晶振。
3)RST:复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc>2.0V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
4)I/O为串行数据输入输出端(双向)。
5)SCLK为时钟输入端。
2、DS1302的控制字节DS1302 的控制字如下图所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
3、数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
数字时钟DS1302+LCD1602

;//////程序结束//////////////////////////////////////
END
;***********************************************************
;程序名称:DS1302+LCD1602简单时钟
;主控芯片:89c51,12MHZ
;编者心得:datasheet很重要,如果datasheet看不懂,找个例程配合着研究
;移用核心:整个框架就是这样,可根据具体需要进行修改
MOV A,B
ADD A,#30H ;转换到ASCII码
MOV B,A
MOV A,R5
MOV P0,A
SETB RS
CLR RW
CLR E
MOV R7,#14H
DJNZ R7,$
SETB E
MOV P0,B
MOV B,R2 ;数据写完没有.
CJNE A,B,AGAIN
RET
;//////转换DS1302数据并写到LCD1602////////////////
WRITE1: MOV B,#10H;拆字节
DIV AB
ADD A,#30H
MOV R5,A
AJMP REPEAT
;//////写lcd1602指令子程序/////////////////////////////
ENABLE: CLR RS
CLR RW
CLR E
ACALL DELAY
SETB E
RET
;//////写lcd1602数据子程序/////////////////////////////
用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现

中州大学信息工程学院毕业设计(论文)2011— 2012学年第二学期题目:用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现学生姓名(学号)梁慧萍田萌萌宋书倩指导教师刘爱荣职称教授评阅教师职称时间中州大学信息工程学院毕业设计(论文)开题报告课题名称(来源、类型):用 DS1302 与 1602LCD 设计的可调式电子日历与时钟的设计指导教师:刘爱荣学生姓名:梁慧萍田萌萌宋书倩开题报告内容:(调研资料的准备,设计/论文的目的、要求、思路与预期成果;任务完成的阶段内容及时间安排;小组内其他成员的分工;完成设计(论文)所具备的条件因素等。
)1.目的:实现日历和时钟的显示并且能够调整2.要求:完成可调式电子日历和时钟的软件和硬件的设计,包括单片机的相关内容;日历时钟模块的设计,液晶显示模块的设计,按键模块的设计。
控制程序的编写等。
3.预期成果:仿真成功,做出实物。
(1)显示初始值日历时钟初始值;(2)用按键调整日历时钟。
4.时间安排:第1周:熟悉课题的基本要求,查阅相关资料,初步拟定设计的整体方案,完成开题报告。
第2-3周:自学这次课题所涉及的相关内容,包括器件基础知识、单片机,DS1302时钟芯片工作原理和相关软件的使用以及LCD1602液晶显示屏的相关内容。
并设计一些简单的实际电路,熟练所学内容并加以巩固。
第4-6周:设计DS1302时钟模块的控制电路、LCD1602液晶显示电路、电源电路等硬件电路,并用Proteus仿真第7周:焊接调试电路,根据个部分的作用对硬件进行调试,最后联机调试。
第8周:写毕业设计论文,完成全部毕业设计5.小组成员分工:梁慧萍负责日历时钟模块的设计和控制程序的编写宋书倩负责液晶显示模块的设计田萌萌负责按键模块的设计指导教师签名:日期:2012年2月20日备注:(1)来源:A—教师拟订;B—学生建议;C—企业和社会征集;D—实习单位提供(2)类型:X—真实课题;Y—模拟课题;Z—虚拟课题中州大学信息工程学院毕业设计(论文)任务书指导教师:刘爱荣职称:教授学生人数: 3人学生姓名(学号、专业):梁慧萍田萌萌宋书倩毕业设计(论文)题目(来源、类型)用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现毕业设计(论文)工作内容与基本要求(目标、任务、途径、方法、成果形式,应掌握的原始资料(数据)、参考资料(文献)以及设计技术要求、注意事项等)(纸张不够可加页)基本要求:(1)显示:年、月、日、时、分、秒;(2)具有年、月、日、时、分、秒的设置功能。
LCD1602液晶显示DS1302实时时钟Proteus仿真

LCD1602液晶显示DS1302实时时钟Proteus仿真Proteus仿真图:仿真程序:#include#include#include#define uint unsigned int#define uchar unsigned char//*******LCD*******sbit LCDRS=P2^0; //LCD数据/命令选择端sbit LCDRW=P2^1; sbit LCDEN=P2^2; //LCD使能新号端//******DS1302******sbit IO=P1^0; //1302数据线sbit SCLK=P1^1; //1302时钟线sbit RST=P1^2; //复位uint num=0;//uchar*week[]={"SUN","***","MON","TUS","WEN","THU","FRI","SAT"}; uchar Date[]={"Date: 2000-00-00 "};uchar Time[]={"Time: *00:00-00* "};uchar date_time[7]; //从ds1302读取的当前日期时间//=======延时=======void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//********向1302写数据*********void write_ds1302(uchar dat){uchar i;for(i=0;i<8;i++){IO=dat & 0x01; //保持最后一位为1,读状态SCLK=1;delay(1);SCLK=0;dat >>= 1;}}//*********从1302读数据*********uchar read_ds1302(){uchar i,b=0x00;for(i=0;i<8;i++){b |= _crol_((uchar)IO,i);delay(1);SCLK=0;}return b/16*10+b%16; //与BCD码转换}//*********从指定位置读数据******** uchar read_data(uchar addr){uchar dat;RST=0;SCLK=0;RST=1;write_ds1302(addr);dat=read_ds1302();SCLK=1;RST=0;return dat;}//*********读取当前日期时间********* void read_date_time(){uchar i,addr=0x81;for(i=0;i<7;i++){date_time[i]=read_data(addr);addr+=2;}}//----------LCD写指令----------void lcd_write_com(uchar com){LCDRS=0; //RS为0时,写指令,RS为1时,写数据P0=com;delay(5);delay(5);LCDEN=0;}//----------LCD写数据----------void lcd_write_data(uchar dat){LCDRS=1;P0=dat;delay(5);LCDEN=1;delay(5);LCDEN=0;}//-------LCD初始化-------void lcd_init(){LCDEN=0;lcd_write_com(0x38); //LCD显示模式设置lcd_write_com(0x0c); //LCD显示开/关及光标设置lcd_write_com(0x06); //当写一个字符后地址指针加1,且光标加1lcd_write_com(0x01); //显示清屏}//---------设置液晶显示位置-----------void set_lcd_pos(uchar p){lcd_write_com(p | 0x80);}//---------液晶显示程序----------void lcd_print(uchar p,uchar *s){set_lcd_pos(p);for(num=0;num<16;num++){lcd_write_data(s[num]);delay(10);}}//----------日期时间转换-----------void format_datetime(uchar d,uchar *p){p[0]=d/10+'0';p[1]=d%10+'0';}//---------主程序----------void main(){LCDRW=0;lcd_init();while(1){read_date_time();format_datetime(date_time[6],Date+8); //年月日format_datetime(date_time[4],Date+11); format_datetime(date_time[3],Date+14);// strcpy(Date+13,week[date_time[5]]);format_datetime(date_time[2],Time+7); //时间转换format_datetime(date_time[1],Time+10);format_datetime(date_time[0],Time+13);lcd_print(0x00,Date);lcd_print(0x40,Time);}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
uchar i,*p;
p = RTC_RADD; //地址传递
for(i = 0 ; i < 7 ; i++) //分7次读取 秒分时日月周年
{
SJ[i] = Read_Ds1302(*p);
p++;
}
}
/*************************************************/
}
/*****************************************************/
/****LCD定位******************************************/
void LOCATE(uchar H , uchar L)
{
if(H == 1) //如果是第一行
{
LCD_RS = rs; //写指令/数据选择:低电平写指令,高电平写数据
LCD_RW = 0; //读写选择:低电平写,高电平读
LCD_E = 0; //关使能
LCD_DAT = c_d; //把指令/数据写入P1口
delay(5); //延时5ms
{
if(SDA)
temp |= 0x80; //每次传输低字节
SCK = 0;
temp>>=1; //右移一位
_nop_();
_nop_();
_nop_();
SCK = 1;
}
RST = 0;
_nop_(); //以下为DS1302复位的稳定时间
_nБайду номын сангаасp_();
return (temp); //返回
}
/************************************************/
/* 读时钟数据 */
/************************************************/
RST = 0;
_nop_();
_nop_();
SCK = 0;
_nop_();
_nop_();
RST = 1;
_nop_();
_nop_();
Write_Ds1302_Byte(address);
for (i = 0 ; i < 8 ; i++) //循环8次 读取数据
/* 读出DS1302数据 */
/************************************************/
uchar Read_Ds1302 ( uchar address )
{
uchar i,temp=0x00;
SDA = temp & 0x01; //每次传输低字节
temp>>=1; //右移一位
SCK = 1;
}
}
/*************************************************/
/* 写入DS1302 */
/****LCD写入数值**************************************/
void LCD(uchar dat)
{
uchar sw , gw; //定义十位、个位变量
sw = dat / 10; //取十位
gw = dat % 10; //取个位
uchar xx; //中间变量
code uchar MM[] = {" smhDMYZ"}; //选择菜单
code uchar RTC_WADD[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年写地址
code uchar RTC_RADD[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //秒分时日月周年读地址
}
/*****************************************************/
/****LCD写命令子函数**********************************/
void LCD_W(char rs , uchar c_d) //写子函数
LCD_E = 1; //开使能
delay(5); //延时5ms
LCD_E = 0; //关使能
}
/*****************************************************/
/****LCD初始化函数************************************/
/* 主函数 */
/*****************************************************/
void main(void)
{
uchar key = 0;
LCD_init(); //LCD初始化
p = RTC_WADD; //传地址
for(i = 0 ; i < 7 ; i++) //7次写入 秒分时日月周年
{
Write_Ds1302(*p , SJ[i]);
p++;
}
Write_Ds1302(0x8E , 0x80);
}
/*****************************************************/
/*************************************************/
void Write_Ds1302(uchar address,uchar dat)
{
RST = 0;
_nop_();
SCK = 0;
_nop_();
RST = 1;
{
LCD_W(0 , 0x80 + L - 1); //从第一行第(L - 1)列开始写入
}
else //否则是第二行
{
LCD_W(0 , 0x80 + 0x40 + L - 1); //从第二行第(l - 1)列开始写入
}
}
/*****************************************************/
sbit LCD_E = P2^7; //LCD使能端
sbit SDA = P3^4; //DS1302数据
sbit RST = P3^5; //DS1302复位
sbit SCK = P3^6; //DS1302时钟
uchar SJ[7]; //用来读取秒分时日月周年
uchar XS[6]; //用来显示秒分时日月周年
LCD_W(0 , 0x06); //000001N0,N(地址指针+-1)
TMOD = 0x01; //定时器0中断初值设置
TH0 = 0x36; //(65536-50000) / 256;
TL0 = 0x9d; //(65536-50000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
/*****************************************************/
/****LCD清屏******************************************/
void CLS()
{
LCD_W(0 , 0x01); //清屏指令
/* 设定时钟数据 */
/*************************************************/
void Set_RTC(void) //设定 日历
{
uchar i,*p;
Write_Ds1302(0x8E , 0X00);
LCD_W(1 , 0x30 + sw); //写十位
LCD_W(1 , 0x30 + gw); //写个位
}
/************************************************/
/* 写一个字节 */
/************************************************/
void Write_Ds1302_Byte(uchar temp)
{
uchar i;
for(i = 0 ; i < 8 ; i++) //循环8次 写入数据
{
SCK = 0;
_nop_(); //启动I2C
Write_Ds1302_Byte(address); //发送地址
Write_Ds1302_Byte(dat); //发送数据
RST = 0; //恢复
}
/************************************************/
_nop_();
RST = 0;
SCK = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SCK = 1;
_nop_();
_nop_();
SDA = 0;