📄 gettime.c
字号:
#include <REG52.H>
#include <intrins.h>
#define DS1307_Addr 0xd0 //前七位为器件地址,最后一位为读写位,为0时写,为1时读
//端口位定义
sbit SDA=P3^5; //模拟I2C数据传送位
sbit SCL=P3^4; //模拟I2C时钟控制位
void delay_us(unsigned char us);
/*******************************************************************
起动总线函数
函数原型: void Start_I2c();
功能: 启动I2C总线,即发送I2C起始条件.
********************************************************************/
void IIC_Start()//在SCL处于高电平状态,SDA从高电平到低电平的跳变表示数据传输起始
{
SDA=1; //发送起始条件的数据信号
_nop_();
SCL=1;
delay_us(5); //起始条件建立时间大于4.7us,延时
SDA=0; //发送起始信号
delay_us(4); //起始条件锁定时间大于4us
SCL=0; //钳住I2C总线,准备发送或接收数据 起始条件已发送准备发送数据
delay_us(2);
}
/*******************************************************************
结束总线函数
函数原型: void Stop_I2c();
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
void IIC_Stop()//在SCL处于高电平的时候,SDA从低电平向高电平的跳变表示结束数据传输
{
SDA=0; //发送结束条件的数据信号
_nop_(); //发送结束条件的时钟信号
SCL=1;
delay_us(4); //结束条件建立时间大于4us
SDA=1; //发送I2C总线结束信号
delay_us(4);
}
/*******************************************************************
字节数据传送函数
函数原型: void SendByte(unsigned char c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0 假)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void IIC_SendByte(unsigned char write_data)
{
unsigned char i;
for(i=0;i<8;i++) //要传送的数据长度为8位
{
delay_us(2);
if(write_data&0x80)
SDA=1; //判断发送位
else
SDA=0;
write_data <<= 1;
delay_us(2);
SCL=1; //置时钟线为高,通知被控器开始接收数据位
delay_us(6); //保证时钟高电平周期大于4us
SCL=0;
}
SDA=1; //8位发送完后释放数据线,准备接收应答位
delay_us(5);
SCL=1;
while (SDA); //等待应答信号
_nop_();
SCL = 0;
}
/*******************************************************************
字节数据接收函数
函数原型: unsigned char RcvByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
********************************************************************/
unsigned char IIC_ReadByte()
{
unsigned char iic_data_temp,i; //iic_data_temp用来接受数据
SDA=1; //置数据线为输入方式,释放数据总线
for(i=0;i<8;i++)
{
delay_us(3);
SCL = 0; //置时钟线为低,准备接收数据位,SDA变化在这段时间出现
delay_us(6); //时钟低电平周期大于4.7us
SCL = 1; //置时钟线为高使数据线上数据有效
delay_us(2);
iic_data_temp <<= 1;
if(SDA)
iic_data_temp +=1; //读数据位,接收的数据位放入iic_data_temp中
delay_us(2);
}
SCL=0;
_nop_();
return(iic_data_temp);
}
/********************************************************************
应答子函数
原型: void Ack_I2c(bit a);
功能:主控器进行应答信号,(可以是应答或非应答信号)
********************************************************************/
void IIC_Ack(bit a)
{
if(a==0)
SDA=0; //在此发出应答或非应答信号
else
SDA=1;
delay_us(3);
SCL=1;
delay_us(6); //时钟低电平周期大于4us
SCL=0; //清时钟线,钳住I2C总线以便继续接收
_nop_();
}
unsigned char DS1307_Read(unsigned char Addr)
{
unsigned char read_data; //存放读出的数据
//随机读取,先进行伪写,使指针移到要读的单元
IIC_Start(); //启动总线
IIC_SendByte(DS1307_Addr); //发送器件地址
IIC_SendByte(Addr); //发送要写的地址
//读取单元内容
IIC_Start();
IIC_SendByte(DS1307_Addr+1);
read_data=IIC_ReadByte();
IIC_Ack(1);
IIC_Stop();
return(read_data);
}
void DS1307_Write(unsigned char Addr,unsigned char wdata)
{
IIC_Start(); //启动总线
IIC_SendByte(DS1307_Addr); //发送器件地址
IIC_SendByte(Addr); //发送要写的地址
IIC_SendByte(wdata);
IIC_Stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -