外型:

代码:

main.c 文件#include "smg.h"
#include "ds18b20.h"/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   u8 i=0;int temp_value;u8 temp_buf[6];ds18b20_init();//初始化DS18B20while(1){              i++;if(i%50==0)//间隔一段时间读取温度值,间隔时间要大于温度传感器转换温度时间temp_value=ds18b20_read_temperture()*10;//保留温度值小数后一位if(temp_value<0)//负温度{temp_value=-temp_value;temp_buf[0]=0x40;//显示负号    }else// temp_buf[0]=0x00;//不显示//temp_buf[1]=gsmg_code[temp_value/1000];//百位temp_buf[2]=gsmg_code[temp_value%1000/100];//十位temp_buf[3]=gsmg_code[temp_value%1000%100/10]|0x80;//个位+小数点temp_buf[4]=gsmg_code[temp_value%1000%100%10];//小数点后一位temp_buf[5]=0x39;         //显示Csmg_display(temp_buf,3);}
}
ds18b20.c 文件#include "ds18b20.h"
#include "intrins.h"/*******************************************************************************
* 函 数 名         : ds18b20_reset
* 函数功能         : 复位DS18B20
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ds18b20_reset(void)
{DS18B20_PORT=0;   //拉低DQdelay_10us(75);   //拉低750usDS18B20_PORT=1;   //DQ=1delay_10us(2);   //20US
}/*******************************************************************************
* 函 数 名         : ds18b20_check
* 函数功能         : 检测DS18B20是否存在
* 输    入         : 无
* 输    出         : 1:未检测到DS18B20的存在,0:存在
*******************************************************************************/
u8 ds18b20_check(void)
{u8 time_temp=0;while(DS18B20_PORT&&time_temp<20)   //等待DQ为低电平{time_temp++;delay_10us(1); }if(time_temp>=20)return 1; //如果超时则强制返回1else time_temp=0;while((!DS18B20_PORT)&&time_temp<20)   //等待DQ为高电平{time_temp++;delay_10us(1);}if(time_temp>=20)return 1;  //如果超时则强制返回1return 0;
}/*******************************************************************************
* 函 数 名         : ds18b20_read_bit
* 函数功能         : 从DS18B20读取一个位
* 输    入         : 无
* 输    出         : 1/0
*******************************************************************************/
u8 ds18b20_read_bit(void)
{u8 dat=0;DS18B20_PORT=0;_nop_();_nop_();DS18B20_PORT=1; _nop_();_nop_(); //该段时间不能过长,必须在15us内读取数据if(DS18B20_PORT)dat=1;  //如果总线上为1则数据dat为1,否则为0else dat=0;delay_10us(5);return dat;
} /*******************************************************************************
* 函 数 名         : ds18b20_read_byte
* 函数功能         : 从DS18B20读取一个字节
* 输    入         : 无
* 输    出         : 一个字节数据
*******************************************************************************/
u8 ds18b20_read_byte(void)
{u8 i=0;u8 dat=0;u8 temp=0;for(i=0;i<8;i++)//循环8次,每次读取一位,且先读低位再读高位{temp=ds18b20_read_bit();dat=(temp<<7)|(dat>>1);}return dat;
}/*******************************************************************************
* 函 数 名         : ds18b20_write_byte
* 函数功能         : 写一个字节到DS18B20
* 输    入         : dat:要写入的字节
* 输    出         : 无
*******************************************************************************/
void ds18b20_write_byte(u8 dat)
{u8 i=0;u8 temp=0;for(i=0;i<8;i++)//循环8次,每次写一位,且先写低位再写高位{temp=dat&0x01;//选择低位准备写入dat>>=1;//将次高位移到低位if(temp){DS18B20_PORT=0;_nop_();_nop_();DS18B20_PORT=1;  delay_10us(6);}else{DS18B20_PORT=0;delay_10us(6);DS18B20_PORT=1;_nop_();_nop_();  }   }
}/*******************************************************************************
* 函 数 名         : ds18b20_start
* 函数功能         : 开始温度转换
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ds18b20_start(void)
{ds18b20_reset();//复位ds18b20_check();//检查DS18B20ds18b20_write_byte(0xcc);//SKIP ROMds18b20_write_byte(0x44);//转换命令
}/*******************************************************************************
* 函 数 名         : ds18b20_init
* 函数功能         : 初始化DS18B20的IO口 DQ 同时检测DS的存在
* 输    入         : 无
* 输    出         : 1:不存在,0:存在
*******************************************************************************/
u8 ds18b20_init(void)
{ds18b20_reset();return ds18b20_check();
}/*******************************************************************************
* 函 数 名         : ds18b20_read_temperture
* 函数功能         : 从ds18b20得到温度值
* 输    入         : 无
* 输    出         : 温度数据
*******************************************************************************/
float ds18b20_read_temperture(void)
{float temp;u8 dath=0;u8 datl=0;u16 value=0;ds18b20_start();//开始转换ds18b20_reset();//复位ds18b20_check();ds18b20_write_byte(0xcc);//SKIP ROMds18b20_write_byte(0xbe);//读存储器datl=ds18b20_read_byte();//低字节dath=ds18b20_read_byte();//高字节value=(dath<<8)+datl;//合并为16位数据if((value&0xf800)==0xf800)//判断符号位,负温度{value=(~value)+1; //数据取反再加1temp=value*(-0.0625);//乘以精度    }else //正温度{temp=value*0.0625; }return temp;
}
ds18b20.h 文件#ifndef _ds18b20_H
#define _ds18b20_H#include "smg.h"//管脚定义
sbit DS18B20_PORT=P3^7;    //DS18B20数据口定义//函数声明
u8 ds18b20_init(void);
float ds18b20_read_temperture(void);#endif
smg.c 文件#include "smg.h"//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*******************************************************************************
* 函 数 名       : delay_10us
* 函数功能       : 延时函数,ten_us=1时,大约延时10us
* 输    入       : ten_us
* 输    出         : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{while(ten_us--);
}
/*******************************************************************************
* 函 数 名       : smg_display
* 函数功能       : 动态数码管显示
* 输    入       : dat:要显示的数据pos:从左开始第几个位置开始显示,范围1-8
* 输    出         : 无
*******************************************************************************/
void smg_display(u8 dat[],u8 pos)
{u8 i=0;u8 pos_temp=pos-1;for(i=pos_temp;i<8;i++){switch(i)//位选{case 0: LSC=1;LSB=1;LSA=1;break;case 1: LSC=1;LSB=1;LSA=0;break;case 2: LSC=1;LSB=0;LSA=1;break;case 3: LSC=1;LSB=0;LSA=0;break;case 4: LSC=0;LSB=1;LSA=1;break;case 5: LSC=0;LSB=1;LSA=0;break;case 6: LSC=0;LSB=0;LSA=1;break;case 7: LSC=0;LSB=0;LSA=0;break;}SMG_A_DP_PORT=dat[i-pos_temp];//传送段选数据delay_10us(100);//延时一段时间,等待显示稳定SMG_A_DP_PORT=0x00;//消音}
}
smg.h 文件#ifndef _smg_H
#define _smg_H#include "reg52.h"typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;#define SMG_A_DP_PORT  P0  //使用宏定义数码管段码口//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;extern u8 gsmg_code[17];void smg_display(u8 dat[],u8 pos);
void delay_10us(u16 ten_us);
#endif

运行结果:

51单片机基础之DS18B20温度传感器相关推荐

  1. 51单片机学习:DS18B20温度传感器实验

    实验名称:DS18B20温度传感器实验 接线说明:     实验现象:下载程序后,插上DS18B20温度传感器,数码管显示检测的温度值 注意事项:注意温度传感器的方向,在接口处我们已经用丝印画了一个凸 ...

  2. 51单片机学习之DS18B20温度传感器

    DS18B20学习 翻了大车,貌似接反了,模块特别烫,坏了 DS18B20接线很简单,但是对时序的要求特别高. 初始化 (1).数据线拉到低电平"0". (2).延时480微妙(该 ...

  3. 【51单片机】DS1302+ DS18b20+LCD1602时钟仿真

    [51单片机]DS1302+ DS18b20+LCD1602时钟仿真 ✨演示效果 工程简介 DS1302提供实时时钟/日历和31字节的静态RAM,它经过一个简单的串行接口与微处理器通信,实时时钟/日历 ...

  4. STM32单片机学习(11) DS18B20温度传感器实验

    STM32单片机学习(11) DS18B20温度传感器实验 本程序主要实现 DS18B20温度传感器数据获取,并利用串口通信把温度数据传至计算机 注:使用普中科技开发板测试时,需要拔掉Boot1插口, ...

  5. 【Proteus仿真】51单片机汇编实现DS18B20+LCD1602显示

    [Proteus仿真]51单片机汇编实现DS18B20+LCD1602显示 Proteus仿真 汇编代码(.asm) ;**************************************** ...

  6. 【C51单片机学习笔记----DS18B20温度传感器LCD1602液晶屏直流电机调速与呼吸灯AD模数转换红外外部中断】

    文章目录 一.DS18B20温度传感器 1.DS18B20温度传感器连接原理图 2.DS18B20温度传感器单总线通信时序 3.DS18B20温度传感器代码模块 二.LCD1602液晶屏 1.LCD1 ...

  7. 智慧农场,51单片机上实现DS18B20与YL69土壤湿度传感器,并将两个获取的数据在LCD上显示出来

    上一篇我说了我们做的是两个模块,但是介于DS18B20的资料太多,我就不再阐述,直接给最终的代码. 该代码是将温度传感器与YL69湿度传感器获取的数据在51单片机LCD上显示出来 #include & ...

  8. (三)51单片机基础——独立按键与数码管

    从小就对电器元件比较感兴趣吧,经常拿坏的电器里面的芯片拆下来玩,甚至那些没坏的电器,比如我家的电视,也会希望它能坏掉,我好去看看里面是什么样子的,为什么能播放节目--,所以我第一眼看到51单片机的时候 ...

  9. 51单片机定时器中断怎么用-------51单片机基础篇

    首先,什么时定时器,简单来说可以比喻为一个闹钟,当你把他打开以后,他就会每秒动一下,+1,+1,+1,+1,如果你设置了某一个时间点闹钟会向以后,那么当闹钟的时间点+1,+1,+1,+到了你设置的时间 ...

最新文章

  1. openlayers2中selectcontrol用法
  2. 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权-百度版...
  3. 前端学习(1423):ajax错误处理
  4. 目标检测发展路程(一)——Two stage
  5. Spring Data JPA 从入门到精通~Criteria概念的简单介绍
  6. Linux 下rpm包搭建LAMP环境
  7. mysql 分区 mycat 分片_Mysql系列六:(Mycat分片路由原理、Mycat常用分片规则及对应源码介绍)...
  8. c 语言矩阵求逆算法,矩阵的逆 C 语言 算法一
  9. Git(6)-- 记录每次更新到仓库图文版(git clone、status、add、diff、commit、rm、mv命令详解)
  10. OC typedef(起别名)
  11. 格雷码与二进制之间的转换
  12. Http请求报文解析
  13. python修改pdf文字_以编程方式更改PDF中文本的字体颜色
  14. python找色_python坐标找色
  15. vs括号对齐和vs设置背景图片
  16. 2020建模穿越沙漠第一关python代码
  17. 如何在EXCEL里画正态分布图
  18. 运动酒店,如何“奇袭”文旅产业精准蓝海赛道——缤跃酒店
  19. 学会感谢--谈辞职信的写法
  20. freecommander 快捷键列表 zz

热门文章

  1. 赋予人工智能记忆的人,带你梳理深度学习核心算法
  2. python tkinter链接数据库的图书借阅系统
  3. 没事别惹程序员_他们可是能毁灭地球的生物
  4. 2023江西理工大学考研择校
  5. GJB151B CS106测试方法
  6. 科技卡牌,PVC(奇怪的游戏增加了)
  7. 2023年陕西中级工程师职称怎么评?
  8. liux常用命令收集
  9. 网络工程师--网络规划和设计案例分析(7)
  10. Unity开发4 资源、商店、地形的绘制