/*******************************************

程序功能:利用单线制DS18B20温度传感器

LED数码管显示当前的温度值

********************************************/

#include <reg51.h>                 //DS18B20温度传感器程序

code unsigned char seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,

0x82,0xf8,0x80,0x90,0xff}; //不带小数点的共阳数码管段码

code unsigned char seg7codeB[]={0x40,0x79,0x24,0x30,0x19,0x12,

0x02,0x78,0x00,0x10,0xff}; //带小数点的共阳数码管段码

sbit DQ=P3^6; //数据传输线接单片机的相应的引脚

unsigned char tempL=0; //设全局变量

unsigned char tempH=0;

unsigned int sdata;//测量到的温度的整数部分

unsigned char xiaoshu1;//小数第一位

unsigned char xiaoshu2;//小数第二位

unsigned char xiaoshu;//两位小数

bit  fg=1;        //温度正负标志

//******************延时子程序 *******************************

//这个延时程序的具体延时时间是time=i*8+10,适用于小于2ms的延时

//************************************************************

void delay(unsigned char i)

{

for(i;i>0;i--);

}

//***********************************************************

//                     延时子程序

//************************************************************

void delay1ms()

{

unsigned char i;

for(i=124;i>0;i--);  //延时124*8+10=1002us

}

//*****************************初始化程序 *********************************//

Init_DS18B20(void)

{

unsigned char x=0;

DQ=1; //DQ先置高

delay(8); //稍延时

DQ=0; //发送复位脉冲

delay(80); //延时(>480us)

DQ=1; //拉高数据线

delay(5); //等待(15~60us)

x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1

delay(20);

}

//**********读一个字节************//

ReadOneChar(void)  //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号

{

unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期

unsigned char dat=0;

for (i=8;i>0;i--) //一个字节有8位

{

DQ=1;

delay(1);

DQ=0;

dat>>=1;

DQ=1;

if(DQ)

dat|=0x80;

delay(4);

}

return(dat);

}

//*********************** **写一个字节**************************//

WriteOneChar(unsigned char dat)

{

unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,

for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。

{

DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。

DQ=dat&0x01;

delay(5);

DQ=1;

dat>>=1;

}

delay(4);

}

//读温度值(低位放tempL;高位放tempH;)

ReadTemperature(void)

{

Init_DS18B20(); //初始化

WriteOneChar(0xcc); //跳过读序列号的操作

WriteOneChar(0x44); //启动温度转换

delay(125); //转换需要一点时间,延时

Init_DS18B20(); //初始化

WriteOneChar(0xcc); //跳过读序列号的操作

WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)

tempL=ReadOneChar(); //读出温度的低位LSB

tempH=ReadOneChar(); //读出温度的高位MSB

if(tempH>0x7f)      //最高位为1时温度是负

{

tempL=~tempL;         //补码转换,取反加一

tempH=~tempH+1;

fg=0;      //读取温度为负时fg=0

}

sdata = tempL/16+tempH*16;      //整数部分

xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位

xiaoshu2 = (tempL&0x0f)*100/16%10;//小数第二位

xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位

}

//********************显示函数****************

void Led(unsigned int date)

{

if(fg==1)

{

P2=0xfe;     //P1.0=0,选通第一位

P0=seg7code[date/10];  //十位数,查表,输出

delay1ms();

P0=0xff;        //消隐

P2=0xfd;     //P1.1=0,选通第二位,个位数

P0=seg7codeB[date%10];

delay1ms();

P0=0xff;       //消隐

P2=0xfb;     //P1.3=0,选通第三位,小数点第一位

P0=seg7code[xiaoshu1];

delay1ms();

P0=0xff;         //消隐

P2=0xf7;     //P1.3=0,选通第四位,小数点第二位

P0=seg7code[xiaoshu2];

delay1ms();

P0=0xff;       //消隐

}

if(fg==0)  //温度为负时显示的数据

{

P2=0xfe;     //P1.0=0,选通第一位

P0=seg7code[11];  //显示负号

delay1ms();

P0=0xff;        //消隐

P2=0xfd;     //P1.1=0,选通第二位,十位数

P0=seg7code[date/10];

delay1ms();

P0=0xff;       //消隐

P2=0xfb;     //P1.3=0,选通第三位,个位数

P0=seg7codeB[date%10];

delay1ms();

P0=0xff;         //消隐

P2=0xf7;     //P1.3=0,选通第四位,小数点第一位

P0=seg7code[xiaoshu1];

delay1ms();

P0=0xff;       //消隐

}

}

//**************************** //主程序

main()

{

while(1)

{

ReadTemperature();

Led(sdata);

}

}

