您的位置:首页技术文栏单片机C51
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

DS18B20测量温度C语言程序1

[日期:2008-01-31 ] [来源:网络 作者:佚名] [字体: (投递新闻)
#include"reg51.h"
sfr WDTRST = 0xA6;
sbit DQ =P2^2;   //定义通信端口
//延时函数
void delay(unsigned int i)
{
     while(i--);
     WDTRST=0x1E;
     WDTRST=0xE1;//喂狗指令,晶振为12M时每16个毫秒需喂狗一次
}
//初始化函数
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;    //DQ复位
delay(8);  //稍做延时
DQ = 0;    //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1;    //拉高总线
delay(14);
x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
   dat|=0x80;
  delay(4);
}
return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
  DQ = 0;
  DQ = dat&0x01;
  delay(5);
  DQ = 1;
  dat>>=1;
}
delay(4);
}
//读取温度
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();   //读取温度值低位
b=ReadOneChar();   //读取温度值高位
a=a>>4;            //低位右移4位,舍弃小数部分
t=b<<4;            //高位左移4位,舍弃符号位
t=t|a;            
return(t);
}

作者:61.175.228.*       2007-6-16 10:15:35    |  发表评论    
 
2 回复:[分享]DS18B20测量温度C语言程序
发个汇编语言写的程序
  ORG 00H
MAIN:
   MOV 30H,#00H
   MOV 31H,#00H
   LCALL RESET   ;复位
   MOV A,#0CCH   ;跳过ROM
   LCALL WRITE
   MOV A,#44H    ;启动转换
   LCALL WRITE
   ;延时
    MOV R7,#100
D1: MOV R4,#20
D2: MOV R5,#248
    DJNZ R5,$
    DJNZ R4,D2
    DJNZ R7,D1

   LCALL RESET   ;复位
   MOV A,#0CCH   ;跳过ROM
   LCALL WRITE
   MOV A,#0BEH    ;启动转换
   LCALL WRITE
   LCALL READ
   MOV A,3DH
   MOV 30H,A
   LCALL READ
   MOV A,3DH
   MOV 31H,A
   ;------------------------
   MOV 36H,#00H
   MOV 37H,#00H
   MOV 38H,#00H
   MOV 39H,#00H
   ;------------------
   ANL A,#00000111B
    MOV 36H,A
    MOV A,30H
    SWAP A
    ANL A,#00001111B
    MOV 37H,A
    MOV A,36H
    SWAP A
    MOV 41H,A
    MOV A,37H
    ADD A,41H
    MOV 41H,A
    MOV B,#10
    DIV AB
    MOV 46H,A
    MOV 47H,B
  
  
  
    MOV A,30H
    ANL A,#00001111B
    MOV 39H,A
    JNB ACC.3,JIN
    MOV A,38H
    ADD A,#50H
    MOV 38H,A
JIN:MOV A,39H
    JNB ACC.2,JIN1
     MOV A,38H
    ADD A,#25H
    MOV 38H,A
JIN1:MOV A,39H
     JNB ACC.1,JIN2
      MOV A,38H
    ADD A,#12H
    MOV 38H,A
JIN2: MOV A,39H
     JNB ACC.0,JIN3
      MOV A,38H
    ADD A,#06H
    MOV 38H,A

JIN3:
  MOV A,38H
  SWAP A
  ANL A,#00001111B
  MOV 38H,A
  SJMP $
   ;数据处理
RESET:  NOP
L0:     CLR     P1.4

        MOV     R2,#200
L1:     NOP
        DJNZ    R2,L1
        SETB    p1.4
        MOV     R2,#30
L4:     DJNZ    R2,L4
        CLR     C
        ORL     C,p1.4
        JC      L3
        MOV     R6,#80
L5:     ORL     C,p1.4
        JC      L3
        DJNZ    R6,L5
        SJMP    L0
L3:     MOV     R2,#250
L2:     DJNZ    R2,L2
        RET


WRITE:  MOV     R3,#8
WR1:    SETB    p1.4
        MOV     R4,#8
        RRC     A
        CLR     p1.4
WR2:    DJNZ    R4,WR2
        MOV     p1.4,C
        MOV     R4,#20
WR3:    DJNZ    R4,WR3
        DJNZ    R3,WR1
        SETB    p1.4
        RET


READ:   MOV     R6,#8
RE1:    CLR     p1.4
        MOV     R4,#6
        NOP
        SETB    p1.4
RE2:    DJNZ    R4,RE2
        MOV     C,p1.4
        RRC     A
        MOV     R5,#30
RE3:    DJNZ    R5,RE3
        DJNZ    R6,RE1
        MOV     3DH,A
        SETB    p1.4
        RET

END

阅读:
录入:petta

推荐 】 【 打印
本文评论
      全部评论
    yasa 于18日评论道: 查看全部评论  
非常感谢
    candyliu 于09日评论道: 查看全部评论  
真是太感谢了,非常非常感谢
发表评论


点评: 字数
姓名:
赞助商广告