⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20new.c.bak

📁 压缩包中包括多个常用的汇编
💻 BAK
字号:
/****************************************************************************/
/*                                                                          */
/*               Copyright (c) 2005, 老树工作室                             */
/*                   All rights reserved.                                   */
/*                                                                          */
/*      http://www.saintone.net      Email:hxm0902@163.com                  */
/*      QQ:112431149                 Tel:010-62966630                       */
/*                                                                          */
/****************************************************************************/
/****************************************************************************/
/* 文件名:ds18b20.c                                                        */
/* 版  本:Version 1.0                                                      */
/* 描  述:单总线温度计ds18b20驱动代码                                      */
/* 作  者:spot                                                             */
/* 函  数:                                                                 */
/*         delay_18b20                                                      */
/*         ow_reset                                                         */
/*         read_bit                                                         */
/*         write_bit                                                        */
/*         read_byte                                                        */
/*         write_byte                                                       */
/*         get_temperature                                                  */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-06-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/

#include <reg52.h>
#include <absacc.h>
#include <intrins.h>

#define ERR 0xffff;

typedef unsigned char u_char;
typedef unsigned int  u_int;

sbit DQ = P0^3;

/* 函数声明 */
bit ow_reset(void);              /* 初始化DS18B20子程序  */
bit read_bit(void);              /* 从DS18B20读出1位     */
void write_bit(u_char bitval);   /* 向DS18B20写入1位     */
u_char read_byte(void);          /* 从DS18B20读出1个字节 */
void write_byte(u_char val);     /* 向DS18B20写入1个字节 */
u_int get_temperature(void);     /* 读取温度子程序       */
/* 声明结束 */

/* 延时子程序           */
void delay_18b20 (u_int us)
{
    while (us--);
}

/* 初始化DS18B20子程序  */
bit ow_reset(void)
{
    bit presence = 0;
    DQ = 1;
    delay_18b20(8); /*add 20050730*/
    DQ = 0;
    delay_18b20(80);                    /* 保持低电平480μs以上 */
    DQ = 1;
    delay_18b20(13);                    /* 等待DS18B20响应     */

    presence = DQ;
    delay_18b20(8); /*add 20050730*/
    return presence;
}

/* 从DS18B20读出1位     */
bit read_bit(void)
{
    DQ = 0;
    delay_18b20(0);                     /* 保持低电平1us以上    */
    DQ = 1;

    if(DQ)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

/* 向DS18B20写入1位     */
void write_bit(u_char bitval)
{
    DQ = 0;
    delay_18b20(0);                     /* 主机在大于1us小于15us之内写数据 */
    if(bitval)
    {
        DQ = 1;
    }
    delay_18b20(9);                     /* DS18B20在15us到60us内采样数据  */

    DQ = 1;
}

/* 从DS18B20读出1个字节 */
u_char read_byte(void)
{
    u_char i;
    u_char value = 0;

    for (i = 0; i < 8; i++)
    {
        if(read_bit())
        {
            value|= (0x01<<i);
        }
        delay_18b20(10);                /*  读时序至少60us        */
    }
    return(value);
}

/* 向DS18B20写入1个字节 */
void write_byte(u_char val)
{
    u_char i;
    u_char temp;

    for (i = 0; i < 8; i++)             /* 从LSB开始写入,每次写1位 */
    {
        temp = val>>i;
        temp &= 0x01;
        write_bit(temp);
    }
}

/* 读取温度子程序       */
u_int get_temperature(void)
{
    u_char tempture_msb;
    u_char tempture_lsb;
    u_int temperature;
    if(ow_reset())                      /* 发送复位信号            */
    {
        return ERR;
    }
    else
    {
    	write_byte(0xcc); 	        /* 跳过ROM                 */
    	write_byte(0x44);	        /* 发送转换温度命令        */

    	ow_reset();
    	write_byte(0xcc);
    	write_byte(0xBE);	        /* 发送读memory命令        */
    	tempture_lsb=read_byte();
    	tempture_msb=read_byte();
    	ow_reset();
    	temperature=(tempture_msb << 8) | tempture_lsb;

    	return temperature;
    }
}

main()
{
    u_int temperature = 0;
    while(1)
    {
        temperature = get_temperature();
        delay_18b20(10000);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -