4057|8

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

温度检测 DS18B20 ??/ [复制链接]

这个程序调了很久啦,不知道为啥读出来的L_temp 和H_temp都是FF、FF
要疯啦  ,呜呜呜.....
有哪位朋友做过相关的东西,帮我看看吧 ,不胜感激啊
#include     //SFRdeclarations
#include
#include     // CH452常量定义

sbit LOAD=P1^4;          //CH452
sbit DCLK=P1^5;
sbit DIN=P1^6;
sbit DOUT=P1^7;

sbit DQ=P2^1;

void PORT_Init (void);

void Init18B20(void);                   //初始化
void Write18B20(unsigned char ch);      //写数据
unsigned char Read18B20(void);          //读数据  
void Temperature_Conversion(void);
void Delay15(unsigned int n);   
void Delay10ms(unsigned int delay_num);

void CT_Date(int temp);

//sbit  a=P1^5;            // 串行数据时钟上升延激活
//sbit  out=P1^4;
//sbit  disp=P1^6;
          

unsigned int   disp1;
unsigned int   disp2;
unsigned int   dot=0;
unsigned int   flag=0;

//bit resetpulse(void) ;

unsigned char bdata out_byte;  /*输出字节到U20*/
sbit OUT_BIT0=out_byte^0;      /*输出到U20字节的最高位*/
//#define SYSCLK          24500000       // Internal oscillator frequency in Hz
//void PORT_Init (void);
void Ch452_Init(void);          //数码管驱动与键盘控制芯片CH452初始化
void write_to_ch452(unsigned char high_byte,unsigned char low_byte);
void main (void)
{        //PCA0MD  =  0x00;     //看门狗禁止,以方便调试
          //int l_temp;
               
         unsigned char L_temp,H_temp;
         unsigned int  Temperature;
         //TMOD=0x01;
         //TH0=(65536-4000)/256;
         //TL0=(65536-4000)%256;
         //ET0=1;
        // EA=1;
        PCA0MD &= ~0x40;   //看门狗的使用    // Disable Watchdog timer
   
          while(1)
       {
          PORT_Init ();                // 端口的定义
                       
          //unsigned int Temperature=0;

           Temperature_Conversion();

           Delay10ms(12);    //转换延时
         
           Init18B20();    //初始化

           Write18B20(0xcc);

           Write18B20(0xbe); //读取暂存器

           L_temp=Read18B20();     //读取LSB

           H_temp=Read18B20();    //读取MSB

           Temperature=H_temp;

           Temperature<<=8;

           Temperature|=L_temp;           //两字节合成一个整型变量。

                //l_temp=Read_Temperature;
           CT_Date(Temperature);
               //initADC();           //初始化ADC
               //ADCSTART ();         //启动ADC  采样数据
               //interruptADCINT();   // 对数据进行处理
           Ch452_Init();        //数码管显示
    }       
  }


void Write18B20(unsigned char ch)   //写时间片
{
unsigned char i;
unsigned char j;

for(i=0;i<8;i++)
{
if((ch & 0x01)==0)
{
DQ=0;
for(j=35;j>0;j--);
DQ=1;
}
else
{
DQ=0;
for(j=2;j>0;j--);
DQ=1;
for(j=33;j>0;j--);
}
ch=_cror_(ch,1);
}
}

unsigned char Read18B20(void)
{
unsigned char i;
unsigned char j;
unsigned char temp;

temp=0;
for(i=0;i<8;i++)
{
temp=_cror_(temp,1);
DQ=0;
_nop_();
_nop_();
DQ=1;
for(j=10;j>0;j--);
if(DQ==1)
{
temp=temp | 0x80;
}
else
{
temp=temp | 0x00;
}
for(j=200;j>0;j--);
}
return(temp);
}

void Temperature_Conversion(void)

{
    //bit fg;
    //fg=resetpulse();
    Init18B20();    //初始化
    Write18B20(0xcc); //跳过ROM读取序列号
    Write18B20(0x44); //启动温度转换


}

void Init18B20(void)
{
  bit flag;
  DQ=1;
  Delay15(1);
  DQ = 0;       //单片机将DQ拉低,发送复位脉冲
  Delay15(34);  //精确延时 480us~960us

  DQ = 1;       //拉高总线
  Delay15(4);   //精确延时 15us~60us

  Delay15(1);    //稍做延时后
  flag=DQ;       //读取DQ
  while(!flag)  //如果DQ=0则存在脉冲有效,初始化成功,如果DQ=1
  {
  Delay15(1);   //稍做延时后
  flag=DQ;      //重新读取DQ
  }
  DQ=1;
}

void Delay15(unsigned int n )
{  do{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_();
        n--;
  
       }while(n);
  }
void Delay10ms(unsigned int delay_num)
{
unsigned char i;
while(delay_num--)
{
  for(i=0;i<125;i++)
   {;}
}
}

void CT_Date(int temp)            //进制转换程序
{            
      int i,dec,disp3=0;
      
      if(temp&0x8000) flag=1;
      if(temp&0x01) dot=5;
      temp=temp>>1;
      for(i=1; i<8; i++)   
          {   
            dec=temp&0x01;
            disp3=disp3*2+dec;
                 temp=temp>>1;
            }

            disp1=disp3%10;
            disp2=disp3/10;               

}  

void Ch452_Init(void)
     {  write_to_ch452(0x02,0x01);                 //系统复位         
        write_to_ch452(0x04,0x03);          //开启显示、键盘
        write_to_ch452(0x05,0xf0);          //显示参数:
        write_to_ch452(0x08,dot);           //显示0.5摄氏度
        write_to_ch452(0x09,disp1);         //显示个位
        write_to_ch452(0x0A,disp2);         //显示十位
        write_to_ch452(0x0B,flag);          //显示符号位
        write_to_ch452(0x0C,0x04);          //系统参数:
        write_to_ch452(0x0D,0x05);          //显示参数:
          
          }
void PORT_Init (void)
{    XBR0 = 0x05;                        // Enable SMBus & UART pins
     XBR1 = 0x40;                        // Enable crossbar and weak pull-ups
}


   
void write_to_ch452(unsigned char high_byte,unsigned char low_byte)
     {   unsigned char i;
                     DIN=1;                     /*ch452 start*/
             DCLK=1;
                 LOAD=1;
                 DOUT=1;
                 out_byte=low_byte;        //先写低8位
         for(i=0;i<8;i++)
          {
                   DIN=OUT_BIT0;
                   DCLK=0;        //dclk对数据帧与帧进行控制
           DCLK=1;
                   out_byte=out_byte>>1;     //左
          }
                   out_byte=high_byte;      //写高4位
         for(i=0;i<4;i++)
          { DIN=OUT_BIT0;
                    DCLK=0;           
            DCLK=1;
                   out_byte=out_byte>>1;   //左移           


          }
                LOAD=0;         //一个十二位二进制数传送结束标志
                    LOAD=1;
         }

最新回复

UPUPUPUPUPUP  详情 回复 发表于 2010-7-1 12:50
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
学习
upupupupupupupupupupupupupupupupupup
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这种现象,估计是你的通信都没有成功,有可能是IO口配置的问题,也有可能是你的时序的问题,也有可能是你的18b20初始化的问题。。。。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

4
 
DOT EQU 30H
ZHENGSHU EQU 31H
FLAG1 EQU 38H ;是否检测到DS18B20的标志位
;定义温度数据
DIS_1 EQU 32H ;符号
DIS_2 EQU 33H ;十位
DIS_3 EQU 34H ;个位
DIS_4 EQU 35H ;小数点后第一位
DIS_5 EQU 36H ;小数点后第二位
WDDATA BIT P3.7 ;定义DS18B20的数据脚为P2.2端口

ORG 0000H
LJMP QISHI




ORG 0030H
QISHI:
CLR EA ;关闭总中断
LCALL BTVF
;-------------------------
; 主程序
;-------------------------
MAIN:
CLR P3.4
SETB P3.5
MOV A,#00H
MOV 76H,A
LCALL INIT_1820 ;调用复位DS18B20子程序
MAIN1:
LCALL GET_TEMPER;调用读温度子程序
LCALL FORMULA ;通过公式计算,小数点后显示两位
LCALL BCD

LCALL CMP1

LCALL DISPLAY ;调用串口显示子程序
LCALL DELAY500 ;延时0.5秒
LCALL DELAY500 ;延时0.5秒
LCALL DELAY500 ;延时0.5秒
AJMP MAIN1

;-------------------------
; DS18B20复位初始化程序
;-------------------------
INIT_1820:
SETB WDDATA
NOP
CLR WDDATA
;主机发出延时540微秒的复位低脉冲
MOV R0,#36
LCALL DELAY
SETB WDDATA;然后拉高数据线
NOP
NOP
MOV R0,#36
TSR2:
JNB WDDATA,TSR3;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0,#06BH
TSR6:
DJNZ R0,TSR6 ;复位成功!时序要求延时一段时间
TSR7:
SETB WDDATA
RET
;-------------------
; 读出转换后的温度值
;-------------------
GET_TEMPER:
SETB WDDATA ; 定时入口
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2
RET ; 判断DS1820是否存在?若DS18B20不存在则返回
TSS2:
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820

MOV R0,#50 ;等待AD转换结束,12位的话750微秒.
LCALL DELAY
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200; 将读出的九个字节数据保存到60H-68H
RET

;----------------------------------
;写DS18B20的子程序(有具体的时序要求)
;----------------------------------
WRITE_1820:
MOV R2,#8 ;一共8位数据
CLR C
WR1:
CLR WDDATA
MOV R3,#6
DJNZ R3,$
RRC A
MOV WDDATA,C
MOV R3,#24
DJNZ R3,$
SETB WDDATA
NOP
DJNZ R2,WR1
SETB WDDATA
RET


;--------------------------------------------------
; 读DS18B20的程序,从DS18B20中读出九个字节的数据
;--------------------------------------------------
READ_18200:
MOV R4,#9
MOV R1,#60H ; 存入60H开始的九个单元
RE00:
MOV R2,#8
RE01:
CLR C
SETB WDDATA
NOP
NOP
CLR WDDATA
NOP
NOP
NOP
SETB WDDATA
MOV R3,#09
RE10:
DJNZ R3,RE10
MOV C,WDDATA
MOV R3,#23
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
INC R1
DJNZ R4,RE00
RET

;------------------------
;温度计算子程序
;------------------------
FORMULA: ; 按公式:T实际=(T整数-0.25)+( M每度-M剩余)/ M每度
;计算出实际温度,整数部分和小数部分分别存于ZHENGSHU单元和DOT单元
;将61H中的低4位移入60H中的高4位,得到温度的整数部分,并存于ZHENGSHU单元
MOV 29H,61H
MOV A,60H
MOV C,48H
RRC A
MOV C,49H
RRC A
MOV C,4AH
RRC A
MOV C,4BH
RRC A
MOV ZHENGSHU,A
; ( M每度-M剩余)/ M每度,小数值存于A中
MOV A,67h
SUBB A,66h
MOV B,#64H
MUL AB
MOV R4,B
MOV R5,A
MOV R7,67H
LCALL DIV457
MOV A,R3
;再减去0.25,实际应用中减去25
SUBB A,#19H
MOV DOT,A ;小数部分存于DOT中
MOV A,ZHENGSHU
SUBB A,#00H ;整数部分减去来自小数部分的借位
MOV ZHENGSHU,A
MOV C,4BH
JNC ZHENG ;是否为负数
CPL A
INC A
MOV DIS_1,#2DH ; 零度以下时,第一位显示"-"号
MOV ZHENGSHU,A
ZHENG:
MOV DIS_1,#2BH ; 零度以上时,第一位显示"+"号
RET


;------------------------
;双字节除以单字节子程序
;------------------------
DIV457: CLR C
MOV A,R4
SUBB A,R7
JC DV50
SETB OV ;商溢出
RET
DV50: MOV R6,#8 ;求平均值(R4R5/R7-→R3)
DV51: MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52: CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,R4 ;四舍五入
ADD A,R4
JC DV53
SUBB A,R7
JC DV54
DV53: INC R3
DV54: CLR OV
RET


;---------------------
;转换成非压缩的BCD码
;---------------------
BCD: MOV A,ZHENGSHU
MOV B,#0AH
DIV AB
ORL A,#00110000B ;转换成ASCII码
MOV DIS_2,A
MOV DIS_3,B
MOV A,DIS_3
ORL A,#00110000B ;转换成ASCII码
MOV DIS_3,A

MOV A,DOT
MOV B,#0AH
DIV AB
ORL A,#00110000B ;转换成ASCII码
MOV DIS_4,A
MOV DIS_5,B
MOV A,DIS_5
ORL A,#00110000B ;转换成ASCII码
MOV DIS_5,A
RET


;----------------------
;串口显示数据子程序
;----------------------
DISPLAY:

CLR TI
MOV A,DIS_1
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示+/-

CLR TI
MOV A,DIS_2
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示整数第一位

CLR TI
MOV A,DIS_3
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示整数第二位

CLR TI
MOV A,#2EH
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示小数点

CLR TI
MOV A,DIS_4
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示小数第一位

CLR TI
MOV A,DIS_5
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示小数第一位


CLR TI
MOV A,#0DH;换行
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示

CLR TI
MOV A,#0AH;换行
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示






CLR TI
MOV A,ZHENGSHU;换行
MOV SBUF,A
JNB TI,$ ;发送给PC,通过串口调试助手显示

RET





BTVF:
MOV SCON,#50H ;设置成串口1方式
MOV PCON,#00H
MOV TMOD,#20H ;波特率发生器T1工作在模式2上
MOV TH1,#0FDH ;预置初值(按照波特率9600BPS预置初值)
MOV TL1,#0FDH ;预置初值(按照波特率9600BPS预置初值)
SETB TR1 ;启动定时器T1
;以上完成串口9600通讯初始化设置
;----------------------
;延时子程序
;----------------------
;为保证DS18B20的严格I/O时序,需要做较精确的延时
;在DS18B20操作中,用到的延时有15 μs,90 μs,270 μs,540 μs
;因这些延时均为15 μs的整数倍,因此可编写一个DELAY15(n)函数
DELAY: ;11.05962M晶振
LOOP: MOV R1,#06H
LOOP1: DJNZ R1,LOOP1
DJNZ R0,LOOP
RET

;500毫秒延时子程序,占用R4、R5
DELAY500:MOV R4,#248
DA222:MOV R5,#248
DJNZ R5,$
DJNZ R4,DA222
RET
;+++++++++++++++++++++++++++++++++++++++++++++
CMP1:
MOV A,ZHENGSHU
CJNE A,#1AH,KK
NOP
KK:JNC NO

MOV A,ZHENGSHU
CJNE A,#12H,KK0
NOP
KK0:JNC OFF
LJMP NO
;__________________))))))))))))))))))))))))))))
;CMP:CLR C
;MOV A,ZHENGSHU
;SUBB A,#31
;JNC NO

;CLR C
;SUBB A,#26
;JNC OFF
;LJMP NO
  
OFF:LCALL OF
LJMP EN


NO: LCALL NO1
EN:NOP     
RET
;******************************************

NO1:LCALL DELAY500
    LCALL DELAY500
