📄 ds18b20.c.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 + -