当前位置:文档之家› 基于DS1302写的12864LCD时钟程序

基于DS1302写的12864LCD时钟程序

基于DS1302写的12864LCD时钟程序
基于DS1302写的12864LCD时钟程序

以下是我写的12864LCD并行口时钟显示程序,时钟用按键可调

/***************12864.h头文件******************************/

#ifndef _12864_h

#define _12864_h

/*****包含头文件**************/

#include

#include"string.h"

#include"DS1302.h"

/********定义I/0口**********/

#define LCD12864_DATA P0

sbit LCD12864_E = P2^7;

sbit LCD12864_RW = P2^5;

sbit LCD12864_RS = P2^6;

sbit LCD12864_RET= P2^0;

sbit LCD12864_PSB =P2^2;

/******声明全局函数*********/

void Delay1ms(unsigned int); //声明延时函数

void BusyChk_12864(void); //声明忙检测函数

void WrCom(unsigned char); //声明写入命令函数

//unsigned char ReDat(void); //声明读数据函数

void WrDat(unsigned char); //声明写数据函数

void LcdInit(void); //12864初始化函数

void SetAddress(unsigned char ,unsigned char); //设置地址转换

void DisplayString(unsigned char ,unsigned char,unsigned char *p);//行显示字符

void DisplayTime();

void DisplayDay();

void DisplayWeek();

#endif

/*****************************12864.c***********************************/

#include"12864.h"

/****************************************************************************** *

* 函数名: Delay1ms

* 函数功能: 延时函数,延时1ms

* 输入: c

* 输出 e : 无

* 说名: 该函数是在12MHZ晶振下,12分频单片机的延时。

******************************************************************************* /

void Delay1ms(unsigned int i) //误差0us

{

unsigned char a;

for (i; i>0; i--)

{

for (a=199;a>0;a--)

;

}

}

/**************************************************************************** 函数名字:void BusyChk()

函数功能:12864LCD忙检测

* 输入: 无

* 输出: 无

******************************************************************************* /

void BusyChk(void)

{

unsigned int timeout=0;

LCD12864_E=0; //E=0 使能关闭

LCD12864_RS=0; //0 指令;1 数据

LCD12864_RW=1; //1 读数据;0写数据

Delay1ms(50); //延时100ms

LCD12864_E=1; //1 开使能,读数据

while(((LCD12864_DATA & 0x80) && ++timeout));//判断1表示内部在工作;0表示正常

LCD12864_E=0; //E=0 使能关闭

}

/**************************************************************************** 函数名字:void WrDat(usnigned char data)

函数功能:写入数据

* 输入: data

* 输出: 无

******************************************************************************* /

void WrDat(unsigned char bTemp)

{

BusyChk(); //忙检测

LCD12864_E=0; //E=0 使能关闭

LCD12864_RS=1; //0 指令;1 数据

LCD12864_RW=0; //1 读数据;0写数据

LCD12864_E=1; //E=1 使能打开

LCD12864_DATA=bTemp;//写入数据

Delay1ms(10); //延时100ms

LCD12864_E=0; //E=0 使能关闭

}

/**************************************************************************** 函数名字:void WrCom(usnigned char com)

函数功能:写入命令

* 输入: com

* 输出: 无

******************************************************************************* /

void WrCom(unsigned char com)

{

BusyChk();

LCD12864_E=0; //E=0 使能关闭

LCD12864_RS=0; //0 指令;1 数据

LCD12864_RW=0; //1 读数据;0写数据

LCD12864_E=1; //E=0 使能打开

LCD12864_DATA=com;//写入数据

Delay1ms(10); //延时100ms

LCD12864_E=0; //E=0 使能关闭

}

/**************************************************************************** 函数名字:unsigned char ReData(void)

函数功能:读数据

* 输入: 无

* 输出: data

******************************************************************************* /

//unsigned char ReData(void)

//{

// unsigned char bTempt;

// BusyChk();

// LCD12864_DATA=0xFF;

// LCD12864_E=0; //E=0 使能关闭

// LCD12864_RS=1; //0 指令;1 数据

// LCD12864_RW=1; //1 读数据;0写数据

// LCD12864_E=1; //E=0 使能打开

// bTempt=LCD12864_DA TA;//读出数据

// Delay1ms(100); //延时100ms

// LCD12864_E=0; //E=0 使能关闭

// return bTempt;

//}

/**************************************************************************** 函数名字:void LcdInit(void)

函数功能:初始化

* 输入: 无

* 输出: 无

******************************************************************************* /

void LcdInit()

{

LCD12864_RS=0; //0 指令;1 数据

LCD12864_RW=0; //1 读数据;0写数据

LCD12864_E=1; //E=1 使能打开

LCD12864_PSB=1;//1为并行模式,0为串行模式

LCD12864_RET=1;

Delay1ms(50);

LCD12864_RET=0;//低电平复位

Delay1ms(300);

LCD12864_RET=1;//恢复高电平

WrCom(0x30); //基本指令用0x30,扩展指令用0x34

Delay1ms(20);

WrCom(0x30);

WrCom(0x0C); //显示开,光标关

// WrCom(0x14); //光标位置右移一个位置

WrCom(0x01); //清屏

WrCom(0x06); //进入模式指针加1,屏幕不移动

}

/**************************************************************************** 函数名字:void SetAddress(unsigned char x,unsigned char y)

函数功能:初始化

* 输入: 行、数据

* 输出: 无

******************************************************************************* /

void SetAddress(unsigned char x,unsigned char y)

{

unsigned char bAddress;

switch(y)

{

case 1: bAddress=0x80+x;break;

case 2: bAddress=0x90+x;break;

case 3: bAddress=0x88+x;break;

case 4: bAddress=0x98+x;break;

default: break;

}

WrCom(bAddress);

}

/**************************************************************************** 函数名字:void DisplayString(unsigned char x,unsigned char y, unsigned)

函数功能:初始化

* 输入: 行、数据

* 输出: 无

******************************************************************************* /

void DisplayString(unsigned char x,unsigned char y,unsigned char *add)

{

unsigned char i;

i=strlen(add);

SetAddress(x,y);

while(i--)

{

WrDat(*(add++));

}

}

/**************************************************************************** 函数名字:void DisplayTime()

函数功能:显示时间

* 输入: 行、数据

* 输出: 无

******************************************************************************* /

void DisplayTime()

{

WrCom(0x88);

WrDat('0'+(TIME[2]/10));

WrDat('0'+(TIME[2]%10));

DisplayString(1,3,":");

WrDat('0'+(TIME[1]/10));

WrDat('0'+(TIME[1]%10));

WrDat(':');

WrDat('0'+(TIME[0]/10));

WrDat('0'+(TIME[0]%10));

}

/**************************************************************************** 函数名字:void DisplayDay()

函数功能:显示时间

* 输入: 行、数据

* 输出: 无

******************************************************************************* /

void DisplayDay()

{

WrCom(0x80);

WrDat('0'+2);

WrDat('0'+0);

WrDat('0'+(TIME[6]/10));

WrDat('0'+(TIME[6]%10));

DisplayString(2,1,"年");

WrDat('0'+(TIME[4]/10));

WrDat('0'+(TIME[4]%10));

DisplayString(4,1,"月");

WrDat('0'+(TIME[3]/10));

WrDat('0'+(TIME[3]%10));

DisplayString(6,1,"日");

}

/**************************************************************************** 函数名字:void DisplayWeek()

函数功能:显示时间

* 输入: 行、数据

* 输出: 无

******************************************************************************* /

void DisplayWeek()

{

switch(TIME[5])

{

case 1: DisplayString(0,2,"星期:Mo");break;

case 2: DisplayString(0,2,"星期:Tu");break;

case 3: DisplayString(0,2,"星期:We");break;

case 4: DisplayString(0,2,"星期:Th");break;

case 5: DisplayString(0,2,"星期:Fr");break;

case 6: DisplayString(0,2,"星期:Sa");break;

case 7: DisplayString(0,2,"星期:Su");break;

}

}

/*****************************DS1302.h***********************************/

#ifndef _DS1302_h

#define _DS1302_h

/*****包含头文件*******/

#include

#include

/***********定义I/O口********************/

sbit DSIO=P3^4;

sbit RST= P3^5;

sbit SCLK=P3^6;

///***********声明全局变量**********************/

extern unsigned char TIME[7];

//---声明全局函数---//

void Ds1302Write(unsigned char addr, unsigned char dat);

unsigned char Ds1302Read(unsigned char addr);

void Ds1302Init();

void Ds1302ReadTime();

unsigned char changeBCD_Variable(unsigned char );

unsigned char changeV ariable_BCD(unsigned char );

#endif

/*****************************DS1302.c***********************************/

#include"DS1302.h"

//---DS1302写入和读取时分秒的地址命令---//

//---秒分时日月周年最低位读写位;-------//

unsigned char code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; unsigned char code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

/****************************************************************************** *

* 函数名: Ds1302Write

* 函数功能: 向DS1302命令(地址+数据)

* 输入: addr,dat

* 输出: 无

******************************************************************************* /

void Ds1302Write(unsigned char addr, unsigned char dat)

{

unsigned char n;

RST = 0;

_nop_();

SCLK = 0;//先将SCLK置低电平。

_nop_();

RST = 1; //然后将RST(CE)置高电平。

_nop_();

for (n=0; n<8; n++)//开始传送八位地址命令

{

DSIO = addr & 0x01;//数据从低位开始传送

addr >>= 1;

SCLK = 1;//数据在上升沿时,DS1302读取数据

_nop_();

SCLK = 0;

_nop_();

}

for (n=0; n<8; n++)//写入8位数据

{

DSIO = dat & 0x01;

dat >>= 1;

SCLK = 1;//数据在上升沿时,DS1302读取数据

_nop_();

SCLK = 0;

_nop_();

}

RST = 0;//传送数据结束

_nop_();

}

/****************************************************************************** *

* 函数名: Ds1302Read

* 函数功能: 读取一个地址的数据

* 输入: addr

* 输出: dat

******************************************************************************* /

unsigned char Ds1302Read(unsigned char addr)

{

unsigned char n,dat,dat1;

RST = 0;

_nop_();

SCLK = 0;//先将SCLK置低电平。

_nop_();

RST = 1;//然后将RST(CE)置高电平。

_nop_();

for(n=0; n<8; n++)//开始传送八位地址命令

{

DSIO = addr & 0x01;//数据从低位开始传送

addr >>= 1;

SCLK = 1;//数据在上升沿时,DS1302读取数据

_nop_();

SCLK = 0;

_nop_();

}

_nop_();

for(n=0; n<8; n++)//读取8位数据

{

dat1 = DSIO;//从最低位开始接收

dat = (dat>>1) | (dat1<<7);

SCLK = 1;

_nop_();

SCLK = 0;//

_nop_();

}

RST = 0;

_nop_(); //以下为DS1302复位的稳定时间,必须的。

SCLK = 1;

_nop_();

DSIO = 0;

_nop_();

DSIO = 1;

_nop_();

return dat;

}

/****************************************************************************** *

* 函数名: Ds1302Init

* 函数功能: 初始化DS1302.

* 输入: 无

* 输出: 无

******************************************************************************* /

void Ds1302Init()

{

unsigned char n;

Ds1302Write(0x8E,0X00); //关闭写保护功能

for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年

{

Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);

}

Ds1302Write(0x8E,0x80); //打开写保护功能

}

/****************************************************************************** *

* 函数名: Ds1302ReadTime

* 函数功能: ReadTime

* 输入: 无

* 输出: 无

******************************************************************************* /

void Ds1302ReadTime()

{

unsigned char n;

for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年

{

TIME[n]=Ds1302Read(READ_RTC_ADDR[n]);

TIME[n]=changeBCD_Variable(TIME[n]);

}

}

/*****************************************************************************/ /*BCD码转换成十进制

*****************************************************************************/ unsigned char changeBCD_Variable(unsigned char data1)

