-
DS18B20 请各位大佬帮忙看一下哪里不正确,
void delay_us(uint count)//进入一次该函数需要11.95us { while(count--); //执行一次cout-- 需要6.5us } //即delay_us(2)的延时时间为6.5*2+11.95 void delay_ms(uint y) { uint x; for(;y>0;y--) { for(x=110;x>0;x--); } } uchar DS18B20Init(void) //send reset and initialization command { uchar i=0; DS=0; delay_us(82);//复位,至少延时480us,挂在总线上的DS18B20将被复位 DS=1;//释放总线, i=0; while(DS)//延时等待82us { delay_ms(1); i++; if(i>5) { return 0;//初始化失败 } } return 1;//初始化成功 } void writebyte(uchar byte) //write a byte to ds18b20 { uchar j; for(j=0;j<8;j++) { DS=0;//每次写入一个数据之前需要把总线拉低 _nop_();//15us内要释放总线,产生写时序 DS=byte&0x01;//写入字节从最低位开始 delay_us(10);//延时不少于60us,不可以大于120us DS=1;//释放总线,准备下一次数据写入 byte>>=1; } } uchar readbyte(void) //读字节 { uchar i,j,byte; for(i=0;i<8;i++) { DS=0; _nop_(); _nop_();//延时至少1us,产生读时序 DS=1; delay_us(1);//释放总线 j=DS;//数据采集, delay_us(10);//延时不少于60us byte=(j<<7)|(byte>>1); delay_us(6); } return byte; } void main() { int i,temp; uchar L,H; while(1) { DS18B20Init();//初始化 delay_ms(1); writebyte(0xcc); // address all drivers on bus,发送跳跃ROM指令 writebyte(0x44); // initiates a single temperature conversion,发送温度转换指令 DS18B20Init();//主机和DS18B20做任何通讯前需要对其初始化 delay_ms(1); writebyte(0xcc);//发送跳跃ROM writebyte(0xbe);//读取DS18B20暂存器值 L=readbyte();//读低俗暂存器的值 H=readbyte();//读高速暂存器的值 i=H; i<<=8;//H移到高8位 i|=L;//L写入i的低字节 if(i<0) { i=i-1; temp=~i; } else { temp=i; } i=temp*0.0625*10000 ;//浮点型数据转换 Display(i); } }
1035浏览量 3回复量 关注量