📄 ds18b20.h
字号:
/*************************************************************************
ds18b20头文件
M16 内部8M
*************************************************************************/
#include "delay.h"
#define BIT(a) (1<<a)
#define CLR_DIR_1WIRE DDRC&=~BIT(0) //只要修改这里的参数就可以了!呵呵!
#define SET_DIR_1WIRE DDRC|=BIT(0) //里面什么都不用该!
#define CLR_OP_1WIRE PORTC&=~BIT(0)
#define SET_OP_1WIRE PORTC|=BIT(0)
#define CHECK_IP_1WIRE (PINC & 0x01) //检测
//unsigned char wmh,wml;
#define ALARM_TEMP 0x14 //警报温度
//unsigned char temp_int ;// 整数部分
//unsigned char temp_point ;// 整数部分
/********************************************************
DS18B20初始化
*********************************************************/
void init_1820()
{
SET_DIR_1WIRE; //设置PC2 为输出
SET_OP_1WIRE;
CLR_OP_1WIRE;
delay_nus(480); //480us以上
SET_OP_1WIRE;
CLR_DIR_1WIRE;
delay_nus(20); //15~60us
while(CHECK_IP_1WIRE);
SET_DIR_1WIRE;
SET_OP_1WIRE;
delay_nus(140); //60~240us
}
/********************************************************
向DS18B20写入一个字节
********************************************************/
void write_1820(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_nus(40); //15~60us
SET_OP_1WIRE;
}
SET_OP_1WIRE;
}
/********************************************************
从DS18B20读出一个字节
********************************************************/
unsigned char read_1820()
{
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_nus(50); //60~120us
SET_DIR_1WIRE;
}
return (temp);
}
/********************************************************
读取温度值
返回一个字节
********************************************************/
unsigned char gettemp()
{
char temh,teml;
//float temper;
init_1820(); //复位18b20
write_1820(0xcc); // 发出转换命令
write_1820(0x44);
// delay_nms(800); //不延时也好使,不知道怎么回事!
init_1820();
write_1820(0xcc); //发出读命令
write_1820(0xbe);
teml=read_1820(); //读数据
temh=read_1820();
//temp_int= (( temh << 4 )& 0x70 )|(( teml >> 4 )& 0x0f );
//temper = (teml&0xf)*0.0625;
//temp_point=(unsigned char)temper*100;
return (( temh << 4 )& 0x70 )|(( teml >> 4 )& 0x0f );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -