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

📄 1820.c

📁 本程序可以实现温度测量
💻 C
字号:
/************************************************************************************/
/*     程序名:DS18B20测温程序                                                      */
/*                                                                                  */
/*     晶振:12.0 M                                        CPU型号:AT89S52         */
/*                                                                                  */                                             
/*                                                                                  */
/*     功能描述: 将实验板上J6的5脚和J7的5脚(均自上往下数)用短路帽连接!           */
/*					用数字温度传感器DS18B20就可以实时检测室温值					    */
/*                                                                                  */
/*     http://www.mculover.net                                                      */
/*     http://www.mculover.net/bbs                                                  */
/*   													 					    	*/
/*                                                                                  */
/*                                                湘灵电子工作室 版权所有           */                                 
/*                                                         2006-03-20               */
/************************************************************************************/ 
#include <reg51.h>

sbit DQ = P3 ^ 2;  //定义端口DQ

unsigned char code LEDData1 [ ] = {0x3f, 0x06, 0x5b, 
								0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};//0-9数字
unsigned char code LEDData2 [ ] = {0x40, 0x79, 0x24, 
									0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; //0.-9.LED数值

/**********************************************************************************/
void Delay(unsigned int num)//延时函数
{
	while( num-- );
}

/**********************************************************************************/
Init_DS18B20(void)//初始化ds1820
{
	unsigned char x = 0;

	DQ = 1;    //DQ复位
	Delay(8);  //稍做延时

	DQ = 0;    //单片机将DQ拉低
	Delay(80); //精确延时 大于 480us

	DQ = 1;    //拉高总线
	Delay(14);

	x = DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
    Delay(20);
}

/**********************************************************************************/
ReadOneChar(void)//读一个字节
{
	unsigned char i = 0;
	unsigned char dat = 0;

	for (i = 8; i > 0; i--)
	{
  		DQ = 0; // 给脉冲信号
  		dat >>= 1;
  		DQ = 1; // 给脉冲信号

  		if(DQ)
  			dat |= 0x80;
  		Delay(4);
	}

	return (dat);
}

/**********************************************************************************/
WriteOneChar(unsigned char dat)//写一个字节
{
	unsigned char i = 0;
	for (i = 8; i > 0; i--)
	{
  		DQ = 0;
  		DQ = dat&0x01;
  		Delay(5);

  		DQ = 1;
  		dat>>=1;
	}
}

/**********************************************************************************/
Read_Disp_Temperature(void)//读取并显示温度
{
	unsigned int a = 0, b = 0, c = 0, t = 0;
	float tt = 0;

	Init_DS18B20();
	WriteOneChar(0xCC); // 跳过读序号列号的操作
	WriteOneChar(0x44); // 启动温度转换

	Init_DS18B20();
	WriteOneChar(0xCC); //跳过读序号列号的操作
	WriteOneChar(0xBE); //读取温度寄存器

	a = ReadOneChar();
	b = ReadOneChar();

	t = b;
	t <<= 8;
	t = t | a;

	tt = t * 0.0625;
   	t = tt * 10 + 0.5; //放大10倍输出并四舍五入

	a = t / 100;              //十位
	b = t / 10 - a * 10;      //个位 
	c = t - a * 100 - b * 10; //小数位

	P0 = 0x4b;  //显示"C"字符
	P2 = 0xfd;
	Delay(300);

	P0 = LEDData1[c];  //显示小数位
	P2 = 0xfb;
	Delay(400);

	P0 = LEDData2[b];  //显示个位
	P2 = 0xfe;
	Delay(400);

	P0 = LEDData1[a];  //显示十位
	P2 = 0xf7;
	Delay(400);
}

/**********************************************************************************/
void main(void)
{
	while(1)
	{
  		Read_Disp_Temperature();
	}
}

⌨️ 快捷键说明

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