电子万年历实验实验要求:在LCD(12864或者1602)上显示:年月日星期时间可以自由修改显示的年月日星期时间实验需求:硬件需求:1.需要按键做初始化等需求2.需要LED作为显示输出。2需要一款硬件作为实时时钟器件选型DS1302实时时钟芯片,三线接口,带涓流充电。DS1307实时时钟芯片,I2C接口。DS1337实时时钟芯片,I2C接口,带两个日历闹钟。PCF8563实时时钟芯片,I2C接口,带中断输出。PCF8583实时时钟芯片,I2C接口,带中断输出,内置的32.768KHz振荡器,256个字节RAM,但性价比较差。DS1302DS1302是DALLAS公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31字节静态RAM可通过简单的串行接口与单片机进行通信可提供:--秒分时日日期月年的信息--每月的天数和闰年的天数可自动调整--可通过AM/PM指示决定采用24或12小时格式--保持数据和时钟信息时功率小于1mW选型结论:LCD:12864键盘:4*4矩阵键盘实时时钟芯片:DS1302结构框图DS1302引脚X1X232.768KHz晶振管脚GND地CE复位脚I/O数据输入/输出引脚SCLK串行时钟Vcc1,Vcc2电源供电管脚各引脚的功能为:Vcc1:主电源;Vcc2:备份电源。当Vcc2Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2Vcc1时,由Vcc1向DS1302供电。SCLK:串行时钟,输入,控制数据的输入与输出;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。参考电路:如上图所示:DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟引脚、I/O串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计时脉冲。实际电路:Vcc_5V:为电路中的主电源;Vcc2,也就是BT1为备份电源。当Vcc2Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2Vcc1时,由Vcc1向DS1302供电CLK和I/O虽然和IIC总线接在一条引脚上,但DS1302其实并不是使用IIC总线,而是一种三线式总线,DS1302内部结构:DS1302内部包括:Powercontrol:电源控制模块Inputshiftregisters:输入移位寄存器Commandandcontrollogic:通讯与逻辑控制器Oscillatoranddivider:晶体振荡器及分频器DS1302的内部主要组成部分虽然有:移位寄存器、控制逻辑、振荡器、实时时钟以及RAM。虽然数据分成两种,但是对单片机的程序而言,其实是一样的,就是对特定的地址进行读写操作。DS1302控制字:控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1(A4~A0):指示操作单元的地址;位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。DS1302时序:如图,所示CE输入驱动高启动所有的数据传输。CE输入有两个功能。首先,CE打开控制逻辑,允许访问的移位寄存器的地址/命令序列。其次,CE提供了一个终止单字节或多字节数据传输方法。一个时钟周期是由一个下降沿之后的上升沿序列。对于数据传输而言,数据必须在有效的时钟的上升沿输入,在时钟的下降沿输出。如果CE为低,所有的I/O引脚变为高阻抗状态,数据传输终止。对于数据输入:开始的8个SCLK周期,输入写命令字节,数据字节在后8个SCLK周期的上升沿输入。数据输入位0开始。对于数据输出:开始的8个SCLK周期,输入一个读命令字节,数据字节在后8个SCLK周期的下降沿输出。注意,第一个数据字节的第一个下降沿发生后,命令字的最后一位被写入(Notethatthefirstdatabittobetransmittedoccursonthefirstfallingedgeafterthelastbitofthecommandbyteiswritten.),命令字节的最后一位被写入。当CE仍为高时。如果还有额外的SCLK周期,DS1302将重新发送数据字节,这使DS1302具有连续突发读取的能力。DS1302驱动程序分析开始设置CE为高在上升沿按位传输地址字读取或写入相应地址的数据结束设置CE为低/*************************************************名称:ucharDS1302Read()*说明:先写地址,后读数据*功能:从cmd相应地址中读取一个字节的数据*调用:DS1302WriteByte(),DS1302ReadByte()*输入:cmd:要写入的控制字节*输出:dat:读取的数据*************************************************/ucharDS1302Read(ucharcmd){uchardat;RST=0;//初始CE线置为0SCLK=0;//初始时钟线置为0RST=1;//初始CE置为1,传输开始DS1302WriteByte(cmd);//传输命令字,要读取的时间/日历地址dat=DS1302ReadByte();//读取要得到的时间/日期SCLK=1;//时钟线拉高RST=0;//读取结束,CE置为0,结束数据的传输returndat;//返回得到的时间/日期}/*************************************************名称:DS1302Write*说明:先写地址,后写数据*功能:向cmd相应地址中写一个字节的数据*调用:DS1302WriteByte()*输入:cmd:要写入的控制字,dat:要写入的数据*输出:无*************************************************/voidDS1302Write(ucharcmd,uchardat){RST=0;//初始CE线置为0SCLK=0;//初始时钟线置为0RST=1;//初始CE置为1,传输开始DS1302WriteByte(cmd);/传输命令字,要写入的时间/日历地址DS1302WriteByte(dat);//写入要修改的时间/日期SCLK=1;//时钟线拉高RST=0;//读取结束,CE置为0,结束数据的传输}/*************************************************名称:DS1302WriteByte*说明:无*功能:写入8bit数据*调用:delayus()*输入:dat:要写入的数据*输出:无*************************************************/voidDS1302WriteByte(uchardat){uchari;SCLK=0;//初始时钟线置为0delayus(2);for(i=0;i8;i++)//开始传输8个字节的数据{SDA=dat&0x01;//取最低位,注意DS1302的数据和地址都是从最低位开始传输的delayus(2);SCLK=1;//时钟线拉高,制造上升沿,SDA的数据被传输delayus(2);SCLK=0;//时钟线拉低,为下一个上升沿做准备dat=1;//数据右移一位,准备传输下一位数据}}/*************************************************名称:DS1302ReadByte()*说明:无*功能:读取8bit的数据*调用:delayus()*输入:无*输出:dat:读取的数据*************************************************/ucharDS1302ReadByte(){uchari,dat;delayus(2);for(i=0;i8;i++){dat=1;//要返回的数据左移一位if(SDA==1)//当数据线为高时,证明该位数据为1dat|=0x80;//要传输数据的当前值置为1,若不是,则为0SCLK=1;//拉高时钟线delayus(2);SCLK=0;//制造下降沿delayus(2);}returndat;//返回读取出的数据}对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有:7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。如下所示:DS1302数据地址和传输格式如图所示,时钟日历包含在7个读/写寄存器内,读/写寄存器中的数据是二——十进制的BCD码。秒寄存器的BIT7定义为时间暂停位,当BIT1为1时,时钟振荡器停止工作,DS1302进入低功耗模式,电源消耗小于100微安,当BIT1为0时,时钟振荡器启动,DS1302正常工作。小时寄存器的BIT7定义为12或24小时工作模式选择位,当BIT7为高时,为12小时工作模式,此时BIT5为AM/PM位,低电平标示AM,高电平标示PM,在24小时模式下,BIT5为第二个10小时位标示(20~23时)。写保护寄存器的BIT7:WP是写保护位,工作时,出WP外的其他位都置为0,对时钟/日历寄存器或RAM进行写操作之前,WP必须为0,当WP为高电平的时候,不能对任何时钟/日历寄存器或RAM进行写操作。关于突发模式(burstmode或称多字节传输模式),突发模式可以指定任何的时钟/日历或者RAM寄存器为突发模式,和以前一样,第6位指定时钟或RAM而0位指定读或写。突发模式的实质是指一次传送多个字节的时钟信号和RAM数据。如下图所示在时钟/日历寄存器中的9至31和在RAM寄存器的地址31不能存储数据。突发模式的读取或写入从地址的位0开始。如下程序所示:/*---------------------------------------------------------------------------------------------------函数名称:DS1302_NReadRam(unsignedchar*rstr)函数功能:多字节突发模式读RAM,DS1302_NRRAM一次可进行31个片内RAM单元读输入参数:*rstr:存放读到的N个数据输出参数:无------------------------------------------------------------------------------------------------------*/voidDS1302_burst_Read(unsignedchar*rstr){unsignedchari;RST=0;SCLK=0;RST=1;//CE拉高,传输开始DS1302_WriteByte(0XFF);//写0XFF,多字节突发方式读RAM具体细节见上一节for(i=0;i31;i++)//连续读取个31字节{*rstr=DS1302ReadByte(address);//此处的ADDRESS指的是你需要进行连续读取的地址rstr++;}RST=0;//CE信号拉低,传输结束CLK=1;}/*--------------------------------------------------------------------------------------