我的时序主要是参考ds18b20写的,看到大多数的书上说单总线的时序都是一样的,如果有时间帮忙看一下呀,谢谢!
#include
#include //用的at89s52
#define uint unsigned int
#define uchar unsigned char
uchar SerialNum[8];
sbit DQ=P0^0;//DQ代表端口,接ds1990a
//延时
//延迟时间大约为(usecond*12+20)us
void delay(uint usecond)
{uchar i;
for(i=0;i
}
//复位
uchar ow_reset(void)
{
uchar presence;
DQ=0;//拉低DQ总线开始复位
delay(36);//保持DQ低480us
DQ=1;//释放DQ
delay(5);//等待芯片应答信号
presence=DQ;//获得应答信号
delay(33);//延时以完成整个时序
return(presence);//返回应答信号,有芯片应答presence=0,无应答presence=1
}
//从1-wire总线上读取一位
uchar read_bit(void)
{
uchar i;
DQ=0;//将总线DQ拉低开始读时序
_nop_();//延时2us
_nop_();
DQ=1;//释放总线
for(i=0;i<3;i++);//延时15us后再读数据
return(DQ);//返回数据值
}
//从1-wire上读取一个字节
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=0;i<8;i++)
{
if(read_bit())
value|=0x01<
delay(6);//延时80us,完成此次读时序,之后读下一位
}
return(value);
}
//向1-wire总线上写一位数据
void write_bit(char bitval)
{
DQ=0;//拉低DQ开始一个写时序
if(bitval==1)
DQ=1;//若写1,则将总线置高
delay(6);//延时80us
DQ=1;//释放DQ总线
}
//向1-wire上写一字节数据
void write(char val)
{uchar i;
uchar temp;
for(i=0;i<8;i++)//写一字节数据,一次写一位
{
temp=val>>i;//移位操作,将在本次写的位移到最低位
temp&=0x01;
write_byte(temp);//向总线写该位
}
}
//ds1990a的crc8校验程序
uchar crc8r(uchar crcbyte) {
uchar i,crc;
crc = 0;
for(i = 0; i < 8; i++) {
if(((crc ^ crcbyte) & 0x01) == 0) crc >>= 1;
else {
crc ^= 0x18; //0x18;//CRC=X8+X5+X4+1
crc >>= 1;
crc |= 0x80;
}
crcbyte >>= 1;
}
return crc;
}
void main() {
uint i;
uint j;
InitUart(); //初始化串口
ow_reset(); //初始化单总线
while(!DQ){ 如果应答信号为0,则开始读数据
write_byte(0x33);
ow_reset();
for(i=0;i<8;i++){
SerialNum=read_byte();
delay(100);
}
crc8r(8); //crc校验
}
while(1){ //将序列号传到上位机
for(i=0;i<8;i++){
TI=0;
SBUF=SerialNum;
while(!TI);
}
}
}
|