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

程序功能:利用单线制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. Mac怎么刷新DNS缓存

    OS X Mavericks.Mountain Lion 和 Lion 请使用以下“终端”命令来还原 DNS 缓存设置: sudo killall -HUP mDNSResponder

  2. 深入理解Android

    http://blog.csdn.net/innost/article/details/47254381

  3. 题解报告:hdu 5750 Dertouzos(最大真约数、最小素因子)

    Problem Description A positive proper divisor is a positive divisor of a number n, excluding n itsel ...

  4. HDFS执行getDatanodeReport时权限不足的解决办法

    通过JAVA获取HDFS的getDatanodeReport方法时,报权限不足的错误信息. org.apache.hadoop.ipc.RemoteException(org.apache.hadoo ...

  5. 【先定一个小目标】Asp.net Core 在IIS上的托管运行

    1.安装 .NET Core Framework 下载.net core地址:官网地址 2.Install IIS 在控制面板->程序与功能->Internet Infomation Se ...

  6. C# winform与Javascript的相互调用[转]

    原文链接<html> <head> <meta http-equiv="Content-Language" content="zh-cn&q ...

  7. 在面试官问你BS和CS区别的时候如何回答??

    这是我下来整理好的,如果哪里不全,望大家多多指教 C/S是Client/Server的缩写.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系统,如Oracle.Sybase.Inform ...

  8. 转 PHP编程过程中需要了解的this,self,parent的区别

    {一}PHP中this,self,parent的区别之一this篇 面向对象编程(OOP,Object Oriented Programming)现已经成为编程人员的一项基本技能.利用OOP的思想进行 ...

  9. win7 系统 右键很慢

    一般都是显卡驱动造成的, 在桌面按右键反应慢,通常都是显卡驱动程序惹的祸,最最简单有效的办法就是:开始--运行--. 运行regsvr32 /u igfxpph.dll

  10. Snort里如何将读取的包记录存到指定的目录下(图文详解)

    不多说,直接上干货! 比如,在/root/log目录下. [root@datatest ~]# snort -dve -l /root/log 需要注意: 1) /log目录需要你自己建立,并修改权限 ...