改一個給你,把你原來的換掉:
/****************************************************************************/
//程序名稱: 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);//禁止寫操作
}
}
|