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

📄 main.c

📁 avr单片机使用的ds18B20的测温系统
💻 C
字号:
#include <avr/io.h>
#include <avr/sfr_defs.h>
#include <util/delay.h>

/****************************************Copyright (c)**************************************************
** 描        述: 宏定义
**********************************************************************************************************/

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

                            	数据类型的定义

********************************************************************************/
#define  	uchar	unsigned char															 
#define 	uint	unsigned int


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

                            	位变量操作宏定义

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


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

                            	DS18B20操作定义

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


/****************************************Copyright (c)**************************************************
** 描        述: 函数声明
**********************************************************************************************************/

void display(void);
uchar resetDS18B20(void);
uchar readByteDS18B20(void);
void writeByteDS18B20(uchar wb);
uint readTempDS18B20(void);

 
//---------------------------------------------------------------------------
uchar dis_buf[3]={0,1,2}; /*显示缓冲区*/
const uchar table[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
                      0x40,0x00};
//--------------------------------------------------------------------------- 
 void display()
{ uchar esgcode,bitcode,i;
  bitcode=0xfe;
  DDRB=0xff;
  DDRA=0xff;
  for(i=0;i<3;i++)
  { esgcode=dis_buf[i];
    PORTB=table[esgcode];
    PORTA=bitcode;
    _delay_ms(1);
    bitcode=bitcode<<1;
    bitcode=bitcode|0x01;
  }
}


/****************************************Copyright (c)**************************************************
** 描        述: DS18B20函数
**********************************************************************************************************/
/**********************************************************************
functionName: uchar resetDS18B20(void)
description :DS18B20初始化
**********************************************************************/
uchar resetDS18B20()
{   uchar flag;
	RLS_DS18B20;		//释放总线
	HLD_DS18B20;		//Maga16控制总线
	CLR_DS18B20;		//强制拉低
	_delay_us(500);     //延时500us,大于480us
	RLS_DS18B20;		//释放总线,总线自动上拉
	_delay_us(85);      //等待85us,读取总线状态
	flag=STU_DS18B20;      //读取总线     
	while(!STU_DS18B20);//等待复位成功
	_delay_us(180);
	return(flag);	
}
/**********************************************************************
functionName: uchar readByteDS18B20(void)
description :读DS18B20一个字节
**********************************************************************/
uchar readByteDS18B20()
{
	uchar i;
	uchar retVal=0;
	RLS_DS18B20;		//释放总线
	for(i=8;i>0;i--)
	{
	 	retVal>>=1;
	    HLD_DS18B20;	 //Maga16控制总线
		CLR_DS18B20;	 //强制拉低
        _delay_us(2);    //延时2us,大于1us
		RLS_DS18B20;     //释放总线
		_delay_us(10);    //10us后读取总线状态,
		if(STU_DS18B20)
		{retVal|=0x80;
		}
        _delay_us(50);      //延时30us
		RLS_DS18B20;		//释放总线
		RLS_DS18B20;		//释放总线
		_delay_us(3);      //3us
	}
	return(retVal);
}


/**********************************************************************
functionName: uchar readByteDS18B20(void)
description :写DS18B20一个字节
**********************************************************************/
void writeByteDS18B20(uchar wb)
{
	uchar j=8;
	for(j=8;j>0;j--)
	{
		HLD_DS18B20;		//Maga16控制总线
		CLR_DS18B20;		//强制拉低
		_delay_us(3);       //保持3us
		if((wb&0x01)==0x01)
			{SET_DS18B20;}
		else CLR_DS18B20;
		_delay_us(65);
		RLS_DS18B20;        //释放总线
		wb>>=1;
		_delay_us(8);
	}
}






/**********************************************************************
functionName: unsigned int readTempDS18B20(void)
description :读DS18B20温度
**********************************************************************/
uint readTempDS18B20()
{
	uchar tempL,tempH;
	uint x;
	resetDS18B20();
	writeByteDS18B20(0xcc); 	//跳过ROM
	writeByteDS18B20(0x44);		//启动温度转换
    for(x=13;x>0;x--)display();
	resetDS18B20();
	writeByteDS18B20(0xcc);		//跳过ROM
	writeByteDS18B20(0xbe);		//读数据
	tempL=readByteDS18B20();
	tempH=readByteDS18B20();
	x=(tempH<<4)|(tempL>>4);
	display();
	return(x);
} 

int main(void)
{
    DDRD  = 0x01;//初始化总线
    PORTD = 0x01;
    uint i;
	while(1)
	{
			i=resetDS18B20();
			i=readTempDS18B20();
			dis_buf[2]=0;
		    dis_buf[1]=i/10;
			dis_buf[0]=i%10;
			display();
	}
}



⌨️ 快捷键说明

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