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 + -
显示快捷键?