持续关注阿杰在线更新保姆式蓝桥杯笔记~~坚持日更

目录

一、DS18b20温度传感器简介

附:

单总线系统

二、DS18b20温度传感器原理

三、DS18b20温度传感器内部结构

四、DS18b20温度传感器ROM和暂存器

ROM:

暂存器

五、DS18B20的温度转换规则

六、DS18b20温度传感器操作步骤

七、编程思路

八、代码区


一、DS18b20温度传感器简介

DS18B20本身就是一个温度传感器,只需要将DS18B20的数据引脚和单片机的一个I/O口接上,单片机通过1-Wire(单总线)协议与DS18B20进行通信,读出温度。

CT107D开发板电路图如下:


附:

单总线系统

单总线系统包括一个总线控制器一个或多个从机。DS18B20 总是充当从机。当只有一只从机挂在总线上时,系统被称为“单点”系统;如果由多只从机挂在总线上,系统被称为“多点”。
所有的数据和指令的传递都是从最低有效位开始通过单总线。


二、DS18b20温度传感器原理

三、DS18b20温度传感器内部结构

英文版:

中文版:

四、DS18b20温度传感器ROM和暂存器

ROM:

暂存器

中文版:

英文版:

五、DS18B20的温度转换规则

DS18B20 的核心功能是它的直接读数字的温度传感器。温度传感器的精度为用户可编程的 9,10,11 或 12 位,分别以 0.5℃,0.25℃,0.125℃和 0.0625℃增量递增。在上电状态下默认的精度为 12 位。DS18B20 启动后保持低功耗等待状态;当需要执行温度测量和 AD 转换时,总线控制器必须发出[44h]命令。在那之后,产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中,DS18B20 继续保持等待状态。当 DS18B20 由外部电源供电时,总线控制器在温度转换指令之后发起“读时序”(见单总线系统节),DS18B20 正在温度转换中返回0,转换结束返回 1。如果 DS18B20 由寄生电源供电,除非在进入温度转换时总线被一个强上拉拉高,否则将不会由返回值。寄生电源的总线要求在 DS18B20 供电节详细解释。

​​​​

六、DS18b20温度传感器操作步骤

步骤一:

 

步骤二:

 步骤三:

七、编程思路

Main()
{
Key_Proc()
Seg_Proc()
Led_Proc()
}Time_1() interrupt 3
{++ Key_Slow_Down降速++Seg_Slow_Down  降速Led_Disp()Seg_Disp(seg_buf, pos); //显示刷新if( ++pos == 8 )  pos = 0;
}void Key_Proc(void)//按键处理,底层数据变更
{   //永远不变if(Key_Slow_Down) return;…Key_Down = Key_Value & (Key_Old ^ Key_Value    Key_Old = Key_Value;…//根据代码需求发生变化Key_Down 控制状态信息变化
}void Seg_Proc(void)//显示处理,显示信息生成
{//永远不变if(Seg_Slow_Down) return;Seg_Slow_Down = 1;//减速程序//根据代码需求发生变化根据状态信息,控制显示内容的采集和更换//永远不变Seg_Tran(seg_string, seg_buf);
}void Led_Proc(void)//LED处理,显示信息生成
{显示信息的处理
}

八、代码区

**main.c文件**#include "bsp_init.h"
#include "bsp_led.h"
#include "bsp_seg.h"
#include "bsp_key.h"
#include "timer.h"
#include "onewire.h"
#include "ds1302.h"
#include "stdio.h"//------------------------
/*函数声明*/
void Key_Proc(void);//按键处理,底层数据变更
void Seg_Proc(void);//显示处理,显示信息生成
void Led_Proc(void);//LED处理,LED状态信息表示//------------------------
/*变量声明*///数码管
unsigned char seg_string[10];//放置字符串
unsigned char seg_buf[8];//放置字符串转换后的段码到数组
unsigned char pos;//中断显示专用
//按键
unsigned char Key_Value;//读取按键的数值存储变量
unsigned char Key_Down,Key_Old;//读取按键的数值存储变量
//灯
unsigned char ucLed;//记录LED的状态信息
//减速
unsigned char Key_slow;//按键减速
unsigned char Seg_slow;//按键减速
//ds1302
unsigned char ucRTC[3] = {23,59,55};//数组初始值,里边放的是时分秒的数值
//变化区
unsigned int ms_count;//记录毫秒数据
unsigned char s_count;//记录秒数据unsigned char mode;//界面切换//------------------------
/*main*/
void main()
{Cls_peripheral();//关闭外设Timer1Init();//定时器1初始化,并且使能定时器1中断,1ms进入一次EA = 1;//打开总中断Set_Rtc(ucRTC);//设置RTC时间,23-59-55while(1){Key_Proc();//按键处理,底层数据变更Seg_Proc();//显示处理,显示信息生成Led_Proc();//LED处理,LED状态信息表示}
}//------------------------
/*timer1_interrupt*/
void timer1()interrupt 3
{if(++Key_slow == 10)   Key_slow = 0;if(++Seg_slow == 500) Seg_slow = 0;if(++ms_count == 1000) //记录运行时间 {     s_count++;ms_count = 0;}Seg_Disp(seg_buf,pos);//数码管显示刷新if(++pos == 8)    pos = 0;Led_Disp(ucLed);//LED显示
}//------------------------
/*Key_Proc*/
void Key_Proc(void)//按键处理,底层数据变更
{if(Key_slow)   return;Key_slow = 1;//减速程序Key_Value = Key_Read_BTN();//读取按键按下的编号Key_Down = Key_Value & (Key_Value ^ Key_Old);Key_Old = Key_Value;if(Key_Down)//如果捕捉到下降沿跳变{if(++mode == 3)   mode = 0;//保证mode在0-2之间翻滚}
}//------------------------
/*Seg_Proc*/
void Seg_Proc(void)//显示处理,显示信息生成
{if(Seg_slow)   return;Seg_slow = 1;//减速程序switch(mode){case 0: sprintf(seg_string,"----%04.2f",rd_temperature()/16.0);//读取18b20的温度数值,将要显示的数值打印到字符串当中break;case 1:    Read_Rtc(ucRTC);//读取1302内部时分秒的数据,放到预定义的数组空间中 sprintf(seg_string,"%02d-%02d-%02d",(unsigned int)ucRTC[0],(unsigned int)ucRTC[1],(unsigned int)ucRTC[2]);//将要显示的数值打印到字符串当中break;case 2:  sprintf(seg_string,"-----%03d",(unsigned int)s_count);//将要显示的数值打印到字符串当中   break;}Seg_Tran(seg_string,seg_buf);
}//------------------------
/*Led_Proc*/
void Led_Proc(void)//LED处理,LED状态信息表示
{switch(mode){case 0:   ucLed = 0x03;//让L1 L2两个亮break;case 1:  ucLed = 0x0c;//让L3 L4亮break;case 2:    ucLed = 0x30;//让L5 L6亮break;}
}
**onewire.c文件**#include "onewire.h"sbit DQ = P1^4;单总线延时函数
void Delay_OneWire(unsigned int t)
{unsigned char i;while(t--){for(i=0;i<12;i++);}
}//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(5);DQ = 1;dat >>= 1;}Delay_OneWire(5);}//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;
//  unsigned char index = 0;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1; if(DQ)  {dat |= 0x80;}       Delay_OneWire(5);}return dat;
}//DS18B20初始化
bit init_ds18b20(void)
{bit initflag = 0;DQ = 1;Delay_OneWire(12);DQ = 0;Delay_OneWire(80); // 延时大于480usDQ = 1;Delay_OneWire(10);  // 14initflag = DQ;     // initflag等于1初始化失败Delay_OneWire(5);return initflag;
}//函数名:读取温度函数
//入口参数:无
//返回值:温度高低两个字节
//函数功能:完成温度转换,并返回转换之后的温度数据;
unsigned int rd_temperature(void)
{unsigned char low,high;//返回的温度数据的高低八位init_ds18b20();//步骤一:初始化 Write_DS18B20(0xcc);//步骤二:跳过ROM(ROM操作指令)Write_DS18B20(0x44);//步骤三:进行温度转换(DS18B20功能指令)init_ds18b20();//初始化Write_DS18B20(0xcc);//跳过ROMWrite_DS18B20(0xbe);//读取温度low = Read_DS18B20();//读取低位high = Read_DS18B20();//读取高位 return ((high<<8) | low);
}

巧:

按照这种编程思路,要把驱动代码void Delay_us(void)函数去掉,否则可能去掉BUG。

全局变量初始值皆为0;局部变量初始值则取决于该单元上次使用后的情况。

蓝桥杯_单片机_入门基础知识(七)_DS18b20相关推荐

  1. python入门需要什么基础知识_小学生Python入门基础知识有哪些

    ​画正方形-小学生 Python 入门课 还没开始学就要画正方形啊!会不会太难啊? 今天主要是教大家简化版的程序设计流程,其实和大家在日常生活中做的事情是一样的. 第一步:准备画画的工具包(纸和铅笔) ...

  2. 第十二届_国赛蓝桥杯个人模板_基础篇

    第十二届_国赛蓝桥杯个人模板_网格图_DFS/BFS篇 第十二届_国赛蓝桥杯个人模板_全排列_DFS/BFS篇 第十二届_国赛蓝桥杯个人模板_DP篇 第十二届_国赛蓝桥杯个人模板_数论篇 第十二届_国 ...

  3. 负荷计算的时候assert失败_负荷计算的入门基础知识,小白入门必备!

    负荷计算是电气设计人员必须掌握的一必修课,选导体.设备还有保护开关的选择,电网系统分析,都离不开负荷计算的内容,为此小编特意总结9个负荷计算的入门基础知识,分享给大家,希望能在工作和学习中作为一份参考 ...

  4. 电脑的基础知识_电脑入门基础知识

    电脑入门基础知识 学习电脑应该先了解电脑的基本的组件,然后学习操作,包括键盘.鼠标的使用,能基本使用操作系统,再学习打字. 作为一个电脑小白,想要学习电脑,首先要知道如何操作,学习打字,接着就是熟练使 ...

  5. 学单片机有前景吗?单片机入门基础知识

    任何一个行业,都难免会看到一群喷子,喷行业辣鸡,喷职业苦逼. 最近看到很多喷单片机这个行业的,说这个行业工资低,学的东西又多,没前途. 还不如去学习纯软件,收入上限高. 一.无际对这个行业的看法(当小 ...

  6. 蓝桥杯(单片机开发)训练笔记

    各模块电路分析 电源+CH341模块 电路功能:主要给单片机提供电源和UART串口调试和下载程序.TENTEN 这里整块开发板采用了双路供电.一路采用DC电源接口直接输入5V直流电压:另一路采用USB ...

  7. PHP简单入门基础知识

    PHP简单入门基础知识 作为一个web前端开发者第一天开始学php,整理的以下笔记,笔记并不完善,只是自我觉得和html,js有差别的地方做了下入门笔记 PHP 变量规则: 变量以 $ 符号开头,其后 ...

  8. 单片机自学多久可以成功?学单片机需要什么基础知识?

    单片机自学完全是可以学会的,现在入门的教程可以用泛滥来形容了. 泛滥不代表讲的不好,有些确实讲的非常不错啊. 我也是自学过来的,下面通过我的经历来解答这些问题. 一.单片机自学多久可以成功 我曾经从零 ...

  9. Python培训入门基础知识学什么?

    Python培训基础知识主要是针对一些零基础的同学安排的,虽说Python是相对比较简单的一门编程语言,但是没有基础的同学还是要进行系统的学习,那么Python培训入门基础知识学什么呢?来看看下面小编 ...

  10. NLP汉语自然语言处理入门基础知识介绍

    NLP汉语自然语言处理入门基础知识介绍 自然语言处理定义: 自然语言处理是一门计算机科学.人工智能以及语言学的交叉学科.虽然语言只是人工智能的一部分(人工智能还包括计算机视觉等),但它是非常独特的一部 ...

最新文章

  1. VIM 高校实用配置实践
  2. 根据坐标点鼠标 不移动_工地基本功:别管一致不一致,CAD坐标一次全部导入...
  3. java耗时操作阻塞_spring boot高并发下耗时操作的实现方法
  4. 前端使用正则表达式从接口地址栏取值并将对应的值展示在页面上
  5. mysql映射mapper_Mybatis中Mapper映射文件使用详解
  6. 带你了解FPGA(1)--一些需要了解的概念
  7. Android单元测试 - Sqlite、SharedPreference、Assets、文件操作 怎么测?
  8. 【转载】Android网络开发案例
  9. 中国航空零部件制造行业业十四五投资发展规划及发展前景预测报告2022-2028年版
  10. 微信 0day漏洞复现
  11. python游戏对象_python基础----以面向对象的思想编写游戏技能系统
  12. ubuntu网页邮箱服务器设置,ubuntu配置邮件服务器
  13. 百胜中国拟2025年前开1000家Lavazza咖啡店​;别样肉客开始陆续进驻中国山姆会员商店 | 知消...
  14. 安庆集团-冲刺日志(第四天)
  15. 01-运营可能是一种思维方式
  16. 春风桃李花开夜,秋雨梧桐叶落时——python面向对象三大特征(封装、继承、多态)
  17. RIM Hong Kong地址和地图
  18. 【JavaWeb】Request对象详解
  19. 3.3.1 TextView(文本框)
  20. 软件测试工程师自我介绍范文_高级软件测试工程师自我介绍

热门文章

  1. 实现两个路由器漫游(传统路由器做AP)
  2. 序列化对象互转--Jackson中的ObjectMapper,解决超类派生问题,序列化问题
  3. 学习自旋电子学的笔记04:模拟自旋波在弯曲磁畴壁中传播
  4. 【论文翻译笔记】Seamlessly Unifying Attributes and Items: Conversational Recommendation for Cold-Start User
  5. ADS1256的使用
  6. selenium 操作 IE11--无法开启新窗口
  7. vue之使用 vue-pdf插件
  8. 持续测试(Continuous Testing)
  9. 润乾报表简单报表制作流程(胎盘级教程)
  10. ODL(C版本)安装过程