DS1302实时时钟电路控制指令表
时间控制模块—DS1302芯片的控制编程
定时器/计数器1-TCNT1H和TCNT1L
TCNT1H和TCNT1L组成了T/C的数据寄存器TCNT1。
定时器/计数器中断标志寄存器-TIFR
T/C1输 入捕捉 标志位
T/C1输 出比较B 匹配标 志位 T/C1溢出标志 (普通模式和 CTC模式时)
如何写表 达式判断 是否有溢 出 实验板上的主控芯片AVR ATMega128:
有四个定时器/计数器 – 两个具有独立预分频器、比较器功能、PWM输出的 8位定时器/计数器(T/C0, T/C2 ) – 两个具有预分频器、比较器功能、 PWM输出、捕 捉功能的16位定时器/计数器(T/C1, T/C3 )
本堂课主要讨论 定时器/计数器1
4.中断服务函数
//外部中断函数
SIGNAL(SIG_INTERRUPT5) {
}
second=0;//中断发生后需做的事情
三、DS1302模块 1.简单介绍
时钟计数功能,年计数可达2100。
DS1302包括时钟/日历寄存器和31字节的
数据暂存寄存器。
2.如何将年月日写入DS1302中
模块电路功能编程(下)
时间控制模块—DS1302芯片的控制编程
双C工作室
复习
1.实验板的电路图 – 控制编程--针对实验板 – 所有的元器件控制--要查看电路图--确定要 它们是由哪些端口或哪些接口来控制
2.实验板上控制数码管 – 用SPI发送数据到74HC595上,PB端口的高 四位作为数码管选通通道
RST_SET; /*启动DS1302总线*/ /*写入目标地址:addr*/ IO_OUT; addr = addr & 0xFE;/*最低位置零*/ for (i = 0; i < 8; i ++) { if (addr & 0x01) IO_SET; else IO_CLR; SCK_SET; SCK_CLR; addr = addr >> 1; }
给出DS1302的典型应用原理图
给出DS1302的典型应用原理图1. 概述本文将介绍DS1302实时时钟芯片的典型应用原理图。
DS1302是一款非易失性实时时钟芯片,在许多电子产品中被广泛使用。
它具有低功耗、精确计时等优点,适用于需要具备时间功能的电路设计。
2. DS1302原理图下面是DS1302的典型应用原理图(供参考):电源电路:--------------VCC --- 5V电源GND --- 接地--------------数据通信和控制线:---------------------------RST --- 复位信号IO --- 数据输入/输出SCLK --- 时钟信号CE --- 芯片使能信号---------------------------外部时钟电路:--------------------R --- 32.768kHz晶振C --- 晶振接地--------------------3. DS1302应用原理图解析•电源电路:DS1302芯片需要提供5V电源和接地,确保芯片正常工作。
•数据通信和控制线:RST、IO、SCLK和CE是DS1302与其他电路进行数据通信和控制的接口线。
RST用于复位芯片,IO用于数据的输入和输出,SCLK为时钟信号,CE为芯片的使能信号。
•外部时钟电路:DS1302芯片需要连接一个外部的32.768kHz晶振,以提供精确的时钟输入。
4. DS1302应用原理图使用说明1.连接电源电路:将VCC引脚连接至5V电源,将GND引脚连接至接地。
2.连接数据通信和控制线:根据实际需求,将RST、IO、SCLK和CE引脚连接至其他电路。
3.连接外部时钟电路:将R引脚连接至外部32.768kHz晶振,将C引脚接地。
5. 注意事项•在连接DS1302芯片时,务必确保正确连接电源和接地,以避免芯片损坏。
•在连接数据通信和控制线时,需要按照芯片的说明书来引脚连接,避免误接或引脚连接错误。
•外部时钟电路的连接需要注意晶振的正确极性,并确保晶振稳定工作。
ds1302时钟程序详解,ds1302程序流程图
ds1302时钟程序详解,ds1302程序流程图(C程序)ds1302时钟程序详解DS1302 的控制字如图2所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
ds1302程序流程图DS1302实时时间流程图4示出DS1302的实时时间流程。
根据此流程框图,不难采集实时时间。
下面结合流程图对DS1302的基本操作进行编程:根据本人在调试中遇到的问题,特作如下说明:DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位L SB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。
ds1302实时时钟程序说明
DS1302实时时钟在数码管上进行实时显示的程序
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit rst=P2^4;
sbit io=P2^0;
}
write_ds1302(0x8e,0x80); //进行写保护
}
void read_rtc()
{
uchar i;
for(i=0;i<7;i++)
{
time_data[i]=read_ds1302(read_add[i]);
}
}
void time_pros()
{
disp[0]=time_data[6]%16;//将BCD码(这里与十六进制没有区别)进行十位个位的分离
{
j=time_data[i]/10;//十位5
time_data[i]%=10;//各位8
time_data[i]=time_data[i]+j*16;
}
write_ds1302(0x8e,0x00);//去除写保护
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_data[i]);
disp[1]=time_data[6]/16;
disp[2]=17;
disp[3]=time_data[5]%16;
disp[4]=time_data[5]/16;
disp[5]=17;
DS1302时钟程序(完整版),液晶显示
#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar table0[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //液晶显示数字0——9代码sbit SCLK=P1^0;sbit DATA=P1^1;sbit CE=P1^2;sbit RS=P2^0;sbit RW=P2^1;sbit EN=P2^2;sbit FB=P0^7;sbit start=P1^4;sbit stop=P1^5;uchar i;/*******************延时n微秒函数*****************/void delaynus(uchar n) //n us延时函数{// uchar i;for(i=n;i>0;i--);}/*******************写数据函数*****************/void write1302(uchar add,uchar dat){CE=0;SCLK=0;CE=1;for(i=0;i<8;i++) //写入地址{DATA=add&0x01;SCLK=1;SCLK=0;add>>=1;}for(i=0;i<8;i++) //写入数据{DATA=dat&0x01;SCLK=1;SCLK=0;dat>>=1;}SCLK=1;CE=0;}/*******************读数据函数*****************/uchar read1302(uchar add){uchar dat;CE=0;SCLK=0;CE=1;for(i=8;i>0;i--) //写入地址{DATA=add&0x01;SCLK=1;SCLK=0;add>>=1;}for(i=8;i>0;i--) //读出数据/********************为神马???**************************/{dat>>=1;if(DATA==1)dat=dat|0x80;SCLK=1;SCLK=0;}SCLK=1;CE=0;return dat;}/*******************DS1302初始化函数*****************/void init1302(){uchar flag;flag=read1302(0x81);if(flag&0x80){write1302(0x8e,0x00);write1302(0x80,0x00);write1302(0x82,(((1/10)<<4)|(1%10)));write1302(0x84,(((20/10)<<4)|(20%10)));write1302(0x86,(((19/10)<<4)|(19%10)));write1302(0x88,(((7/10)<<4)|(7%10)));write1302(0x8a,((2/10)<<4)|(2%10));write1302(0x8c,(((11/10)<<4)|(11%10)));write1302(0x90,0xa5); //充电。
DS1302实时时钟芯片应用
DS1302实时实钟芯片应用(一)DS1302概述DS1302是DALLAS公司生产的绢流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与微控制器进行通信。
具有秒、分、时、日、周、月、年信息。
每月的天数和闰年的天数可自动调整。
时钟和RAM的读/写可以以一个字节或多达31个字节的形式进行传输。
DS1302工作时的功耗很低,保持数据和时钟信息时所需功率小于1mW。
有主电源和备用电源。
(二)DS1302的主要性能A. 实时时钟能计算到2099年B. 31字节静态RAMC. 串口通信方式D. 电压范围2~5.5V,2V时工作电流小于300nAE. 温度范围-40~+85℃(三)引脚及功能(四)DS1302的命令字每一次数据传送都由一字节命令字开始,其后紧跟一字节数据或多字节数据。
命令字如下:读写DS1302内部RAM命令字如下:(五)DS1302的数据传送通过把/RST拉至高电平来启动数据传送,将/RST拉至低电平则可终止数据传送,I/O引脚变为高阻状态。
数据输入时,在时钟的上升沿数据必须有效,而数据位在时钟的下降沿输出。
上电时,在Vcc≥2.5V之前,/RST必须为逻辑0。
此外,当把/RST拉至逻辑1时,SCLK必须为逻辑0。
跟随在写命令字节的8个SCLK周期之后,在下8个SCLK周期的上升沿输入数据字节,如果有额外的SCLK 周期,它们将被忽略,数据从最低位(位0)开始传送。
跟随在读命令字节的8个时钟周期之后,在下8个时钟周期的下将沿输出数据字节。
注意:被传送的第一个数据位发生在写命令字节的最后一位之后和第一个下将沿。
只要/RST保持高电平,如果有额外的时钟周期,它们将重新发送数据字节,这一操作使之具有连续的多字节的读能力。
另外,在时钟的每一个上升沿,I/O引脚为三态。
数据从最低位开始是传送。
DS1302的多字节读写:对时钟/日历寄存器进行多字节读写时,其命令字节BFH为读,BEH为写;当对RAM 进行多字节读写时,其命令字节FFH为读,FEH为写。
时钟芯片DS1302 的程序(C51程序)
时钟芯片DS1302 的程序(C51程序)模块名称:DS1302.c功能:实时时钟模块时钟芯片型号:DS1302 程序设计:zhaojunjie********************************************************************* /#includesbit T_CLK = P2^7; /*实时时钟时钟线引脚 */ sbit T_IO = P1^4; /*实时时钟数据线引脚 */ sbit T_RST = P1^5; /*实时时钟复位线引脚 */sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;void RTInputByte(uchar); /* 输入 1Byte */uchar RTOutputByte(void); /* 输出?1Byte */void W1302(uchar, uchar);uchar R1302(uchar);void Set1302(uchar *); /* 设置时间 */void Bcd2asc(uchar,uchar *);void Get1302(uchar curtime[]); /* 读取1302当前时间 *//********************************************************************函数名:RTInputByte()功能:实时时钟写入一字节说明:往DS1302写入1Byte数据 (内部函数)入口参数:d 写入的数据返回值:无设计:zhaojunjie********************************************************************* **/void RTInputByte(uchar d){uchar i;ACC = d;for(i=8; i>0; i--){T_IO = ACC0; /*相当于汇编中的 RRC */T_CLK = 1;T_CLK = 0;ACC = ACC >> 1;}}/********************************************************************函数名:RTOutputByte()功能:实时时钟读取一字节说明:从DS1302读取1Byte数据 (内部函数)入口参数:无返回值:ACC设计:zhaojunjie********************************************************************* **/uchar RTOutputByte(void){uchar i;for(i=8; i>0; i--){ACC = ACC >>1; /*相当于汇编中的 RRC */ACC7 = T_IO;T_CLK = 1;T_CLK = 0;}return(ACC);}/********************************************************************函数名:W1302()功能:往DS1302写入数据说明:先写地址,后写命令/数据 (内部函数)调用:RTInputByte() , RTOutputByte()入口参数:ucAddr: DS1302地址, ucData: 要写的数据返回值:无设计:zhaojunjie********************************************************************* **/void W1302(uchar ucAddr, uchar ucDa){T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(ucAddr); /* 地址,命令 */RTInputByte(ucDa); /* 写1Byte数据*/T_CLK = 1;T_RST = 0;}/********************************************************************函数名:R1302()功能:读取DS1302某地址的数据说明:先写地址,后读命令/数据 (内部函数)调用:RTInputByte() , RTOutputByte()入口参数:ucAddr: DS1302地址返回值:ucData :读取的数据设计:zhaojunjie********************************************************************* **/uchar R1302(uchar ucAddr){uchar ucData;T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(ucAddr); /* 地址,命令 */ucData = RTOutputByte(); /* 读1Byte数据 */T_CLK = 1;T_RST = 0;return(ucData);}/********************************************************************函数名:BurstW1302T()功能:往DS1302写入时钟数据(多字节方式)说明:先写地址,后写命令/数据调用:RTInputByte()入口参数:pWClock: 时钟数据地址格式为: 秒分时日月星期年控制8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie********************************************************************* **/void BurstW1302T(uchar *pWClock){uchar i;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */for (i = 8; i>0; i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/{RTInputByte(*pWClock); /* 写1Byte数据*/pWClock++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:BurstR1302T()功能:读取DS1302时钟数据说明:先写地址/命令,后读数据(时钟多字节方式)调用:RTInputByte() , RTOutputByte()入口参数:pRClock: 读取时钟数据地址格式为: 秒分时日月星期年7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie********************************************************************* **/void BurstR1302T(uchar *pRClock){uchar i;T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */for (i=8; i>0; i--){*pRClock = RTOutputByte(); /* 读1Byte数据 */pRClock++;}T_CLK = 1;}/********************************************************************函数名:BurstW1302R()功能:往DS1302寄存器数写入数据(多字节方式)说明:先写地址,后写数据(寄存器多字节方式)调用:RTInputByte()入口参数:pWReg: 寄存器数据地址返回值:无设计:zhaojunjie********************************************************************* **/void BurstW1302R(uchar *pWReg){uchar i;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xfe); /* 0xbe:时钟多字节写命令*/for (i=31; i>0; i--) /* 31Byte 寄存器数据 */{RTInputByte(*pWReg); /* 写1Byte数据*/pWReg++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:BurstR1302R()功能:读取DS1302寄存器数据说明:先写地址,后读命令/数据(寄存器多字节方式)调用:RTInputByte() , RTOutputByte()入口参数:pRReg: 寄存器数据地址返回值:无设计:zhaojunjie********************************************************************* **/void BurstR1302R(uchar *pRReg){uchar i;T_CLK = 0;T_RST = 1;RTInputByte(0xff); /* 0xff:时钟多字节读命令 */for (i=31; i>0; i--) /*31Byte 寄存器数据 */{*pRReg = RTOutputByte(); /* 读1Byte数据 */pRReg++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:Set1302()功能:设置初始时间说明:先写地址,后读命令/数据(寄存器多字节方式)调用:W1302()入口参数:pClock: 设置时钟数据地址格式为: 秒分时日月星期年7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie********************************************************************* **/void Set1302(uchar *pClock){uchar i;uchar ucAddr = 0x80;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/for(i =7; i>0; i--){W1302(ucAddr,*pClock); /* 秒分时日月星期年*/pClock++;ucAddr +=2;}W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/}/********************************************************************函数名:Get1302()功能:读取DS1302当前时间说明:调用:R1302()入口参数:ucCurtime: 保存当前时间地址。
ds1302实时时钟程序
/* 时间:4月19日功能:使用ds1302实时时钟芯片,用共阴数码管显示时,分,秒*/#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit io=P3^4;sbit cs=P3^5;sbit clk=P3^6;uchar code table1[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80};uchar code table2[]={ //译码器与单片机的接线引脚P2.4 P2.3 P2.20xe3,0xe7,0xeb,0xef,0xf3,0xf7,0xfb,0xff};uchar time[7]={14,2,3,25,23,59,50}; //初始化实时时钟时间uchar register_wr[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};uchar register_re[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; uchar temp1[7];uchar shi,ge;void delay_ms(uchar t);void delay(); //大约10usvoid spi_writebyte(uchar dat);uchar spi_readbyte();void ds1302_spiwrite(uchar add,uchar dat);uchar ds1302_spiread(uchar add);void ds1302_init();void ds1302_run(); //ds1302全运行过程void display(); //共阴数码管显示过程void main(){ds1302_init();while(1){ds1302_run();display();}}void delay_ms(uchar t){uchar x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}void ds1302_run(){ //ds1302全运行过程uchar i;for(i=0;i<7;i++){ds1302_spiwrite(0x8e,0x80);//写保护,不让写temp1[i]=ds1302_spiread(register_re[i]); //将十六进制数转换成相同数字的十进制shi=temp1[i]/16;ge=temp1[i]%16;time[i]=shi*10+ge;}}void display(){P0=table1[time[4]/10]; P2=table2[0];delay_ms(1);P0=table1[time[4]%10]; P2=table2[1];delay_ms(1);P0=table1[16];P2=table2[2];delay_ms(1);P0=table1[time[5]/10]; P2=table2[3];delay_ms(1);P0=table1[time[5]%10]; P2=table2[4];delay_ms(1);P0=table1[16];P2=table2[5];delay_ms(1);P0=table1[time[6]/10];P2=table2[6];delay_ms(1);P0=table1[time[6]%10];P2=table2[7];delay_ms(1);}void ds1302_init(){uchar i;ds1302_spiwrite(0x8e,0x00); //wp是写允许位。
DS1302原理及程序说明
DS1302原理及程序说明DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM ,通过简单的串行接口与单片机进行通信。
实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。
DS1302 与单片机之间能简单地采用同步串行的方式进行,DS1302的引脚命名如图1-1所示。
通信仅需用到三根信号线:(1)CE 片选,(2)I/O 数据线,(3)SCLK 串行时钟,DS1302与CPU 的连接如图1-2所示。
时钟/RAM 的读/写数据以一个字节或多字节的字符组方式通信,DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW 。
DS1302具有双电源管脚,用于主电源和备份电源供应Vcc1,为可编程涓流充电电源附加七个字节存储器,它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等产品领域。
DS1302主要的性能指标如下:实时时钟具有能计算2100 年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力31× 8 位暂存数据存储RAM 串行I/O 口方式,使得管脚数量最少宽范围工作电压2.0~ 5.5V工作电流2.0V 时,小于300nA读/写时钟或RAM 数据时有两种传送方式:单字节传送和多字节传送字符组方式8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配简单3 线接口与TTL 兼容Vcc=5V 。
DS1302的读写模式工作时序如图1-3和图1-4所示。
图1-3 单字节读模式图1-4 单字节写模式注:在多字节模式下,SCLK 发出同步脉冲,CS 须持续保持高电平直到多字节操作结束,图1-1 DS1302引脚图1-2 DS1302与CPU 接口DS1302内部寄存器的地址定义如表1-1所示。
表1-1 寄存器的地址及定义实验说明1. DS1302与51单片机的连接IO ——P2.7:串行数据输入/输出引脚SCLK ——P2.6:串行时钟引脚CE ——P2.4:片选CE2. LCD 与单片机连接;************************************************************************* ; LCD Module LMB1602 与单片机连接:;************************************************************************* ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ;Vss Vdd V o RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 BLA BLK ; 0V +5V 0V P32 P33 P34 ---------------- P1[0..7] ---------------- +5V 0V;*************************************************************************3. LCD 显示功能说明LCD1602显示格式如图1-5所示。
DS1302 时钟电路
时钟电路1应用:1.1需要显示时钟及日期或实现时钟控制的电子设备。
1.2本电路在HGT2110、HGT3101、HDM2100、HDM3200中成功应用。
2特性:2.1年、月、日、时、分、秒、星期的实时走时;2.2可设置为12小时制或24小时制走时;2.3日历时钟数据可读写,可启动写保护;2.4可接入3V电池,断电后由电池供电走时,电池供电通常可持续一年以上;2.5可对电池设置充电参数。
3核心部件:3.1DS1302,DIP8 或SOP8封装(推荐)。
4外围关键元件:4.132768Hz晶体振荡器;4.23V电池。
5设计注意事项:5.1晶体振荡器必须采用32768Hz,其引脚不得接入其它元件;5.2晶振引脚具有高阻抗特性,印制板漏电会导致停振。
设计时引脚应尽量短,远离周边元件或导线,并应大于2mm;5.3此器件对潮湿、低温敏感,推荐线路进行防潮处理;5.4不推荐使用大容量电容替代电池,电容引脚易与其它线路板接通造成其它线路板元件损坏。
6软件设计要点:6.1上电初始化必须设置为充电;6.2上电后对秒进行操作,可避免时钟锁定;6.3非写入数据操作后启动写保护;7原理图:7.1见DS1302.Ddb文件;8引脚说明或时序图:8.1见DS1302.pdf文件;9主要指标:10C语言例程:10.1本例在HDM3200消防电话总机中应用,CPU为ATmega32L ,工作频率为4MHz。
//************************************************************************// // 日历时钟DS1302公用变量说明 // // -------------------------------------------------------------------- // // uchar cale[7] 下标对应 0 1 2 3 4 5 6 // // year month day hour minute second week // // 年月日时分秒星期 // // write_cale(why) 将cale[]中指定的日期或时间写入dallas中 // // get_cale(why); 获得由why指定的日期或时钟,并且赋值给cale[why] // // why--指定年、周、月、日、时、分、秒中的一个, why可取year或 // // month或day或hour或minute或second或week // //************************************************************************// // -------------------------------------------------------------------- // // 充电设置 //// -------------------------------------------------------------------- // // 使用bttay_charger(uchar charge_set)函数,其中 // // charge_set: 0--不充电 4.3V时 0mA 0mA // // 1--2K充电 4.3V时 1.8mA 1.5mA // // 2--4K充电 4.3V时 0.9mA 0.8mA // // 3--8K充电 4.3V时 0.45mA 0.4mA // // 默认使用1只二极管建议使用4K电阻(0.9mA) // // -------------------------------------------------------------------- // //************************************************************************////DS1302时钟端口定义(以下端口可根据实际使用改变)-------------------------// #define SET_DS_RST SETBIT(PORTD,1) //ret=1#define CLK_DS_RST CLRBIT(PORTD,1) //ret=0#define SET_DS_SCL SETBIT(PORTB,7) //scl=1#define CLK_DS_SCL CLRBIT(PORTB,7) //scl=0#define SET_DS_DAT SETBIT(PORTB,2) //data=1#define CLK_DS_DAT CLRBIT(PORTB,2) //data=0#define IN_DS_DAT CLRBIT(DDRB,2) //data port is input#define OUT_DS_DAT SETBIT(DDRB,2) //data port is output#define CHK_DS_DAT CHKBIT(PINB,2) //get data#define dec_dallas(x) ((x/10)*16+x%10) //将10进制数转换为dallas数#define dallas_dec(x) ((x/16)*10+x%16) //将dallas数转换为10进制数//日历时钟全局变量定义---------------------------------------------------// unsigned char cale[7]; //日期缓存数据,下标用以下宏表示#define year 0 //年#define month 1 //月#define day 2 //日#define hour 3 //时#define minute 4 //分#define second 5 //秒#define week 6 //星期//**********************************************************//// DS1302日历时钟电路程序 //// ------------------------------------------------------ //// 涓流充电:read_dallas(0x91) write_dallas(0x90) //// 控制:read_dallas(0x8f) write_dallas(0x8e) //// 年:read_dallas(0x8d) write_dallas(0x8c) //// 周:read_dallas(0x8B) write_dallas(0x8a) //// 月:read_dallas(0x89) write_dallas(0x88) //// 日:read_dallas(0x87) write_dallas(0x86) //// 时:read_dallas(0x85) write_dallas(0x84) //// 分:read_dallas(0x83) write_dallas(0x82) //// 秒:read_dallas(0x81) write_dallas(0x80) //// ----------------------------------------------------- //// 内有31字节RAM 存储器,掉电失去: //// write_dallas(0xc0 - 0xfc) 偶数写 //// read_dallas(0xc1 - 0xfd) 奇数读 ////**********************************************************////**********************************************************//// 数据写入时钟芯片DS1302 //// ------------------------------------------------------ //// 功能:将数据ch写入地址为rtc_add的存储单元中 //// 输入参数:地址----uchar rtc_add //// 数据----uchar ch ////**********************************************************//void write_dallas(uchar rtc_add,uchar ch){unsigned char i;OUT_DS_DAT; //set DAT outputCLK_DS_SCL; //CLK=0SET_DS_RST; //RST=1for(i=0;i<8;i++){if(rtc_add & (0x01<<i)) SET_DS_DAT; //DAT=1else CLK_DS_DAT; //DAT=0SET_DS_SCL; //CLK=1CLK_DS_SCL; //CLK=0}for(i=0;i<8;i++){if(ch & (0x01<<i)) SET_DS_DAT; //DAT=1else CLK_DS_DAT; //DAT=0SET_DS_SCL; //CLK=1CLK_DS_SCL; //CLK=0}CLK_DS_RST; //RST=0 IN_DS_DAT; //set DAT input}g//**********************************************************//// 从时钟芯片DS1302 读出数据 //// ------------------------------------------------------ //// 功能:将数据ch写入由地址为rtc_add存储单元中读出数据 //// 输入参数:地址----uchar rtc_add //// 返回参数:数据----uchar read_dallas() ////**********************************************************// unsigned char read_dallas(unsigned char rtc_add){unsigned char i,j;j=0;OUT_DS_DAT; //set DAT outputCLK_DS_SCL; //CLK=0SET_DS_RST; //RST=1for(i=0;i<8;i++) {if(rtc_add & (0x01<<i)) SET_DS_DAT; //DAT=1else CLK_DS_DAT; //DAT=0SET_DS_SCL; //CLK=1CLK_DS_SCL; //CLK=0}IN_DS_DAT; //set DAT inputSET_DS_DAT; //DAT=1 置为上拉电阻for(i=0;i<8;i++) {if(CHK_DS_DAT) j|=0x01<<i; //j=DATSET_DS_SCL; //CLK=1CLK_DS_SCL; //CLK=0}CLK_DS_RST; //RST=0;return(j);}//**********************************************************//// 设置DS1302日期或时间 //// ------------------------------------------------------ //// 功能:将cale[]中指定的日期或时间设置到DS1302中 //// 输入参数:why--指定年、周、月、日、时、分、秒中的一个 //// 即year、week、month、day、hour、minute、second //// 以下例程将8点30分10秒写入DS1302: //// cale[hour]=8; //// cale[minute]=30; //// cale[second]=10; //// for(i=hour; i<=second; i++) write_cale(i); ////**********************************************************// void write_cale(uchar why){uchar d;write_dallas(0x8e,0x00); //关闭写保护d=dec_dallas(cale[why]);if(!why) write_dallas(0x8c,d); //写年else if(why<week) write_dallas(0x80+(10-why*2),d); //写月日时分秒else write_dallas(0x8a,d); //写星期write_dallas(0x8e,0x80); //启动写保护}//**********************************************************//// 获得DS1302指定的日期或时间 //// ------------------------------------------------------ //// 功能:将DS1302中指定的日期或时间赋给cale[why] //// 输入参数:why--指定年、周、月、日、时、分、秒中的一个 //// 即year、week、month、day、hour、minute、second //// 以下例程获取DS102当前时间,并将时间写入cale[]中: //// for(i=hour; i<=second; i++) get_cale(i); ////**********************************************************//void get_cale(uchar why){uchar d;if(!why) d=read_dallas(0x8d); //读年else if(why<week) d=read_dallas(139-(why*2)); //读月日时分秒 else d=read_dallas(0x8b); //读周cale[why]=dallas_dec(d);}//**********************************************************//// 快速获得月、日、时、分、秒 //// ------------------------------------------------------ //// 功能:获取DS1302当前月、日、时、分、秒写入cale[] ////**********************************************************//void fast_get_cale(void){uchar i;for(i=1;i<6;i++) cale[i]=dallas_dec(read_dallas(139-(i*2)));}//**********************************************************//// 获得秒 //// ------------------------------------------------------ //// 功能:直接返回当前秒 //// 返回参数:当前秒—get_second() ////**********************************************************//unsigned char get_second(void) {return dallas_dec(read_dallas(0x81));}//**********************************************************//// 电池充电设置 (应在电路上电时进行初始化设置) //// ------------------------------------------------------ //// 功能:对电池充电方式进行选择或设置 //// 输入参数:charge_set (取值见下表) //// 使用read_dallas(0x91) write_dallas(0x90) 进行设置 //// ------------------------------------------------------ //// 关于充电寄存器: //// D7 D6 D5 D4 D3 D2 D1 D0 //// -------------------------------------------------- //// | 充电设置1010 | 二极管设置|充电限流电阻| //// -------------------------------------------------- //// | 1010: 使能充电 |01: 接通1D |00:无 01:2K | //// | |10: 接通2D |10:4K 11:8K | //// -------------------------------------------------- //// ------------------------------------------------------- //// | 串联电阻 | 1只二极管 | 2只二极管 | //// charge_set: 0--不充电 4.3V时 0mA 0mA //// charge_set: 1--2K充电 4.3V时 1.8mA 1.5mA //// charge_set: 2--4K充电 4.3V时 0.9mA 0.8mA //// charge_set: 3--8K充电 4.3V时 0.45mA 0.4mA //// ------------------------------------------------------ //// 默认使用1只二极管建议使用4K电阻(0.9mA) ////**********************************************************//void bttay_charger(uchar charge_set){write_dallas(0x8e,0x00); //关闭写保护if(!charge_set) write_dallas(0x90,0x00);else write_dallas(0x90,(0xa4|charge_set));write_dallas(0x8e,0x80); //启动写保护}//主程序中应用方法Void main(void){……//时钟初始化bttay_charger(2); //电池充电初始化:0.9mA充电 write_dallas(0x8e,0x00); //关闭写保护write_dallas(0x90,(0xa4|2));write_dallas(0x8e,0x80); //启动写保护get_rili(second);if(rili[second]>59) //时钟自锁时去除锁保护{rili[second]=0;write_rili(second);}get_rili(year); //获得年fast_get_rili(); //获得年月日时分秒……while(1){……}}编著:王立新日期:2009年5月。
DS1302时钟秒表
;******************************************************************; 1 2 3 A;修改时间时,A键为当前修改时间加一,B键为减一,C不保存退出,D保存并退出; 4 5 6 B INT0;INT0键,进入和退出秒表;7 8 9 C INT1;显示时间时,INT1键,进入修改时间程序;秒表时,INT1键为计数清零; E 0 F D T0;显示时间时,T0键为切换日历和时钟,秒表时,T0为开始结束计时;*******************************************************************;修改时间时E键左移F键右移;*******************************************************************LED EQU P0;显示接口KEY EQU P1;键盘接口DUAN EQU P2;LED段控制ZCLK BIT P1.6;时钟线引脚ZIO BIT P3.5;数据线引脚ZRST BIT P1.7;复位线引脚ZINT0BIT P3.2;外部中断0引脚ZINT1BIT P3.3;外部中断1引脚ZT0BIT P3.4;T0引脚ZT1BIT P3.5;T1引脚XSW EQU 7FH;显示首地址SECOND EQU 30H;秒地址XGDDZ EQU 7EH;修改段地址XGSJDZ EQU 7DH;修改时间地址SMBZ EQU 70H;键盘扫描标志位XGWBZ EQU 71H;修改位标志MBBZ EQU72H;秒表标志SS EQU 70H;闪烁缓存地址T0JC EQU 74H;T0计数次数XSW1EQU75H;显示辅助;********************************ORG00H;程序入口LJMP STARTORG03H;外部中断0程序入口LJMP AINT0ORG0BH;定时器T0程序入口LJMP AT0ORG13H;外部中断1程序入口LJMP AINT1ORG1BH;定时器T1程序入口LJMP AT1;********************************ORG30HSTART:CLR SMBZ;清扫描标志,为0表示当前不进行键盘扫描,为1表示扫描。
51单片机 DS1302时钟
/*============================================================使用1602液晶显示DS1302+c51时钟[注:AT89C51使用12M晶振]=============================================================*/#include <AT89x51.h>#include <string.h>#define LCM_RW P2_1 //定义引脚#define LCM_RS P2_0#define LCM_E P2_2#define LCM_Data P0#define Busy 0x80 //用于检测LCM状态字中的Busy标识#define uchar unsigned charsbit T_CLK=P2^3;sbit T_IO =P2^4;sbit T_RST=P2^5;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit LED=P2^0; //背光灯输出(因本实验板无此功能所以此项功能无效)sbit system=P1^1; //模式sbit TimerUp=P1^2; //时间加sbit TimerDown=P1^0; //时间减sbit Speaker=P3^7; //蜂鸣器void Set(uchar,uchar); //根据选择调整相应项目void RTInputByte(uchar); //输入1Byte */uchar RTOutputByte(void); //输出1Byte */void W1302(uchar, uchar); //向DS1302写入一个字节uchar R1302(uchar); //从DS1302读出一个字节void Set1302(uchar * ); //设置时间void KeySound(); //按键音void ClockSound(); //闹铃蜂鸣声uchar id,msec,model,LedTime,d;bit a,b; //闪烁标志位uchar inittime[7]={0x00,0x10,0x19,0x29,0x03,0x04,0x06}; //初始化后设置为:06年3月29日星期3 19点10分0秒void Out_LCM(void); //显示屏幕void model0(void); //显示输出void model1(void);void model2(void);void model3(void);void model4(void);void model5(void);void model6(void);void id_case1_key(); //项目调整void Modset(); //模式键处理void WriteDataLCM(uchar WDLCM);void WriteCommandLCM(uchar WCLCM,BuysC);uchar ReadStatusLCM(void);void LCMInit(void);void OutputInformation(uchar X, uchar Y, uchar DData);void DisplayListChar(uchar X, uchar Y, uchar code *DData);void Delay5Ms(void);void Delay400Ms(void);void systemsetup(void); //进入系统设置uchar code systemp[]={"System.setup"}; //字符串输出(系统设定) uchar code TIMER[]={"Time"}; //字符串输出(时间) uchar code DATE[]={"Date"}; //字符串输出(日期) uchar code alarmclock[]={"Clock"}; //字符串输出(闹铃)uchar code lamp[]={"Lamp"}; //字符串输出(背光灯)uchar code reset[]={"Reset"}; //字符串输出(时间归零)uchar code exit[]={"Exit"}; //字符串输出(退出)uchar code set[]={"Set"}; //字符串输出(设置)uchar code sec[]={"sec"}; //字符串输出(秒)uchar code ClockSet[]={"ClockSet"}; //字符串输出(闹铃设置)uchar code ClockOn[]={"ON"}; //字符串输出(ON)uchar code ClockOff[]={"OFF"}; //字符串输出(OFF)void timesetup(void); //时间设置void datesetup(void); //日期设置void alarmclockset(void); //闹铃设置void lampsetup(void); //背光灯设置void timereset(void); //时间清零void main(void){Speaker=1; //关闭蜂鸣器LED=0; //打开LED ,低电平有效,外接9012驱动Delay400Ms(); //启动等待,等LCM讲入工作状态LCMInit(); //LCM初始化TMOD=0x01; //16位定时TH0=0x3c; //50msTL0=0xb0;EA=1;TR0=1;ET0=1;while(1){if(TimerDown==0) //左移键按下后把背光灯打开{Delay5Ms();if(TimerDown==0){KeySound(); //蜂鸣声LED=0; //打开背光灯LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16;} //取出背光灯时间并转换为十进制数}b=1; //模式键是否动作标志。
DS1302时钟基础使用(含代码)
DS1302时钟基础使⽤(含代码)了解其管脚X1 X2 32.768KHz 晶振管脚GND 地RST 复位脚I/O 数据输⼊/输出引脚,具有三态SCLK 串⾏时钟Vcc1,Vcc2(备⽤电源供电)电源供电管脚DS1302 的寄存器及⽚内RAM控制寄存器⽤于存放DS1302的控制命令字,DS1302的RST引脚回到⾼电平后写⼊的第⼀个字就为控制命令。
它⽤于对DS1302读写过程进⾏控制,它的格式如下:D7:固定为1D6:RAM/CK位,=1⽚内RAM,=0⽇历、时钟寄存器选择位。
D5~D1:地址位,⽤于选择进⾏读写的⽇历、时钟寄存器或⽚内RAM。
对⽇历、时钟寄存器或⽚内RAM的选择见表。
D0:读写选择,=0写,=1读⽇历时钟寄存器写保护寄存器⽤于初始化时钟void Ds1302Init(){uchar n;Ds1302Write(0x8E,0X00); //禁⽌写保护,就是关闭写保护功能for (n=0; n<7; n++)//写⼊7个字节的时钟信号:分秒时⽇⽉周年{Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);}Ds1302Write(0x8E,0x80); //打开写保护功能}寄存器说明数据输出输⼊在控制指令字输⼊后的下⼀个SCLK时钟的上升沿时,数据被写⼊DS1302,数据输⼊从低位即位0开始。
同样,在紧跟8位的控制指令字后的下⼀个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到⾼位7。
单字节读和写DS1302是通过SPI串⾏总线跟单⽚机通信的,当进⾏⼀次读写操作时最少得读写两个字节,第⼀个字节是控制字节,就是⼀个命令,告诉DS1302是读还是写操作,是对RAM还是对CLOK寄存器操作。
第⼆个字节就是要读或写的数据了。
单字节读写:只有在SCLK为低电平时,才能将CE置为⾼电平。
所以在进⾏操作之前先将SCLK置低电平,然后将CE置为⾼电平,接着开始在IO上⾯放⼊要传送的电平信号,然后跳变SCLK。
DS1302时钟芯片单片机控制操作步骤
DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力.RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc>2.0V之前,RST必须保持低电平。
只有在SCLK 为低电平时,才能将RST置为高电平。
时钟相关寄存器:时钟数据为BCD码格式,秒寄存器的CH位:时钟暂停位,为1是,振荡器停止工作,进入低功耗。
小时寄存器:最高位12/24:为1时表示12小时模式,0表示24小时模式。
第5位A/P,1表示下午,0表示上午。
DS1302命令控制字:DS1302的RAM共31个,寄存器地址范围:C0H~FDH,其中奇数为读操作,偶数为写操作DS1302的读写时序:通过控制RST端为高电平启动读写操作,首先发送8位命令控制字,指明读操作还是写操作,及读写的地址。
数据从低到高位顺序传输。
上电时,RST脚必须为低电平,当把RST置为高电平前,SCLK必须为低电平。
写过程:一、启动准备:RST为低电平,SCLK为低电平--PORTB&=~(1<<PB2); PORTB&=~(1<<PB0);二、启动读写开始信号:将RST置为高电平--- PORTB|=(1<<PB2);三、发送要写入地址的命令字节数据,如写秒寄存器,命令字节为80H,write_byte(0x80);四、延时10ms,SCLK 置低电平,----delay(10);PORTB&=~(1<<PB0);五、发送要写入秒寄存器的数据; write_byte(0x02);六、结束写入过程:SCLK清0,RST置为低电平。
用ds1302做时钟电路图详解
DS1302 是由美国 DALLAS 公司推出的具有涓细电流充电能力的低功 耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有 闰年补偿等多种功能。 DS1302 主要性能指标: 1、DS1302 是一个实时时钟芯片,可以提供秒、分、小时、日期、 月、年等信息,并且还有软件自动调整的能力,可以通过配置 AM/PM 来决 定采用 24 小时格式还是 12 小时格式。 2、拥有 31 字节数据存储 RAM。 3、串行 I/O 通信方式,相对并行来说比较节省 IO 口的使用。 4、DS1302 的工作电压比较宽,大概是 2.0V~5.5V 都可以正常工作。
一次。 ds1302 相关文章:51 单片机 DS1302 实时时钟驱动程序
5、DS1302 这种时钟芯片功耗一般都很低,它在工作电压 2.0V 的时 候,工作电流小于 300nA。 6、DS1302 共有 8 个引脚,有两种封装形式,一种是 DIP-8 封装,芯 片宽度(不含引脚)是 300mil,一种是 SOP-8 封装,有两种宽度,一种是 150mil,一种是 208mil。 7、当供电电压是 5V 的时候,兼容标准的 TTL 电平标准,这里的意 思是,可以完美的和单片机进行通信。 8、由于 DS1302 是 DS1202 的升级版本,所以所有的功能都兼容 DS1202。此外 DS1302 有两个电源输入,一个是主电源,另外一个是备用电 源,比如可以用电池或者大电容,这样是为了保证系统掉电的情况下,我们 的时钟还会继续走。如果使用的是充电电池,还可以在正常工作时,设置充 电功能,给我们的备用电池进行充电。 DS1302 引脚功能 1 脚 VCC2 是主电源正极的引脚,2 脚 X1 和 3 脚 GND 是负极,5 脚 CE 是使能引脚,接单片机的 IO 口,6 脚 I/O 是数据传输引脚,接单片机的 IO 口,7 脚 SCLK 是通信时钟引脚,接单 片机的 IO 口,8 脚 VCC1 是备用电源引脚。 如果在 8 脚接一个 10uF 的电容,经过试验可以运行 1 分钟左右的时 间,如果大家想运行时间再长,可以加大电容的容量。电路图如下: 用 ds1302 做时钟电路图 DS1302 的电路一个重点就是时钟电路,它所使用的晶振是一个 32.768k 的晶振,晶振外部也不需要额外添加其他的电容或者电阻电路了。时 钟的精度,首先取决于晶振的精度以及晶振的引脚负载电容。如果晶振不准 或者负载电容过大过小,都会导致时钟误差过大。在这一切都搞定后,最终 一个考虑因素是晶振的温漂。随着温度的变化,晶振往往精度会发生变化, 因此,在实际的系统中,其中一种方法就是经常校对。比如我们所用的电脑 的时钟,通常我们会设置一个选项将计算机设置于 internet 时间同步。选中这 个选项后,一般可以过一段时间,我们的计算机就会和 internet 时间校准同步
SPI总线的DS1302实时钟控制
实验四SPI总线的DS1302实时钟控制一、实验目的1、了解电子电路PROTEUS软件的在单片机方面的仿真使用2、掌握具有SPI总线DS1302、MAX7219芯片的使用及编程二、实验要求在PROTEUS环境下,利用DS1302实时钟芯片实现时间、日期的显示,并且具有调节时间、日期的功能,显示用共阴极LED显示。
用串行芯片MAX7219驱动LED显示.实现此功能的电路原理图如下所示:1、显示“星期”的共阳极二极管接到单片机的P0口,P0口数据线接上拉电阻;2、显示“时间”或“日期”,是采用MAX7219控制共阴极LED来实现3、DS1302的IO脚接单片机的P1.1,时钟信号SCLK接单片机P1.0,复位信号/RST接单片机P1.2。
DS1302的晶振在这里可以不接,电源、地线都省略。
4、MAX7219是用来驱动“时间”或“日期”的LED显示的。
MAX7219的DIN信号脚接单片机的P2.0,/LOAD接单片机的P2.1,CLK接单片机的P2.2;5、时间/日期的调整:按下调整键,再分别按相应的“星期”、“年”、“月”、“日”,“时”、“分”、“秒“键,即可以调整时间/日期;6、在正常显示时,按下“时间/日期“切换键,即可以在显示时间或日期来回切换。
三、PROTEUS环境下的硬件设计1、打开PROTEUS ISIS,在PROTEUS ISIS编辑窗口中单击列表上的“P”按钮,添加下列元器件:元件名称所属类AT89C51 Microprocessor ICSCRYSTAL 晶振MisecllaneousCAP 电容CapacitorRES 电阻ResistorDS1302 Microprocessor ICS7SEG-COM-ANODE共阳极OptoeletronicsBUTTON按键Switches&relaysMAX7129 Microprocessor ICSRESPACK-7排阻Resistor一、软件设计#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit A7=ACC^7;sbit A0=ACC^0;sbit clk=P1^0; //注意P要大写,DS1302的信号脚的连接sbit dat=P1^1;sbit rst=P1^2;sbit DIN=P2^0; //max7219sbit LOAD=P2^1; //max7219sbit CLK=P2^2; //max7219/*--------------------------------------------------------------------------------------------------------------- MAX7219寄存器宏定义---------------------------------------------------------------------------------------------------------------*/#define DECODE_MODE 0x09 //译码控制寄存器#define INTENSITY 0x0A //亮度控制寄存器#define SCAN_LIMIT 0x0B //扫描界限寄存器#define SHUT_DOWN 0x0C //关断模式寄存器#define DISPLAY_TEST 0x0F //测试控制寄存器bit flag=0; //调整控制标记bit flagh=1; //时间日期切换标记uchar temp[7]; //调整前的时间uchar curtime1[8],curtime2[8]; //调整后的时间显示模式uchar tab1[]={58,59,23,31,8,2,10}; //DS1302初始化时间uchar xingqi; //读取的星期uchar code tab2[]={0xff,0xf9,0xA4,0xb0,0x99,0x92,0x82,0xf8}; //显示星期的共阴极LED uchar code tab3[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x60}; //PROTEUS显示时间窗口的代码uchar code tab4[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x01};/*--------------------------------------------------------------------------------------------------------------- 此函数是向MAX7219写数据(操作字或者显示数据)address是内部寄存器的地址;dat是操作字或者显示的数据---------------------------------------------------------------------------------------------------------------*/ void Write_7219(uchar address,uchar dat){ uchar i;ACC=address;LOAD=0; //拉低片选线,选中器件//发送地址for (i=0;i<8;i++) //移位循环8次{CLK=0; //清零时钟总线DIN=A7; //每次取最高位送max7219CLK=1; //时钟上升沿,发送地址address<<=1; //左移一位}ACC=dat; //发送数据for (i=0;i<8;i++){CLK=0;DIN=A7;CLK=1; //时钟上升沿,发送数据dat<<=1;}LOAD=1; //发送结束,上升沿锁存数据}/*--------------------------------------------------------------------------------------------------------------- 这个是MAX7219的初始化程序DECODE_MODE 0x09 //译码控制寄存器INTENSITY 0x0A //亮度控制寄存器SCAN_LIMIT 0x0B //扫描界限寄存器SHUT_DOWN 0x0C //关断模式寄存器DISPLAY_TEST 0x0F //测试控制寄存器---------------------------------------------------------------------------------------------------------------*/ void Init_7219(void){Write_7219(SHUT_DOWN,0x01); //开启正常工作模式(0xX1)Write_7219(DISPLAY_TEST,0x00); //选择工作模式(0xX0)Write_7219(DECODE_MODE,0x00); //选用不译码模式Write_7219(SCAN_LIMIT,0x07); //8只LED全用Write_7219(INTENSITY,0x04); //设置初始亮度}/*--------------------------------------------------------------------------------------------------------------- 这个程序是往DS1302写一个字节的数据dd是要写的数据---------------------------------------------------------------------------------------------------------------*/ void Write_1302_byte(uchar dd) //写一个字节到1302中{uchar i;ACC=dd;for(i=8;i>0;i--){clk=0;dat=A0;clk=1;ACC>>=1;}}/*--------------------------------------------------------------------------------------------------------------- 这个程序是从DS1302中读取一个字节数据将得到的数据存到累加器中最后将数据存到dd 中---------------------------------------------------------------------------------------------------------------*/ uchar Get_1302_byte(void) //从DS1302中读到i个数据{uchar i;dat=1;for(i=8;i>0;i--){clk=0;ACC>>=1; //右移1位A7=dat; //dat=p1.1,先读出的是低位数据clk=1;}return(ACC);}/*--------------------------------------------------------------------------------------------------------------- 单字节写,向DS1302某地址写入命令或者数据,先写地址,后写命令或者数据addr为地址,num为要写入的命令或者数据---------------------------------------------------------------------------------------------------------------*/ void write_1302(uchar addr,uchar num){rst=0;clk=0;rst=1;Write_1302_byte(addr); //写地址Write_1302_byte(num); //写数据clk=1;rst=0;}/*--------------------------------------------------------------------------------------------------------------- 单字节读,从DS1302某地址读出数据,先写地址,后读命令或者数据addr为地址,将数据存到time中---------------------------------------------------------------------------------------------------------------*/ uchar read_1302(uchar addr){uchar time;rst=0;clk=0;rst=1;Write_1302_byte(addr);time=Get_1302_byte();clk=1;rst=0;return(time);}/*--------------------------------------------------------------------------------------------------------------- 设置1302时间即向时间寄存器中多字节一起写入时间{0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; 向时间寄存器中写初始时间的初始地址将数组tab1中的初始值写入DS1302中---------------------------------------------------------------------------------------------------------------*/ void set_rtc(uchar tab[]){ uchar ucaddr=0x80; //向时间寄存器中写初始时间的初始地址uchar a,i;write_1302(0x8e,0x00); //去除写保护for(i=0;i<7;i++){ a=tab[i]/10; //将十进制数转换为BCD码tab[i]=tab[i]%10;tab[i]=tab[i]+a*16;write_1302(ucaddr,tab[i]);//curtime[i]可用指针形式:*curtime,再加一个curtime++,即可ucaddr+=2;}write_1302(0x8e,0x80); //添加写保护}/*--------------------------------------------------------------------------------------------------------------- 这个函数是将1302的时间寄存器中的数据多字节一起读出,放到curtime数组里{0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};从时间寄存器中读数据的初始地址将读出的数据放到数组curtime中---------------------------------------------------------------------------------------------------------------*/ void get_1302() //将1302的时间寄存器中的数据多字节一起读出,放到curtime数组里{ uchar ucaddr=0x81; //从时间寄存器中读数据的初始地址uchar i=0;//for(i=0;i<7;i++)while(i<7){temp[i]=read_1302(ucaddr);ucaddr+=2;i++;}}/*--------------------------------------------------------------------------------------------------------------- 将读出的时间BCD码转换为十进制数显示将星期数单独取出,将年月日数取出放到curtime1中,将时分秒数取出放到curtime2中---------------------------------------------------------------------------------------------------------------*/ void chuli(){uchar a,j=0;uchar i=0;for(i=0;i<7;i++){a=temp[i]/16;temp[i]=temp[i]%16;temp[i]=temp[i]+a*10; //将BCD码转换为十进制数}xingqi=temp[5]; //将星期数单独取出for(i=2;i>0;i--) //将年月日数取出放到curtime1中{curtime1[j]=temp[i]/10;curtime1[++j]=temp[i]%10;curtime1[++j]=10;j++;}curtime1[j]=temp[0]/10;curtime1[++j]=temp[0]%10;j=0;curtime2[j]=temp[6]/10;curtime2[++j]=temp[6]%10;for(i=4;i>2;i--) //将时分秒数取出放到curtime2中{curtime2[++j]=10;curtime2[++j]=temp[i]/10;curtime2[++j]=temp[i]%10;}}void main(void){uchar i;P3=0xff;Init_7219(); //初始化MAX7219set_rtc(tab1); //初始化DS1302for(i=0;i<222;i++);for(i=0;i<222;i++);while(1){ get_1302();chuli();if(flagh) //如果切换键被按下{i=1; //从第一位数码管开始显示while(i<9){Write_7219(i,tab4[curtime1[i-1]]);i++;}}else{i=1; //从第一位数码管开始显示while(i<9){Write_7219(i,tab4[curtime2[i-1]]);i++;}}P0=tab2[xingqi];if(flag){if(p30==0){temp[5]++;if(temp[5]>=8)temp[5]=1;while(p30==0);}if(p31==0){temp[6]++;if(temp[6]>=99)temp[6]=11;while(p31==0);}if(p32==0){temp[4]++;if(temp[4]>=13)temp[4]=1;while(p32==0);}if(p33==0){temp[3]++;if(temp[3]>=32)temp[3]=1;while(p33==0);}if(p34==0){temp[2]++;if(temp[2]>=24)temp[2]=0;while(p34==0);}if(p35==0){temp[1]++;if(temp[1]>=60)temp[1]=0;while(p35==0);}set_rtc(temp); //调整好时间,将调整好的时间送入DS1302}if(p37==0){flag=~flag;if(flag){temp[0]=0;write_1302(0x80,0x80); //将DS1302暂停,开始调整时间}elsewrite_1302(0x80,0x00); //调整结束,时钟开始走while(p37==0);}if(p36==0){flagh=~flagh;while(p36==0);}}}。
基于51单片机的实时时钟DS1302
基于51单片机的DS1302实时时钟本讲内容:介绍DS1302实时时钟芯片基本知识,演示DS1302例程。
DS1302实时时钟:DS1302能提供包括秒、分、时、日期、月份和年份信息。
闰年可自行调整,可选择12小时制和24小时制,可以设置AM、PM。
只通过三根线进行数据的控制和传递:/RST、I/O、SCLK。
通过备用电源可以让芯片在小于1mw的功率下运作。
DS1302是总线驱动方式,它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。
要想与DS1302通信,首先要先了解DS1302的控制字。
DS1302的控制字如图:位7:必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM 数据。
位5至位1(A4~A0):指示操作单元的地址。
位0:为1表示进行读操作,为0表示要进行写操作,控制字后SCLK下降沿读数据,SCLK上升沿写数据。
数据是低位在前,高位在后。
读数据:读数据时在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据是从最低位到最高位。
写数据:写数据时在紧跟8位的控制字指令后的下一个SCLK脉冲的上升沿,数据被写入DS1302,数据输入也是从最低位(0位)开始。
DS1302的数据读写是通过I/O串行进行的。
当进行一次读写操作时最少要读写两个字节。
第一个字节是控制字节,就是一个命令,告诉DS1302是读还是写操作,是对RAM还是对CLOCK寄存器操作,以及操作的地址。
第二个字节就是要读或写的数据了。
单字节写:在进行操作之前先将CE(也可说是RST)置高电平,然后单片机将控制字的位0放到I/O上,当I/O的数据稳定后,将SCLK置高电平,DS1302检测到SCLK的上升沿后就将I/O上的数据读取,然后单片机将SCLK置为低电平,再将控制字的位1放到I/O上,如此反复,将一个字节控制字的8个位传给DS1302。
DS1302实时时钟电路控制指令表
TCS
DS
时钟多字节 RAM数据0
0 RD/W C0写/C1读 31* 8 位暂存数据存储RAM, 地址C0H~FDH,其中奇数为 读操作,偶数为写操作。
31* 8 位暂存数据存储RAM, 地址C0H~FDH,其中奇数为 12 1 1 。。。 。。。 。。 RD/W 13 1 1 1 1 1 1 0 RD/W FC写/FD读 读操作,偶数为写操作。 RAM字符组 14 1 1 1 1 1 1 1 RD/W FE写/FF读 注:最低位LSB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。 R A M
RAM数据30
数据说明
DS1302实时时钟电路控制指令表
序 分 号 类 1 2 3 4 5 6 7 8 时 钟 命令字节 7 1 1 1 1 1 1 1 1 6 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 3 0 0 0 0 1 1 1 1 2 0 0 1 1 0 0 1 1 1 0 十六进制 命令 秒 分 小时 日 月
0 RD/W 80写/81读 1 RD/W 82写/83读 0 RD/W 84写/85读 1 RD/W 86写/87读 0 RD/W 88写/89读
1 RD/W 8A写/8B读 星期 0 RD/W 8C写/8D读 年
WP为写保护位,WP=0 寄存器数据 能够写入.
1 RD/W 8E写/8F读பைடு நூலகம்控制
WP
0
9 10 11 R A M
1 1 1
0 0 1
0 1 0
1 1 0
0 1 0
0 1 0
0 RD/W 90写/91读 1 RD/W BE写/BF读
TCS: 涓流充电选择 ,TCS=1010能涓流充 电,TCS=其它 禁止充电. DS: 二极管选择位,DS=01 选择一个二极 管,DS=10 选择两个,DS=00 或11,充电功 能也被禁止
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TCS
DS
时钟多字节
R 1 1 0 0 0 0 0 RD/W C0写/C1读 31* 8 位暂存数据存储RAM, 地址C0H~FDH,其中奇数为 12 A 1 1 。。。 。。。 。。 RD/W 13 M 1 1 1 1 1 1 0 RD/W FC写/FD读 读操作,偶数为写操作。 RAM字符组 14 1 1 1 1 1 1 1 RD/W FE写/FF读 注:最低位LSB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。 11
DS1302实时时钟电路控制指令表
序 分 号 类 1 2 3 4 5 6 7 8 时 钟 命令字节 7 1 1 1 1 1 1 1 1 6 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 3 0 0 0 0 1 1 1 1 2 0 0 1 1 0 0 1 1 1 0 十六进制 命令 秒 分
RAM数据0 RAM数据30
数据说明
WP
0
9 10
1 1
0 0
0 1
1 1
0 1
0 1
0 RD/W 90写/91读 1 RD/W BE写/BF读
TCS: 涓流充电选择 ,TCS=1010能涓流充 电,TCS=其它 禁止充电. DS: 二极管选择位,DS=01 选择一个二极 管,DS=10 选择两个,DS=00 或11,充电功 能也被禁止
12/24 小时标志 bit7=1,12 小时模式,AP=1 下午 模式
说明 数据
CH: 时钟停止位,CH=1 振荡器 停,CH=0 振荡器工作允许
数据 7 CH 0 12/24 0 0 0 0 0 0 0 10年 6 5 10秒 10分 小 A/P 时 10日 0 0 10 0 0 10 4 3 2 秒 分 小时 日 月 星期 年 0 0 0 0 0 0 1 0
0 RD/W 80写/81读 1 RD/W 82写/83读
0 RD/W 84写/85读 小时 1 RD/W 86写/87读 0 RD/W 88写/8Байду номын сангаас读 日 月
1 RD/W 8A写/8B读 星期 0 RD/W 8C写/8D读 年
WP为写保护位,WP=0 寄存器数据 能够写入.
1 RD/W 8E写/8F读 控制