实时时钟芯片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 的控制字如下图所示。
1 / 10
控制字节的最高有效位(位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的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见数据手册。
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
#include
#define uint unsigned int #define uchar unsigned char
2 / 10
sbit beep=P2^3;//闹铃
sbit IO=P1^3; //定义1302管脚 sbit SCLK=P1^4; sbit RST=P1^5;
sbit RS=P2^2;//定义1602管脚 sbit RW=P2^1; sbit EN=P2^0;
sbit key1=P3^4;//选择 //调时键盘 sbit key2=P3^5;//加 sbit key3=P3^6;//减 sbit key4=P3^7;//确定
sbit key11=P1^6;//选择//闹钟键盘 sbit key22=P1^7;//加 sbit key33=P3^0;//减 sbit key44=P3^1;//确定
uchar x1=0,x;
int hour=8,minute=0;//闹钟的初始时间8:00
uchar DateTime[9]; //秒,分,时,日,周,月,年 address, uchar lcd1[]={\ %uchar lcd2[]={\ \/***************延时*************/ void delayms(uchar x)//延时毫秒程序 { uchar i,j;
for(i=x;i>0;i--) for(j=110;j>0;j--); }
/********1302的驱动程序***********/
void DS1302WriteByte(uchar dat)//写入数据,dat:要写入的数据 {
uchar i;
SCLK=0;//初始时钟线置为0 delayms(2);
for(i=0;i<8;i++)//开始传输8个字节的数据 {
IO=dat&0x01;//取最低位,DS1302的数据和地址都是从最低位开始传输的 delayms(2);
SCLK=1;//时钟线拉高,制造上升沿,SDA的数据被传输 delayms(2);
SCLK=0;//时钟线拉低,为下一个上升沿做准备
3 / 10
dat>>=1;//数据右移一位,准备传输下一位数据 } }
/********1302的驱动程序**********/
uchar DS1302ReadByte()//功能: 读取数据,dat:读取的数据 { uchar i; uchar dat; delayms(2); for(i=0;i<8;i++) {
dat>>=1;//要返回的数据左移一位
if(IO==1)//当数据线为高时,证明该位数据为 1
dat|=0x80;//要传输数据的当前值置为 1,若不是,则为 0 SCLK=1;//拉高时钟线 delayms(1);
SCLK=0;//制造下降沿 delayms(1); }
return dat;//返回读取出的数据/16*10+dat }
/*********1302的驱动程序*********///从cmd相应地址中读取一个字节的数据 uchar DS1302Read(uchar cmd)//cmd:要写入的控制字节,dat:读取的数据 {
uchar dat;
RST=0;//初始 CE线置为0 SCLK=0;//初始时钟线置为0
RST=1;//初始 CE置为 1,传输开始
DS1302WriteByte(cmd);//传输命令字,要读取的时间/日历地址 dat=DS1302ReadByte();//读取要得到的时间/日期 SCLK=1;//时钟线拉高
RST=0;//读取结束,CE置为 0,结束数据的传输 return dat;//返回得到的时间/日期 }
/**********1302的驱动程序*********///向cmd相应地址中写一个字节的数据 void DS1302Write(uchar cmd, uint dat)//cmd:要写入的控制字,dat:要写入的数据 {
RST=0; //初始 CE线置为 0 SCLK=0; //初始时钟线置为0
RST=1; //初始 CE置为 1,传输开始
DS1302WriteByte(cmd); //传输命令字,要写入的时间/日历地址 DS1302WriteByte(dat); //写入要修改的时间/日期 SCLK=1; //时钟线拉高
RST=0; //读取结束,CE置为0,结束数据的传输 }
4 / 10
/*************初始化ds1302********///给1302写入日期和时钟的值 void chushihuaDS1302(void) {
DS1302Write(0x8e,0x00);//写保护关 DS1302Write(0x80,0x10); //初始秒 DS1302Write(0x82,0x02);//初始分钟
DS1302Write(0x84,0x15); //初始为24小时模式,初始时 DS1302Write(0x86,0x25); //25日 DS1302Write(0x88,0x04);//4月 DS1302Write(0x8c,0x14);//2014年 DS1302Write(0x8a,0x05);//星期5 // DS1302Write(0x90,0x01); //充电
//DS1302Write(0xc0,0xf0); //初始化一次标示 //DS1302Write(0x8e,0x80);//写保护开 }
/************以下是1602的程序******************/ /******************************///向1602内写命令 void write_order(uchar order) {
RS=0; P0=order; delayms(5); EN=1; delayms(5); EN=0; }
/******************************///向1602内写数据 void write_date(uchar date) {
RS=1; P0=date; delayms(5); EN=1; delayms(5); EN=0; }
/******************************///lcd1602的初始化 void chushihuaLCD1602() { EN=0; write_order(0x38); write_order(0x0c); write_order(0x06);
5 / 10