📄 code.c
字号:
#include <REG52.H>
#include <INTRINS.H>
//***************************宏定义***********************************
#define uchar unsigned char
#define uint unsigned int
#define T4us _nop_();_nop_();_nop_();_nop_() //延时4μs
#define T6us _nop_();_nop_();_nop_();_nop_();_nop_() //延时6μs
//***************************端口定义***********************************
sbit DATA_BIT=P1^0; //定义1-Wire总线
sbit sda=P3^6; //AT24C02数据线
sbit scl=P3^7; // AT24C02时钟线
//**********************端口复位程序**************************
bit Reset1990A(void)
{
uchar i;
bit a;
DATA_BIT=0; //拉低总线
for (i=230;i>0;--i); //保持500us
DATA_BIT=1; //释放总线
i=255; //超时1.6ms
while (--i)
if (DATA_BIT==1) //等待总线拉高
{
a=0;
for (i=63;i>0;--i) //延时480us
a|=!DATA_BIT; //采集总线状态
return a; //返回总线状态
}
return 0; //返回失败标示
}
//*************************读写位程序*****************************
void Bit1990A (void)
{
uchar i;
DATA_BIT=0; //总线拉低
T4us; //延时4us
DATA_BIT=CY; //写入电平 CY=PSW^7
T6us; //延时6us
CY=DATA_BIT; //读入电平
i=23;
while(--i); //延时50us
DATA_BIT=1; //释放总线
}
//*************************写数据字节程序*****************************
void WriteByte(uchar indata)
{
uchar i;
for(i=8;i>0;--i) //共写8位
{
indata>>=1; //低位先写
Bit1990A(); //写1位
}
}
//*************************读数据字节程序*****************************
uchar ReadByte(void)
{
uchar a=0xFF,i; //读数据类似于写0xFF
for(i=8;i>0;--i)
{
a>>=1; //移出低位
Bit1990A(); //读1位
if(CY)
a|=0x80;
}
return a;
}
//*************************读数CRC校验程序*****************************
uchar Data_Crc(uchar indata,uchar crc)
{
uchar i;
bit b;
for(i=8;i>0;--i)
{
if(b=(bit)((indata^crc)&0x01)) //判断与x7异或的结果(x8)
crc^=0x18; //反馈到x5 x4
crc>>=1; //移位
if(b)
crc|=0x80; //x7异或的结果送x0
indata>>=1;
}
return crc;
}
//*************************读DS1990A程序*****************************
bit Read1990A(uchar idata *pt)
{
uchar c,i,crc;
for(c=10;c>0;--c) //最多读10次
{
if (Reset1990A()) //检查复位是否正确
{
WriteByte(0x33); //发出读ROM命令
crc=0; //CRC校验赋初值
for (i=7;i>0;--i,++pt) //读出前面7个字节
{
*pt= ReadByte();
crc=Data_Crc(*pt,crc); //进行校验
}
*pt= ReadByte(); //读出Ibutton中的CRC值
if (crc==*pt) //比较
return 1; //成功返回1
}
}
return 0; //失败返回0
}
//*************************启动I2C总线 *****************************
void I2CStart(void)
{
scl=0;
sda=1; //发送起始条件的数据信号
T6us;
scl=1;
T6us; //起始条件建立时间大于4.7μs
sda=0; //发送起始信号
T6us; //起始条件锁定时间大于4μs
scl=0; //钳住I2C总线准备发送或接收数据
sda=1;
}
//*************************停止I2C总线 *****************************
void I2CStop(void)
{
sda=0; //发送结束条件的数据信号
sda=0;
T6us;
scl=1;
T6us; //STOP时SCL至少领先SDA 4μs
sda=1; //发送I2C总线结束信号
T6us; //STOP后必须至少维持4.7us方可START
}
//**********************发送应答位或非应答位 **************************
void SendAck(bit ack)
{
sda=ack; //发出应答或非应答信号
T6us;
scl=1;
T6us;
scl=0; //清时钟线钳住I2C总线以便继续接收
T6us;
}
//*************************I2C总线读字节函数*************************
uchar I2CReadByte(void)
{
uchar i=8;
uchar temp;
scl=0;
while(i--)
{
scl=1; //置时钟线为高使数据线上数据有效
T6us;
temp=(temp<<1)|sda;
scl=0;
T6us;
}
return temp;
}
//************************* I2C总线写字节函数*****************************
bit I2CWriteByte(uchar byte)
{
bit ack;
uchar i=8;
sda=1;
T6us;
for(;i>0;i--) //要传送的数据长度为8bit
{
if((byte&0x80)>0)
{
sda =1;
scl=1;
T6us;
scl=0;
sda =0;
}
else
{
sda=0;
scl=1;
T6us;
scl=0;
}
byte<<=1;
}
sda=1; //发送完后释放数据线
T6us;
scl=1;
T6us;
do{}while(1==sda); //准备接收应答位
ack=1;
scl=0;
return ack;
}
//************************* AT24C32读数据函数**********************
uchar AT24C32ReadByte(uint addr)
{
uchar temp;
uchar HighAddr;
uchar LowAddr;
I2CStart();
HighAddr=addr>>8;
LowAddr=addr&0xFF;
I2CWriteByte(0xA0); //实现写操作
I2CWriteByte(HighAddr); //发送高地址
I2CWriteByte(LowAddr); //发送低地址
I2CStart();
I2CWriteByte(0xA1); //实现读操作
temp=I2CReadByte();
SendAck(1);
I2CStop();
return temp;
}
//************************* AT24C32写数据函数***********************
void AT24C32WriteByte(uint addr,uchar value)
{
uchar HighAddr;
uchar LowAddr;
I2CStart();
HighAddr=addr>>8;
LowAddr=addr&0xff;
I2CWriteByte(0xA0); //实现写操作
I2CWriteByte(HighAddr); //发送高地址
I2CWriteByte(LowAddr); //发送低地址
I2CWriteByte(value);
I2CStop();
T6us;
}
//功能演示,在实际用的时候把这段注释掉
//*****************************
void main(void)
{
uchar data a[8]; //定义存放SN的数组
bit cc;
uchar idata *pt;
pt=&a[0];
cc=Read1990A(pt); //读Ibutton
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -