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

📄 1.c

📁 利用AT89C51单片机开发的DS18B20温度采集程序
💻 C
字号:
/******************************************************************************
东北大学104实验室
利用DS18B20实现温度计功能
目标器件:DS18B20
晶振:11.0592MHz
编译环境:Keil 7.60 A
******************************************************************************/
/********************************包含头文件***********************************/
#include <reg51.h>
#include <INTRINS.H>
/*******************************宏定义****************************************/
#define  uchar unsigned char
#define  uint  unsigned int 
/*******************************端口定义**************************************/  
sbit DQ = P1^0;         //传感器的数据线	 
sbit disp_clk=P1^7;     //输出系统时钟	 
sbit disp_num=P1^5;     //输出led显示数	 
/*******************************7段共阳LED码表******************************/ 
uchar code  tab[11][8]={
						  {0,0,0,0,0,0,1,0},  //0
		              	  {1,1,0,0,1,1,1,0},  //1
		                  {0,0,1,0,0,1,0,0},  //2
						  {1,0,0,0,0,1,0,0},  //3
						  {1,1,0,0,1,0,0,0},  //4
						  {1,0,0,1,0,0,0,0},  //5			          
						  {0,0,0,1,0,0,0,0},  //6
						  {1,1,0,0,0,1,1,0},  //7
						  {0,0,0,0,0,0,0,0},  //8
						  {1,0,0,0,0,0,0,0},  //9
						  {1,1,1,1,1,1,1,1}  
					  };
/*****************************定义全局变量************************************/ 
uchar temperature,temperature_decimal;  //保存正的温度 即 0--127 度,
                                  //temperature为//18B20采集温度的整数部分,
                                  //temperature_decimal为小数部分 
/******************************************************************************
函数功能:LED显示子程序
入口参数:n
出口参数:
******************************************************************************/
void fun(uint n)          //led 显示函数	 
{                 
	uint i;
	for(i=0;i<8;i++)
	{
		disp_clk=!disp_clk;    //led八位初始清屏	  
		disp_clk=!disp_clk;
		disp_num=tab[n][i];    //发送led的一个控制码段   
	}
}
/******************************************************************************
函数功能:延时子程序
入口参数:x
出口参数:
******************************************************************************/
void delay(uint x)  //延时函数,进入该函数一次需要13us,x每减1,延时11us
{
	for(;x>0;x--);
}
/******************************************************************************
函数功能:18B20复位函数
入口参数:
出口参数:
******************************************************************************/

bit reset_18b20()	 
{
	bit	temp;
	DQ = 1;
	_nop_();
	DQ = 0;
	delay(45);                // 480 us
	DQ = 1;
	_nop_();
	_nop_();
	_nop_();
	delay(2);                 //35 us
	temp = DQ;
	delay(20);                //233 us
	return	temp;           //返回18B20重启完成标志位
}
/******************************************************************************
函数功能:18B20写函数
入口参数:command
出口参数:
******************************************************************************/
void write_18b20(uchar command)//向18B20通过单总线写数据   
{
	uchar i;
	CY = 0;
	for(i = 8; i > 0; i --)
	{
	    DQ = 0;
		delay(0);            //13 us
		command >>= 1;       //低位在前   
		DQ = CY;
		delay(3);            //46us
		DQ = 1;
		_nop_();
	}
	DQ = 1;
	_nop_();	
}
/******************************************************************************
函数功能:18B20读函数
入口参数:
出口参数:value
******************************************************************************/
uchar read_18b20()//通过单总线读18B20的ROM数据	  
{
	uchar i;
    uchar value = 0;    
    for (i = 0; i < 8; i ++)
    {
	    DQ = 1;
		_nop_();
        _nop_(); 
        DQ = 0;
		_nop_();
        _nop_(); 
        _nop_();
        DQ = 1;
		 value=value>>1;
		 if (DQ==1)
		 {
			value=value+0x80;   //先读取低位
		 }
        delay(3);
    }                              
return value;    
}
/******************************************************************************
函数功能:获取18B20的温度数据子程序
入口参数:
出口参数:
******************************************************************************/

void getTemperature()                 //获取18B20的温度数据	   
{
	uchar temperature_low;            //存储温度值的低八位数据	  
	uchar temperature_high;           //存储温度值的高八位数据	   
	DQ = 1;
	while(reset_18b20());              //等待18B20完成复位,完成复位后才能进行数据的传输	    
	write_18b20(0xcc);                //跳过ROM匹配	 
	write_18b20(0x44);                //发出温度转换命令	
	delay(48000);                     //最大转换时间 750 ms
	delay(48000);                     //528,043 us	
	while(reset_18b20());              //等待18B20完成复位,准备读温度前先复位	
	write_18b20(0xcc);                //跳过ROM匹配 
	write_18b20(0xbe);                //发出读温度命令 
	//将读出的温度数据保存到 temperature_high/temperature_low 
	temperature_low = read_18b20();    //读取温度值	  
	temperature_high = read_18b20();
	temperature = 0;
	temperature_decimal = temperature_low & 0x0f;   //提取温度值的小数部分	  
	temperature += (temperature_low >> 4);         //低字节右移四位获取温度值的正数部分的低四位数据 
	temperature += (temperature_high << 4);        //高字节左移四位与低字节数据相加获得十二位的温度值整数部分温度值		 
}
/******************************************************************************
函数功能:主程序
入口参数:
出口参数:
******************************************************************************/
void main()                               //主函数	    
{  
	uint temp[3];                          //存储温度值的十位,个位,小数数值	    
	int i;
	while(1)
	{
		getTemperature();                   //读取18B20温度值	   
		for(i=0;i<3;i++)
			fun(10);
		temp[0]=(temperature%100)/10;       //温度值的十位值   
		temp[1]=temperature%10;            //个位值	   
		temp[2]=temperature_decimal*625/1000;//小数部分的十位之一位
		for(i=0;i<3;i++)
			fun(temp[i]);                 //循环输出温度值的十位,个位,小数位	   }
	}
}

⌨️ 快捷键说明

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