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

📄 ds18b20.c

📁 18B20源程序 测量温度程序 单片机使用51单片机
💻 C
字号:
/******************************************************************************/
/*                  单片机系统培训项目程序资料                                */
/*                    DS18B20的温度测试程序                                   */
/*----------------------------------------------------------------------------*/
/*程序说明:此程序是单片机89C51控制并接收DS18B20的数据而设计的电路            */
/*          程序中应用了一线式通信协议                                        */
/*          程序中采用浮点数存入温度参数,精度为1/1000                        */
/*          程序中做了相应的基础函数,用户可以直接调用                        */
/*电路描述:								      */
/******************************************************************************/

#include"reg51.h"
#include "intrins.h"

#define uchar unsigned char
#define uint unsigned int
#define Byte unsigned char
#define Word unsigned int

typedef unsigned char byte;
typedef unsigned int word;

#define bool bit
#define true 1
#define false 0


sbit DS18B20_DQ =P3^3;   //定义通信端口
/******************************************************************************/
/*函数名称:void QNPX_Delay(unsigned int DelayTime)                           */
/*函数功能:延时函数,用户可以根据单片机的晶振进行调整时间                     */
/*输入参数:无                                                                */
/*返回参数:无                                                                */
/*函数类型:私有函数							      */
/******************************************************************************/
void QNPX_Delay(unsigned int DelayTime)
{
 	while(DelayTime--){
 		_nop_();
 		_nop_();
 	};
}
/******************************************************************************/
/*函数名称:void QNPX_OwReset()                                               */
/*函数功能:DS18B20的初始化函数                                               */
/*输入参数:无                                                                */
/*返回参数:无                                                                */
/*函数类型:私有函数							      */
/******************************************************************************/
//
void QNPX_OwReset(void)
{
	 unsigned char x=0;
	 DS18B20_DQ = 1;    	//DQ复位
	 QNPX_Delay(8);  	//稍做延时
	 DS18B20_DQ = 0;   	 //单片机将DQ拉低
	 QNPX_Delay(80); 	//精确延时 大于 480us
	 DS18B20_DQ = 1;    	//拉高总线
	 QNPX_Delay(14);
	 x=DS18B20_DQ;      	//稍做延时后 如果x=0则初始化成功 x=1则初始化失败
	 QNPX_Delay(20);
}
/******************************************************************************/
/*函数名称:void QNPX_ReadByte()                                              */
/*函数功能:读一个字节,返回读取的数据                                        */
/*输入参数:无                                                                */
/*返回参数:dat:返回从DB18B20读取的数据                                       */
/*函数类型:私有函数							      */
/******************************************************************************/
//
unsigned char QNPX_ReadByte(void)
{
	unsigned char Cnt=0;
	unsigned char dat = 0;
	for (Cnt=8;Cnt>0;Cnt--)
	 {
		  DS18B20_DQ = 0; // 给脉冲信号
		  dat>>=1;
		  DS18B20_DQ = 1; // 给脉冲信号
		  if(DS18B20_DQ)
		   	dat|=0x80;
		  QNPX_Delay(4);
	 }
	 return(dat);
}
/******************************************************************************/
/*函数名称:QNPX_WriteByte(unsigned char dat)                                */
/*函数功能:写一个字节到DS18B20                                               */
/*输入参数:dat:写入数据到DB18B20期                                           */
/*返回参数:无                                                                */
/*函数类型:私有函数							      */
/******************************************************************************/
//写一个字节
void QNPX_WriteByte(unsigned char dat)
{
	 unsigned char Cnt=0;
	 for (Cnt=8; Cnt>0; Cnt--)
	 {
		  DS18B20_DQ = 0;
		  DS18B20_DQ = dat&0x01;
		  QNPX_Delay(5);
		  DS18B20_DQ = 1;
		  dat>>=1;
	 }
	//QNPX_Delay(4);
}

/******************************************************************************/
/*函数名称:int QNPX_ReadTemperature(void)                                    */
/*函数功能:读取温度                                                          */
/*输入参数:无                                                                */
/*返回参数:返回读取的温度,并返回一个整形数据,经过浮点的*0.0625处理,就是可 */
/*          以使用的温度                                                      */
/*函数类型:私有函数							      */
/******************************************************************************/
int QNPX_ReadTemperature(void)
{
	union{
		byte c[2];
		int x;
	}Temp;
	float tt=0;
	QNPX_OwReset();
	QNPX_WriteByte(0xCC); 		// 跳过读序号列号的操作
	QNPX_WriteByte(0x44); 		// 启动温度转换
	QNPX_OwReset();
	QNPX_WriteByte(0xCC); 		//跳过读序号列号的操作
	QNPX_WriteByte(0xBE); 		//读取温度寄存器等(共可读9个寄存器) 前两个就是温度
	Temp.c[1]=QNPX_ReadByte();
	Temp.c[0]=QNPX_ReadByte();
	return(Temp.x);
}

main()
{
  	int ReadTemp;
  	float ChgTemp;
  	ReadTemp = QNPX_ReadTemperature();
  	ChgTemp = ReadTemp*0.0625;            //轻过转换到摄氏温度,这个才是真正的温度,可以用于显示。
	_nop_();
}

⌨️ 快捷键说明

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