51单片机利用温度传感器和数码管动态显示室内温度。

关于温度传感器读写函数的编写:温度传感器的读写函数编写
在上面的函数的前提下,读取温度传感器响应的数据并在数码管上显示即可。
利用Ds18b20ReadTemp()函数返回温度值。
编写datapros()函数处理传输过来的数据。(DisplayData数组是用于存储显示数据的全局变量,smgduan用来存储标准的数码管显示数组)
代码部分:

void datapros(int temp) 	 
{
   	float tp;  
		if(temp< 0)				//当温度值为负数
  	{
		DisplayData[0] = 0x40; 	  //   显示‘-’符号
		//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
		temp=temp-1;
		temp=~temp;
		tp=temp;
		temp=tp*0.0625*100+0.5;	
		//保留两位小数*100,+0.5达成四舍五入
  	}
 	else
  	{			
		DisplayData[0] = 0x00;	//首位不显示
		tp=temp;//数据处理有小数点将温度赋给一个浮点型变量
		temp=tp*0.0625*100+0.5;	
	}
	DisplayData[1] = smgduan[temp / 10000];
	DisplayData[2] = smgduan[temp % 10000 / 1000];
	DisplayData[3] = smgduan[temp % 1000 / 100] | 0x80;
	DisplayData[4] = smgduan[temp % 100 / 10];
	DisplayData[5] = smgduan[temp % 10];
}

最后编写数码管的显示函数。
void DigDisplay()
{
	u8 i;
	for(i=0;i<6;i++)
	{
		switch(i)	 //位选,选择点亮的数码管,
		{
			case(0):
				LSA=0;LSB=0;LSC=0; break;//显示第0位
			case(1):
				LSA=1;LSB=0;LSC=0; break;//显示第1位
			case(2):
				LSA=0;LSB=1;LSC=0; break;//显示第2位
			case(3):
				LSA=1;LSB=1;LSC=0; break;//显示第3位
			case(4):
				LSA=0;LSB=0;LSC=1; break;//显示第4位
			case(5):
				LSA=1;LSB=0;LSC=1; break;//显示第5位	
		}
		P0=DisplayData[5-i];//发送数据
		delay(40); //间隔一段时间扫描	
		P0=0xff;//消影
	}		
}

完成了上面的相关函数之后只需要在主函数中调用他们即可。

void main()
{	
	datapros(Ds18b20ReadTemp());
	DigDisplay();
}

效果图如下:
在这里插入图片描述在这里插入图片描述

  • 8
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要在51单片机上实现DS18B20数码显示温度,需要以下步骤: 1. 首先,需要连接DS18B20传感器数码管到你的51单片机上。连接方法与其他控制器类似,具体可以参考DS18B20数据手册和数码管的数据手册。 2. 然后,需要编写程序来读取DS18B20传感器温度数据。可以使用单总线协议来读取DS18B20传感器的数据。 3. 接下来,需要将读取到的温度数据转换成数码管可以显示的格式。可以使用数码管的动态扫描方式来实现这个功能。 4. 最后,将转换后的温度数据显示数码管上。 下面是一个51单片机的示例程序,可以实现DS18B20数码显示温度的功能: ```c #include <reg52.h> // DS18B20传感器连接到P2.0引脚 sbit DQ = P2^0; // 数码管连接到P0口 sbit LSA=P0^0; sbit LSB=P0^1; sbit LSC=P0^2; sbit LED=P0^7; //数码管的小数点 // DS18B20传感器初始化 void Init_DS18B20(void) { unsigned char i; DQ = 1; i = 1; while(i--); DQ = 0; i = 80; while(i--); DQ = 1; i = 1; while(i--); } // DS18B20传感器写1 void Write_DS18B20_1(void) { DQ = 0; _nop_(); _nop_(); _nop_(); DQ = 1; } // DS18B20传感器写0 void Write_DS18B20_0(void) { DQ = 0; _nop_(); _nop_(); _nop_(); DQ = 0; } // DS18B20传感器读1 bit Read_DS18B20_1(void) { bit flag; DQ = 0; _nop_(); _nop_(); _nop_(); DQ = 1; _nop_(); _nop_(); flag = DQ; return flag; } // DS18B20传感器读取一个字节 unsigned char Read_DS18B20(void) { unsigned char i; unsigned char dat = 0; for(i=8; i>0; i--) { dat >>= 1; if(Read_DS18B20_1()) { dat |= 0x80; } else { dat &= 0x7F; } } return dat; } // DS18B20传感器写一个字节 void Write_DS18B20(unsigned char dat) { unsigned char i; for(i=8; i>0; i--) { if(dat & 0x01) { Write_DS18B20_1(); } else { Write_DS18B20_0(); } dat >>= 1; } } // 读取DS18B20传感器温度数据 float ReadTemperature(void) { unsigned char TL, TH; float temperature; Init_DS18B20(); Write_DS18B20(0xcc); Write_DS18B20(0x44); while(!Read_DS18B20_1()); Init_DS18B20(); Write_DS18B20(0xcc); Write_DS18B20(0xbe); TL = Read_DS18B20(); TH = Read_DS18B20(); temperature = TH; temperature <<= 8; temperature |= TL; temperature /= 16; return temperature; } // 数码显示温度数据 void Display(float temperature) { unsigned int temp = (unsigned int)(temperature * 10); LSA=0;LSB=0;LSC=0;LED=0; //清零 P0 = 0xc0; //选择第一位数码管 P0 |= temp / 1000; //写入千位数字 P0 &= 0xcf; //关闭小数点 delay(5); LSA=1;LSB=0;LSC=0;LED=0; //清零 P0 = 0xf9; //选择第二位数码管 P0 |= temp % 1000 / 100; //写入百位数字 P0 &= 0xcf; //关闭小数点 delay(5); LSA=0;LSB=1;LSC=0;LED=0; //清零 P0 = 0xa4; //选择第三位数码管 P0 |= temp % 100 / 10; //写入十位数字 P0 &= 0xcf; //关闭小数点 delay(5); LSA=1;LSB=1;LSC=0;LED=1; //清零 P0 = 0xb0; //选择第四位数码管 P0 |= temp % 10; //写入个位数字 P0 &= 0xcf; //打开小数点 delay(5); } void main() { float temperature; while(1) { temperature = ReadTemperature(); Display(temperature); } } ``` 这个程序通过单总线协议来读取DS18B20传感器温度数据,使用了数码管的动态扫描方式来实现显示。在main函数中,程序循环读取温度数据并显示数码管上。注意要适当延时,以确保数码管可以正常显示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值