51 温度传感器 DS18B20程序代码

我们先来看一下 DS18B20 的硬件原理图:
在这里插入图片描述
DS18B20 通过编程,可以实现最高 12 位的温度存储值,在寄存器中,以补码的格式存储,如图所示。

在这里插入图片描述
下面我们就写一个程序,将读到的温度值显示在 1602 液晶上,并且保留一位小数位。

/**
1、温度从哪里来–》DS18B20传感器,
2、怎么去获取温度,配置好了,何时去取出温度?,需要过多久你才去拿一次温度的值
时间操作 -》 定时器操作 —> 中断 + 标志位
3、取出温度后,要进行怎样的处理? 数据类型的一个转换处理, 整型 -》 字符串型
4、温度的值有可能是负数,也有可能是正数, -》》 做一个判断

5、相关显示操作

**/

/ds18b20.h文件程序源代*/

#ifndef _DS18B20_H_
#define _DS18B20_H_

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int


//实现位绑定操作
sbit DS18B20_IO = P3^2;

/**初始化DS18B20**/
bit InitDS18B20ACK();

/**us延时函数**/
void delay_10us(uchar count);

/**向DS18B20写入一个字节的数据**/
void writeToDs18b20(uchar dat); 

/**向DS18B20读取一个字节的数据**/
uchar readeToDs18b20(); 

/**启动DS18B20进行温度的采集以及转换,并返回读取成功与否**/
bit startDs18b20();

/**读取DS18B20中的温度转换,并返回读取成功与否,而已还需要吧温度回去**/
bit getTempForDs18b20(int *temp);

#endif


/ds18b20.c文件程序源代*/

#include "ds18b20.h"

//DS18B20_IO = 0;

/**初始化DS18B20**/
bit InitDS18B20ACK(){
   
	bit ACK;//用来判断DS18B20是否初始化成功
	EA = 0;
	DS18B20_IO = 0;
	delay_10us(60);
	DS18B20_IO = 1;
	delay_10us(5);
	ACK = DS18B20_IO;
	while(!DS18B20_IO);//等待脉冲结束
	EA = 1;
	return ACK;
}

/**向DS18B20写入一个字节的数据**/
void writeToDs18b20(uchar dat){
   
		uchar mask;
		EA = 0;//关闭总中断开关
		for(mask = 0x01; mask != 0; mask <<= 1){
   
				DS18B20_IO = 0;
			_nop_();
			_nop_();
			if
  • 7
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于51单片机和DS18B20温度传感器的完整显示程序代码: ```c #include <reg51.h> sbit DQ = P2^0; // DS18B20数据线连接到P2.0 typedef unsigned char uchar; typedef unsigned int uint; uchar code table[] = "0123456789"; // 数码管字符表 // 数码管位选,共阴数码管需要取反 uchar code digit[] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; // 延时函数 void Delay1ms(uint t){ uint i, j; for(i=0; i<t; i++){ for(j=0; j<110; j++); } } // DS18B20初始化 uchar Init_DS18B20(){ uchar i; DQ = 1; // 数据线先置高 Delay1ms(10); // 延时10ms DQ = 0; // 发送复位脉冲 Delay1ms(80); DQ = 1; Delay1ms(10); i = DQ; // 检测DS18B20响应信号 Delay1ms(15); return i; } // DS18B20写一位数据 void Write_DS18B20(uchar dat){ uchar i; for(i=0; i<8; i++){ DQ = 0; // 发送时间槽 DQ = dat & 0x01; // 发送数据位 Delay1ms(5); DQ = 1; // 释放总线 dat >>= 1; } } // DS18B20读一位数据 uchar Read_DS18B20(){ uchar i, dat = 0; for(i=0; i<8; i++){ DQ = 0; // 发送时间槽 dat >>= 1; // 接收数据位 if(DQ) dat |= 0x80; Delay1ms(5); DQ = 1; // 释放总线 } return dat; } // DS18B20读取温度值 int GetTemp_DS18B20(){ uchar i; uchar TL, TH; int k; Init_DS18B20(); // 初始化DS18B20 Write_DS18B20(0xCC); // 跳过ROM操作,直接进入温度转换模式 Write_DS18B20(0x44); // 启动温度转换 Delay1ms(500); // 等待至少500ms,确保转换完成 Init_DS18B20(); // 重新初始化DS18B20 Write_DS18B20(0xCC); // 跳过ROM操作,直接进入读温度模式 Write_DS18B20(0xBE); // 读取温度寄存器中的值 TL = Read_DS18B20(); // 读取温度低字节 TH = Read_DS18B20(); // 读取温度高字节 k = TH; k <<= 8; k |= TL; return k; } void main(){ uchar i, j, k; int temp; while(1){ temp = GetTemp_DS18B20(); // 读取温度值 temp >>= 4; // 温度值右移4位,保留整数部分 for(i=0; i<4; i++){ j = temp % 10; // 取出当前位的数值 temp /= 10; // 剩下未显示的数值 P1 = digit[j]; // 显示当前位的数值 Delay1ms(5); // 稍作延时 P1 = 0x00; // 关闭当前位显示 k++; // 计数器加1 if(k == 8) k = 0; // 计数器复位 P0 = ~(1 << k); // 切换到下一位数码管 Delay1ms(2); } } } ``` 该程序使用了共阴数码管进行温度显示,需要将P0口连接到数码管的位选端。程序中先调用`Init_DS18B20()`函数初始化DS18B20温度传感器,然后调用`GetTemp_DS18B20()`函数读取温度值。最后使用循环将温度值依次显示在数码管上。 注意:该程序是基于51单片机的,如果使用其他单片机或开发板需要根据具体情况进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值