📄 ds1990a的底层程序.c
字号:
#include <reg52.h>
#include <intrins.h>
typedef unsigned int uint;
typedef unsigned char uchar;
#define T4us _nop_();_nop_();_nop_();_nop_(); //延时4us的宏 base=11.059Mhz(精确控制)
#define T6us _nop_();_nop_();_nop_();_nop_();_nop_(); //延时6us的宏 base=11.059Mhz(精确控制)
sbit DATA_BIT=P3^2; //定义1-wire总线
//外部函数声明
extern bit Read1990a(uchar idata *pt);
//功能演示,在实际用的时候把这段注释掉
//*****************************
void main(void)
{
uchar data a[8]; //定义存放SN的数组
bit cc;
uchar idata *pt;
pt=&a[0];
cc=Read1990a(pt); //读Ibutton
}
//******************************
//*************************************************
//发出复位脉冲
//入口:无
//出口: 0=失败,1=成功,失败表示总线被钳在低电平
static bit TouchReset(void)
{
uchar i;
bit a;
DATA_BIT=0; //拉低总线
for (i=230;i>0;--i); //保持500us base=11.059Mhz(精确控制)
DATA_BIT=1; //释放总线
i=255; //超时1.6ms base=11.059Mhz(精确控制)
while (--i)
if (DATA_BIT==1) //等待总线拉高
{
a=0;
for (i=63;i>0;--i) //延时480us base=11.059Mhz(精确控制)
a|=!DATA_BIT; //采集总线状态
return(a); //返回总线状态
}
return(0); //返回失败标示
}
//*************************************************
//*****************************************************
//读写1位,总时间>=65us
//入口:以CY传递参数
//出口:以CY传递参数
static void TouchBit(void)
{
uchar i;
DATA_BIT=0; //总线拉低
T4us; //延时4us
DATA_BIT=CY; //写入电平
T6us; //延时6us
CY=DATA_BIT; //读入电平
i=23;
while(--i); //延时50us, base=11.059Mhz(精确控制)
DATA_BIT=1; //释放总线
}
//*****************************************************
//*****************************************************
//向1-wire器件写入1个字节
//入口:1字节数据
//出口:无
static void OutByte(uchar indata)
{
uchar i;
for (i=8;i>0;--i) //共写8位
{
indata>>=1; //低位先写
TouchBit(); //写1位
}
}
//*****************************************************
//*****************************************************
//从1-wire器件读入1个字节
//入口:无
//出口:1字节数据
static uchar InByte(void)
{
uchar a=0xff,i; //读数据类似于写0xff
for (i=8;i>0;--i)
{
a>>=1; //移出低位
TouchBit(); //读1位
if(CY)
a|=0x80;
}
return(a);
}
//*************************************************
//*************************************************
//8位CRC校验,生成多项式x8+x5+x4+1
//入口:待校验字节,CRC结果
//出口:当次的CRC结果
static 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的SN,要检查复位情况和CRC,总共读10次
//入口:指向内部RAM的指针
//出口:返回0表示没有成功读取,指针的值不变,
//返回1表示成功读取,指针指向最后一个字节
extern bit Read1990a(uchar idata *pt)
{
uchar c,i,crc;
for (c=10;c>0;--c) //最多读10次
{
if (TouchReset()) //检查复位是否正确
{
OutByte(0x33); //发出读ROM命令
crc=0; //CRC校验赋初值
for (i=7;i>0;--i,++pt) //读出前面7个字节
{
*pt=InByte();
crc=Data_Crc(*pt,crc); //进行校验
}
*pt=InByte(); //读出Ibutton中的CRC值
if (crc==*pt) //比较
return(1); //成功返回1
}
}
return(0); //失败返回0
}
//*************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -