DS2431 DS18B20读写程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
unsignedcharOneWire_ack(void)
{
unsignedcharack;
DS_DQ_TRISD=0;//输出
DS_DQ_OUT=0;//输出LOW
//delay_us(500);
delay_us(250);
delay_us(250);
delay_us(100);
DS_DQ_OUT=1;//输出HIGH
*/
}
uint8*DS2431_ReadString(uint16address)
{
uint8i;
if(OneWire_ack())return;
OneWire_write(0xAA);//复制暂存器数据到存储器中
temp8=OneWire_read();
temp8<<=8;
temp8+=OneWire_read();
errors=OneWire_read();
if(errors!=0x07)
return0;
if(OneWire_ack())return;
return1;
/*
unsignedchari=1;
if(OneWire_ack())return;
OneWire_write(0xcc);//跳过ROM匹配
OneWire_write(0x0f);//writescrachpad
OneWire_write(0x20);//ta1
OneWire_write(0x00);//ta2
写ROM或存贮器命令到DS1820
*********************************************/
voidOneWire_write(unsignedcharcmd)
{
unsignedchari,j;
DS_DQ_TRISD=0;//RE2输出
for(j=0;j<=7;j++)
OneWire_write(0xcc);//跳过ROM匹配
OneWire_write(0xf0);//发出读存储器命令
OneWire_write(LS_BYTE(address));//地址低8位
OneWire_write(HS_BYTE(address));//地址高8位
a_DS2431[0]=OneWire_read();//readdata
do
i=OneWire_ack();
while(i==0x01);
OneWire_write(0x55);
for(i=0;i<8;i++)
OneWire_write(p[i]);
}
uint8DS2431_WriteOneByte(uint16address,uint8*p_data)
{
uint8tem8h,tem8l,i,data,errors,temp8;
DS_DQ_TRISD=1;//RE2输入
delay_us(40);//delay_us(45);
if(DS_DQ_IN==1)ack=1;//
elseack=0;//
//delay_us(500);
delay_us(250);
delay_us(250);
delay_us(100);
returnack;
{
unsignedcharbit0,cbit,r,temp,i,j,byte;
temp=0;
for源自文库j=0;j<len;j++)
{
byte=p[j];
for(i=0;i<8;i++)
{
cbit=temp&0x01;
bit0=byte&0x01;
temp=temp>>1;
r=cbit^bit0;
if(r==1)
}
cmd=cmd>>1;
}
}
/*********************************************
匹配DS1820
*********************************************/
voidOneWire_match(unsignedchar*p)
{
unsignedchari;
DS2431DS18B20onewire读写程序
最近公司有一个产品用到了DS2431,我就将先前一个DS18B20的程序中加入了DS2431的按规定函数。先传给大家分享.大家可以使用,转载时请说明出处.此程序不够完善,希望能支持多节点设备连接。
单总线适用于单,能够控制一个或多个从机设备。主机可以是微控制器,从机可以是单总线器件,它们之间的数据交换只通过一条信号线。当只有一个从机设备时,系统可按单节点系统操作;当有多个从机设备时,系统则按多节点系统操作。
OneWire_write(0xcc);//跳过ROM匹配
OneWire_write(0x55);//发出启动转换命令
OneWire_write(tem8l);//发送地址低位
OneWire_write(tem8h);//发送地址高位
OneWire_write(errors);
for(i=0;i<50;i++)
returna_DS2431[0];
/*
unsignedchari=1;
if(OneWire_ack())return;
OneWire_write(0xcc);//跳过ROM匹配
OneWire_write(0xaa);//
a_DS2431[0]=OneWire_read();//readta1
a_DS2431[1]=OneWire_read();//readta2
{
i=cmd&0x01;
if(i==0x01)
{
DS_DQ_OUT=0;//输出LOW
delay_us(5);
DS_DQ_OUT=1;//输出HIGH
delay_us(120);
}
else
{
DS_DQ_OUT=0;//输出LOW
delay_us(120);
DS_DQ_OUT=1;//输出HIGH
delay_us(5);
temp=temp^0x8c;
byte=byte>>1;
}
}
returntemp;
}
/*********************************************
检查DS1820是否存在:
如果DS1820不存在返回1,否则返回0
*********************************************/
a_DS2431[2]=OneWire_read();//reades
a_DS2431[3]=OneWire_read();//readdata
a_DS2431[4]=OneWire_read();//crc
a_DS2431[5]=OneWire_read();//CRC
crccheck(&a_DS2431[4],2);
tem8h=(unsignedchar)(address>>=4);
tem8l=(unsignedchar)address;
if(OneWire_ack())return;
OneWire_write(0xcc);//跳过ROM匹配
OneWire_write(0x0f);//发送写暂存器命令
OneWire_write(tem8l);//发送地址低位
if(DS_DQ_IN)byte|=0x80;//读入
if(i<7)
byte=byte>>1;
delay_us(120);//delay_us(100);
DS_DQ_TRISD=0;//RE2输出
delay_us(2);//delay_us(5);
}
returnbyte;
}
/*********************************************
temp8<<=8;
temp8+=OneWire_read();
errors=OneWire_read();
if(errors!=0x07)
return0;
if(OneWire_ack())return;
OneWire_write(0xcc);//跳过ROM匹配
OneWire_write(0x55);//发出启动转换命令
以下是程序:
#include""
#include""
unsignedchara_DS2431[8];
//codebylyxandRyanHsiung
#
#
#
voiddelay_us(unsignedchartime)
{//delayms=1usof20Mhzosc//不准确1us
while(time--);
OneWire_write(data);//data
a_DS2431[0]=OneWire_read();
a_DS2431[1]=OneWire_read();
crccheck(a_DS2431,2);
*/
}
uint8DS2431_ReadOneByte(uint16address)
{
if(OneWire_ack())return;
OneWire_write(0x20);//ta1
OneWire_write(0x00);//ta2
OneWire_write(data);//data
a_DS2431[0]=OneWire_read();
a_DS2431[1]=OneWire_read();
crccheck(a_DS2431,2);
byte=0x00;
for(i=0;i<8;i++)
{
DS_DQ_TRISD=0;//RE2输出
DS_DQ_OUT=0;//输出LOW
delay_us(1);//delay_us(3);
DS_DQ_OUT=1;//输出HIGH
DS_DQ_TRISD=1;//RE2输入
delay_us(5);//delay_us(10);
{
data=*p_data;
p_data++;
OneWire_write(data);
}
delay_us(25);
if(OneWire_ack())return;
OneWire_write(0xcc);//跳过ROM匹配
OneWire_write(0xAA);//复制暂存器数据到存储器中
temp8=OneWire_read();
}
/*********************************************
从DS1820读1字节数据
*********************************************/
unsignedcharOneWire_read(void)
{
unsignedchari,byte,temp;
*/
}
uint8DS2431_WriteString(uint16address,uint8*p_data)
{
uint8tem8h,tem8l,i,data,errors,temp8;
tem8h=(unsignedchar)(address>>=4);
tem8l=(unsignedchar)address;
delay_us(100);//等待写时序结束510us
if(OneWire_read()!=0xAA)
return0;
return1;
/*
unsignedchari=1;
if(OneWire_ack())return;
OneWire_write(0xcc);//跳过ROM匹配
OneWire_write(0x0f);//writescrachpad
OneWire_write(tem8l);//发送地址低位
OneWire_write(tem8h);//发送地址高位
OneWire_write(errors);
for(i=0;i<50;i++)
delay_us(100);//等待写时序结束510us
if(OneWire_read()!=0xAA)
return0;
if(OneWire_ack())return;
OneWire_write(0xcc);//跳过ROM匹配
OneWire_write(0x0f);//发送写暂存器命令
OneWire_write(tem8l);//发送地址低位
OneWire_write(tem8h);//发送地址高位
for(i=0;i<8;i++)
}
/*********************************************
CRC校验
*********************************************/
unsignedcharcrccheck(unsignedchar*p,unsignedcharlen)
OneWire_write(tem8h);//发送地址高位
for(i=0;i<8;i++)
{
data=*p_data;
p_data++;
OneWire_write(data);
//ClrWDT();
}
delay_us(25);
if(OneWire_ack())return;
OneWire_write(0xcc);//跳过ROM匹配
相关文档
最新文档