📄 ds2401.c
字号:
#include "sys.h"
//******************************DS2401初始化*************************
unsigned char DS2401Init(void)
{
unsigned char result;
DelayNus(G);
DS2401IO = 0; // Drives DQ low
DelayNus(H);
DS2401IO = 1; // Releases the bus
DelayNus(I);
if(DS2401IO==0)
result = 1;
else
result = 0;
DelayNus(J); // Complete the reset sequence recovery
return result; // Return sample presence pulse result
//1代表初始化成功,0代表失败
}
//******************************发送读写命令*************************
void SendOrderToDS2401(unsigned char order)
{
unsigned char Temp = 8;
while(Temp)
{
if(order&0x80)
{
DS2401IO = 0;
DelayNus(4);//拉低10us
DS2401IO = 1;//拉高
DelayNus(200);
}
else
{
DS2401IO = 0;
DelayNus(100);//拉低100us
DS2401IO = 1;//拉高
DelayNus(200);
}
Temp--;
order<<=1;
}
}
//*****************************对2401写一位数据**********************
void DS2401WriteBit(bit b)
{
if (b)
{
// Write '1' bit
DS2401IO = 0; // Drives DQ low
DelayNus(A);
DS2401IO = 1; // Releases the bus
DelayNus(B); // Complete the time slot and 10us recovery
}
else
{
// Write '0' bit
DS2401IO = 0; // Drives DQ low
DelayNus(C);
DS2401IO = 1; // Releases the bus
DelayNus(D);
}
}
//*****************************对2401读一位数据**********************
unsigned char DS2401ReadBit(void)
{
unsigned char result;
DS2401IO = 0; // Drives DQ low
DelayNus(A);
DS2401IO = 1; // Releases the bus
DelayNus(E);
result = DS2401IO ;; // Sample the bit value from the slave
DelayNus(F); // Complete the time slot and 10us recovery
return result;
}
//*****************************对2401写一个字节数据**********************
void OWWriteByte(int value)
{
unsigned char loop;
for (loop = 0; loop < 8; loop++)
{
DS2401WriteBit(value & 0x01);
value >>= 1;
}
}
//*****************************对2401读一个字节数据**********************
unsigned char OWReadByte(void)
{
unsigned char loop, result=0;
for (loop = 0; loop < 8; loop++)
{
result >>= 1;
if (DS2401ReadBit())
result |= 0x80;
}
return result;
}
//******************************读DS2401 ID 号*************************
void ReadDS2401ID(void)
{
unsigned char Temp=0;
while(1)
{
if(DS2401Init())
{
DS2401WorkOK = 1;//表示DS2401初始化成功
break;
}
else Temp++;
if(Temp>=10)
{
DS2401WorkOK=0;//初始化10次失败的化,表示DS2401工作不正常
break;
}
}
if(DS2401WorkOK)
{
OWWriteByte(0x33);//发送读命令码
for (Temp=0;Temp<8;Temp++)
{
IDCode[Temp] = OWReadByte();//读一个字节,总共8个
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -