可以看到,温度传感器DS18B20接在P14上并进行了上拉

sbit DQ=P1^4;

我们通过单总线端口对温度传感器进行控制,步骤如下:

需要注意的是,通过单线总线的所有执行(处理)都从一个初始化序列开始。也就是说所有的操作前都需要初始化一次。

那么先要进行初始化:

根据时序图可以看出,我们需要先拉低,等待480us再拉高,接下来传感器自己拉低,控制完成

void Init_DS18B20(void)//传感器初始化
{DQ=0;Delay500us();DQ=1;Delay500us();
}

初始化完成之后,就可以开始操作了

这时候我们需要用到ROM指令,主要用到三种:忽略、温度转换和读暂存器

第一种:忽略ROM指令

常规来讲,我们需要进行ROM识别来确定到自己想用的外设,但是P14上只有一个温度传感器,所以不需要识别,直接忽略即可

DS18B20_WriteByte(0XCC);

第二种:温度转换指令

Init_DS18B20();
DS18B20_WriteByte(0XCC);
DS18B20_WriteByte(0X44);

第三种:读暂存器指令

在暂存器前需要进行初始化

 Init_DS18B20();DS18B20_WriteByte(0XCC);DS18B20_WriteByte(0XBE);

读数据的过程:

从上到下依次进行读,我们只需要第一、二次读的温度低八位和高八位就够了

 low=DS18B20_ReadByte();//第一次读低八位(byte0)high=DS18B20_ReadByte();//第二次读高八位(byte1)

温度/数据关系:

读写时序

这里注意所有的数据和指令的传递都是从最低有效位开始

写时序:

先拉低,保持15us后DS18B20开始采集,此时若为低电平则DS18B20得到0,高电平则为1,总时长至少保持60us(从拉低到采集完)

void DS18B20_WriteByte(u8 dat)
{   u8 j;for(j=0;j<8;j++){DQ=0;DQ=dat&0X01;//判断最后一位是高电平还是低电平Delay80us();//最低60usdat>>=1;//移位准备进行下一位的传输DQ=1;}
}

读时序:

先拉低,采样后拉高,然后根据DS18B20自身为0或1来读0或1

u8 DS18B20_ReadByte()
{   u8 i;u8 dat=0;for(i=0;i<8;i++){DQ=0;dat>>=1;DQ=1;if(DQ==1){dat|=0X80;}Delay80us();}return dat;
}

整理读到的数据:

低八位的后四位是小数点,高八位的前四位是正负表示,不需要的话需要清除

 temp=high<<4;temp=temp|(low>>4);

如果需要读小数点的话:

temp=high&0x0f;//不显示正负
temp<<=8;
temp=temp|low;
temp=temp*625;//精度为0.0625

最后整体代码

#include <STC15F2K60S2.H>
#include<intrins.h>#define u8 unsigned char
#define u16 unsigned intu8 yi,er,san,si,wu,liu,qi,ba;
u8 tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XFF};
sbit DQ=P1^4;
u8 num,temper,tt;void Allinit(void);
void DS18B20_WriteByte(u8 dat);
u8 TemperGet();
void Init_DS18B20(void);
void Delay500us(void);
void Delay80us();
void Delay100us(void);
u8 DS18B20_ReadByte();
void Display1(u8 yi,u8 er);
void Display2(u8 san,u8 si);
void Display3(u8 wu,u8 liu);
void Display4(u8 qi,u8 ba);
void Delay(u8 ms);void main()
{   yi=10;er=10;san=10;si=10;wu=10;liu=10;qi=10;ba=10;Allinit();Init_DS18B20();DS18B20_WriteByte(0XCC);DS18B20_WriteByte(0X44);while(1){if(++tt==120)//隔一段时间进行显示{tt=0;temper=TemperGet();yi=temper/10;er=temper%10;}Display1(yi,er);Display2(san,si);Display3(wu,liu);Display4(qi,ba);}
}u8 DS18B20_ReadByte()
{   u8 i;u8 dat=0;for(i=0;i<8;i++){DQ=0;dat>>=1;DQ=1;if(DQ==1){dat|=0X80;}Delay80us();}return dat;
}void DS18B20_WriteByte(u8 dat)
{   u8 j;for(j=0;j<8;j++){DQ=0;DQ=dat&0X01;//判断最后一位是高电平还是低电平Delay80us();//最低60usdat>>=1;//移位准备进行下一位的传输DQ=1;}
}u8 TemperGet()//开始工作
{u8 low,high,temp;Init_DS18B20();DS18B20_WriteByte(0XCC);DS18B20_WriteByte(0X44);Delay500us();Init_DS18B20();DS18B20_WriteByte(0XCC);//进行下一个流程DS18B20_WriteByte(0XBE);low=DS18B20_ReadByte();high=DS18B20_ReadByte();temp=high<<4;temp=temp|(low>>4);return temp;
}void Allinit(void)
{P2=0X80;P0=0XFF;//LED灯P2=0XA0;P0=0X00;//蜂鸣器,继电器P2=0XC0;P0=0XFF;//数码管位选    P2=0XE0;P0=0XFF;//数码管全关闭
}void Delatems(int ms)
{int i,j;for(i=0;i<ms;i++)for(j=0;j<845;j++);
}void Delay500us(void)      //@11.0592MHz
{unsigned char i, j;_nop_();_nop_();i = 6;j = 93;do{while (--j);} while (--i);
}void Delay80us()       //@11.0592MHz
{unsigned char i;_nop_();_nop_();_nop_();i = 218;while (--i);
}void Init_DS18B20(void)//传感器初始化
{DQ=0;Delay500us();DQ=1;Delay500us();
}void Display1(u8 yi,u8 er)
{P2=0XC0;P0=0X01;P2=0XE0;P0=tab[yi];Delay(100);P0=0XFF;Delay(150);P2=0XC0;P0=0X02;P2=0XE0;P0=tab[er];Delay(100);P0=0XFF;Delay(150);
}void Display2(u8 san,u8 si)
{P2=0XC0;P0=0X04;P2=0XE0;P0=tab[san];Delay(100);P0=0XFF;Delay(150);P2=0XC0;P0=0X08;P2=0XE0;P0=tab[si];Delay(100);P0=0XFF;Delay(150);
}void Display3(u8 wu,u8 liu)
{P2=0XC0;P0=0X10;P2=0XE0;P0=tab[wu];Delay(100);P0=0XFF;Delay(150);P2=0XC0;P0=0X20;P2=0XE0;P0=tab[liu];Delay(100);P0=0XFF;Delay(150);
}void Display4(u8 qi,u8 ba)
{P2=0XC0;P0=0X40;P2=0XE0;P0=tab[qi];Delay(100);P0=0XFF;Delay(150);P2=0XC0;P0=0X80;P2=0XE0;P0=tab[ba];Delay(100);P0=0XFF;Delay(150);
}void Delay(u8 ms)      //1毫秒@11.0592MHz
{u8 i;for(i=0;i<ms;i++){AUXR |= 0x80;        //定时器时钟1T模式TMOD &= 0xF0;       //设置定时器模式TL0 = 0xCD;       //设置定时初始值TH0 = 0xD4;       //设置定时初始值TF0 = 0;      //清除TF0标志TR0 = 1;      //定时器0开始计时}
}

蓝桥杯单片机温度传感器DS18B20(基于STC15F2K60S2)相关推荐

  1. 蓝桥杯单片机之DS18B20温度传感器

    蓝桥杯单片机之DS18B20温度传感器 简述: 根据提供的芯片数据手册可以获取的信息: ROM操作命令: 存储器操作命令 温度转换及温度获取 温度寄存器格式: 获取温度的具体操作 温度数据处理与数码管 ...

  2. 蓝桥杯单片机(九)DS18B20温度测量(四位小数和负数显示)

    上一次讲了DS18B20的整数温度显示 蓝桥杯单片机(八)DS18B20温度测量(整数显示) 但近几年有出题小数部分的温度显示,首先打开DS18B20的数据手册,如图 通过这张表,我就知道读取数据时, ...

  3. 【蓝桥杯单片机11】单总线温度传感器DS18B20的基本操作

    [蓝桥杯单片机11]单总线温度传感器DS18B20的基本操作 广东职业技术学院 欧浩源 单总线数字温度传感器DS18B20几乎成了各类单片机甚至ARM实验板的标配模块来,在蓝桥杯的往届省赛和国赛中,这 ...

  4. 蓝桥杯单片机DS18B20代码注释及部分时序图

    蓝桥杯单片机蓝桥杯单片机DS18B20代码注释及部分时序图 #include<STC15F2K60S2.H> #include<intrins.h>#define uchar ...

  5. 蓝桥杯单片机DS18b20单总线测温模块常见问题解决

    蓝桥杯单片机DS18b20单总线测温模块常见问题解决 有道是:"溪水声声留我住,梅花朵朵唤人回" DS18b20测温模块作为一个比较简单.稳定的蓝桥杯单片机外设模块, 使用时却经常 ...

  6. 【蓝桥杯单片机芯片STC15F2K60S2 / IAP15F61S2 转51/52直插式 转接板PCB】

    参加过蓝桥杯单片机大学组的小伙伴都知道,有一款蓝色的板子(非比赛用板,训练用的)是插入转接板的(STC15F2K60S2/IAP15F61S2  转51/52直插式的 ),然后我自己做一些小项目的时候 ...

  7. 蓝桥杯单片机 | 特训案例【进阶06】基于PCF8591的DAC模拟电压输出

    [1]题目要求 新建工程,以I/O模式编写代码,在CT107D单片机综合训练平台上,实现以下功能: 1.将IIC总线的底层驱动代码文件正确移植到工程中. 2.将J5配置BTN模式,把S4设置为独立按键 ...

  8. LCD1602的学习和实验(基于蓝桥杯单片机)

    1602液晶屏(LCD) 1602液晶屏可以同时显示16*2即32个字符(16列2行).我用的1602是基于HD44870的,HD44780内置了DDRAM.CGROM和CGRAM: DDRAM(Di ...

  9. 【蓝桥杯单片机(24)】历届单片机客观题及答案解析

    目录 考前冲刺,专栏完结篇 ## 推荐链接: 推荐视频–小蜜蜂老师讲解 赛点资源包下载,提取码:brno 三极管基本知识总结 运算放大电路的基础 第十三届蓝桥杯单片机官方直播课录屏 目录 一些刷题后的 ...

  10. 关于第八届蓝桥杯单片机初赛----电子钟设计的题目分析和编程思路分享

    关于第八届蓝桥杯单片机初赛----电子钟设计的题目分析和编程思路分享 1.前言 蓝桥杯单片机比赛,对于初试者,比如那些没有接触51系列单片机,或者很少编程训练的人而言,确实很有挑战力.而即使对于有基础 ...

最新文章

  1. TensorFlow中的ResNet残差网络实战(1)
  2. Sql Server系列:Transact-SQL概述
  3. 关于python变量使用_Python 基础知识关于变量的定义使用
  4. mysql8jdbc连接串_mysql8 JDBC连接注意事项
  5. 13.配置 influxDB 鉴权及 HTTP API 写数据的方法
  6. 笔记:数据绑定表达式(一)
  7. 三分钟理解Python函数式编程与闭包
  8. 软件设计模式之单例模式
  9. iOS ViewController利用代理页面传值
  10. 自由职业者互联网进化记
  11. CMSIS RTOS API,内核通用API接口
  12. 基于osgEarth的空间态势三维场景视点控制与卫星轨道绘制
  13. codeforces 697C Lorenzo Von Matterhorn(二叉树LCA)
  14. 0基础学c语言txt下载,0基础学C语言.doc
  15. CVPR 2019 论文汇总(按方向进行论文划分)
  16. Web3D开发者兼职副业平台推荐
  17. MathType不能正常右对齐解决方法
  18. 计算机系统要素--第六章,02-HACK汇编编译器实现
  19. 【powerbi】自定义排序
  20. ESB Evaluation

热门文章

  1. ESET_VC52_UPID (nod32激活获取器)V4.2.0.9 绿色版
  2. eclipse中修改xml文件的默认编辑器
  3. linux怎么运维和平精英游戏,和平精英开局怎么玩 和平精英开局玩法介绍
  4. java nio网络编程的一点心得
  5. “AI”与“爱”满格下的百度地图:刻画真实世界,社会责任同行
  6. SpringMVC 工作原理了解吗?
  7. 串口485接法图_RS232转换为RS485的接线方法最好有图
  8. 解读国密非对称加密算法SM2
  9. 关于《训练指南》中的“翻棋子游戏”
  10. 索爱S318小蜜蜂扩音器性能如何?