{

unsigned char i=0,j=0;

i=data1&0xf0;

i>>=4;

j=data1&0x0f;

data1=i*10+j;

return data1;

}

/***************************************************************************** *十进制转换成BCD

*****************************************************************************/ unsigned char changeV ariable_BCD(unsigned char data2)

{

unsigned char i=0,j=0;

i=data2/10;

i<<=4;

j=data2%10;

data2=i+j;

return data2;

}

/*****************************key.h***********************************/

#ifndef _Key_h

#define _Key_h

#include

#include"12864.h"

/*******定义I/O口*********/

#define GPIO_KEY P1

/*********声明全局变量***********/

extern unsigned char keyvalue;

/**************声明全局函数*************/

void KeyDown();

unsigned char keycurrent(unsigned char ,int);

void toolmode();

#endif

/*****************************key.c***********************************/

#include"Key.h"

/****************************************************************************** *

* 函数名: keyvalue

* 函数功能: 矩阵按键值

* 输入: 无

* 输出: keyvalue

******************************************************************************* /

const char code ValueList[]={ //下限上限

0, 59, //秒

1, 59, //分

1, 12, //时

1, 31, //日

1, 12, //月

1, 7, //周

1, 99 // 年

};

/*矩阵按键扫描*/

void KeyDown(void)

{

GPIO_KEY=0x0f;

if(GPIO_KEY!=0x0f)

{

Delay1ms(3);

if(GPIO_KEY!=0x0f)

{

switch(GPIO_KEY)

{

case 0x07: keyvalue=1; break;

case 0x0b: keyvalue=2; break;

case 0x0d: keyvalue=3; break;

case 0x0e: keyvalue=4; break;

}

GPIO_KEY=0xf0;

switch(GPIO_KEY)

{

case 0x70: keyvalue=keyvalue;break;

case 0xb0: keyvalue+=4; break;

case 0xd0: keyvalue+=8; break;

case 0xe0: keyvalue+=12;break;

}

while(GPIO_KEY!=0xf0)

{

Delay1ms(3);

}

}

}

}

unsigned char keycurrent(unsigned char value,int i) {

if(value==2)

{

keyvalue=0;

TIME[i]++;

if(TIME[i]>ValueList[2*i+1])

TIME[i]=ValueList[2*i];

}

if(value==3)

{

keyvalue=0;

TIME[i]--;

if(TIME[i]<=ValueList[2*i])

TIME[i]=ValueList[2*i+1];

}

return TIME[i];

}

/*********按键处理,调节时间***********/ void toolmode(void)

{

unsigned char n;

keyvalue=0;

WrCom(0x01); //清屏

WrCom(0x02); //复位

Ds1302ReadTime();//读ds1302中数值

///////////////////////////////

TIME[0]=0x00;

while(1) //年设置

{

WrCom(0x80);

WrDat('2');

WrDat('0');

WrDat('0'+TIME[6]/10);

WrDat('0'+(TIME[6]%10));

DisplayString(2,1,"年");

KeyDown(); //按键扫描

keycurrent(keyvalue,6);

if(keyvalue==1)

{

keyvalue=0;

break;

}

if(keyvalue==4) //进入月设置{

keyvalue=0;

break;

}

}

while(1) //月份设置

{

WrCom(0x80+3);

WrDat('0'+(TIME[4]/10));

WrDat('0'+(TIME[4]%10));

DisplayString(4,1,"月");

KeyDown();

keycurrent(keyvalue, 4);

if(keyvalue==1)

{

keyvalue=0;

goto EXIT_toolmode;

}

if(keyvalue==4) //进入日期设置

{

keyvalue=0;

break;

}

}

while(1) //日期设置

{

WrCom(0x80+5);

WrDat('0'+(TIME[3]/10));

WrDat('0'+(TIME[3]%10));

DisplayString(6,1,"日");

KeyDown();

keycurrent(keyvalue, 3);

if(keyvalue==1)

{

keyvalue=0;

goto EXIT_toolmode;

}

if(keyvalue==4) //进入周设置{

keyvalue=0;

break;

}

}

while(1) //周设置

{

DisplayWeek();

KeyDown();

keycurrent(keyvalue,5);

if(keyvalue==1)

{

keyvalue=0;

goto EXIT_toolmode;

}

if(keyvalue==4) //进入时间设计{

keyvalue=0;

break;

}

}

while(1) //时间设置

{

WrCom(0x88);

WrDat('0'+(TIME[2]/10));

WrDat('0'+(TIME[2]%10));

DisplayString(1,3,":");

KeyDown();

keycurrent(keyvalue, 2);

if(keyvalue==1)

{

keyvalue=0;

goto EXIT_toolmode;

}

if(keyvalue==4) //进入分钟设置

{

keyvalue=0;

break;

}

}

while(1) //分钟设置

{

DisplayString(1,3,":");

WrDat('0'+(TIME[1]/10));

WrDat('0'+(TIME[1]%10));

WrDat(':');

KeyDown();

keycurrent(keyvalue, 1);

if(keyvalue==1||keyvalue==4)

{

keyvalue=0;

break;

}

}

EXIT_toolmode:

/*将十进制数转换成BCD码*/

for(n=0;n<7;n++)

{

TIME[n]=changeVariable_BCD(TIME[n]);

}

Ds1302Init(); //将数据存入Ds1302中

WrCom(0x0C);

}

/*****************************main.c***********************************/ #include"Key.h"

/*定义全局变量*/

unsigned char keyvalue;

//---DS1302时钟初始化2013年1月1日星期天12点00分00秒。---//

//---存储顺序是秒分时日月周年,存储格式是用BCD码---//

unsigned char TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x07, 0x13};

void main()

{

bit bTimeFlag=0;

keyvalue=0;

LcdInit();

Ds1302Init();

Ds1302ReadTime();

DisplayDay();

DisplayWeek();

while(1)

{

Ds1302ReadTime();

if(TIME[2]==12)

{bTimeFlag=1;}

if(TIME[2]==0&&bTimeFlag==1)

{

bTimeFlag=0;

DisplayDay();

DisplayWeek();

}

DisplayTime();

KeyDown();

if(keyvalue==1)

{

keyvalue=0;

toolmode();

}

}

}

DS1302时钟芯片读写详解

DS1302时钟芯片读写详解 2008-09-26 13:07 /*DS1302读写程序(C51)*/ sbit DS13CLK =P1^5; /*DS1302的SCLK脚脉冲*/ sbit DS13IO =P1^6; /*DS1302的IO脚数据*/ sbit DS13CS =P1^7; /*DS1302的RST脚片选*/ /*向DS1302写一个字节*/ void _wds13byte(uchar _code) { uchar i; DS13CLK =0; DS13CLK =0; for(i=0;i<8;i++) { if(_code&0x01) DS13IO =1; else DS13IO =0; DS13CLK =1; DS13CLK =1; DS13CLK =0; DS13CLK =0; _code =_code >> 1; } } /*从DS1302读一个字节*/ uchar _rds13byte(void) { uchar i,_code; _code=0; DS13CLK =0; DS13CLK =0; DS13IO =1; for(i=0;i<8;i++) { _code =_code >>1; if(DS13IO) _code =_code|0x80; DS13CLK =1; DS13CLK =1; DS13CLK =0; DS13CLK =0; } return _code; } /*读功能_code读功能命令*/ uchar readds1302(uchar _code)

