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

📄 ds18b20.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-07-15     Creat Inital version. (Version 1.0)        */
/****************************************************************************/

#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include "../includes/types.h"

#define ERR 0xffff;

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 display_temperature(u_int current_tempreature);/* 在数码管上显示当前温度 */
extern void load_number(u_char number, bit dp);
extern void send_latch_clock(void);
extern void clear_led(void);
/* 声明结束 */

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

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

    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(9);         /*  读时序至少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 = 0;
    if(ow_reset())               /* 发送复位信号     */
    {
        return ERR;
    }
    else
    {
        delay_18b20(20);
    	write_byte(0xcc); 	 /* 跳过ROM          */
    	write_byte(0x44);	 /* 发送转换温度命令 */

    	ow_reset();
        delay_18b20(14);
    	write_byte(0xcc);
    	write_byte(0xBE);	 /* 发送读memory命令 */

    	tempture_lsb =read_byte();
    	tempture_msb =read_byte();
    	ow_reset();
    	temperature |= tempture_msb;
    	temperature <<= 8;
    	temperature |= tempture_lsb;

    	return temperature;
    }
}

void display_temperature(u_int current_temperature)
{
    load_number( (current_temperature %10), 0);
    load_number( (current_temperature /10), 0);
    send_latch_clock();
}

main()
{
    u_int temperature = 0;
    float real_temp = 0;
    temperature = get_temperature();
    while(1)
    {
        temperature = get_temperature();
        if (temperature != 0xffff)
        {
            real_temp = temperature * 0.0625;
            clear_led();
            display_temperature(real_temp);
        }
        delay_18b20(10000);
    }
}

⌨️ 快捷键说明

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