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

📄 tempreature.c

📁 HT单片机控制DS18B20测温度
💻 C
字号:
#include <ht46c24.h>

//8M晶振,一条指令周期是0.5us

#define uchar unsigned char  	 //0~255

#define temp_data _12_4			//DS18B20 端口
#define temp_data_ctrl _13_4	//DS18B20控制端口

uchar Read_Temperature(void);					//读温度的函数
uchar Init_DS18B20(void);						//初始化DS18B20
uchar Read_OneChar(void);						//读一个字节的数据
void Write_OneChar(uchar write_data);			//写一个字节的数据

uchar temperature;
uchar str[2];

void main()
{
	long k;
	temperature = 0;
	_pbc = 0;				//output mode 
	_pcc = 0;				//output mode
	_pb0 = 1;
	_pb1 = 1;
	_pc &= 0xf0;
	while(1)
	{
		temperature = Read_Temperature();
		str[0] = temperature % 10;			//个位
		str[1] = temperature / 10;			//十位
		_pc &= 0xf0;						//清除低位
		_pc |= str[0];
		_pb0 = 0;							//选中个位LED管
		_delay(10);
		_pb0 = 1;
		
		_pc &= 0xf0;						//清除低位
		_pc |= str[1];
		_pb1 = 0;							//选中十位LED管
		_delay(10);
		_pb1 = 1;
		
		_delay(2000);
	}
}


//18b20初始化函数
uchar Init_DS18B20(void)
{
 unsigned char temp_flag = 0;
 temp_data_ctrl = 0;    //output mode
 temp_data = 1;			//准备复位
 _delay(80);  			//稍做延时
 temp_data = 0;    		//单片机将总线拉低,产生复位信号
 _delay(1000); 			//精确延时 大于 480us
 temp_data = 1;   		//拉高总线
 _delay(80);
 temp_data_ctrl = 1;	//input mode 
 temp_flag = temp_data; //稍做延时后 如果temp_flag = 0则初始化成功 temp_flag = 1则初始化失败
 _delay(500);			//注意:ds18b20应答脉冲要持续60——240us
 if (temp_flag)
 {
	return 1;				//初始化失败
 }
 else
 {
	return 0;				//初始化成功
 }
}

//读一个字节
uchar Read_OneChar(void)
{
uchar j;
uchar i = 0;
uchar read_data = 0;

for (i = 8; i > 0; i --)
 {
  read_data >>= 1;
  temp_data_ctrl = 0;			//output mode

  temp_data = 0; 				// 给脉冲信号
  _delay(2);
  temp_data = 1; 				// 给脉冲信号
  _delay(8);
  temp_data_ctrl = 1;			//input mode 
  if(temp_data)
   read_data |= 0x80;
  else
   read_data &= 0x7f;
  _delay(90);
  
  temp_data_ctrl = 0;
  temp_data = 1;
 }
 return(read_data);
}

//写一个字节
void Write_OneChar(uchar write_data)
{
 uchar i = 0;
 for (i = 8; i > 0; i --)
 {
  temp_data_ctrl = 0;		//output mode
  temp_data = 0;			//给个脉冲
  _delay(30);
  temp_data = write_data & 0x01;
  _delay(90);
  temp_data = 1;
  write_data >>= 1;
  _delay(2);
 }
}

//读取温度
uchar Read_Temperature(void)
{
 long j;
 long m;

 uchar temp_l = 0;
 uchar temp_h = 0;
 uchar temp = 0;
 uchar ds18b20_exist = 0;
 uchar ds18b20_exist1 = 0;
	ds18b20_exist = Init_DS18B20();
	if(!ds18b20_exist)
	{
		Write_OneChar(0xCC); // 跳过读序号列号的操作
		Write_OneChar(0x44); // 启动温度转换
	
		for (j = 800; j >= 0; j --)
		{
			_delay(2000);
		}
		
		ds18b20_exist1 = Init_DS18B20();
		Write_OneChar(0xCC); //跳过读序号列号的操作 
		Write_OneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

		temp_l = Read_OneChar();
		temp_h = Read_OneChar();

		temp_h <<= 4;
		temp_h += ((temp_l & 0xf0) >> 4);
		temp = temp_h;
		
		return(temp);
	}
	else
		return 0;
}

⌨️ 快捷键说明

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