温馨提示:读者若要彻底理解并会灵活使用DS18B20温度传感器,请详细阅读中文手册,并且对照代码注释充分分析代码。请不要觉得中文手册内容繁多!如能静心分析,定能深有体会,获益匪浅!

一、DS18B20中文手册(节选)

主函数操作顺序(执行序列)

功能指令

数码管温度计详解代码如下:

#include <reg52.h>
#include <intrins.h>
#define MAIN_Fosc     11059200UL    //宏定义主时钟HZ
/*====================================自定义类型名
====================================*/
typedef unsigned char INT8U;
typedef unsigned char uchar;typedef unsigned int INT16U;
typedef unsigned int uint;/*====================================硬件接口位声明
====================================*/
sbit DS  = P2^2;   //DS18B20单总线
sbit DU  = P2^6;   //数码管段选
sbit WE  = P2^7;   //数码管位选
/*====================================
共阴极数码管段选码
====================================*/
uchar code table[]={
//0        1     2     3     4     5     6     7     8
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,
//9     A     B       C     D       E     F        -     .      关显示
0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x80, 0x00};/*====================================
数码管位选码
====================================*///第1位    2位      3位     4位   5位    6位      7位    8位
uchar code T_COM[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};//数码管位码/*====================================
函数:void Delay_Ms(INT16U ms)
参数:ms,毫秒延时形参
描述:12T 51单片机自适应主时钟毫秒级延时函数
====================================*/
void Delay_Ms(INT16U ms)
{INT16U i;do{i = MAIN_Fosc / 96000; while(--i);   //96T per loop}while(--ms);
}
/*us延时函数,执行一次US--所需6.5us进入一次函数需要11.95us*/
void Delay_us(uchar us)
{while(us--);
}
/*====================================
函数:void Display(INT16U Value)
参数:Value,显示值 取值0-65535
描述:共阴极数码管显示函数可显示一个字节的数
====================================*/
void Display(INT16U Value)            //注意由于需要显示的数大于一个字节所有形参需为int型
{
//------------------------------DU = 0;                            //关闭段选P0 = table[Value/100];        //数码管显示百位DU = 1;                            //打开段选DU = 0;                            //关闭段选WE = 0;                        //关闭位选P0 = T_COM[0];                //第一位数码管WE = 1;                        //打开位选WE = 0;                        //关闭位选Delay_Ms(3);
//-------------------------------DU = 0;P0 = table[Value%100/10]|0x80; //显示十位DU = 1;DU = 0;WE = 0;P0 = T_COM[1];              //第二位数码管WE = 1;WE = 0;Delay_Ms(3);
//-------------------------------DU = 0;P0 = table[Value%10];        //显示个位DU = 1;DU = 0;WE = 0;P0 = T_COM[2];                //第三位数码管WE = 1;WE = 0;Delay_Ms(3);
}
/*单总线初始化时序*/
/*出始化时序里包含了复位DS18B20和接收DS18B20返回的存在信号*/
bit ds_init()
{bit i;DS = 1;_nop_();DS = 0;Delay_us(75); //拉低总线499.45us 挂接在总线上的18B20将会全部被复位DS = 1; //释放总线(检测到上升沿)Delay_us(4); //延时37.95us 等待18B20发回存在信号(存在脉冲)i = DS;Delay_us(20); //141.95usDS = 1;_nop_();return (i);    //返回一个存在信号
}
/*写一个字节*/
void write_byte(uchar dat)
{uchar i;for(i=0;i<8;i++){DS = 0;_nop_();//产生些时序DS = dat & 0x01; //0000 0001Delay_us(10);//76.95usDS = 1; //释放总线准备下一次数据写入_nop_();dat >>= 1;}
}uchar read_byte()
{uchar i, j, dat;for(i=0;i<8;i++){DS = 0;_nop_();//产生读时序 1us,延时一个指令周期,空指令DS = 1;    //释放总线_nop_(); //延时时间可以通过单步调试来计算j = DS;Delay_us(10);//76.95usDS = 1;_nop_();dat = (j<<7)|(dat>>1);    }return (dat);
}
void main()
{uint i;uchar L, M;while(1){ds_init();//初始化DS18B20write_byte(0xcc);//发送跳跃ROM指令write_byte(0x44);//发送温度转换指令ds_init();//初始化DS18B20write_byte(0xcc);//发送跳跃ROM指令(注意:当只有一只从机在总线上时,无论如何,//忽略ROM指令之后只能跟着发出一条暂存器指令【BEh】)write_byte(0xbe);//读取DS18B20暂存器值,读取将从字节0开始,一直进行下去,直到第9字节(字节8,CRC)读完L = read_byte();//总线控制器在发出温度转换指令之后进行读时序M = read_byte();//总线控制器在发出温度转换指令之后进行读时序i = M; //高速暂存器(共8位),详见中文手册i <<= 8; //将最低位移至高位i |= L;                        i = i * 0.0625 * 10 + 0.5;Display(i);}
}

LCD1602温度显示

#include <reg52.H>
#include <intrins.H>
#include <math.H>#define uchar unsigned char#define uint unsigned intsbit dula = P2^6;//数码管段选sbit wela = P2^7;//数码管位选sbit rw = P3^6; //LCD1602读/写选择端sbit RS = P3^5;//LCD1602数据/命令选择端  sbit LCDEN = P3^4; //LCD1602使能端void delayUs()
{_nop_();  //空指令,延时一个指令周期
}void delayMs(uint a)
{uint i, j;for(i = a; i > 0; i--)for(j = 100; j > 0; j--);}void writeComm(uchar comm) //写指令
{RS = 0;    P0 = comm;LCDEN = 1;delayUs();LCDEN = 0;delayMs(1);
}//写数据:RS=1, RW=0;
void writeData(uchar dat)
{RS = 1;P0 = dat;LCDEN = 1;delayUs();LCDEN = 0;delayMs(1);}void init() //LCD1602初始化函数{rw = 0; //LCD1602读/写选择端dula = wela = 0;writeComm(0x38);//LCD1602显示设置writeComm(0x0c);//开显示 writeComm(0x06);//当读或写一个字符后地址指针加一,且光标加一writeComm(0x01);//清屏指令
}void writeString(uchar * str, uchar length)//LCD1602写字符串
{uchar i;for(i = 0; i < length; i++){writeData(str[i]);}}/**//*****************************DS18B20*******************************//*温馨提示:读者若要彻底理解并会灵活使用DS18B20温度传感器,请详细阅读
中文手册,并且对照代码注释充分分析代码。如能静心分析,定能深有体会,获
益匪浅!*/
sbit ds = P2^2;
void dsInit()//初始化,详见中文手册{unsigned int i;  ds = 0;i = 100;  while(i>0) i--;    //用于延时(严格按照时序来写)ds = 1;   i = 4;while(i>0) i--;}void dsWait()//等待信号{unsigned int i;while(ds);  while(~ds);i = 4;while(i > 0) i--;
}bit readBit()//读一个bit位,一节数据共8个bit位,故后面会连续读到8次来实现读一个字节的数据
{unsigned int i;bit b;ds = 0;i++;   ds = 1; i++; i++;  b = ds;i = 8; while(i>0) i--;return b;//返回数据
}unsigned char readByte() //读一个字节的数据
{unsigned int i;unsigned char j, dat;dat = 0;for(i=0; i<8; i++)//每一次读一位,一节数据共8位,读8次{j = readBit();dat = (j << 7) | (dat >> 1);}return dat;
}void writeByte(unsigned char dat)//写一节数据
{unsigned int i;unsigned char j;bit b;for(j = 0; j < 8; j++)//每次写一位,写8次{b = dat & 0x01;//取最低位,从最低位泄气dat >>= 1; //右移一位   if(b)   {ds = 0;         i++; i++;//延时以产生时序  ds = 1;    i = 8;while(i>0) i--; //延时以产生时序 }else  {ds = 0;i = 8;while(i>0) i--;//延时以产生时序  ds = 1;i++; i++;//延时以产生时序}}
}void sendChangeCmd()//发送指令
{dsInit();    dsWait();   delayMs(1);    writeByte(0xcc);//发送跳跃ROM指令(注意:当只有一只从机在总线上时,无论如何,//忽略ROM指令之后只能跟着发出一条暂存器指令【BEh】)writeByte(0x44);//发送温度转换指令
}void sendReadCmd()//读操作
{dsInit();dsWait();delayMs(1);writeByte(0xcc);//发送跳跃ROM指令 writeByte(0xbe);//发送温度转换指令
}int getTmpValue()  //获取温度值
{unsigned int tmpvalue;int value; float t;unsigned char low, high;sendReadCmd();low = readByte(); high = readByte();tmpvalue = high;tmpvalue <<= 8;tmpvalue |= low;value = tmpvalue;t = value * 0.0625;value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5return value;
}void display(int v) //LCD1602显示内容设置
{unsigned char count;unsigned char datas[] = {0, 0, 0, 0, 0};unsigned int tmp = abs(v);datas[0] = tmp / 10000;datas[1] = tmp % 10000 / 1000;datas[2] = tmp % 1000 / 100;datas[3] = tmp % 100 / 10;datas[4] = tmp % 10;writeComm(0xc0+3);if(v < 0){writeString("- ", 2);}else{writeString("+ ", 2);}if(datas[0] != 0){writeData('0'+datas[0]);}for(count = 1; count != 5; count++){writeData('0'+datas[count]);if(count == 2){writeData('.');}}
}
/**//*****************************DS18B20*******************************/void main()
{uchar table[] = "  xianzaiwendu: ";sendChangeCmd();init();writeComm(0x80);writeString(table, 16);//发送"  xianzaiwendu: "while(1){delayMs(1000); //温度转换时间需要750ms以上writeComm(0xc0);display(getTmpValue());//通过LCD1602显示温度转换值sendChangeCmd();//发送转换指令}
}

最后希望我的分享对你有所帮助!敬请关注,持续更新!

51单片机DS18B20温度传感器使用及数码管温度计、LCD1602温度显示代码详解相关推荐

  1. 51单片机DS18B20温度传感器及数码管显示温度

    51单片机DS18B20温度传感器及数码管显示温度 大家好,今天给大家带来的代码及原理解释是,在51单片机在接收DS18B20温度传感器数据,并且在数码管上实时显示温度 DS18B20及数码管显示温度 ...

  2. 51单片机~DS18B20温度传感器

    51单片机~DS18B20温度传感器 (一)简介说明: (二)接线: 1. 内部结构: 正温度前五位是0. 负温度前五位是1. 由LS,MS组成的四位十六进制数,和16位二进制数.(先MS后LS) 结 ...

  3. 51单片机 | DS18B20 温度传感器实验

    文章目录 一.DS18B20介绍 二.硬件设计 三.软件设计 1.数码管显示函数 2.DS18B20 初始化函数及温度读取函数 4.主函数 四.实验现象   这一节我们来学习精度较高的外部 DS18B ...

  4. 51单片机DS18B20温度传感器原理及实验

    目录 DS18B20简介 外部结构 内部结构 数据温度的读取 实验 程序实现 附 DS18B20简介 DS18B20 是由 DALLAS 半导体公司推出的一种的"一线总线(单总线)" ...

  5. 4.5 51单片机-DS18B20温度传感器

    4.5 DS18B20温度传感器 4.5.1 原理图介绍 图4-5-1 图4-5-2 实验板上的DS18B20模块接在单片机的P3.5 IO口上,在插入DS18B20芯片时,圆弧朝上插入,具体效果可以 ...

  6. 51单片机DS18B20温度传感器详解

    DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点.单总线,意味着没有时钟线,只有一根通信线.单总线读写数据是靠控制起始时间和 ...

  7. 51单片机——DS18B20温度传感器

    目录 DS18B20特性 内部存储器表 ROM指令表 RAM指令表 DS18B20暂存器表 单个DS18B20温度转换过程 温度读取及计算 配置寄存器(分辨率) 读写时序 复位及存在检测 写时序 读时 ...

  8. 51单片机~运放控制声控电路,运算放大器(各模式精细详解),NE555时基电路芯片分析

    51单片机~运放控制声控电路 (一)驻极体话筒: (二)运算放大器: 说明:在使用时V+和V-之间没有压差不进行电路放大,但是一旦有了压差,就成为运算放大器, (1)单电源:V+ > V-时,输 ...

  9. 51单片机DS18B20温度传感器

    DS18B20 DS18B20 是单线接口数字温度传感器,测量范围是-55℃-+125℃,-10℃-+85℃范围内精 度是±0.5℃,测量分辨率为 9-12 位(复位值为 12 位,最大转换时间为 7 ...

最新文章

  1. vue Iframe
  2. Cocos 技术派:实时竞技小游戏技术实现分享
  3. PHP定时抽奖怎么实现的,PHP 实现抽奖逻辑
  4. Intel Core Enhanced Core架构/微架构/流水线 (15) - 先进智能缓存
  5. 计算机组成原理浮点数左移规则,2020考研计算机组成原理知识点:浮点数的表示和运算...
  6. 怎么做应力应变曲线_金属薄板塑性应变比ISO 10113:2020 解读
  7. laravel Ajax请求 X-CSRF验证问题
  8. FasterRCNN调试笔记
  9. 2018看得见的未来:数字化医疗发展三大看点
  10. 韩立刚《计算机网络》| 第6章 应用层
  11. oracle imp命令参数,oracle exp和imp命令参数详解
  12. 如何在ubuntu上解压压缩包
  13. “时间的朋友”2017跨年演讲全回顾
  14. [VT虚拟化驱动]利用EPT实现无痕HOOK
  15. php实现word文档在线浏览功能,配置安装手记
  16. matlab syms min,科学网—Matlab中的syms与conj - 孔令才的博文
  17. Android按钮滚动条,Android自定义Seekbar滑动条,Pop提示跟随滑动按钮一起滑动
  18. 阅读理解(1)|TED演讲_20岁光阴不再来
  19. 计算机CPU性能提升
  20. 安全交流:浅谈sql注入式(SQL injection)攻击与防范

热门文章

  1. python jieba模块基本命令讲解
  2. webpack打包生成的map文件_Webpack的source map
  3. Android 弹框菜单系列之王者荣耀设置PopupWindow
  4. 锐捷深入油田场景 助力胜利油田生产物联网通向“新胜利”之路
  5. mvn打包springboot项目,打包时报错:子模块找不到找不到父模块所配置的信息,<relativePath /> 所引发的问题
  6. kali linux 简单介绍
  7. 小程序引入字体注意点
  8. vim-plug 安装失败
  9. android自定义键盘监听输入框,Android 自定义键盘的车牌输入框
  10. 『津津乐道播客』#139. 日本异闻录·三句日语,就在涩谷推倒了她们