单线制DS18B20温度传感器LED数码管显示当前的温度值的更多相关文章

  1. 音响音箱/恒温壶/电量显示/电子数字时钟等LED数码管显示驱动IC-VK1640B 8段12位/12段8位显示

    市面上最常用的数码管为七段/八段显示,八段数码管比七段数码管多一个发光二极管单元(比七段数码管多一个点),又按能显示多少个"8"可分为1位.2位.4位等等.数码管又分为共阳极驱动/ ...

  2. S7-300 符号IO域的组态 HMI变量指针化的方法以及应用,在一个IO域显示多个温度值的办法

    应用工业场景 例如需要测试很多个节点的温度值的时候,需要监控的位置很多,如果HMI的画面很小, 可以使用符号IO域和变量的间接寻址 符号IO域接近于VB中的combo 控件 实现上图的界面 : 上图界 ...

  3. LED数码管显示实验

    1.代码: #include <reg52.h>typedef unsigned char  u8;typedef unsigned int   u16;sbit seg_sel = P1 ...

  4. DS18b20温度传感器基础使用

    认识管脚 认识唯一标示的64位地址序列号 寄存器数据译码成温度值(下面只针对12位转化的,还有9..10等其他位的转化方式,不同位的转化,其精度也不同) 传感器存储器 配置寄存器使用说明 DS18b2 ...

  5. ATmega8仿真——LED 数码管的学习

    1. I/O 口的结构及特点 Atmega8 有23 个I/O 引脚,分成3 个8 位的端口B.C 和D,其中C 口只有7 位 Atmega8 采用3个8位寄存器来控制I/O端口,它们分别是:方向寄存 ...

  6. 【Arduino】8地点LED数码管(3461BS)

    淘宝买了一块3461BS的8地点LED数码管,婴儿就迫不及待地尝试,结果看到了文件,好家伙无Arduino测试程序. 莫急~莫急~无论如何串行操作,大不了呗瞎蒙! 以下几点是在更有趣的点瞎蒙: 1.须 ...

  7. 硬件原理系列之LED数码管(一)

    LED数码管也叫数码显示器,由8段(7段,8多一位小数点)发光二极管组成,控制不同组合,就可以显示不同字符 dp示小数点,COM为公共端,根据连接方式的不同,分为共阴极和共阳极 工作原理:若选用共阴极 ...

  8. 【雕爷学编程】Arduino动手做(47)---七段LED数码管模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...

  9. 「雕爷学编程」Arduino动手做(39)——DS18B20温度传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

随机推荐

  1. 如何管理第三方接口token过期时间

    背景: 随着微服务的盛行,做开发时不可避免的要涉及第三方接口,安全起见,这些接口都会需要一个token参数.而token一般都会有一个过期时间,比如2小时或者30分钟.那么如何在自己的应用中存储并管理 ...

  2. Taro 小程序 自定义导航栏

    在小程序中,有的页面需求可能需要我们做一个自定义的导航栏, 今天就来踩一踩坑 首先需要在app.js 中给全局的导航栏隐藏, // app.js window: { navigationStyle: ...

  3. ACM_给你100块钱

    给你100块钱 Time Limit: 2000/1000ms (Java/Others) Problem Description: 小光见到昨晚旭能神没拿到一血,又损失了一百块,很同情他.但是为了不 ...

  4. SQLServer 2012 高效分页

    SQLSERVER2012 出新分页功能啦!!!近两天我在自己工作机的PC(没有并发,单一线程)上做了SqlServer  2000/ (2005/2008)/2012三个版本下的分页性能比较. 大致 ...

  5. poj3050 Hopscotch

    思路: 水题. 实现: #include <iostream> #include <cstdio> #include <set> using namespace s ...

  6. 跨库导表数据(sql)

    程序员用 列子: insert into "000".tbFreeReportselect ReportCode ,ReportName ,GroupNamefrom openda ...

  7. iOS-控件响应用户控制事件之事件处理

    事件处理 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象” UIApplication.UIViewControlle ...

  8. 一个圆的移动 AE教程 速度曲线调节

    AE里面速度的曲线调节 最终的小效果 两个关键点: 一:速度曲线调节 编辑速度图标,他的曲线是编辑速度的. 二:节点不要用贝塞尔曲线 编辑值图标,就是圆圈的x值y值的曲线.控制位置移动的. 选择一个节 ...

  9. Vue完成TodoList案例

    写一个简单的TodoList的更实用(文末有彩蛋). 一,使用VUE-CLI脚手架快速搭建一个框架 利用VUE-CLI来自动生成我们项目的前端目录及文件,方法: npm install -g vue- ...

  10. 07JavaScript数组与字符串对象

    JavaScript数组与字符串对象 5.1.1数组(Array)对象 <script> //声明一个数组并赋值; var arr = new Array("aa",& ...