⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1990a的底层程序.c

📁 DS1990A的C51读写程序
💻 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 + -