📄 ds18b20.c
字号:
//包含所需头文件
#include "Com_header.h"
#define CLR_DIR_1WIRE DDRD&=~BIT(7) // 设置总线为输出口
#define SET_DIR_1WIRE DDRD|=BIT(7) // 设置总线为输入口
#define CLR_OP_1WIRE PORTD&=~BIT(7) // 总线清0
#define SET_OP_1WIRE PORTD|=BIT(7) // 总线置1
#define CHECK_IP_1WIRE (PIND&BIT(7)) // 检测总线状态
unsigned int ms_count;
unsigned char wmh,wml;
unsigned long int WenDu;
//************************************************************************
//===初始化18B20===
//************************************************************************
void init_18b20()
{
SET_DIR_1WIRE; // 设置总线为输出
SET_OP_1WIRE;
CLR_OP_1WIRE;
Delay_us(250);
Delay_us(250); // 等待500us
SET_OP_1WIRE;
CLR_DIR_1WIRE;
Delay_us(20); // 15~60us
while(CHECK_IP_1WIRE);
SET_DIR_1WIRE;
SET_OP_1WIRE;
Delay_us(140); // 60~240us
}
//************************************************************************
//===写入一个字节到18B20===
//************************************************************************
void write_18b20(unsigned char x)
{
unsigned char m;
for(m=0;m<8;m++)
{
CLR_OP_1WIRE;
if(x&(1<<m)) // 先写低位数据
SET_OP_1WIRE;
else
{CLR_OP_1WIRE;}
Delay_us(40); // 15~60us
SET_OP_1WIRE;
}
// SET_OP_1WIRE;
}
//************************************************************************
//===从18B20读取一个字节===
//************************************************************************
unsigned char read_18b20()
{
unsigned char temp,k,n;
temp=0;
for(n=0;n<8;n++)
{
CLR_OP_1WIRE;
SET_OP_1WIRE;
CLR_DIR_1WIRE;
k=(CHECK_IP_1WIRE); // 从低位开始读数据
if(k)
temp|=(1<<n);
else
temp&=~(1<<n);
Delay_us(50); // 60~120us
SET_DIR_1WIRE;
}
return (temp);
}
//************************************************************************
//===读取温度值===
//************************************************************************
void gettemp() //读取温度值
{
unsigned char tem_h,tem_l;//,wm0,wm1,wm2,wm3;
init_18b20(); // 复位18b20
write_18b20(0xcc); // 跳过ROM命令
write_18b20(0x44); // 启动温度转换
//__delay_cycles(6400000);
Delay_ms(200); // 不延时也好使,不知道怎么回事!
Delay_ms(200); // 不延时也好使,不知道怎么回事!
Delay_ms(200); // 不延时也好使,不知道怎么回事!
Delay_ms(200); // 不延时也好使,不知道怎么回事!
init_18b20();
write_18b20(0xcc); // 发送跳过ROM命令
write_18b20(0xbe); // 发送读数据命令
tem_l=read_18b20(); // 读温度低字节
tem_h=read_18b20(); // 读温度高字节
WenDu=tem_h;
WenDu<<=8;
WenDu+=tem_l;
WenDu=6.25*WenDu;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -