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

程序功能:利用单线制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. Luogu P2858 [USACO06FEB]奶牛零食Treats for the Cows 【区间dp】By cellur925

    题目传送门 做完A Game以后找道区间dp练练手...结果这题没写出来(哭). 和A Game一样的性质,从两边取,但是竟然还有天数,鉴于之前做dp经常在状态中少保存一些东西,所以这次精心设计了状态 ...

  2. 大数据技术之_25_手机APP信息统计系统项目_01_APP 数据生成模块 + 数据收集模块 + 数据处理模块框架搭建 + 业务需求处理 + 数据展示模块 +项目总结 + 问题总结

    一 项目概述1.1 角色1.2 业务术语1.3 项目效果展示二 项目需求三 项目概要3.1 项目技术架构3.2 项目目录结构3.3 项目技术选型3.4 项目整体集群规划3.5 创建项目工程四 APP ...

  3. c语言程序设计案例教程(第2版)笔记(四)—指针、分配存储空间、文件

    零散知识点: 指针类型:每个变量占用的首单元地址称为这个变量的存储地址. “&”为“取地址运算符”.格式:&  变量名.功能:返回指定变量的存储地址. “*”为“取内容运算”.格式:* ...

  4. CF446C [DZY loves Fibonacci]

    Description Transmission Gate 你需要维护一个长度为\(n \leq 300000\) 的数列,兹词两个操作: 1.给一个区间加上一个fibonacci数列,规定\(f[0 ...

  5. Java 线程是什么-渐入佳境

    线程:(一)什么是线程 管哥说:程序中有多个执行流就叫多线程.多线程是多任务的一种特别的形式.好处:单个程序可以创建多个并发执行的程序来完成各自的任务.多线程能满足程序员编写高效率的程序来达到充分利用 ...

  6. TCP协议三次握手和四次握手

    前言 先说一下IP协议和TCP协议,IP协议是无连接的通信协议,IP不会占用两个设备之间通信的线路,IP实际上主要负责将每个数据包路由至目的地,但是IP协议并没有能够确保数据包是否到达,传过去的数据包 ...

  7. Spring Cloud是什么?

    [学习笔记] 3)Spring Cloud是什么?马克-to-win@马克java社区:i)Spring Cloud是一个微服务框架,Spring Cloud基于微服务基础框架Netflix进行了up ...

  8. 内置函数isinstance和issubclass

    1. isinstance(obj,class) 判断对象obj是不是由class生成的对象. class Foo: pass obj=Foo() print(isinstance(obj,Foo)) ...

  9. Farseer.net轻量级开源框架 中级篇:Cookies、Session、Request

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 探究ORM(Mapping) 下一篇:Farseer.net轻量级开源框架 中级篇 ...

  10. IE和DOM事件流、普通事件和绑定事件的区别

    IE和DOM事件流的区别 IE采用冒泡型事件 Netscape(网络信息浏览器)使用捕获型事件 DOM使用先捕获后冒泡型事件 示例: <body> <div> <butt ...