改一个给你,把你原来的换掉:
/****************************************************************************/
//程序名称: DS1302头文件
/****************************************************************************/
#ifndef __DS1302_H__
#define __DS1302_H__
#include <AT89X52.h>
#include <intrins.h> //包含_nop_()延时函数
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
//定义DS1302时钟接口
sbit clock_clk = P2^4; //ds1302_clk(时钟线)
sbit clock_dat = P2^5; //ds1302_dat(数据线)
sbit clock_Rst = P2^6; //ds1302_clock_Rst(复位线)
void write_clock(uchar addr, uchar dat)
{
uchar n;
clock_Rst = 0;
_nop_();
clock_clk = 0;//先将clock_clk置低电平。
_nop_();
clock_Rst = 1; //然后将clock_Rst(CE)置高电平。
_nop_();
for (n=0; n<8; n++)//开始传送八位地址命令
{
clock_dat = addr & 0x01;//数据从低位开始传送
addr >>= 1;
clock_clk = 1;//数据在上升沿时,DS1302读取数据
_nop_();
clock_clk = 0;
_nop_();
}
for (n=0; n<8; n++)//写入8位数据
{
clock_dat = dat & 0x01;
dat >>= 1;
clock_clk = 1;//数据在上升沿时,DS1302读取数据
_nop_();
clock_clk = 0;
_nop_();
}
clock_Rst = 0;//传送数据结束
_nop_();
}
/*******************************************************************************
* 函 数 名 : Ds1302Read
* 函数功能 : 读取一个地址的数据
* 输 入 : addr
* 输 出 : dat
*******************************************************************************/
uchar read_clock(uchar addr)
{
uchar n,dat,dat1;
clock_Rst = 0;
_nop_();
clock_clk = 0;//先将clock_clk置低电平。
_nop_();
clock_Rst = 1;//然后将clock_Rst(CE)置高电平。
_nop_();
for(n=0; n<8; n++)//开始传送八位地址命令
{
clock_dat = addr & 0x01;//数据从低位开始传送
addr >>= 1;
clock_clk = 1;//数据在上升沿时,DS1302读取数据
_nop_();
clock_clk = 0;//DS1302下降沿时,放置数据
_nop_();
}
_nop_();
for(n=0; n<8; n++)//读取8位数据
{
dat1 = clock_dat;//从最低位开始接收
dat = (dat>>1) | (dat1<<7);
clock_clk = 1;
_nop_();
clock_clk = 0;//DS1302下降沿时,放置数据
_nop_();
}
clock_Rst = 0;
_nop_(); //以下为DS1302复位的稳定时间,必须的。
clock_clk = 1;
_nop_();
clock_dat = 0;
_nop_();
clock_dat = 1;
_nop_();
return dat;
}
/*****************************************************************************/
//设置1302的初始时间(自动初始化)
void Init_1302(void)//-设置1302的初始时间(2007年1月1日00时00分00秒星期一)
{ unsigned char f;
if(read_clock(0xc1) != 0xaa)
{
write_clock(0x8e,0x00);//允许写操作
write_clock(0x8c,0x07);//年
write_clock(0x8a,0x01);//星期
write_clock(0x88,0x01);//月
write_clock(0x86,0x01);//日
write_clock(0x84,0x00);//小时
write_clock(0x82,0x00);//分钟
write_clock(0x80,0x00);//秒
write_clock(0x90,0xa5);//充电
write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
for(f=0;f<60;f=f+2)//清除闹钟RAM位为0
{
write_clock(0xc2+f,0x00);
}
write_clock(0x8e,0x80);//禁止写操作
}
}
|