ds18b20_usingtimer2.c
来自「avr基础程序大全」· C语言 代码 · 共 417 行
C
417 行
//包含所需头文件
#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 char Get_State=0;
unsigned long int WenDu;
//定时器T2初始化
void timer2_init(void)
{
TCCR2 = 0x00;//停止定时器
ASSR = 0x00;//异步时钟模式
TCNT2 = 0x00;//初始值
OCR2 = 0x00;//匹配值
TIMSK |= 0x40;//中断允许
TCCR2 = 0x07;//启动定时器
}
void Delay_Timer_512us(void)
{
TCNT2 = 0xF0;//初始值
TCCR2 = 0x06;//启动定时器
}
void Delay_Timer_32us(void)
{
TCNT2 = 0xFF;//初始值
TCCR2 = 0x06;//启动定时器
}
void Delay_Timer_40us(void)
{
TCNT2 = 0xD8;//初始值
TCCR2 = 0x02;//启动定时器
}
void Delay_Timer_128us(void)
{
TCNT2 = 0xFC;//初始值
TCCR2 = 0x06;//启动定时器
}
void Delay_Timer_64us(void)
{
TCNT2 = 0xFE;//初始值
TCCR2 = 0x06;//启动定时器
}
void Delay_Timer_32768us(void)
{
TCNT2 = 0x00;//初始值
TCCR2 = 0x07;//启动定时器
}
//************************************************************************
//===初始化18B20===
//************************************************************************
void DS18B20_init(void)
{
static unsigned char Init_State=0;
switch (Init_State)
{
case 0 :
{
SET_DIR_1WIRE; // 设置总线为输出
SET_OP_1WIRE;
CLR_OP_1WIRE;
Init_State=1;
Delay_Timer_512us();// 等待512us
break;
}
case 1:
{
SET_OP_1WIRE;
CLR_DIR_1WIRE;
Init_State=2;
Delay_Timer_32us(); // 15~60us
break;
}
case 2:
{
while(CHECK_IP_1WIRE);
SET_DIR_1WIRE;
SET_OP_1WIRE;
Init_State=3;
Delay_Timer_128us(); // 60~240us
break;
}
case 3:
{
Get_State++;
Init_State=0;
break;
}
default : break;
}
}
//************************************************************************
//===写入一个字节到18B20===
//************************************************************************
void Write_18B20(unsigned char Data)
{
static unsigned char Write_State=0;
switch (Write_State)
{
case 0 :
{
CLR_OP_1WIRE;
if(Data&(1<<0)) // 先写低位数据
SET_OP_1WIRE;
else
{CLR_OP_1WIRE;}
Write_State=1;
Delay_Timer_40us(); // 15~60us
break;
}
case 1 :
{
SET_OP_1WIRE;
CLR_OP_1WIRE;
if(Data&(1<<1)) // 先写低位数据
SET_OP_1WIRE;
else
{CLR_OP_1WIRE;}
Write_State=2;
Delay_Timer_40us(); // 15~60us
break;
}
case 2 :
{
SET_OP_1WIRE;
CLR_OP_1WIRE;
if(Data&(1<<2)) // 先写低位数据
SET_OP_1WIRE;
else
{CLR_OP_1WIRE;}
Write_State=3;
Delay_Timer_40us(); // 15~60us
break;
}
case 3 :
{
SET_OP_1WIRE;
CLR_OP_1WIRE;
if(Data&(1<<3)) // 先写低位数据
SET_OP_1WIRE;
else
{CLR_OP_1WIRE;}
Write_State=4;
Delay_Timer_40us(); // 15~60us
break;
}
case 4 :
{
SET_OP_1WIRE;
CLR_OP_1WIRE;
if(Data&(1<<4)) // 先写低位数据
SET_OP_1WIRE;
else
{CLR_OP_1WIRE;}
Write_State=5;
Delay_Timer_40us(); // 15~60us
break;
}
case 5 :
{
SET_OP_1WIRE;
CLR_OP_1WIRE;
if(Data&(1<<5)) // 先写低位数据
SET_OP_1WIRE;
else
{CLR_OP_1WIRE;}
Write_State=6;
Delay_Timer_40us(); // 15~60us
break;
}
case 6 :
{
SET_OP_1WIRE;
CLR_OP_1WIRE;
if(Data&(1<<6)) // 先写低位数据
SET_OP_1WIRE;
else
{CLR_OP_1WIRE;}
Write_State=7;
Delay_Timer_40us(); // 15~60us
break;
}
case 7 :
{
SET_OP_1WIRE;
CLR_OP_1WIRE;
if(Data&(1<<7)) // 先写低位数据
SET_OP_1WIRE;
else
{CLR_OP_1WIRE;}
Write_State=8;
Delay_Timer_40us(); // 15~60us
break;
}
case 8:
{
SET_OP_1WIRE;
Write_State=0;
Get_State++;
break;
}
default : break ;
}
}
//************************************************************************
//===从18B20读取一个字节===
//************************************************************************
unsigned char Read_18B20()
{
static unsigned char Read_State=0;
unsigned char k=0;
static unsigned char temp=0;
switch (Read_State)
{
case 0:
{
CLR_OP_1WIRE;
SET_OP_1WIRE;
CLR_DIR_1WIRE;
k=(CHECK_IP_1WIRE); // 从低位开始读数据
if(k)
temp|=(1<<0);
else
temp&=~(1<<0);
Read_State=1;
Delay_Timer_64us(); // 60~120us
break;
}
case 1:
{
SET_DIR_1WIRE;
CLR_OP_1WIRE;
SET_OP_1WIRE;
CLR_DIR_1WIRE;
k=(CHECK_IP_1WIRE); // 从低位开始读数据
if(k)
temp|=(1<<1);
else
temp&=~(1<<1);
Read_State=2;
Delay_Timer_64us(); // 60~120us
break;
}
case 2:
{
SET_DIR_1WIRE;
CLR_OP_1WIRE;
SET_OP_1WIRE;
CLR_DIR_1WIRE;
k=(CHECK_IP_1WIRE); // 从低位开始读数据
if(k)
temp|=(1<<2);
else
temp&=~(1<<2);
Read_State=3;
Delay_Timer_64us();// 60~120us
break;
}
case 3:
{
SET_DIR_1WIRE;
CLR_OP_1WIRE;
SET_OP_1WIRE;
CLR_DIR_1WIRE;
k=(CHECK_IP_1WIRE); // 从低位开始读数据
if(k)
temp|=(1<<3);
else
temp&=~(1<<3);
Read_State=4;
Delay_Timer_64us(); // 60~120us
break;
}
case 4:
{
SET_DIR_1WIRE;
CLR_OP_1WIRE;
SET_OP_1WIRE;
CLR_DIR_1WIRE;
k=(CHECK_IP_1WIRE); // 从低位开始读数据
if(k)
temp|=(1<<4);
else
temp&=~(1<<4);
Read_State=5;
Delay_Timer_64us(); // 60~120us
break;
}
case 5:
{
SET_DIR_1WIRE;
CLR_OP_1WIRE;
SET_OP_1WIRE;
CLR_DIR_1WIRE;
k=(CHECK_IP_1WIRE); // 从低位开始读数据
if(k)
temp|=(1<<5);
else
temp&=~(1<<5);
Read_State=6;
Delay_Timer_64us(); // 60~120us
break;
}
case 6:
{
SET_DIR_1WIRE;
CLR_OP_1WIRE;
SET_OP_1WIRE;
CLR_DIR_1WIRE;
k=(CHECK_IP_1WIRE); // 从低位开始读数据
if(k)
temp|=(1<<6);
else
temp&=~(1<<6);
Read_State=7;
Delay_Timer_64us(); // 60~120us
break;
}
case 7:
{
SET_DIR_1WIRE;
CLR_OP_1WIRE;
SET_OP_1WIRE;
CLR_DIR_1WIRE;
k=(CHECK_IP_1WIRE); // 从低位开始读数据
if(k)
temp|=(1<<7);
else
temp&=~(1<<7);
Read_State=8;
Delay_Timer_64us(); // 60~120us
break;
}
case 8:
{
SET_DIR_1WIRE;
Read_State=0;
Get_State++;
// printf_P(PSTR("temp : %d\n"),temp);
break;
}
default : break ;
}
return (temp);
}
//************************************************************************
//===读取温度值===
//************************************************************************
void Get_Temperature(void) //读取温度值
{
static unsigned char Delay800ms_Count=0;
static unsigned char tem_h=0;
static unsigned char tem_l=0;
if(Get_State==0)
{
DS18B20_init(); // 复位18b20
}
if(Get_State==1)
{
Write_18B20(0xcc); // 跳过ROM命令
}
if(Get_State==2)
{
Write_18B20(0x44); // 启动温度转换
}
if(Get_State==3)//延时等待转换
{
if(Delay800ms_Count<24)
{
Delay_Timer_32768us();
Delay800ms_Count++;
}
else
{
Delay800ms_Count=0;
Get_State=4;
}
}
if(Get_State==4)
{
DS18B20_init();
}
if(Get_State==5)
{
Write_18B20(0xcc); // 发送跳过ROM命令
}
if(Get_State==6)
{
Write_18B20(0xbe); // 发送读数据命令
}
if(Get_State==7)
{
tem_l=Read_18B20(); // 读温度低字节
}
if(Get_State==8)
{
tem_h=Read_18B20(); // 读温度高字节
}
if(Get_State==9)
{
WenDu=tem_h;
WenDu<<=8;
WenDu+=tem_l;
// WenDu=6.25*WenDu;
WenDu>>=4; //乘以分辨率0.625,得温度值
printf_P(PSTR("Temperature : %ld\n"),WenDu);
Get_State=0;
Delay_Timer_32768us();
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?