{ DS13CS =0; /*关闭DS1302*/ DS13CLK =0; DS13CLK =0; DS13CS =1; /*使能DS1302*/ _wds13byte(_code); /*读代码*/ _code=_rds13byte(); /*返回读取数字*/ DS13CLK =1; DS13CS =0; /*关闭DS1302*/ return _code; } /*写功能fp写的地址,_code写的内容*/ void writeds1302(uchar fp,uchar _code) { DS13CS =0; /*关闭DS1302*/ DS13CLK =0; DS13CLK =0; DS13CS =1; /*使能DS1302*/ _wds13byte(fp); /*写控制命令*/ _wds13byte(_code); /*写入数据*/ DS13CLK=1; DS13CS =0; /*关闭DS1302*/ } /*******DS1302设置快速充电***************/ void ds13_charg(void) { writeds1302(0x8e,0x00); /*解除写保护*/ writeds1302(0x90,0xa5); /*单二极管2K电阻充电*/ writeds1302(0x8e,0x80); /*置位写保护*/ } ;;;DS1302读写程序(汇编);;; ;******************************************************************* **/ T_CLK Bit P1.5 ;实时时钟时钟线引脚 T_IO Bit P1.6 ;实时时钟数据线引脚 T_RST Bit P1.7 ;实时时钟复位线引脚 ;********************************************************** ;子程序名:Set1302 ;功能:设置DS1302 初始时间,并启动计时。 ;说明: ;调用:RTInputByte ;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.YearL(地址连续) ;出口参数:无 ;影响资源:A B R0 R1 R4 R7

ds1302时钟程序详解-ds1302程序流程图(C程序)

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寄存器,此方式下可一次性读写所有的RA M的31个字节,命令控制字为FEH(写)、FFH(读)。

ds1302程序流程图 3.2 DS1302实时时间流程 图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。下面结合流程图对DS1302的基 本操作进行编程:

时钟芯片DS1302的用法

单片机玩到此时,很想玩TFT真彩屏,但如果不玩一玩汉显字符液晶屏,就总觉得少了些什么,说实话,我对时钟制作并不很感兴趣,因为家里走针的、蹦字的计时器、定时器大小有七八个,还不算手机和电脑的时钟,而要想玩汉显屏,则做时钟算是最合适的了,也难怪杜洋老师会在这上下功夫,毕竟没有那家公司会让咱初学者去搞工控或商品。前些时,在网上淘了一只LCD-12864模块,已经点亮并通过了简单的测试,准备做杜洋的时钟,准备技术资料时,在网上找到了一篇关于时钟芯片DS1302的应用文章,觉得不错,转帖于此以资共享。 时钟芯片DS1302可靠起振的方法 作者:不详出处:不详 DS1302是Dallas公司生产的一种实时时钟芯片。它通过串行方式与单片机进行数据传送,能够向单片机提供包括秒、分、时、日、月、年等在内的实时时间信息,并可对月末日期、闰年天数自动进行调整;它还拥有用于主电源和备份电源的双电源引脚,在主电源关闭的情况下,也能保持时钟的连续运行。另外,它还能提供31字节的用于高速数据暂存的RAM。鉴于上述特点,DS1302已在许多单片机系统中得到应用,为系统提供所需的实时时钟信息。 一、 DS1302的主要特性 1. 引脚排列 图1 DS1302引脚排列图(见附图) DS1302的引脚排列如图1所示,各引脚的功能如下: X1,X2——32768Hz晶振引脚端; RST——复位端; I/O——数据输入/输出端; SCLK——串行时钟端; GND——地; VCC2,VCC1——主电源与后备电源引脚端。 2. 主要功能: DS1302时钟芯片内主要包括移位寄存器、控制逻辑电路、振荡器、实时时钟电路以及用于高速暂存的31字节RAM。DS1302与单片机系统的数据传送依靠RST,I/O,SCLK三根端线即可完成。其工作过程可概括为:首先系统RST引脚驱动至高电平,然后在作用于SCLK时钟脉冲的作用下,通过I/O引脚向DS1302输入地址/命令字节,随后再在SCLK时钟脉冲的配合下,从I/O引脚写入或读出相应的数据字节。因此,其与单片机之间的数据传送是十分容易实现的。 二、时钟的产生及存在的问题 (1) 在实际使用中,我们发现DS1302的工作情况不够稳定,主要表现在实时时间的传送有时会出现误差,有时甚至整个芯片停止工作。我们对DS1302的工作电路进行了分析,其与单片机系统的连接如图2所示。从图中可以看出,DS1302的外部电路十分简单,惟一外接的元件是32768Hz 的晶振。通过实验我们发现:当外接晶振电路振荡时,DS1302计时正确;当外接晶振电路停振时,DS1302计时停止。因此,我们认为32768Hz晶振是造成DS1302工作不稳定的主要原因。 图2 DS1302与单片机系统的连接图(见附图) (2) DS1302时钟的产生基于外接的晶体振荡器,振荡器的频率为32768Hz。该晶振通过引脚X1、X2直接连接至DS1302,即DS1302是依靠外部晶振与其内部的电容配合来产生时钟脉冲的。

