📄 sd2403.c
字号:
#include <stdio.h>
#include <intrins.h>
#include "stc89c52.h"
#include "sd2403.h"
#include "12232.h"
#include "main.h"
//SDA P36
//SCL P37
sbit SDA=P3^6;
sbit SCL=P3^7;
/*********I2C延时***********/
void I2CWait(void)
{
_nop_();_nop_();_nop_();_nop_();
}
/********开启SD2400的I2C总线********/
bit I2CStart(void)
{
SDA=1;
SCL=1;
I2CWait();
if(!SDA)return false;//SDA线为低电平则总线忙,退出
SDA=0;
I2CWait();
while(SDA)return false;//SDA线为高电平则总线出错,退出
SCL=0;
I2CWait();
return true;
}
/********关闭SD2400的I2C总线*******/
void I2CStop(void)
{
SDA=0;
SCL=0;
I2CWait();
SCL=1;
I2CWait();
SDA=1;
}
/*********发送 ACK*********/
void I2CAck(void)
{
SDA=0;
SCL=0;
I2CWait();
SCL=1;
I2CWait();
SCL=0;
}
/*********发送NO ACK*********/
void I2CNoAck(void)
{
SDA=1;
SCL=0;
I2CWait();
SCL=1;
I2CWait();
SCL=0;
}
/*********读取ACK信号*********/
bit I2CWaitAck(void) //返回为:1=有ACK,0=无ACK
{
uchar errtime=255;
SCL=0;
SDA=1;
I2CWait();
SCL=1;
I2CWait();
while(SDA)
{
errtime--;
if(!errtime)
SCL=0;
return false;
}
SCL=0;
return true;
}
/************MCU向SD2400发送一个字节*************/
void I2CSendByte(uchar demand) //数据从高位到低位//
{
uchar i=8;
while(i--)
{
SCL=0;
_nop_();
SDA=(bit)(demand&0x80);
demand<<=1;
I2CWait();
SCL=1;
I2CWait();
}
SCL=0;
}
/*********MCU从SD2400读入一字节*********/
uchar I2CReceiveByte(void) //数据从高位到低位//
{
uchar i=8;
uchar ddata=0;
SDA=1;
while(i--)
{
ddata<<=1; //数据从高位开始读取
SCL=0;
I2CWait();
SCL=1;
I2CWait(); //从高位开始 ddata|=SDA;ddata<<=1
if(SDA)
{
ddata|=0x01;
}
}
SCL=0;
return ddata;
}
/******读SD2400实时数据寄存器******/
extern void I2CReadDate(void)
{
uchar n;
I2CStart();
I2CSendByte(0x65);
I2CWaitAck();
for(n=0;n<7;n++)
{
date[n]=I2CReceiveByte();
if (n!=6) //最后一个数据不应答
{
I2CAck();
}
}
I2CNoAck();
I2CStop();
}
/******写SD2400实时数据寄存器******/
void TXI2CWriteDate(unsigned char a,unsigned char b,unsigned char c,unsigned char d,unsigned char e,unsigned char f)
{
WriteTimeOn();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x00);//设置写起始地址
I2CWaitAck();
I2CSendByte(f);// second
I2CWaitAck();
I2CSendByte(e);//minute
I2CWaitAck();
I2CSendByte(d);//hour ,二十四小时制 A2 xor 80=22
I2CWaitAck();
I2CSendByte(0x03);//week
I2CWaitAck();
I2CSendByte(c);//day
I2CWaitAck();
I2CSendByte(b);//month
I2CWaitAck();
I2CSendByte(a);//year
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x12);//设置写起始地址
I2CWaitAck();
I2CSendByte(0x00);//清零数字调整寄存器
I2CWaitAck();
I2CStop();
WriteTimeOff();
}
void I2CWriteDate(void) // ,unsigned char A2,unsigned char A3,unsigned char A4,unsigned char A5)
{
WriteTimeOn();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x00);//设置写起始地址
I2CWaitAck();
I2CSendByte(0x00);// second
I2CWaitAck();
I2CSendByte(0x00);//minute
I2CWaitAck();
I2CSendByte(0x00);//hour ,二十四小时制 A2 xor 80=22
I2CWaitAck();
I2CSendByte(0x03);//week
I2CWaitAck();
I2CSendByte(0x00);//day
I2CWaitAck();
I2CSendByte(0x00);//month
I2CWaitAck();
I2CSendByte(0x00);//year
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x12);//设置写起始地址
I2CWaitAck();
I2CSendByte(0x00);//清零数字调整寄存器
I2CWaitAck();
I2CStop();
WriteTimeOff();
}
/******写SD2400实时数据寄存器******/
void I2CWriteDate1(unsigned char A1) // ,unsigned char A2,unsigned char A3,unsigned char A4,unsigned char A5)
{
WriteTimeOn();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x06);//设置写起始地址
I2CWaitAck();
//I2CSendByte(0x00);// second
//I2CWaitAck();
//I2CSendByte(A5);//minute
//I2CWaitAck();
//I2CSendByte(A4);//hour ,二十四小时制 A2 xor 80=22
//I2CWaitAck();
//I2CSendByte(0x03);//week
//I2CWaitAck();
//I2CSendByte(A3);//day
//I2CWaitAck();
//I2CSendByte(A2);//month
//I2CWaitAck();
I2CSendByte(A1);//year
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x12);//设置写起始地址
I2CWaitAck();
I2CSendByte(0x00);//清零数字调整寄存器
I2CWaitAck();
I2CStop();
WriteTimeOff();
}
/******写SD2400实时数据寄存器******/
void I2CWriteDate2(unsigned char A1) // ,unsigned char A2,unsigned char A3,unsigned char A4,unsigned char A5)
{
WriteTimeOn();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x05);//设置写起始地址
I2CWaitAck();
//I2CSendByte(0x00);// second
//I2CWaitAck();
//I2CSendByte(A5);//minute
//I2CWaitAck();
//I2CSendByte(A4);//hour ,二十四小时制 A2 xor 80=22
//I2CWaitAck();
//I2CSendByte(0x03);//week
//I2CWaitAck();
//I2CSendByte(A3);//day
//I2CWaitAck();
//I2CSendByte(A2);//month
//I2CWaitAck();
I2CSendByte(A1);//year
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x12);//设置写起始地址
I2CWaitAck();
I2CSendByte(0x00);//清零数字调整寄存器
I2CWaitAck();
I2CStop();
WriteTimeOff();
}
/******写SD2400实时数据寄存器******/
void I2CWriteDate3(unsigned char A1) // ,unsigned char A2,unsigned char A3,unsigned char A4,unsigned char A5)
{
WriteTimeOn();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x04);//设置写起始地址
I2CWaitAck();
//I2CSendByte(0x00);// second
//I2CWaitAck();
//I2CSendByte(A5);//minute
//I2CWaitAck();
//I2CSendByte(A4);//hour ,二十四小时制 A2 xor 80=22
//I2CWaitAck();
//I2CSendByte(0x03);//week
//I2CWaitAck();
//I2CSendByte(A3);//day
//I2CWaitAck();
//I2CSendByte(A2);//month
//I2CWaitAck();
I2CSendByte(A1);//year
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x12);//设置写起始地址
I2CWaitAck();
I2CSendByte(0x00);//清零数字调整寄存器
I2CWaitAck();
I2CStop();
WriteTimeOff();
}
/******写SD2400允许程序******/
void WriteTimeOn(void)
{
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x10);//设置写地址10H
I2CWaitAck();
I2CSendByte(0x80);//置WRTC1=1
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x0F);//设置写地址0FH
I2CWaitAck();
I2CSendByte(0x84);//置WRTC2,WRTC3=1
I2CWaitAck();
I2CStop();
}
/******写SD2400禁止程序******/
void WriteTimeOff(void)
{
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x0F);//设置写地址0FH
I2CWaitAck();
I2CSendByte(0x0) ;//置WRTC2,WRTC3=0
I2CWaitAck();
I2CSendByte(0x0) ;//置WRTC1=0(10H地址)
I2CWaitAck();
I2CStop();
}
/*
void Delay(uint nn)
{
while(nn--);
}
*/
extern void Run2403()
{
I2CReadDate();
//delay2043(4500);
//delay2043(4500);
/*date[6]=year,date[5]=month,date[4]=day,date[3]=week,date[2]=hour,date[1]=minute,date[0]=second*/
NowY[0]=date[6];
NowM[0]=date[5];
NowD[0]=date[4];
NowHH[0]=date[2]^0x80;
NowMM[0]=date[1];
NowSS[0]=date[0];
//时间IC工作 结束
//sprintf(Temp1,"日期:2008-11-15");
//sprintf(Humi1,"时间:23:27");
}
/*********延时子程序*********/
void delay2043(unsigned int nn)
{
while(nn--);
}
/******写SD2400实时数据寄存器******/
void I2CWriteDate4(unsigned char A1) // ,unsigned char A2,unsigned char A3,unsigned char A4,unsigned char A5)
{
WriteTimeOn();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x02);//设置写起始地址
I2CWaitAck();
//I2CSendByte(0x00);// second
//I2CWaitAck();
//I2CSendByte(A5);//minute
//I2CWaitAck();
//I2CSendByte(A4);//hour ,二十四小时制 A2 xor 80=22
//I2CWaitAck();
//I2CSendByte(0x03);//week
//I2CWaitAck();
//I2CSendByte(A3);//day
//I2CWaitAck();
//I2CSendByte(A2);//month
//I2CWaitAck();
I2CSendByte(A1);//year
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x12);//设置写起始地址
I2CWaitAck();
I2CSendByte(0x00);//清零数字调整寄存器
I2CWaitAck();
I2CStop();
WriteTimeOff();
}
/******写SD2400实时数据寄存器******/
void I2CWriteDate5(unsigned char A1) // ,unsigned char A2,unsigned char A3,unsigned char A4,unsigned char A5)
{
WriteTimeOn();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x01);//设置写起始地址
I2CWaitAck();
//I2CSendByte(0x00);// second
//I2CWaitAck();
//I2CSendByte(A5);//minute
//I2CWaitAck();
//I2CSendByte(A4);//hour ,二十四小时制 A2 xor 80=22
//I2CWaitAck();
//I2CSendByte(0x03);//week
//I2CWaitAck();
//I2CSendByte(A3);//day
//I2CWaitAck();
//I2CSendByte(A2);//month
//I2CWaitAck();
I2CSendByte(A1);//year
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x12);//设置写起始地址
I2CWaitAck();
I2CSendByte(0x00);//清零数字调整寄存器
I2CWaitAck();
I2CStop();
WriteTimeOff();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -