导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→请用过18B20的帮忙看看,究竟怎么了???为什么读出来的数[deltta]

 *第15579篇: 请用过18B20的帮忙看看,究竟怎么了???为什么读出来的数据始终是16??

  
楼 主:deltta 2003年8月18日11:15
 请用过18B20的帮忙看看,究竟怎么了???为什么读出来的数据始终是16??
//----***** 以下是 1820  的控制操作*****

//延时
void delay(int useconds)
{
  int s;
  for(s=0;s  <useconds;s++) ;
}

//复位
unsigned char ow_reset(void)
{
  unsigned char presence;
  //do {
   DQ = 0;           //pull DQ line low
   delay(29);        // leave it low for 480us
   DQ = 1;           // allow line to return high
   delay(3);         // wait for presence
   presence = DQ;    // get presence signal
   delay(25);        // wait for end of timeslot
  
   if(presence==0)     JDQ= 1;

   //while(presence==0);
   return(presence); // presence signal returned
   
}     // 0=presence, 1 = no part

//从 1-wire 总线上读取一个
unsigned char read_bit(void)
{
  unsigned char i;
  
    DQ = 0;   // pull DQ low to start timeslot
    DQ = 1;   // then return high
    for (i=0; i  <3; i++); 
    
  return(DQ);
}

//向 1-WIRE 总线上写一个
void write_bit(char bitval)
{

    DQ = 0;   // pull DQ low to start timeslot
    if(bitval==1) DQ = 1;
    delay(5);   // hold value for remainder of timeslot
    DQ = 1;
    
}
//从 1-wire 总线上读取一个
unsigned char read_byte(void)
{
 unsigned char i;
 unsigned char value = 0;
 
 for(i=0;i  <8;i++)
 {
  if(read_bit())  value|=0x01  <  <i;  //reads byte in,one byte at a time and then shift it left
  
  delay(6);      //wait for rest of timeslot
 
 }

 return(value);
}

//向 1-WIRE 总线上写一个
void write_byte(char val)
{
 unsigned char i;
 unsigned char temp;
 
 for(i=0;i  <8;i++)  //writes byte,one bit at a time
 {
  temp = val>  >  i;  //shift val right 'i'spaces
  temp &=0x01;  //copy that bit to temp
  write_bit(temp); //write bit temp into
 }
 delay(5);

}

//读取温度
void Read_Temperature(void )
{

char temp_lsb,temp_msb;
//char k;
//char get[10];

  //ow_reset();
  
  if(!ow_reset()){
    write_byte(0xCC); // Skip ROM
    write_byte(0x4e); // 写方式
    write_byte(0x64);
    write_byte(0x00);
    write_byte(0x1f); // 设置9位转换
    write_byte(0x44); // Start Conversion
  
    delay(6);
    write_byte(0xCC); //Skip ROM
    write_byte(0xBE); // Read Scratch Pad
 
     temp_lsb=read_byte();
    temp_msb=read_byte();
    ow_reset();
    write_byte(0xCC); //Skip ROM
    write_byte(0x44); // Start Conversion
  
  //取出转换结果,保留整数
   temp=((temp_msb  <  <4)|(temp_lsb>  >  4))&0x7f;
  //将转换结果写入显存
     led[2]=temp/100;
     led[1]=(temp%100)/10;
     led[0]=temp%10;                     //始终是:16

   }

// return(temper);
}


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:大家帮我看看

[下一篇主题]:请用过的18b20的帮我看看,好吗?