?? 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 + -