ad26.c
来自「Small Device C Compiler 面向Inter8051」· C语言 代码 · 共 266 行
C
266 行
//---------------------------------------------------------------------------
// Copyright (C) 2000 Dallas Semiconductor Corporation, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES
// OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
//
// Except as contained in this notice, the name of Dallas Semiconductor
// shall not be used except as stated in the Dallas Semiconductor
// Branding Policy.
//--------------------------------------------------------------------------
//
// ad26.c - Reads the voltage on the 1-Wire
// version 1.00
//
// Include Files
#include <stdio.h>
#include "ownet.h"
#include "ad26.h"
int Volt_AD(int portnum, int vdd, uchar *SNum)
{
uchar send_block[50];
uchar test;
int send_cnt=0;
int i;
ushort lastcrc8;
int busybyte;
owSerialNum(portnum,SNum,FALSE);
// Recall the Status/Configuration page
// Recall command
send_block[send_cnt++] = 0xB8;
// Page to Recall
send_block[send_cnt++] = 0x00;
if(!owBlock(portnum,FALSE,send_block,send_cnt))
return FALSE;
send_cnt = 0;
if(owAccess(portnum))
{
// Read the Status/Configuration byte
// Read scratchpad command
send_block[send_cnt++] = 0xBE;
// Page for the Status/Configuration byte
send_block[send_cnt++] = 0x00;
for(i=0;i<9;i++)
send_block[send_cnt++] = 0xFF;
if(owBlock(portnum,FALSE,send_block,send_cnt))
{
setcrc8(portnum,0);
for(i=2;i<send_cnt;i++)
lastcrc8 = docrc8(portnum,send_block[i]);
if(lastcrc8 != 0x00)
return FALSE;
}//Block
else
return FALSE;
test = send_block[2] & 0x08;
if(((test == 0x08) && vdd) || ((test == 0x00) && !(vdd)))
return TRUE;
}//Access
if(owAccess(portnum))
{
send_cnt = 0;
// Write the Status/Configuration byte
// Write scratchpad command
send_block[send_cnt++] = 0x4E;
// Write page
send_block[send_cnt++] = 0x00;
if(vdd)
send_block[send_cnt++] = send_block[2] | 0x08;
else
send_block[send_cnt++] = send_block[2] & 0xF7;
for(i=0;i<7;i++)
send_block[send_cnt++] = send_block[i+4];
if(owBlock(portnum,FALSE,send_block,send_cnt))
{
send_cnt = 0;
if(owAccess(portnum))
{
// Copy the Status/Configuration byte
// Copy scratchpad command
send_block[send_cnt++] = 0x48;
// Copy page
send_block[send_cnt++] = 0x00;
if(owBlock(portnum,FALSE,send_block,send_cnt))
{
busybyte = owReadByte(portnum);
while(busybyte == 0)
busybyte = owReadByte(portnum);
return TRUE;
}//Block
}//Access
}//Block
}//Access
return FALSE;
}
float Volt_Reading(int portnum, int vdd, uchar *SNum)
{
uchar send_block[50];
int send_cnt=0;
int i;
int busybyte;
uchar lastcrc8;
ushort volts;
float ret=-1.0;
if(Volt_AD(portnum,vdd,SNum))
{
if(owAccess(portnum))
{
if(!owWriteByte(portnum,0xB4))
{
//output_status(LV_ALWAYS,(char *)"DIDN'T WRITE CORRECTLY\n");
printf ("DIDN'T WRITE CORRECTLY\n");
return ret;
}
busybyte = owReadByte(portnum);
while(busybyte == 0)
busybyte = owReadByte(portnum);
}
if(owAccess(portnum))
{
// Recall the Status/Configuration page
// Recall command
send_block[send_cnt++] = 0xB8;
// Page to Recall
send_block[send_cnt++] = 0x00;
if(!owBlock(portnum,FALSE,send_block,send_cnt))
return ret;
}
send_cnt = 0;
if(owAccess(portnum))
{
// Read the Status/Configuration byte
// Read scratchpad command
send_block[send_cnt++] = 0xBE;
// Page for the Status/Configuration byte
send_block[send_cnt++] = 0x00;
for(i=0;i<9;i++)
send_block[send_cnt++] = 0xFF;
if(owBlock(portnum,FALSE,send_block,send_cnt))
{
setcrc8(portnum,0);
for(i=2;i<send_cnt;i++)
lastcrc8 = docrc8(portnum,send_block[i]);
if(lastcrc8 != 0x00)
return ret;
}
else
return ret;
volts = ((int)send_block[6] << 8) | send_block[5];
ret = (float) volts/100;
}//Access
}
return ret;
}
double Get_Temperature(int portnum,uchar *SNum)
{
double ret=-1.0;
uchar send_block[50];
int send_cnt=0;
int i;
uchar lastcrc8;
owSerialNum(portnum,SNum,FALSE);
if(owAccess(portnum))
// Convert Temperature command
owWriteByte(portnum,0x44);
msDelay(10);
if(owAccess(portnum))
{
// Read the Status/Configuration byte
// Read scratchpad command
send_block[send_cnt++] = 0xBE;
// Page for the Status/Configuration byte
send_block[send_cnt++] = 0x00;
for(i=0;i<9;i++)
send_block[send_cnt++] = 0xFF;
if(owBlock(portnum,FALSE,send_block,send_cnt))
{
setcrc8(portnum,0);
for(i=2;i<send_cnt;i++) {
lastcrc8 = docrc8(portnum,send_block[i]);
} printf ("\n");
if(lastcrc8 != 0x00)
return ret;
}
else
return ret;
ret = ((((unsigned int)send_block[4] << 8) | send_block[3]) >> 3) * 0.03125;
}//Access
return ret;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?