⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 DS18B20的AVR驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************



                                            DS18B20自动搜索算法测试程序  

       
                                            Author: 仔仔  
                                            Email:soulmate_gigi@163.com


                                            


****************************************************************************/
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include <avr/delay.h>
#include "string.h"
#include "stdio.h"



#define  NOP     asm volatile("nop\n"::) 
#define  _NOP()  NOP

#define  BAUDRATE        9600	//波特率

#define  TraMode   PORTC|=(1<<2)  //发送模式
#define  RecMode   PORTC&=~(1<<2) //接收模式

#define BIT0                (0x0001)
#define BIT1                (0x0002)
#define BIT2                (0x0004)
#define BIT3                (0x0008)
#define BIT4                (0x0010)
#define BIT5                (0x0020)
#define BIT6                (0x0040)
#define BIT7                (0x0080)
#define BIT8                (0x0100)
#define BIT9                (0x0200)
#define BITA                (0x0400)
#define BITB                (0x0800)
#define BITC                (0x1000)
#define BITD                (0x2000)
#define BITE                (0x4000)
#define BITF                (0x8000)

static unsigned char dscrc_table[] = {
0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};

/********************************************************************************

                            	位变量操作宏定义

********************************************************************************/
#define		BIT_SET(a,b)	a|=(1<<b)
#define		BIT_CLR(a,b)	a&=~(1<<b)
#define		BIT_INV(a,b)   	a^=(1<<b)
#define		BIT_STATUS(a,b) a&(1<<b)


/********************************************************************************

                            	DS18B20操作定义

********************************************************************************/
#define		CLR_DS18B20		BIT_CLR(PORTB,PB1)		//数据线强制拉低
#define		SET_DS18B20		BIT_SET(PORTB,PB1)		//数据线强制拉高,上拉
#define		HLD_DS18B20		BIT_SET(DDRB,PB1)		//Mega16控制总线
#define		RLS_DS18B20		BIT_CLR(DDRB,PB1)   	 	//释放总线
#define		STU_DS18B20		BIT_STATUS(PINB,PB1)		//数据线的状态


unsigned char ROM_NO[8];
unsigned char LastDiscrepancy;
unsigned char LastFamilyDiscrepancy;
unsigned char LastDeviceFlag;
unsigned char crc8;


volatile unsigned char PC_COMMAND;		//PC发出的当前命令
volatile unsigned char RX_BUFFER[16];	//存放接收数据的数组
volatile unsigned char RX_index;			//存放接收数据的个数
volatile unsigned char TX_BUFFER[16];  //存放发送数据的数组


unsigned char result[9];
unsigned char lpmain;

unsigned char R_Delay=0;
unsigned int  R_Status=0;
double temp;


void delayUs(unsigned int temp);

unsigned char OWReset(void);
unsigned char OWReadBit(void);
unsigned char OWReadbyte(void);
void OWWriteBit(unsigned char temp);
void OWWriteByte(unsigned char wb);
void delayms(void);
unsigned char OWSearch(void);
unsigned char docrc8(unsigned char value);
int OWFirst(void);
int OWNext(void);

void init_port(void);
void init_timer1(void);
void init_USART(void);

void put_c(unsigned char c);
void put_s(unsigned char *s,unsigned char Len);

int main(void)
{
   unsigned int i;


   cli();
   
   MCUSR=0;
   
   wdt_disable();  


   init_port();
   

   init_timer1();
   init_USART();

   

   for(i=0;i<20;i++)    
      _delay_ms(20);

   
   sei();

   if (OWFirst())
   {
       put_s(ROM_NO,sizeof(ROM_NO));
  
       while(OWNext())
	   {
          put_s(ROM_NO,sizeof(ROM_NO));   


	   }

   }
   

   while(1)
   {
      
	/*  if (R_Status&BIT0)
	  {
	      R_Status&=~BIT0;

          OWReset();
		  OWWriteByte(0x55);
		  ROM_NO[0]=0x28;
          ROM_NO[1]=0xb7;
		  ROM_NO[2]=0x19;
		  ROM_NO[3]=0x7b;
		  ROM_NO[4]=0x00;
		  ROM_NO[5]=0x00;
		  ROM_NO[6]=0x00;
		  ROM_NO[7]=0x2f;
		  
		  for(i=0;i<8;i++)
		     OWWriteByte(ROM_NO[i]);
          
		  OWWriteByte(0x44);

		  for(i=0;i<50;i++);
		    _delay_ms(10);


          OWReset();
          OWWriteByte(0x55);
		  ROM_NO[0]=0x28;
          ROM_NO[1]=0xb7;
		  ROM_NO[2]=0x19;
		  ROM_NO[3]=0x7b;
		  ROM_NO[4]=0x00;
		  ROM_NO[5]=0x00;
		  ROM_NO[6]=0x00;
		  ROM_NO[7]=0x2f;
		  
		  for(i=0;i<8;i++)
		     OWWriteByte(ROM_NO[i]);
	      OWWriteByte(0xbe);
		  
		  for(lpmain=0;lpmain<9;lpmain++)
          {
             result[lpmain] = OWReadbyte();
          }	
		  
		  OWReset();
		  
		  put_s(result,sizeof(result));		 
			  
		     
      } */   
      /* if (R_Status&BIT0)
	   {
	      R_Status&=~BIT0;
          memset((void *)result,0,sizeof(result));

		   
          OWReset();		 		  
	      OWWriteByte(0xcc); 	//跳过ROM
	      OWWriteByte(0x44);		//启动温度转换
	      delayms();

          OWReset();
	      OWWriteByte(0xcc);		//跳过ROM
	      OWWriteByte(0xbe);		//读数据

          for(lpmain=0;lpmain<9;lpmain++)
          {
             result[lpmain] = OWReadbyte();
          }	   	          

       }*/
          

   }


}

void delayUs(unsigned int temp)
{
 	 while(temp--);

}

/**********************************************************************
functionName: BYTE resetDS18B20(void)
description :DS18B20初始化
**********************************************************************/
unsigned char OWReset(void)
{
	unsigned char errTime=0;

	RLS_DS18B20;		//释放总线
	_NOP();
	HLD_DS18B20;		//Maga16控制总线
	CLR_DS18B20;		//强制拉低
	delayUs(150);		//209.42us
	delayUs(150);		//209.42us 480us

	RLS_DS18B20;	//释放总线,总线自动上拉
	_NOP();			
	while(STU_DS18B20)	
	{
		delayUs(2);	 	//5.15us
		errTime++;
		if(errTime>14)
		return(0x00);		//如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
	}
	errTime=0;
	while(!(STU_DS18B20))	
	{	   
		delayUs(2);	 	//5.15us
		errTime++;
		if(errTime>50)
		return(0x00);		//如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)

	}	

	delayUs(120);
	delayUs(125);
	return(0xff);
}

////////////////////////////////////////////////

unsigned char OWReadBit(void)
{     
    unsigned char t;
	HLD_DS18B20;	//Maga16控制总线
	CLR_DS18B20;	//强制拉低
	_NOP();
	_NOP();
	RLS_DS18B20;		//释放总线,DS18B20会将总线强制拉低
	delayUs(3);
	if(STU_DS18B20)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -