一.
1.Ds1302芯片有关代码
#include<REGX52.h>
//引脚定义
sbit Ds1302_IO=P3^4;
sbit DS1302_CE=P3^5;
sbit DS1302_SCLK=P3^6 //时序脉冲周期
//寄存器写入地址/指令定义
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_DATE 0x86
#define DS1302_MONTH 0x88
#define DS1302_DAY 0x8A
#define DS1302_YEAR 0x8C
#define DS1302_WP 0x8E
//寄存器写入地址/指令定义
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_DATE 0x86
#define DS1302_MONTH 0x88
#define DS1302_DAY 0x8A
#define DS1302_YEAR 0x8C
#define DS1302_WP 0x8E
//时间数组,索引0~6分别为年、月、日、时、分、秒、星期
unsigned char DS1302_Time[]={19,11,16,12,59,55,6};
//初始化
void init(void){
DS1302_CE=0;
Ds1302_SClk=0;
}
//写入字节
void Write_Byte(unsigned char Commend,Date)//commend 命令字
{
unsigned char i;
Ds1302_CE=1;
for(i=0;i<8;i++){
DS1302_IO=Commend&(0x01<<i);//Commend&0x01就是取Commend的最低位值的运算,<<i就是0x01左移i位
Ds1302_Sclk=1;//为1表示上升沿,写入命令字
DS1302_Sclk=0;//下降沿,输出
}
//Date写入同理
for(i=0;i<8;i++){
for(i=0;i<8;i++){
DS1302_IO=Date&(0x01<<i);
Ds1302_Sclk=1;
DS1302_Sclk=0;
}
Ds1302_CE=0;//写入操作结束
}
unsigned char Read_Byte(unsigned char commend){
unsigned char i;
Ds1302_CE=1;
Command|=0x01;//逻辑或,取高位,将指令转为读指令
Date=0x00;
for(i=0;i<8;i++){
Ds1302_IO=Commend&(0x01<<i)//取低位后左移
Ds1302_Sclk=0;//此时是读,应该先下降沿以输出数据
Ds1302_Sclk=1;}
for(i=0;i<8;i++){
Ds1302_Sclk=1;//注意脉冲周期
Ds1302_Sclk=0;
if(DS1302_IO){Data|=(0x01<<i);//如果IO线为1即为读模式的话
}
DS1302_CE=0;
DS1302_IO=0; //读取后将IO设置为0,否则读出的数据会出错
return Data;
}
void DS1