ds1302实时时钟程序说明
- 格式:doc
- 大小:226.50 KB
- 文档页数:5


××大学 ××大学
#include
#include"xianshi.h"
sbit io=P1^0; // 1302通信允许
sbit SCLK=P1^1; // 1302串行数据的位同步脉冲信号
sbit RST=P1^2; // 1302双向串行数据传送
sbit ACC7=ACC^7;
sbit ACC0=ACC^0;
uchar tab[7];
uchar year[12]={2,0,0,0,0x2d-0x30,0,0,0x2d-0x30,0,0,0x20-0x30,0x20-0x30};
uchar week[7][3]={"mon","tue","wen","thu","fri","sat","sun"};
uchar date[8]={0,0,0x3a-0x30,0,0,0x3a-0x30,0,0};
void write1302(uchar date)//向ds1302写数据
{
uchar i;
SCLK=0; //初始时钟线置为0
ACC=date;
for(i=8;i>0;i--) //开始传输8个字节的数据
{
io=ACC0; //取最低位,注意DS1302的数据和地址都是从最低位开始传输的
SCLK=1; //时钟线拉高,制造上升沿,SDA的数据被传输 ××大学
SCLK=0; //时钟线拉低,为下一个上升沿做准备
ACC=ACC>>1; //数据右移一位,准备传输下一位数据
}
}
uchar read1302()//读ds1302数据
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1; //要返回的数据左移一位
ACC7=io; //从1302由低位到高位逐渐取数据,存入ACC中
ds1302时钟程序详解,ds1302程序流程图(C程序)
ds1302时钟程序详解
DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
2.3 数据输入输出(I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
2.4 DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
ds1302程序流程图
3.2 DS1302实时时间流程
图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。下面结合流程图对DS1302的基本操作进行编程:
根据本人在调试中遇到的问题,特作如下说明: DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。 在DS1302的时钟日历或RAM进行数据传送时,DS1302必须首先发送命令字节。若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输出数据字节。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,在此方式下可一次性读、写所有的RAM的31个字节。 要特别说明的是备用电源B1,可以用电池或者超级电容器(0.1F以上)。虽然DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。可以用老式电脑主板上的3.6V充电电池。如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。100 μF就可以保证1小时的正常走时。DS1302在第一次加电后,必须进行初始化操作。初始化后就可以按正常方法调整时间。
/******************* 说明 :**************************
将实时时钟数据通过 LCD1602 显示 基于 51 单片机
**************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int uchar dis_time_buf[16]={0};
//LCD1602 引脚定义
// 采用 8 位并行方式 ,DB0~DB7 连接至 LCDDATA0~LCDDATA7
sbit RS=P2A0;
sbit RW=P2A1;
sbit CS=P2A2;
#define LCDDATA P0
//DS1302 引脚定义
sbit RST=P1A3;
sbit IO=P1A2;
sbit SCK=P1A1;
//DS1302 地址定义
#define ds1302_sec_add 0x80 // 秒数据地址
#define ds1302_min_add 0x82 // 分数据地址
#define ds1302_hr_add 0x84 // 时数据地址
#define ds1302_date_add 0x86 // 日数据地址
#define ds1302_month_add 0x88 // 月数据地址
#define ds1302_day_add 0x8a // 星期数据地址 #define ds1302_year_add 0x8c // 年数据地址
#define ds1302_control_add 0x8e // 控制数据地址
#define ds1302_charger_add 0x90
#define ds1302_clkburst_add 0xbe
// 初始时间定义
#include
#define uint unsigned int
#define uchar unsigned char
sbit lcden=P2^0;
sbit lcdrw=P2^1;
sbit lcdrs=P2^2;
sbit key4=P3^7;
sbit key3=P3^6;
sbit key2=P3^5;
sbit key1=P3^4;
sbit dscs=P1^0;
sbit dsas=P1^1;
sbit dsrw=P1^2;
sbit dsds=P1^4;
sbit dsirq=P3^2;
sbit beep=P2^7;
uchar num,k4num,k3num,k2num,k1num,flag,flag1,flag2,ak4num;
char shi,fen,miao,ashi,afen,amiao,month,day,week;
uint a,year;
uchar code t1[]=" 2000-00-00 000";
uchar code t2[]=" 00:00:00";
uchar code t3[]="OFF 00:00:00";
void write_ds(uchar,uchar);
uchar read_ds(uchar);
void set_time();
void set_alarm(uchar,uchar,uchar);
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void didi()//闹钟
{
beep=0;
delay(5);
beep=1;
delay(5);
beep=0;
delay(5);
beep=1;
}
void write_com(uchar com) //向液晶屏写指令
{ lcdrw=0;