MOV A,76H
CJNE A,#00H,EN0
SETB P3.4
CLR TI
MOV A,#78;换行
MOV SBUF,A
JNB TI,$
MOV A,#01H
MOV 76H,A
CLR P3.5
LCALL DELAY500
LCALL DELAY500
LCALL DELAY500
LCALL DELAY500
SETB P3.5

EN0:
RET
;******************************
OF:MOV A,76H
  CJNE A,#01H,EN1
  CLR P3.4
  CLR TI
MOV A,#70;换行
MOV SBUF,A
JNB TI,$
MOV A,#00H
MOV 76H,A
CLR P3.5
LCALL DELAY500
LCALL DELAY500
LCALL DELAY500
LCALL DELAY500
SETB P3.5
EN1:

RET


END

 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
这个你也别急,18B20的时序不是那么好惹的,所以还得努力才是。。。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
严格参照手册时序调整

不难

当年只用了半天不到就OK

有示波器的话

更容易
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

7
 
我有做好的温度程序,是数码管显示温度
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit ds=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;
uint temp;
float f_temp;
uchar code a[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//带小数点的0到9编码
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef//不带小数点的0到9编码
};
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void dsreset(void)//DS18B20复位,初始化函数
{
        uint i;
        ds=0;
        i=103;
        while(i>0)i--;
        ds=1;
        i=4;
        while(i>0)i--;
}
bit tempreadbit(void)//读1位数据函数
{
        uint i;
        bit dat;
        ds=0;i++;
        ds=1;i++;i++;
        dat=ds;
        i=8;while(i>0)i--;
        return(dat);
}
uchar tempread(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{j=tempreadbit();
  dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tempwritebyte(uchar dat)//向DS18B20写一个字节数据函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{testb=dat&0x01;
  dat=dat>>1;
  if(testb)
   {ds=0;i++;i++;
   ds=1;i=8;while(i>0)i--;
   }
  else
   {ds=0;i=8;while(i)i--;
    ds=1;i++;i++;
   }
}
}
void tempchange(void)//DS18B20开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uint get_temp()//读取寄存器中存储的温度数据
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05;
return temp;
}
void display(uchar num,uchar dat)//数据显示程序
{
uchar i;
dula=0;
P0=a[dat];
dula=1;
dula=0;
wela=0;
i=0xff;
i=i&(~((0x01)<<(num)));
P0=i;
wela=1;wela=0;
delay(1);
}
void dis_temp(uint t)
{
uchar i;
i=t/100;
display(0,i);
i=t%100/10;
display(1,i+10);
i=t%100/10;
display(2,i);
}
void init_com(void)//串口初始化程序
{
TMOD=0X20;
PCON=0X00;
SCON=0X50;
TH1=0XFD;
TL1=0XFD;
TR1=1;
}
void comm(char*parr)//串口数据发送程序
{
do {
     SBUF=*parr++;
     while(!TI);
     TI=0;
   }while(*parr);
}
void main()
{
uchar buff[4],i;
dula=0;wela=0;
init_com();
        while(1)
        {
                tempchange();
                for(i=10;i>0;i--)
                 {
                  dis_temp(get_temp());
                 }
                sprintf(buff,"%f",f_temp);
                for(i=10;i>0;i--)
                {
                dis_temp(get_temp());
                }
                comm(buff);
                for(i=10;i>0;i--)
                {
                dis_temp(get_temp());
                }
   }
}
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
msp430的DS18B20程序。修改下就可以用了
#include
typedef unsigned char uchar;
typedef unsigned int  uint;

#define DQ1 P1OUT |= BIT6
#define DQ0 P1OUT &= ~BIT6
#define DQ_in   P1DIR &= ~BIT6
#define DQ_out  P1DIR |= BIT6
#define DQ_val  (P1IN & BIT6)

