六、51单片机 使用Proteus仿真实现用DS18B20测量温度并用数码管显示(仿真及代码)

啊?有粉丝私信我说原理大家都懂,那部分没必要那么详细,把原理图和代码分享一下大家就懂了。额······好吧。那这次就按粉丝要求来吧。

不过我还是简单提一下吧,谁让我担心你们搞不好呢?(嘻嘻嘻)

本项目使用AT89C52为主控芯片,数码管使用的是7SEG-MPX4-CA显示温度,使用DS18B20实现温度的模拟采集,原理图如下

代码如下:

#include <stc.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ = P3^5;
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
bit DS18B20_IS_OK = 1;
uchar CurrentT = 0;
uchar Temp_Value[]={0};
uchar Display_Digit[]={0,0,0,0};
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管的段码,对应数字0~9

void delayms(uint x)	//ms延时子程序,延时x毫秒
{
 	uchar i;
	while(x--)
	{
	 	for(i=0;i<120;i++);
	}
}

void delayus(uchar us)	//us延时子程序,延时时间为“5+2*us”微妙
{
 	while(--us);
}

uchar Init_DS18B20()	//DS18B20初始化子程序
{
 	uchar status;
	DQ = 1;
	delayus(1);		//延时7us(实测)
	DQ = 0;
	delayus(250);	//延时505us(实测)
	DQ = 1;
	delayus(28);	//延时61us(实测)
	status = DQ;
	delayus(240);	//延时485us(实测)
	return status;	//根据返回值可以判断是否复位成功,“0”表示复位成功
}

uchar ReadOneByte()	//DS18B20读一个字节子程序
{
 	uchar i,dat=0;
	DQ = 1;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		delayus(3);	//延时11us(实测)
		DQ = 1;
		dat >>= 1;
		if(DQ)
			dat|=0x80;
		DQ = 1;
		delayus(30);
	}
	return dat;
}

void WriteOneByte(uchar dat)	//DS18B20写入一个字节子程序
{
 	uchar i;
	for(i=0;i<8;i++)
	{
	 	DQ = 1;
		delayus(1);
		DQ = 0;
		delayus(1);
		DQ = (bit)(dat&0x01);
		dat >>= 1;
		delayus(40);		
	}
}

void Display_Temperature()	//数码管显示温度子程序
{
 	uchar i;
	for(i=0;i<140;i++)	//输出到数码管显示
	{
		P0 = 0xff;	//关闭数码管,防止闪烁
		P2_1 = 0;	//低电平对应的位显示
		P0 = DSY_CODE[Display_Digit[2]];
		delayms(2);

		P0 = 0xff;	//关闭数码管,防止闪烁
		P2_1 = 1;P2_2 = 0;	//低电平对应的位显示
		P0 = DSY_CODE[Display_Digit[1]];
		delayms(2);

		P0 = 0xff;	//关闭数码管,防止闪烁
		P2_2 = 1;P2_3 = 0;	//低电平对应的位显示
		P0 = DSY_CODE[Display_Digit[0]];
		delayms(2);
		P2_3 = 1;
	}
}

void Read_Temperature()
{
 	if(Init_DS18B20()==1)	//判断是否复位成功
		DS18B20_IS_OK=0;	//DS18B20没有准备好
	else
	{
		WriteOneByte(0xcc);
		WriteOneByte(0x44);
		DQ = 1;
		Display_Temperature();	//等待温度转换,耗时约840ms,边等边显示上次测量到的温度
		Init_DS18B20();
		WriteOneByte(0xcc);
		WriteOneByte(0xbe);
		Temp_Value[0] = ReadOneByte();	//读取RAM的第0字节
		Temp_Value[1] = ReadOneByte();	//读取RAM的第1字节
		CurrentT = ((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
		Display_Digit[2] = CurrentT/100;
		Display_Digit[1] = CurrentT%100/10;
		Display_Digit[0] = CurrentT%10;
		DS18B20_IS_OK=1;	
	}	
}

void main()	//主程序
{
	while(1)
	{
		Read_Temperature();	//实时读取温度并显示
	}
}

 大家点赞支持一下,我计划周末把手头的51单片机资源项目整理一下,打包上传,0积分,免费供大家下载学习使用。

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值