ds1302时钟程序详解经典
ds1302实时时钟C程序
*输入: ucAddr:控制字
*返回值: ucDa :读取的数据
**********************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
//OE=0;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(ucAddr); /*地址,命令*/
ucDa = uc_RTOutputByte(); /*读1Byte数据*/
T_CLK = 1;
T_RST =0;
// OE=1;
return(ucDa);
}
/***************************************
v_WTInputByte(ucDa); /*写1Byte数据*/
T_CLK = 1;
T_RST =0;
//OE=1;
}
/*********************************************
*名称: uc_R1302
*说明:先写地址,后读数据
*功能:读取DS1302某地址的数据
{Baidu Nhomakorabea
51单片机ds1302实时时钟程序
51单⽚机ds1302实时时钟程序
#ifndef __DS1302_H_
#define __DS1302_H_
//---包含头⽂件---//
#include
#include
//---重定义关键词---//
#ifndefuchar
#define uchar unsigned char
#endif
#ifndefuint
#define uint unsigned int
#endif
//---定义ds1302使⽤的IO⼝---//
sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;
//---定义全局函数---//
void Ds1302Write(ucharaddr, uchardat); uchar Ds1302Read(ucharaddr);
void Ds1302Init();
void Ds1302ReadTime();
//---加⼊全局变量--//
extern uchar TIME[7]; //加⼊全局变量#endif #include"ds1302.h"
//---DS1302写⼊和读取时分秒的地址命令---//
//---秒分时⽇⽉周年最低位读写位;-------//
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
DS1302程序
实时时钟DS1302读写程序(C51)
//打开DS1302
void TimeSpiOpen(void)
{
TIMECLK = 0;
TIMERST = 0;//禁止DS1302
TIMEIO = 1;//释放数据总线
TIMERST = 1;//使能DS1302
}
//关闭DS1302
void TimeSpiClose(void)
{
TIMERST = 0;//禁止DS1302
TIMEIO = 1;//释放数据总线
TIMECLK = 1;
}
//读写DS1302
unsigned char TimeSpiReadWrite(unsigned char val) {
unsigned char i;
ACC = val;//取8位数据
for (i = 8;i > 0; i--)
{
TIMECLK = 0;//时钟下降沿输入数据(DS1302读)
_nop_();//延时
CY = TIMEIO;//接收串行数据到CY
_rrca_();//右移一位数据到CY(先存后取)
TIMEIO = CY;//发送串行数据
TIMECLK = 1;//时钟上升沿打入数据(DS1302写)
TIMEIO = 1;//释放数据总线
}
val = ACC;
return val;
}
//读DS1302字节
unsigned char TimeByteRead(unsigned char address) {
TimeSpiOpen();//打开DS1302
TimeSpiReadWrite(address);//写入DS1302命令
address = TimeSpiReadWrite(0xff);//读入DS1302数据
ds时钟程序详解ds程序流程图C程序
ds时钟程序详解,ds程序流程图(C程序)
ds1302时钟程序详解,ds1302程序流程图(C程序)
ds1302时钟程序详解
DS1302 的控制字。控制字节的最高有效位(位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实时时间流程
DS1302实现时钟
DS1302实现时钟
一、实验目的:
1、了解DS1302的结构及工作原理;
2、理解DS1302的寄存器;
3、掌握DS1302的读/写时序;
4、利用DS1032实现时钟功能。
二、实验原理:
DS1302的工作电压为2.5~5.5V,采用的是三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据,DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。其内部结构如下:
DS1302串行时钟由电源、输入移位寄存器、命令控制逻辑、振荡器、实时时钟以及RAM组成。
DS1302的控制字的最高有效位(D7)必须是逻辑1;如果它为0,则不能把数据写入DS1302中。D6如果为0,则表示存取日历时钟数据;为1表示存取RAM数据。D5~D1指示操作单元的地址。最低有效位(D0)如果为0表示进行写操作,为1表示进行读操作,控制字总是从最低位开始输出。
值得注意的是:在单片机从DS1302中读取数据时,从DS1302输出的第一个数据位发生在紧接着单片机输出的命令字节最后一位的第一个下降沿处;而且在读操作过程中,要保持RST时钟为高电平状态。当有额外的SCLK时钟周期时,DS1302将重新发送数据字节,这一输出特性使得DS1302具有多字节连续输出的能力。
在控制指令字输入之后下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即D0开始。同样,在紧跟8位控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位D0至高位D7。
下面为DS1302的单字节读/写时序图:
DS1302程序及连接图
/****************************************************************************** *
* 标题: 试验数码管显示时钟*
*
*
* 通过本例程了解DS1302时钟芯片的基本原理和使用,理解并掌握DS1302时钟芯片
*
* 驱动程序的编写以及实现数字字符在数码管中的显示。
*
* 注意:JP1302跳线冒要短接。
*
* 请学员认真消化本例程,懂DS1302在C语言中的操作
*
******************************************************************************* */
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include <intrins.h>
sbit SCK=P3^6; //时钟
sbit SDA=P3^4; //数据
sbit RST = P3^5;// DS1302复位
sbit LS138A=P2^2;
sbit LS138B=P2^3;
sbit LS138C=P2^4;
bit ReadRTC_Flag;//定义读DS1302标志
unsigned char l_tmpdate[7]={0,0,12,15,5,3,8};//秒分时日月周年08-05-15 12:00:00
unsigned char l_tmpdisplay[8];
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年最低位读写位
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~FD
H,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
ds1302程序流程图
DS1302实时时间流程
图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。下面结合流程图对DS1302的基
ds1302定时钟程序
#include#define uchar unsigned char#define uint unsigned intsbit beep=P1^5; //蜂鸣器位定义sbit SCK=P1^6; //DS1302相关操作线定义sbit SDA=P3^5;sbit RST=P1^7;sbit key1=P1^0; //按键定义,key1切换键,key2加,key3减,key4闹钟,年月日周sbit key2=P1^1;sbit key3=P1^2;sbit key4=P1^3;sbit mm=P1^4;uchar i,j,mod,flag,flag1=1,s=7; //控制定时器动态扫描数码管的第几位,j是定时读取时间。mod是对key1按下次数计数。flag切换闹钟,日期,和周.flag1为闹钟标志位//uchar code write_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 写地址//uchar code read_addr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //秒分时日月周年 读地址uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管码表,表示0-9和-。-表示时分秒的间隔.uchar disbuf[8]={0x06,0x06,0x40,0x06,0x5b,0x40,0x3f,0x07}; //显示缓冲区,初始化的时候为11-7-23。struct time //定义时间日期的结构类型{uchar second;uchar minute;uchar hour;uchar week;uchar day;uchar month;uchar year;}current_time;#define ctime current_timeuchar asec,amin,ahour; //定义闹钟的时分秒变量void delay(uint ms){uchar i;while(ms--)for(i=110;i>0;i--);}void di() //滴一声,用来按键伴音,因为我的开发板上的是无源的蜂鸣器,所以响起了不太容易{uchar i;for(i=0;i<40;i++){beep=0;delay(1);beep=1;delay(1);}}void didi() //滴滴,连续响两下。用来闹钟提醒。{uchar i;for(i=2;i>0;i--){di();delay(140);}}void write(uchar addr,uchar dat) //DS1302的写驱动,传入参数为一个地址和数据{uchar i;RST=0;SCK=0;RST=1;for(i=0;i<8;i++){SCK=0;SDA=(bit)(addr&0x01);addr>>=1;SCK=1;}for(i=0;i<8;i++){SCK=0;SDA=(bit)(dat&0x01);dat>>=1;SCK=1;}RST=0;}uchar read(uchar addr) //DS1302的读驱动,传入参数为一个地址,返回参数为读到的数据{uchar i,dat;RST=0;SCK=0;RST=1;for(i=0;i<8;i++){SCK=0;SDA=(bit)(addr&0x01);addr>>=1;SCK=1;}for(i=0;i<8;i++){SCK=0;dat>>=1;if(SDA)dat|=0x80;SCK=1;}RST=0;dat=(dat/16*10)+(dat&0x0f);return(dat);}void read_time() //读取DS1302的时间和日期{ctime.second=read(0x81);ctime.minute=read(0x83);ctime.hour=read(0x85);ctime.day=read(0x87);ctime.month=read(0x89);ctime.week=read(0x8b);ctime.year=read(0x8d);}void set_time() //设定时间和日期{if(!flag){write(0x8e,0x00);write(0x80,((ctime.second/10)<<4|(ctime.second%10)));write(0x82,((ctime.minute/10)<<4|(ctime.minute%10)));write(0x84,((ctime.hour/10)<<4|(ctime.hour%10)));write(0x8e,0x80);}else{write(0x8e,0x00);write(0x86,
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 ;复位线引脚
ZINT0 BIT P3.2 ;外部中断0引脚
ZINT1 BIT P3.3 ;外部中断1引脚
ZT0 BIT P3.4 ;T0引脚
ZT1 BIT P3.5 ;T1引脚
XSW EQU 7FH ;显示首地址
SECOND EQU 30H ;秒地址
XGDDZ EQU 7EH ;修改段地址
XGSJDZ EQU 7DH ;修改时间地址
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;键盘扫描标志位
ds1302时钟程序详解,单片机
以下资料摘自电子发烧友网感谢作者,版权归网站所有,资料仅供参考
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中文手册
DS1302中文手册
一、简介
DS1302是一种实时时钟芯片,主要用于计算机系统、通信设备、智能家居等领域。本手册旨在提供DS1302的详细说明和操作方法,帮助用户正确使用该芯片。
二、芯片特性
1. 基本特性:
- 日期格式:年-月-日
- 时间格式:时:分:秒
- 温度测量范围:-55℃至+125℃
- 时钟频率:32768Hz
2. 时钟控制:
- 时钟源选择:外部或内部
- 时钟暂停功能
- 时钟调制功能
三、引脚定义
DS1302具有8个引脚,分别为:
1. X1:外部时钟输入端
2. X2:外部时钟输出端
3. Vcc:供电正极
4. GND:地
5. SDA:串行数据输入/输出端
6. SCLK:串行数据时钟输入端
7. RST:复位控制端
8. BAT:电池输入端
四、工作原理
DS1302基于Bipolar CMOS技术,通过外部提供的时钟信号进行时
间计数和存储。芯片内部包含时钟控制电路、RAM存储器、温度计和
时钟计数器等功能模块,通过串行通信协议与外部设备进行数据传输。
五、使用方法
1. 芯片初始化:
- 将X1和X2连接外部时钟源
- Vcc与电源正极相连
- GND与地相连
2. 设定时间:
- 通过串行数据输入将年、月、日、时、分、秒信息写入相应寄存器
- 通过串行数据输入将温度信息写入相应寄存器(可选)
3. 读取时间:
- 通过串行数据输出获取年、月、日、时、分、秒信息
- 通过串行数据输出获取温度信息(可选)
4. 设置时钟暂停:
- 通过串行数据输入将时钟控制字节写入相应寄存器控制位,实现时钟暂停功能
5. 时钟调制:
DS1302时钟程序详解
DS1302 时钟程序详解
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 实时时间流程
DS1302时钟基础使用(含代码)
DS1302时钟基础使⽤(含代码)
了解其管脚
X1 X2 32.768KHz 晶振管脚
GND 地
RST 复位脚
I/O 数据输⼊/输出引脚,具有三态
SCLK 串⾏时钟
Vcc1,Vcc2(备⽤电源供电)电源供电管脚
DS1302 的寄存器及⽚内RAM
控制寄存器⽤于存放DS1302的控制命令字,DS1302的RST引脚回到⾼电平后写⼊的第⼀个字就为控制命令。它⽤于对DS1302读写过程进⾏控制,它的格式如下:
D7:固定为1
D6: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寄存器操作。第⼆个字节就是要读或写的数据了。
超详细的ds1302使用说明及其例程
的控制字如图6。
图6 控制字(即地址及命令字节)
控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把 数据写入到 DS1302中。
位6:如果为0,则表示存取日历时钟数据,为1表示存取 RAM 数 据;
DS1302的工作原理
DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且 将8位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前8位指 定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时 输出数据。时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为 8加最多可达248的数据。
1 DS1302 简介: DS1302是美国 DALLAS 公司推出的一种高性能、低功耗的实时
时钟芯片,附加31字节静态 RAM,采用 SPI 三线接口与 CPU 进行 同步通信,并可采用突发方式一次传送多个字节的时钟信号和 RAM 数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与 31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~ 5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电 方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部 引脚分配如图1所示及内部结构如图2所示。DS1302用于数据记录, 特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该 数据的时间同时记录,因此广泛应用于测量系统中。
DS1302数码管电子闹钟程序
while(!key4);
keyn++;
if(keyn==4)
keyn=0;}
write_sfm(clock1[2],clock1[1],clock1[0]);
if(keyn==1) //时修改
{
if(key3==0) //减键
{
//delay(3);
if(key3==0)
{
while(!key3);
clock1[0]--;
if(clock1[0]<0)clock1[0]=24;
}
}
if(key2==0) //加键
{
//delay(3);
if(key2==0)
{
while(!key2);
clock1[0]++;
if(clock1[0]>24)clock1[0]=0;
}
}
}
if(keyn==2) //分修改
miaog=miao%10;
miaos=miao/10;
feng=fen%10;
fens=fen/10;
shig=shi%10;
shis=shi/10;
display(miaog,miaos,feng,fens,shig,shis);
}
void didi() //发声程序
{
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
dsl302时钟程序详解经典
dsl302时钟程序详解
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
位到高位7o
2.4 DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位
为BCD码形式,其日历、
时间寄存器及其控制字见表1。
» I日历•別间襦存祁及凡担制孑
fir* 野擅"itwtr 収他总cn -
T
»fsy网
移
e S』3
2 1 0
林斶
son8!ll00-59 f.H IUSVX SIX X2H S3II oum(1Mh、
MH K4H851101 \2A12 24« 10 IIH HK
MhH M7II01 -2S.2V,
W-Jl »o imiAre
8SH WII03 - !2(11) 0 IUM MOYI1I
AAII8HH ni(i II » 0 0h\V
8LH Mill OQ • 9910YLAH
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器
及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为COH, FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
dsl302程序流程图
S 4 ISI30J 实廿时M ]人川
3.2 DS1302实时时间流程
图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。下 面结合流程图对DS1302的基
本操作进行编程
:
#inrluilr **lnttins, h"
站ylk=P3・3
whit tj<> = PJ-4
•hii t j>i = PV5
>Ut BO7 = AC(77
“i【nrro=ACCD
void oipulbytr {uri(sgi>e (iiiwigm-d rluir i: AC<* = IH ch: 48UPJ人的数故人\ for(»=8: i> 0: i-);循环8次,写入8位数擁 ;从低位到高位 {ijo二BIT0;将ACCD的值賦给时钟数据线t_rlk = 0 U-lk二I:他时钟线的上升沿写人I位数据ACC = ACCAL:将応1位数站移至 ACC0 unsignrd char outputl^te(void)//8 位数据址出函数 | uiisipKMj rliJir i; 二I:启动数据传送 f«r(i = 8: i> 0: i・J:渎出&位数据.从低位到禺位(ACC = ACC>1;将前一下降沿读出的数据右莎 I位,从而该次谀出的数放人ACC-7 tio^hPI 口输人之前置I tjrlk = 1 Ulk =0:时钟线下降沿读出I位数据 IMT7 = f Jo: ran not usr PI "7 =tja for PI"7 not :d varietu return (ACC) //^elay 15( I) input byte ( ucda) = 0 U<> = I i unsigned char rej302(unsigned chnr mid)//读出对应寄存器内容(unsigned chnr ncda Ijst = 0 l』lk =0 I J»t = I mpulby(e(«dd) //4rlayl5(l) ucdn = uni卩u【byle() iju=0 return (ucdn) I void SH I l3O2(unMignrd char * pda ) /殳It 时伺 lunMgncd dmr i unsigned char add = 0x80 MT J 302( O«8r. 0x(X1);将控制奇ff器值没为零. ;圮高位0允许写 ror(i = 7; i> 0; i牌七个时间初徂写人对 :应斷存器 |wrj302(iid(i. * |xkd:写对应时仲需存器的值 A I rrj 302 :间值 I "21 g*!j302 (kittened char rlirtilttel ])"读収 绅时阿値 lurMigiicd <4iar i< j unsigned char add =0*81 Ixlaia unsigiinl fhar 5cc for(i = 0; i <7: i + ♦) kurtimr(i) = re J 302( add}; i 粪对应时钟寄 存器的值 see 二ciirtinirUl j = see Al:桁HCI)码辕化成对应十进制数 j* =10 we = $r<'&(h0f sec+ xj curtimef i | = sw add 4=2 ■ ,1 根据本人在调试中遇到的问题,特作如下说明:DS1302与微处理器进行数据交换时,首先山微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6二0,指定时钟数据,D6=l,指定