STC89S51单片机 DS18B20温度显示到数码管上

本文详细介绍了如何使用STC89S51单片机配合DS18B20传感器显示温度到数码管上。通过解析时序图进行初始化、写入和读取操作,并在main主函数中实现。延时函数的选择和单片机指令集、系统频率的匹配是关键点。
摘要由CSDN通过智能技术生成

STC89S51单片机 DS18B20温度显示到数码管上

1.根据时序图 来写程序

1. 初始化时序图

在这里插入图片描述

初始化的作用 是侦测DS18B20是否能正常工作 就是是否存在DS18B20 如果初始化成功 DS18B20会将DQ置0

所以代码如下

bit DS18B20_Reset()
{
	bit flag;//是否侦测到DS18B20的标志位
	DS18B20_DQ=0;//先将DQ置0
	Delay480us();//延时480us
	DS18B20_DQ=1;//释放 等待DS18B20拉低  但是要超过60u 如果小于60 就不准确
	Delay80us();//就定延时80us
	flag=DS18B20_DQ;//然后给到flag 
	Delay400us();//把时序走完
	return flag;
}

2. 写入时序图

在这里插入图片描述

void DS18B20_WriteData(unsigned char dat)
{
	unsigned char j;
	for(j=0;j<8;j++)
	{
		DS18B20_DQ=0;//可以看到 要延时>1us  
		Delay4us();//就延时4us
		DS18B20_DQ=dat&0x01;//取数据的最低位
		Delay60us();//延时60us  60到120均可 不管是写0还是写1
		DS18B20_DQ=1;// 释放总线
		dat=dat>>1;//右移一位 把最低位移走  移动8次 就传完了
		Delay25us();//时序走完
	}
}

3.读时序图

在这里插入图片描述

unsigned char DS18B20_ReadData()
{
	unsigned char j,rdata;
	for(j=0;j<8;j++)
	{
		DS18B20_DQ=0;//不管怎样 做之前 都要先拉低DQ
		Delay4us();//延时4us 大于1us即可
		DS18B20_DQ=1;//释放总线
		rdata>>=1;//
		Delay6us();
		if(DS18B20_DQ==1)//如果读到是1
		{
			rdata=rdata|0x80;//先放到最高位 然后右移
		}
		Delay60us();//延时60us
		DS18B20_DQ=1;//释放总线
	}
	return rdata;//返回数据
}

2.main 主函数

void main()
{
	while(1)
	{ 
		unsigned int i=0;
		unsigned int tempH,tempL;//温度高位和低位
		DS18B20_Reset();
		DS18B20_WriteData(0xCC);//跳过RAM检测
		DS18B20_WriteData(0x44);//启动温度转换
		DS18B20_Reset();
		DS18B20_WriteData(0xCC);//跳过RAM检测
		DS18B20_WriteData(0xBE);//读暂存器命令
		tempL=DS18B20_ReadData();//读温度低位
		tempH=DS18B20_ReadData();//读温度高位
		tempH=(tempH<<8)|tempL;
		if((t&0xF800)==0xF800)//如果温度是负值
		{
			t=~t+1;
		}
		temp=tempH*0.0625*100;//×0.0625就是温度
		dis_code[0]=change(temp/1000);//温度十位
		dis_code[1]=change(temp/100%10)|0x80;//温度个位
		dis_code[2]=change(temp/10%10);//温度小数点后一位
		dis_code[3]=change(temp%10);//温度小数点后二位
      //显示到动态数码管上面
    for(i=0;i<4;i++)
		{
       //HC138译码器 位码
			switch(i)
				{
				case 0:HC138_A=0;HC138_B=0;HC138_C=0;break;
            case 1:HC138_A=1;HC138_B=0;HC138_C=0;break;
				case 2:HC138_A=0;HC138_B=1;HC138_C=0;break;
				case 3:HC138_A=1;HC138_B=1;HC138_C=0;break;
				default: break;
			}
			P2=dis_code[i];
			Delay1ms();
			P2=0;
		}
}
}
unsigned int change(unsigned int t)
{
	switch(t)
	{
		//每个数字对应的数码管共阴极的16进制
		case 0:return 0x3f;break;
		case 1:return 0x06;break;
		case 2:return 0x5b;break;
		case 3:return 0x4f;break;
		case 4:return 0x66;break;
		case 5:return 0x6d;break;
		case 6:return 0x7d;break;
		case 7:return 0x07;break;
		case 8:return 0x7f;break;
		case 9:return 0x6f;break;
	  default: return 0; break;
	}
}

另外 代码中用到了许多延时函数 尽量用烧入代码的软件里面 有更加准确的延时函数 如stc-isp

在这里插入图片描述

注意 找到自己单片机对应的指令集 和系统频率

3. 展示视频

VID_20230411_170205

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值