题目




我的解答
DS1302
DS1302.h
#ifndef __DS1302_H__
#define __DS1302_H__
extern unsigned char DS1302_Time[3];
void DS1302_Init();
void SetTime();
void ReadTime();
#endif
DS1302.c
#include <STC15F2K60S2.H>
#define DS1302_Sec 0x80
#define DS1302_Min 0x82
#define DS1302_Hou 0x84
#define DS1302_WP 0x8E
sbit DS1302_SCLK=P1^7;
sbit DS1302_IO=P2^3;
sbit DS1302_CE=P1^3;
unsigned char DS1302_Time[3]={
11,50,59};
void DS1302_Init()
{
DS1302_CE=0;
DS1302_SCLK=0;
}
void DS1302_Write(unsigned char Command,Data)
{
unsigned char k;
DS1302_CE=1;
for(k=0;k<8;k++)
{
DS1302_IO=Command&(0x01<<k);
DS1302_SCLK=0;
DS1302_SCLK=1;
}
for(k=0;k<8;k++)
{
DS1302_IO=Data&(0x01<<k);
DS1302_SCLK=0;
DS1302_SCLK=1;
}
DS1302_CE=0;
}
unsigned char DS1302_Read(unsigned char Command)
{
unsigned char k,Data=0x00;
Command|=0x01;
DS1302_CE=1;
for(k=0;k<8;k++)
{
DS1302_IO=Command&(0x01<<k);
DS1302_SCLK=0;
DS1302_SCLK=1;
}
for(k=0;k<8;k++)
{
DS1302_SCLK=1;
DS1302_SCLK=0;
if(DS1302_IO){
Data|=(0x01<<k);};
}
DS1302_IO=0;
DS1302_CE=0;
return Data;
}
void SetTime()
{
unsigned char Temp;
DS1302_Write(DS1302_WP,0x00);
Temp=DS1302_Time[0];
DS1302_Write(DS1302_Hou,Temp/10*16+Temp%10);
Temp=DS1302_Time[1];
DS1302_Write(DS1302_Min,Temp/10*16+Temp%10);
Temp=DS1302_Time[2];
DS1302_Write(DS1302_Sec,Temp/10*16+Temp%10);
DS1302_Write(DS1302_WP,0x80);
}
void ReadTime()
{
unsigned char Temp;
Temp=DS1302_Read(DS1302_Hou);
DS1302_Time[0]=Temp/16*10+Temp%16;
Temp=DS1302_Read(DS1302_Min);
DS1302_Time[1]=Temp/16*10+Temp%16;
Temp=DS1302_Read(DS1302_Sec);
DS1302_Time[2]=Temp/16*10+Temp%16;
}
iic.h
#ifndef __IIC_H__
#define __IIC_H__
void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendAck(bit ackbit);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
void AT24C02_Write(unsigned char Address,Data);
unsigned char AT24C02_Read(unsigned char Address);
void Delay1ms(unsigned int x);
#endif
iic
iic.c
#include "reg52.h"
#include "intrins.h"
#define DELAY_TIME 5
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
sbit SDA = P2^1;
sbit SCL = P2^0;
void IIC_Delay(unsigned char i)
{
do{
_nop_();}
while(i--);
}
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit;
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME)