下面是我的函数
分3个文件:头文件,DS18B20系列子函数文件,主函数部分(既数据处理和显示部分)
头文件

#ifndef __TEMP_H_
#define __TEMP_H_#include<reg52.h>
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint unsigned int
#endifsbit DSPORT=P2^2;void Delay1ms(uint );
uchar Ds18b20Init();
void Ds18b20WriteByte(uchar com);
uchar Ds18b20ReadByte();
void  Ds18b20ChangTemp();
void  Ds18b20ReadTempCom();
int Ds18b20ReadTemp();#endif

DS18B20系列子函数文件,主要是读写一字节和开始转换温度以及读取温度

#include"temp.h"
/*******************************************************************************
*            : Delay1ms*******************************************************************************/void Delay1ms(uint y)
{uint x;for( ; y>0; y--){for(x=110; x>0; x--);}
}
/*******************************************************************************
*            : Ds18b20Init
*                   : ʼ
*              :
*              : ʼɹ1ʧܷ0
*******************************************************************************/uchar Ds18b20Init()
{uchar i;DSPORT = 0;                         //-480us~960usi = 70;         while(i--);DSPORT = 1;  i = 0;while(DSPORT) {Delay1ms(1);i++;if(i>5)//ȴ>5MS{return 0;}}return 1;
}/*******************************************************************************
*            : Ds18b20WriteByt
*              :
*              :
*******************************************************************************/void Ds18b20WriteByte(uchar dat)
{uint i, j;for(j=0; j<8; j++){DSPORT = 0;i++;DSPORT = dat & 0x01;i=6;while(i--);  DSPORT =  1;  dat >>= 1;}
}
/*******************************************************************************
*            : Ds18b20ReadByte*******************************************************************************/uchar Ds18b20ReadByte()
{uchar byte, bi;uint i, j;         for(j=8; j>0; j--){DSPORT = 0;i++;DSPORT = 1;i++;i++;bi = DSPORT;byte = (byte >> 1) | (bi << 7);                                               i = 4;while(i--);}                                 return byte;
}
/*******************************************************************************
*            : Ds18b20ChangTemp
*              :
*              :
*******************************************************************************/void  Ds18b20ChangTemp()
{Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);  Ds18b20WriteByte(0x44);
//        Delay1ms(100);}
/******************************************************************************* *******************************************************************************/void  Ds18b20ReadTempCom()
{         Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);         Ds18b20WriteByte(0xbe);
}
/******************************************************************************* *******************************************************************************/int Ds18b20ReadTemp()
{uchar temp = 0;uchar tmh, tml;Ds18b20ChangTemp();        Ds18b20ReadTempCom();tml = Ds18b20ReadByte();tmh = Ds18b20ReadByte();/*temp = tmh;//temp <<= 8;temp |= tml;*/tml>>=4;tmh<<=4;temp=tml|tmh;return temp;
}

主函数所在文件(主要是读取的数值转换成我们所需的温度以及温度的显示)

/**************************************************************************************
*                     DS18B20温度传感器实验                                                  *
实现现象:下载程序后,在温度传感器接口处,按照丝印方向插好温度传感器,数码管就会显示检测的温度值,
注意事项:
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include"temp.h"  #define u16 unsigned int   //对数据类型进行声明定义
#define u8 unsigned char sbit numchoose=P2^6;
sbit wela=P2^7;/*this code is the num form 0 to F in the LED tube*/
u8 duanxuantable[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};char num=0;
u8 DisplayData[8];
//u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函 数 名         : datapros()
* 函数功能         : 温度读取处理转换函数
* 输    入         : temp
* 输    出         : 无
*******************************************************************************/
u8 datapros(u8 temp)
{float tp;  if(temp>127)             //当温度值为负数{DisplayData[0] = 0x40;     //   -//因为读取的温度是实际温度的补码,所以减1,再取反求出原码temp=temp-1;temp=~temp;tp=temp;
//      temp=tp/2;temp=tp*0.0625*100+0.5;    //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就//算加上0.5,还是在小数点后面。}else{         DisplayData[0] = 0x00;tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量//如果温度是正的那么,那么正数的原码就是补码它本身
//      temp=tp/2;temp=tp*0.625+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就//算加上0.5,还是在小数点后面。}return temp;
}/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能       :数码管显示函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void display(u8 num)
{u8 weitable[]={0,0,0,0};weitable[0]=DisplayData[0];weitable[1]=num/100;weitable[2]=(num/10)%10;weitable[3]=num%10;wela=1;P0=0xfe;wela=0;numchoose=1;P0=duanxuantable[weitable[0]];numchoose=0;delay(100);wela=1;P0=0xfd;wela=0;numchoose=1;P0=duanxuantable[weitable[1]];numchoose=0;delay(100);  wela=1;P0=0xfb;wela=0;numchoose=1;P0=duanxuantable[weitable[2]];numchoose=0;delay(100);wela=1;P0=0xf7;wela=0;numchoose=1;P0=duanxuantable[weitable[3]];numchoose=0;delay(100);
}
/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   u8 temp;u16 i;while(1){display(temp);temp=datapros(Ds18b20ReadTemp());for(i=500;i>0;i--){display(temp);}}
}

主函数部分也可以直接写成这样,不过会导致数码管的个位明显亮于其他位,主文件 部分的主函数解决了这个问题但是会在DS18B20获取温度期间闪烁一下,因为每个命令的输入都要初始化一次,时间太长

void main()
{   while(1){/*datapros(Ds18b20ReadTemp());DigDisplay();while(1){display(datapros(Ds18b20ReadTemp()));}}
}

DS18B20读取温度并显示在数码管上相关推荐

  1. Proteus中如何实现按一次键使得74LS161计数器中数值加一并且显示在数码管上

    Proteus中如何实现按一次键使得74LS161计数器中数值加一并且显示在数码管上 这是74LS161在Proteus中的样子 现在要实现按一次键74LS161计数器就数值加1,按理来说74LS16 ...

  2. 51单片机按键值显示在数码管上,数码管亮度控制,数码管显示原理

    项目场景: 51单片机按下按键在数码管上显示相应的值 问题描述 平常按键检测程序,按下延时消抖,记录一个数字,再按下另一个记录一个数字,然后在一位数码管上显示,就出现了问题.数码管一直显示0 . 下面 ...

  3. 将上面累加器输入的加数、被加数能被输入并显示在数码管上

    好的,那么首先需要使用数字输入按键来输入加数和被加数.然后,您可以使用类似于显示器的设备,如数码管或液晶显示器来显示这两个数字.数码管是一种常用的显示器,它由若干个 LED 灯组成,可以用来显示数字和 ...

  4. 单片机-蓝桥杯 用光敏电阻测量光照强度并显示在数码管上。

    先给大家看下效果  数码管会随光照强度而变化,可以拿手电筒照射 光敏电阻看数码管数值变化 项目工程如下: 首配置一下IIC协议 这个比较基础代码如下: 首先是.c文件 #include "i ...

  5. 使用单片机的串口蓝牙通信写的接收SBUF里的数据,并进行发送执行命令,显示在数码管上,波特率9600

    #include <reg52.h> #include "xs.h" #include "xs1.h" #include "delayms ...

  6. 在六位共阴数码管上最左边一位上显示稳定的数字

    解析 通过P0口对数码管进行位选和段选,由于只使用了一个IO口,为避免数据混乱,通过两个锁存器进行位选和段选的控制: while(1)循环中,先打开了位选端,并通过P0口发送数据0XFE,此时发送的数 ...

  7. 51单片机——在数码管上显示红外遥控器按钮的码值

    /*在数码管上显示红外遥控器按钮的码值*/#include <reg52.h> #define uchar unsigned char sbit dula=P2^6; sbit wela= ...

  8. 51单片机:利用两个按键通过中断分别实现数码管上数字自加自减功能(00——99)

    51单片机:利用两个按键通过中断分别实现数码管上数字自加自减功能(00--99) 功能描述: 开关key1控制实现每按一次,数码管数字加1,实现00-99的循环 开关key2按键按一下实现数码管减1, ...

  9. STC15系列读取DS18B20温度传感器串口显示代码

    STC15系列读取DS18B20温度传感器串口显示代码 调试通过,复制粘贴即编译可使用,无需调试,晶振:22.1184M,串口输出,波特率:115200 为方便大家调试,特附该程序的项目文件,下载打开 ...

最新文章

  1. 二维码Data Matrix编码、解码使用举例
  2. 鸿蒙系统几点更新,鸿蒙系统正式上线,第一批可升级鸿蒙系统手机公布,网友:终于等到了...
  3. UNIX再学习 -- 网络IPC:套接字
  4. Deepin v20系统关机或重启的时候提示unattended upgrades shutdown的解决办法
  5. linux脚本的数据输出到excel,使用shell实现Excel表格导出功能 | 剑花烟雨江南
  6. WCF服务自托管(Self-Hosting)
  7. Kotlin学习笔记26 协程part6 协程与线程的关系 Dispatchers.Unconfined 协程调试 协程上下文切换 Job详解 父子协程的关系
  8. (69)Verilog HDL测试激励:时钟激励2
  9. python list中append()与extend()用法
  10. tensorflow没有这个参数_解决TensorFlow中Batch Normalization参数没有保存的问题
  11. Java导出源程序_JAVA导出项目的所有源代码到一个文件
  12. Web前端JavaScript笔记(4)节点
  13. 一个人想生存发展具备3大关键
  14. dateformat java 并发_SimpleDateFormat并发隐患及其解决
  15. 阵列信号处理——求根MUSIC算法(Root MUSIC)
  16. Java 上机----实训操作6---汽车类
  17. 前端架构之 React 领域驱动设计
  18. 《歌手》2019歌王之战红毯众星云集 总决赛选曲透玄机
  19. Parallel Tracking and Verifying: A Framework for Real-Time and High Accuracy(PTAV)论文笔记
  20. 《FLUENT 14.0超级学习手册》——第1章 流体力学与计算流体力学基础1.1 流体力学基础...

热门文章

  1. 【Android】手机远程登录Windows服务器(使用Rd Client)
  2. echarts折线图常见配置项 分割线虚线样式 显示y轴符号 设置间隔
  3. 基于YOLO目标检测及OpenCV实现的游戏代玩人工智能体(Auto Gaming Agent) [3] (更新)
  4. python写论文难吗_师兄一年发表5篇CSSCI,原来高手也用套路……
  5. 读文章笔记(八):多模态情感分析数据集整理
  6. 为什么计算机不显示u盘,电脑不显示u盘盘符_电脑不显示u盘怎么回事
  7. 初中数学老师计算机培训反思,初中数学老师考试反思
  8. 最短路径算法(上)——迪杰斯特拉(Dijikstra)算法
  9. 不看后悔系列:强烈推荐的一款截图神器
  10. 红黑树调整(漫画版)