基于DS1302的数码管显示数字钟

单片机原理课程设计 课题名称:基于DS1302的数码管显示数字钟 专业班级:电子信息工程 学生学号: 学生姓名: 指导教师: 设计时间:2010年6月21日--2010年6月25日

目录 摘要........................................................................................................................................................................ 1 设计任务和要求............................................................................................................................................ 2 方案论证........................................................................................................................................................ 3 系统硬件设计................................................................................................................................................ 3.1 系统总原理图 ................................................................................................................................ 3.2 元器件清单...................................................................................................................................... 3.3 PCB板图....................................................................................................................................... 3.4 Proteus仿真图 ............................................................................................................................... 3.5 分电路图及原理说明................................................................................................................... 3.5.1 主控部分(单片机MCS-51).............................................................................. 3.5.2 计时部分(实时时钟芯片DS1302).................................................................. 3.5.3 显示部分(共阳极数码管)................................................................................ 3.5.4 调时部分(按键)................................................................................................ 4系统软件设计................................................................................................................................................ 4.1 程序流程图..................................................................................................................................... 4.2 程序源代码........................................................................................................................................ 5心得体会........................................................................................................................................................ 6参考文献........................................................................................................................................................ 7结束语............................................................................................................................................................

DS1302时钟芯片的原理与应用

DS1302 时钟芯片的原理与应用 1 写保护寄存器操作 当写保护寄存器的最高位为0 时,允许数据写入寄存器,写保护寄存器可以通过命令字节8E 8F 来规定禁止写入/读出。写保护位不能在多字节传送模式下写入Write_Enable: MOV Command,#8Eh ;命令字节为8E MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#00h 数据内容为0 写入允许 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 当写保护寄存器的最高位为1 时禁止数据写入寄存器 Write_Disable: MOV Command,#8Eh ;命令字节为8E MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#80h 数据内容为80h 禁止写入 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 以上程序调用了基本数据发送(Send_Byte)模块及一些内存单元定义, 其源程序清单在附录中给出下面 的程序亦使用了这个模块 2 时钟停止位操作 当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始 Osc_Enable: MOV Command,#80h ; 命令字节为80 MOV ByteCnt,#1 ; 单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#00h 数据内容为0 振荡器工作允许 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 当把秒寄存器的第7 位时钟停止位设置为1 时,时钟振荡器停止DS1320 进入低功耗方式 Osc_Disable: MOV Command,#80h ;命令字节为80 MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#80h 数据内容为80h 振荡器停止 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 3. 多字节传送方式

DS1302时序和C语言程序

1 DS130 2 简介: DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如图1所示及内部结构如图2所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。 图1 DS1302的外部引脚分配 图2 DS1302的内部结构 各引脚的功能为: Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。 SCLK:串行时钟,输入; I/O:三线接口时的双向数据线; CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。 DS1302有下列几组寄存器: ①DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch),存放的数据格式为BCD码形式,如图3所示。

图 3 DS1302有关日历、时间的寄存器 小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是,当为1时,表示PM。在24小时模式时,位5是第二个10小时位。 秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。 控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM 的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。 ②DS1302有关RAM的地址 DS1302中附加31字节静态RAM的地址如图4所示。 图4 ③DS1302的工作模式寄存器 所谓突发模式是指一次传送多个字节的时钟信号和RAM数据。突发模式寄存器如图5所示。 图5 ④此外,DS1302还有充电寄存器等。 2 读写时序说明 DS1302是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。 要想与DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如图6。 图6 控制字(即地址及命令字节) 控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。

ds1302时钟程序详解经典

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程序流程图

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的基本操作进行编程:

基于51系列单片机及DS1302时钟芯片的电子时钟Proteus仿真_报告

目录 摘要 一、引言 (1) 二、基于单片机的电子时钟硬件选择分析 (2) 2.1主要IC芯片选择 (2) 2.1.1微处理器选择 (2) 2.1.2 DS1302简介 (4) 2.1.3 DS1302引脚说明 (4) 2.2电子时钟硬件电路设计 (5) 2.2.1时钟电路设计 (6) 2.2.2整点报时功能 (7) 三、Protel软件画原理图 (8) 3.1系统工作流程图 (8) 3.2原理图 (9) 四、proteus软件仿真及调试 (9) 4.1电路板的仿真 (9) 4.2软件调试 (9) 五、源程序 (10) 六、课设心得 (13) 七、参考文献 (13)

基于单片机电子时钟设计 摘要 电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。另外,在生活和工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。 本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃的多功能电子时钟。 本文对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现多功能电子时钟。本设计应用AT89C52芯片作为核心,6位LED数码管显示,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。 该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。 关键词:电子时钟;多功能;AT89C52;时钟日历芯片

一、引言 时间是人类生活必不可少的重要元素,如果没有时间的概念,社会将不会有所发展和进步。从古代的水漏、十二天干地支,到后来的机械钟表以及当今的石英钟,都充分显现出了时间的重要,同时也代表着科技的进步。致力于计时器的研究和充分发挥时钟的作用,将有着重要的意义。 1.1 多功能电子时钟研究的背景和意义 20世纪末,电子技术获得了飞速的发展。在其推动下,现代电子产品几乎渗透到了社会的各个领域,有力的推动和提高了社会生产力的发展与信息化程度,同时也使现代电子产品性能进一步提升,产品更新换代的节奏也越来越快。 时间对人们来说总是那么宝贵,工作的忙碌性和繁杂容易使人忘记当前的时间。然而遇到重大事情的时候,一旦忘记时间,就会给自己或他人造成很大麻烦。平时我们要求上班准时,约会或召开会议必然要提及时间;火车要准点到达,航班要准点起飞;工业生产中,很多环节都需要用时间来确定工序替换时刻。所以说能随时准确的知道时间并利用时间,是我们生活和工作中必不可少的[1]。 电子钟是采用电子电路实现对时、分、秒进行数字显示的计时装臵,广泛应用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、0按时自动打铃、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。

DS1302时钟芯片资料全

DS1302 DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。 下面是标准的接线电路图:

DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch)是存放秒、分,小时、日、月、年、周数据的,存放的数据格式为BCD码形式 它的部时间寄存器如下: 将初始设置的时间、日期数据写入这几个寄存器,然后再不断地读取这几个寄存器来获取实时时间和日期。这几个寄存器的说明如下: 1、秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当初始上电时该位置为1,时钟振荡器停止,DS1302处于低功耗状态;只有将秒寄存器的该位置改写为0时,时钟才能开始运行。 2、控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。也就是说在电路上电的初始态WP是1,这时是不能改写上面任何一个时间寄存器的,只有首先将WP改写为0,才能进行其它寄存器的写操作。 3、控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。也就是说在电路上电的初始态WP是1,这时是不能改写上面任何一个时间寄存器的,只有首先将WP改写为0,才能进行其它寄存器的写操作。 下面来说说如果对DS1302进行读写: 上面的电路图可以看出,除了电源和接地,DS1302只有三根线和单片机连接,SCLK、I/O 和RST(有的也写成CE),先看时序图:

实时时钟芯片DS1302

实时时钟芯片DS1302的结构,工作原理及应用(含源程序) 1.ds1302实时时钟简介 现在流行的串行时钟电路很多,如DS1302、DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。 2 DS1302的结构及工作原理 DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。 2.1 引脚功能及结构 图1示出DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST 为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST 置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK始终是输入端。 2.2 DS1302的控制字节

51单片机DS1302日历时钟程序

51 单片机ds1302 时钟芯片 #define uint unsigned int #define uchar unsigned char sbit lcdrs = P1^0; sbit lcdrw = P1^1; sbit lcden = P1^2; sbit key0 = P2^0;//功能键,选择时分秒 sbit key1 = P2^1;//加1键 sbit key2 = P2^2;//减1键 sbit key4 = P2^4; sbit clk_1302 = P1^5; //1302芯片位定义sbit io_1302 = P1^6; sbit rst_1302 = P1^7; uchar bdata dat; sbit dat0 = dat^0; sbit dat7 = dat^7; uchar key0_count;//按键0被按的次数(0~3) uchar flag; char hour,minute,second; uchar table_date[] = "2009-4-12 Mon"; uchar table_time[] = "00:00:00"; /****** 函数申明********/ void write_cmd_1602(uchar cmd); void write_data_1602(uchar dat); void write_add(uchar add,uchar dat); void init1602(); void delay(uint z); uchar reverse(uchar c); void keyscan(); void init(); void RTC_initial (); void wr_1302(uchar wr_data); uchar rd_1302(void); uchar uc_R1302(uchar ucAddr); void v_W1302(uchar ucAddr, uchar ucDa); 主程序 #include

关于实时时钟模块DS1302的介绍

关于实时时钟模块DS1302的介绍 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。DS1302工作原理DS1302 工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。DS1302主要性能指标DS1302实时时钟芯片广泛应用于电话、传真、便携式仪器等产品领域,他的主要性能指标如下: 1、DS1302是一个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软年自动调整的能力,可以通过配置AM/PM来决定采用24小时格式还是12小时格式。 2、拥有31字节数据存储RAM。 3、串行I/O通信方式,相对并行来说比较节省IO口的使用。 4、DS1302的工作电压比较宽,大概是2.0V~5.5V都可以正常工作。采用双电源供电,当主电源比备用电源高0.2V时,由主电源供电,否则采用备用电源,一般是一个纽扣电池。 5、DS1302这种时钟芯片功耗一般都很低,它在工作电压2.0V的时候,工作电流小于300nA。 6、DS1302共有8个引脚,有两种封装形式,一种是DIP-8封装,芯片宽度(不含引脚)是300mil,一种是SOP-8封装,有两种宽度,一种是150mil,一种是208mil。 DS1302引脚及定义这是单字节写入的时序图,可见,先拉高使能端,进行使能选择,然后在时钟上升沿写入一个字节。 DS1302在进行读写操作时最少读写两个字节,第一个是控制字节,就是一个命令,说明是读还是写操作,第二个时需要读写的数据。 对于单字节写,只有在SCLK为低电平时才能将CE 置高电平,所以刚开始将SCLK 置低,CE置高,然后把需要写入的字节送入IO口,然后跳变SCLK,在SCLK下降沿时,

51单片机可调的ds1302时钟程序

#include #include #define uchar unsigned char #define uint unsigned int uchar count_10ms; //定义10ms计数器 sbit K1 = P3^7; //定义K1键 sbit K2 = P3^4; //定义K2键 sbit K3 = P3^5; //定义K3键 sbit K4 = P3^6; //P1^3定义K4键 sbit K5 = P3^3; sbit BEEP=P2^2; //定义蜂鸣器 sbit reset = P1^6; //P2^5; sbit sclk = P1^7; //P2^6; sbit io = P2^6; //P2^7; sbit LCD_RS=P1^0; sbit LCD_RW=P1^1 ; sbit LCD_EN=P1^2; bit K1_FLAG=0; //定义按键标志位,当按下K1键时,该位置1,K1键未按下时,该位为0。 uchar disp_buf[16] ={0x00}; //定义显示缓冲区 uchar time_buf[7] ={0,0,0x12,0,0,0,0}; //DS1302时间缓冲区,存放秒、分、时、日、月、星期、年 uchar temp [2]={0}; //用来存放设置时的小时、分钟的中间值 uint m=0,n=0,r=0; /********以下是函数声明********/ void Delay_ms(uint xms) ; bit lcd_busy(); void lcd_wcmd(uchar cmd); void lcd_wdat(uchar dat) ; void lcd_clr() ; void lcd_init() ; void write_byte(uchar inbyte); //写一字节数据函数声明 uchar read_byte(); //读一字节数据函数声明 void write_ds1302(uchar cmd,uchar indata); //写DS1302函数声明 uchar read_ds1302(uchar addr); //读DS1302函数声明 void set_ds1302(uchar addr,uchar *p,uchar n); //设置DS1302初始时间函数声明 void get_ds1302(uchar addr,uchar *p,uchar n); //读当前时间函数声明 void init_ds1302(); //DS1302初始化函数声明 /********以下是延时函数********/ void Delay_ms(uint xms) { uint i,j;

51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)

51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了这个程序。目前还不能修改时间与日期,只是以预定时间以始。 适用于开发板:51单片机(AT89S52)+带字库液晶12864(ST7920)+DS1302(实时时钟) 实现功能:简单,数字时钟+日期(以后会不断完美)。 C语言源程序如下: #include #include #define uchar unsigned char #define uint unsigned int /*DS1302 端口设置 */ sbit SCK=P3^6; //DS1302时钟 sbit SDA=P3^4; //DS1302 IO sbit RST = P3^5; // DS1302复位 bit ReadRTC_Flag; //读DS1302全局变量 /* 12864端口定义*/ #define LCD_data P0 //带字库液晶12864数据口 sbit LCD_RS = P2^4; //寄存器选择输入 sbit LCD_RW = P2^5; //液晶读/写控制 sbit LCD_EN = P2^6; //液晶使能控制 sbit PSB=P2^1; //并口控制 sbit RES=P2^3; uchar code dis1[] = {" 电子设计天地"}; //液晶显示的汉字 uchar code dis2[] = {"有志者,事竟成!"}; uchar code dis4[] = {'0','1','2','3','4','5','6','7','8','9'}; unsigned char temp; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; void lcd_pos(uchar X,uchar Y); //确定显示位置 unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};//秒分时日月周年 09-10-19 16:07:00 code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日

ds1302时钟原理介绍

早就已经不在学校了,可是前几天突然有老童学问我有没有保存这方面的资料,赶紧翻了一下我的电脑,呵呵,还是找到了一些资料,顺便共享出来,有需要的同学们拿走后留个言吧——可以的话。最后感谢无名的原作者。 DS1302的特点 DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如图1所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。 各引脚的功能 Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。SCLK:串行时钟,输入;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。 DS1302的几组寄存器以及有关RAM的地址

(1)DS1302有关日历、时间的寄存器 DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch),存放的数据格式为BCD码形式,如图3所示。 (2)小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是,当为1时,表示PM。在24小时模式时、位5是第二个10小时位。 (3)秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。(4)控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。 (5)DS1302中附加31字节静态RAM的地址如图4所示。 (6)DS1302的工作模式寄存器 所谓突发模式是指一次传送多个字节的时钟信号和RAM数据。突发模式寄存器如图5所示

相关主题
相关文档 最新文档