温度传感器DS18B20的读写一个字节的子程序

全部回答2
默认 最新
  • /***********ds18b20读一个字节**************/unsignedcharReadOneChar(void){uchari=0;//定义i用于循环uchardat=0;//读取的8位数据for(i=8;i>0;i--)//8次循环{DQ=0;//拉低DQ总线开始读时序dat>>=1;//dat左移一位DQ=1;//释放DQ总线if(DQ)//如果DQ=1,执dat|=0x80;(0x80即第7位为1,如果DQ为1,即读取的数据为1,将dat的第7为置1,然后dat>>=1,循环8次结束,dat即为读取的数据)//DQ=0,就跳过dat|=0x80;delay_18B20(4);//延时以完成此次读时序,之后再读下一数据}return(dat);//返回读取的dat}DQ=dat&0x01;这句语句是错误的。DQ为位变量,而dat为unsignedchar如果真要这么写的话,应该是这样:DQ=(bit)dat&0x01;把我写的给你做个参考吧:externuchar8sig;//sig判定温度符号/*延时函数*/voiddelay(intus)//DELAY-11.0592MHZ调用程序大约为24us,每次循环为16us{ints;for(s=0;s<us;s++);}voiddelayms(intz)//z为毫秒数{intx,y;for(x=z;x>0;x--)for(y=125;y>0;y--);}/*复位程序*/unsignedcharreset(void){uchar8presence;DQ=0;//拉低总线。当总线停留在低电平480us-960us,总线上所以器件都将被复位delay(30);//保持低电平504usDQ=1;//释放总线,让其恢复高电平delay(3);//等待芯片应答信号presence=DQ;//获取应答信号delay(25);//延时以完成整个时序return(presence);//返回应答信号。有芯片应答返回0,否则返回1。}/*写一位数据*/voidwrite_bit(charbitval){DQ=0;//拉低DQ总线,开始时序if(bitval==1)//如果写入的为1,则返回高电平DQ=1;delay(5);//延时104us,以完成整个时序DQ=1;}/*写一字节数据*/voidwrite_byte(charval){uchar8i,temp;for(i=0;i<8;i++)//写入一个字节的数据,一个时序中写一次{temp=val>>i;//右移i位temp&=0x01;//复制那位数据到tempwrite_bit(temp);//调用write_bit()}delay(5);//延时104us以完成此次时序,之后再写下一数据}/*读一位数据*/uchar8read_bit(void){uchar8i;DQ=0;//拉低DQ,开始读时序DQ=1;//释放DQ总线for(i=0;i<3;i++);//从时序开始延时15usreturn(DQ);//返回DQ值}/*读一字节数据*/uchar8read_byte(void){uchar8i,value=0;for(i=0;i<8;i++){if(read_bit())//读一字节数据,一个时序中读一次,并作移位处理value|=0x01<<i;delay(6);//延时以完成此次读时序,之后再读下一数据}return(value);}/*温度转化*/voidtmconvert(void){reset();//复位delay(1);write_byte(0xcc);//仅一个DS18b20,跳过ROMwrite_byte(0x44);//温度变换}/*读取温度*/longgettm(void){uchar8LSB=0,MSB=0;//用于存储读取的温度longtemp;reset();//复位write_byte(0xcc);//写指令,跳过ROM,仅一个DS18b20write_byte(0xbe);//写指令,读暂存存储器LSB=read_byte();//读LSBMSB=read_byte();//读MSBsig=(MSB>>4==0X0F);if(sig)//判断符号位是否为负值,是负值了,转去处理{LSB=~LSB;//温度处理MSB=~MSB;LSB=LSB+1;}temp=MSB*256+LSB;//十六进制转换为10进制temp=temp*100/16;//12位精度,最小分辨率为0.0625°Creturntemp;//获得0.01°C的精度并返回}
    0 点赞
  • /***********ds18b20读一个字节**************/ unsigned char ReadOneChar(void){uchar i=0; //定义i用于循环uchar dat = 0; //读取的8位数据for (i=8;i>0;i--) //8次循环{DQ = 0; //拉低DQ总线开始读时序dat>>=1; //dat左移一位DQ = 1; //释放DQ总线 if(DQ) //如果DQ=1,执dat|=0x80;(0x80即第7位为1,如果DQ为1,即读取的数据为1,将dat的第7为置1,然后dat>>=1,循环8次结束,dat即为读取的数据) //DQ=0,就跳过 dat|=0x80; delay_18B20(4); // 延时以完成此次读时 序,之后再读下一数据 } return(dat); //返回读取的dat}DQ = dat&0x01;这句语句是错误的。DQ为位变量,而dat为 unsigned char如果真要这么写的话,应该是这样 :DQ = (bit)dat&0x01;把我写的给你做个参考吧:extern uchar8 sig; //sig判定温度符号/*延时函数*/void delay (int us) //DELAY-11.0592MHZ 调用程序大约为24us,每次循环为16us{ int s; for(s=0;s<us;s++);}void delayms(int z) //z为毫秒数{ int x,y; for(x=z;x>0;x--) for(y=125;y>0;y--);}/*复位程序*/unsigned char reset(void){ uchar8 presence; DQ=0; //拉低总线。当总线停留在低电平480us-960us ,总线上所以器件都将被复位 delay(30); //保持低电平504us DQ=1; //释放总线,让其恢复高电平 delay(3); //等待芯片应答信号 presence=DQ; //获取应答信号 delay(25); //延时以完成整个时序 return(presence); //返回应答信号。有芯片应答返回0,否则返回1。}/*写一位数据*/void write_bit(char bitval){ DQ=0; //拉低DQ总线,开始时序 if(bitval==1) //如果写入的为1,则返回高电平 DQ=1; delay(5); //延时104us,以完成整个时序 DQ=1; }/*写一字节数据*/void write_byte(char val){ uchar8 i,temp; for (i=0;i<8;i++) //写入一个字节的数据,一个时序中写一次 { temp=val>>i; //右移i位 temp&=0x01; //复制那位数据到temp write_bit(temp); //调用write_bit() } delay(5); //延时104us以完成此次时序,之后再写下一数据}/*读一位数据*/uchar8 read_bit(void){ uchar8 i; DQ=0; //拉低DQ,开始读时序 DQ=1; //释放DQ总线 for(i=0;i<3;i++); //从时序开始延时15us return(DQ); //返回DQ值}/*读一字节数据*/uchar8 read_byte(void){ uchar8 i,value=0; for(i=0;i<8;i++) { if(read_bit()) //读一字节数据,一个时序中读一次,并作移位处理 value|=0x01<<i; delay(6); //延时以完成此次读时序,之后再读下一数据 } return(value);}/*温度转化*/void tmconvert(void){ reset(); //复位 delay(1); write_byte(0xcc); //仅一个DS18b20 ,跳过ROM write_byte(0x44); //温度变换}/*读取温度*/long gettm(void){ uchar8 LSB=0,MSB=0; //用于存储读取的温度 long temp; reset(); //复位 write_byte(0xcc); //写指令,跳过ROM,仅一个DS18b20 write_byte(0xbe); //写指令,读暂存存储器 LSB = read_byte(); //读LSB MSB = read_byte(); //读MSB sig=(MSB>>4==0X0F); if(sig) //判断符号位是否为负值,是负值了,转去处理 { LSB=~LSB; //温度处理 MSB=~MSB; LSB=LSB+1; } temp=MSB*256+LSB; //十六进制转换为10进制 temp=temp*100/16; //12位精度,最小分辨率为0.0625°C return temp; //获得0.01°C 的精度并返回}
    0 点赞

没有更多内容了

返回顶部
产品求购 求购