/*******************************************
函数名称:DelayNus
功    能:实现N个微秒的延时
参    数:n--延时长度
返回值  :无
说明    :定时器A的计数时钟是1MHz,CPU主频8MHz
          所以通过定时器延时能够得到极为精确的
          us级延时
********************************************/
void DelayNus(uint n)
{
    CCR0 = n;
    TACTL |= MC_1;           //增计数到CCR0
    while(!(TACTL & BIT0));   //等待
    TACTL &= ~MC_1;          //停止计数
    TACTL &= ~BIT0;          //清除中断标志
}
/*******************************************
函数名称:Init_18B20
功    能:对DS18B20进行复位操作
参    数:无
返回值  :初始化状态标志:1--失败,0--成功
********************************************/
uchar Init_18B20(void)
{
    uchar Error;
   
    DQ_out;
    _DINT();
    DQ0;
    DelayNus(500);
    DQ1;
    DelayNus(55);
    DQ_in;
    _NOP();
    if(DQ_val)      
    {
        Error = 1;          //初始化失败
    }
    else
    {
        Error = 0;          //初始化成功
    }
    DQ_out;
    DQ1;
    _EINT();
   
    DelayNus(400);
   
    return Error;
}
/*******************************************
函数名称:Write_18B20
功    能:向DS18B20写入一个字节的数据
参    数:wdata--写入的数据
返回值  :无
********************************************/
void Write_18B20(uchar wdata)
{
    uchar i;
   
    _DINT();
    for(i = 0; i < 8;i++)
    {
        DQ0;
        DelayNus(6);            //延时6us
        if(wdata & 0X01)    DQ1;
        else                DQ0;
        wdata >>= 1;
        DelayNus(50);           //延时50us
        DQ1;
        DelayNus(10);           //延时10us
    }
    _EINT();
}
/*******************************************
函数名称:Read_18B20
功    能:从DS18B20读取一个字节的数据
参    数:无
返回值  :读出的一个字节数据
********************************************/
uchar Read_18B20(void)
{
    uchar i;
    uchar temp = 0;
   
    _DINT();
    for(i = 0;i < 8;i++)
    {
        temp >>= 1;
        DQ0;
        DelayNus(6);            //延时6us
        DQ1;
        DelayNus(8);            //延时9us
        DQ_in;
        _NOP();
        if(DQ_val)   temp |= 0x80;
        DelayNus(45);           //延时45us
        DQ_out;
        DQ1;
        DelayNus(10);           //延时10us
    }
    _EINT();
   
    return  temp;
}

/*******************************************
函数名称:Skip
功    能:发送跳过读取产品ID号命令
参    数:无
返回值  :无
********************************************/
void Skip(void)
{
    Write_18B20(0xcc);
}
/*******************************************
函数名称:Convert
功    能:发送温度转换命令
参    数:无
返回值  :无
********************************************/
void Convert(void)
{
    Write_18B20(0x44);
}
/*******************************************
函数名称:Read_SP
功    能:发送读ScratchPad命令
参    数:无
返回值  :无
********************************************/
void Read_SP(void)
{
    Write_18B20(0xbe);
}
/*******************************************
函数名称:ReadTemp
功    能:从DS18B20的ScratchPad读取温度转换结果
参    数:无
返回值  :读取的温度数值
********************************************/
uint ReadTemp(void)
{
    uchar temp_low;
    uint  temp;
   
    temp_low = Read_18B20();      //读低位
    temp = Read_18B20();     //读高位
    temp = (temp<<8) | temp_low;
   
    return  temp;
}
/*******************************************
函数名称:ReadTemp
功    能:控制DS18B20完成一次温度转换
参    数:无
返回值  :测量的温度数值
********************************************/
uint Do1Convert(void)
{
    uchar i;
   
    do
    {
        i = Init_18B20();
    }
    while(i);
    Skip();
    Convert();
    for(i = 20;i > 0;i--)  
        DelayNus(60000); //延时800ms以上
    do
    {
        i = Init_18B20();
    }
    while(i);
    Skip();
    Read_SP();
    return ReadTemp();
}
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

9
 
UPUPUPUPUPUP
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表