导航:首页 > 操作系统 > 51单片机18b20

51单片机18b20

发布时间:2022-12-31 12:24:49

Ⅰ 用51单片机和18b20做一个温度计,求一个完整程序,要求用12864显示。

这个是用数码显示的 你自己改改显示就ok了 12864 有带字库的那种,只要输入ASCII码就行了 程序有点乱,你注意换行就行

1.DS18B20基本知识
DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
1、DS18B20产品的特点
(1)、只要求一个端口即可实现通信。
(2)、在DS18B20中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55。C到+125。C之间。
(5)、数字温度计的分辨率用户可以从9位到12位选择。
(6)、内部有温度上、下限告警设置。
2、DS18B20的引脚介绍
TO-92封装的DS18B20的引脚排列见图1,其引脚功能描述见表1。
(底视图)图1

表1 DS18B20详细引脚功能描述
序号 名称 引脚功能描述
1 GND 地信号
2 DQ 数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。
3 VDD 可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。
3. DS18B20的使用方法
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。
DS18B20的复位时序

DS18B20的读时序
对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。

DS18B20的写时序
对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。

4. 实验任务
用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在-20度到+100度之间,用8位数码管显示出来。
5. 电路原理图

6. 系统板上硬件连线
(1). 把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。
(2). 把“单片机系统”区域中的P2.0-P2.7用8芯排线连接到“动态数码显示”区域中的S1S2S3S4S5S6S7S8端子上。
(3). 把DS18B20芯片插入“四路单总线”区域中的任一个插座中,注意电源与地信号不要接反。
(4). 把“四路单总线”区域中的对应的DQ端子连接到“单片机系统”区域中的P3.7/RD端子上。
C语言源程序#include <AT89X52.H>#include <INTRINS.h> unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,25,28,31,34,38,41,44,48,50,53,56,59,63,66,69,72,75,78,81,84,88,91,94,97};unsigned char displaycount;unsigned char displaybuf[8]={16,16,16,16,16,16,16,16};unsigned char timecount;unsigned char readdata[8]; sbit DQ=P3^7;bit sflag; bit resetpulse(void){unsigned char i; DQ=0;for(i=255;i>0;i--);DQ=1;for(i=60;i>0;i--);return(DQ);for(i=200;i>0;i--);} void writecommandtods18b20(unsigned char command){unsigned char i;unsigned char j; for(i=0;i<8;i++){if((command & 0x01)==0){DQ=0;for(j=35;j>0;j--);DQ=1;}else{DQ=0;for(j=2;j>0;j--);DQ=1;for(j=33;j>0;j--);}command=_cror_(command,1);}} unsigned char readdatafromds18b20(void){unsigned char i;unsigned char j;unsigned char temp; temp=0;for(i=0;i<8;i++){temp=_cror_(temp,1);DQ=0;_nop_();_nop_();DQ=1;for(j=10;j>0;j--);if(DQ==1){temp=temp | 0x80;}else{temp=temp | 0x00;}for(j=200;j>0;j--);}return(temp);} void main(void){TMOD=0x01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;ET0=1;EA=1; while(resetpulse());writecommandtods18b20(0xcc);writecommandtods18b20(0x44);TR0=1;while(1){;}} void t0(void) interrupt 1 using 0{unsigned char x;unsigned int result; TH0=(65536-4000)/256;TL0=(65536-4000)%256;if(displaycount==2){P0=displaycode[displaybuf[displaycount]] | 0x80;}else{P0=displaycode[displaybuf[displaycount]];}P2=displaybit[displaycount];displaycount++;if(displaycount==8){displaycount=0;} timecount++;if(timecount==150){timecount=0;while(resetpulse());writecommandtods18b20(0xcc);writecommandtods18b20(0xbe);readdata[0]=readdatafromds18b20();readdata[1]=readdatafromds18b20();for(x=0;x<8;x++){displaybuf[x]=16;}sflag=0;if((readdata[1] & 0xf8)!=0x00){sflag=1;readdata[1]=~readdata[1];readdata[0]=~readdata[0];result=readdata[0]+1;readdata[0]=result;if(result>255){readdata[1]++;}}readdata[1]=readdata[1]<<4;readdata[1]=readdata[1] & 0x70;x=readdata[0];x=x>>4;x=x & 0x0f;readdata[1]=readdata[1] | x;x=2;result=readdata[1];while(result/10){displaybuf[x]=result%10;result=result/10;x++;}displaybuf[x]=result;if(sflag==1){displaybuf[x+1]=17;}x=readdata[0] & 0x0f;x=x<<1;displaybuf[0]=(dotcode[x])%10;displaybuf[1]=(dotcode[x])/10;while(resetpulse());writecommandtods18b20(0xcc);writecommandtods18b20(0x44);}}

Ⅱ 关于51单片机的问题,18b20通过定时器0中断采集温度,串口中断把温度发给pc,

//这是将采集到的数据发给1602的程序,你要发给电脑的还要简单些,时间有限,来不及给你改了,这个供你参考,
/*********************************************************************************/
/* */
/*模块名:基于DS18B20的数字温度计 */
/* */
/*功能描述:本模块采用DALLS公司的单线数字温度传感器DS18B20,抗干扰能力强, */
/* 便于远距离测量,因而得到了广泛应用。 */
/* */
/* */
/* */
/* 晶体: 12M */
/* */
/*********************************************************************************/
#include <at89x51.h>

sbit DQ = P3 ^ 7; //定义端口DQ
sbit led1 =P2^0;
sbit led2 =P2^1;
sbit led3 =P2^2;
sbit led4 =P2^3;
unsigned char tx[10]={0,0,0x2E,0,0,0,0,0xDF,0x43,0x0A};
unsigned code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90};
/******************************************************************************/
void Delay(int num)//延时函数
{
while(num--) ;
}
/******************************************************************************/
void Delaynms(unsigned int di) //延时
{
unsigned int da,db;
for(da=0;da<di;da++)
for(db=0;db<100;db++);
}

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

void TX(unsigned char TX_char)
{
SBUF=TX_char;
while(!TI);
TI=0;

}
/******************************************************************************/
void Init_DS18B20(void)//初始化ds1820
{
unsigned char x=0;
DQ = 1; //DQ复位
Delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
Delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
Delay(20);
}
/******************************************************************************/
unsigned char ReadOneChar(void)//读一个字节
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}

/******************************************************************************/
void WriteOneChar(unsigned char dat)//写一个字节
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay(2);
DQ = 1;
dat>>=1;
}
}

/******************************************************************************/
void ReadTemperature(void)//读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned char Data_L=0;
unsigned char num=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
// Delay(5000);
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位

tx[0] = (a/16+b*16)/10; //整数部分

tx[1] = (a/16+b*16)%10;

Data_L=a&0X0F;
for(num=3;num<7;num++) //小数部分
{
Data_L=Data_L*10; //10 //100 //40 //80
tx[num]=Data_L/16; //0 //6 //2 //5
Data_L=Data_L%16; //10 //4 //8
}

}
/******************************************************************************/
void Int_232(void) //232初始化
{
TMOD=0x20;
SCON=0x50;
TH1=0xFD;
TL1=0xFD;
TR1=1;
TI=0;
}

void Display_SMG(void)
{
unsigned char a;
for(a=0;a<=50;a++)
{
P0=table[tx[0]];
P2_0 = 0;
Delaynms(5);
P2_0 = 1;

P0=(table[tx[1]])&0x7f;
P2_1 = 0;
Delaynms(5);
P2_1 = 1;

P0=table[tx[3]];
P2_2 = 0;
Delaynms(5);
P2_2 = 1;

P0=table[tx[4]];
P2_3 = 0;
Delaynms(5);
P2_3 = 1;
}
}

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

void main(void)
{

Int_232();

while(1)
{

ReadTemperature(); //读取温度
Display_SMG();

}

}

Ⅲ 如何通过51单片机判别18B20温度传感器的数值范围

51读18B20,将读出的值换算为实际温度
和你的范围作比较
范围外报警就行了

Ⅳ 51单片机蓝牙模块读取温度

51单片机蓝牙模块读取温度为18B20。51单片机采集18B20文都传感器数据,并经过蓝牙连续发送,蓝牙温度计是接收5位数据的,可在手机上接收。

Ⅳ 51单片机 测试18b20温度问题!

你的问题描述的貌似挺详细,但说了半天都是你知道的东西,例如:你的开发板是有什么组成的,你换用的小板子又是什么情况,大体来说对于18B20而言,如果你的代码没变而只是更换了这个传感器元件就不会有问题的,如果你的接线真的毫无更改而又属实无法正常工作,建议你在更换一个18B20试试,比如将小板在上的18B20拆下来安装到那个好用的开发板上再试试看。

Ⅵ 51单片机我把串口中断优先级开始后18b20温度显示4096我把优先级关掉后温度显示正常,这是怎么

52单片机一共有6个中断源:   INTO0--外部中断0,由P3.2端口线引入,低电平或下降沿引起。INTO1--外部中断1,有P3.3端口线引入,低电平或下降沿引起。T0--定时器/计数器0中断,由T0计数器计满回零引起。T1--定时器/计数器1中断,由T1计数器计满回零引起。T2--定时器/计数器2中断,由T2计数器计满回零引起。TI/RI--串口中断,串行端口完成一帧字符发送/接收后引起。中断级别:参考:网络文库

Ⅶ 51单片机、一个18b20测温,数码管显示的电路图

51单片机连接多个数码管,不使用锁存器等附加元件,需要进行扫描来显示。八个数据口,每个数码管再占用一个使能位选。给你一张图片看看。图上的三极管是增加驱动能力的,用普通数码管时可以不加。

18b20是单线的,就是说加个两条电源线,和一条单条数据线(自己选51单片机的一个引脚就可以了)。连接非常简单,但对时序要求非常严格哦,建议你参考几份程序,手边在对照18b20的器件手册来看。

Ⅷ 求18b20+51单片机的C语言程序

#include<reg51.h>
unsigned char LedT0;
unsigned char Led1;
unsigned char Led2;
unsigned char Led3;
unsigned char Led4;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;

sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
sbit BUZZER=P2^3;
sbit P0_5=P0^5;

bit flag=0;

unsigned char Buzz=0;

unsigned int h_temp=399,l_temp=199;

unsigned int time=0;
const unsigned char table[18]=

//{0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xA0,0x60,0x25,0x3c,0x23,0x34,0x74,0xF7,0xD7,0xFF};
{0xD7,0x14,0xCD,0x5D,0x1E,0x5B,0xDB,0x15,0xDF,0x5F,0x9F,0xDA,0xC3,0xDC,0xCB,0x8B,0x0B,0x00};

sbit DQ =P2^2;

void delay(unsigned int i)
{
while(i--);

}

Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;
delay(8);
DQ = 0;
delay(80);
DQ = 1;
delay(14);
x=DQ;
delay(20);
}

ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
EA=0;
for (i=8;i>0;i--)
{
DQ = 0;
dat>>=1;
DQ = 1;
if(DQ)
dat|=0x80;
delay(4);
}
EA=1;
return(dat);
}

WriteOneChar(unsigned char dat)
{
unsigned char i=0;
EA=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
EA=1;
delay(4);
}

ReadTemperature(void)
{
union uni_a{
unsigned int temp;
unsigned char a[2];
} uni;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
uni.a[1]=ReadOneChar();
uni.a[0]=ReadOneChar();
if(uni.temp<0x0fff)
{
flag=0;
}
else
{
flag=1;
uni.temp=~uni.temp+1;
}
uni.temp=uni.temp*0.625;
return(uni.temp);
}

void int1() interrupt 1 using 1
{
TF0 = 0;
TH0 = 0xF6;
TL0 = 0x3D;
time++;
if(Buzz==1)
{
if(time%50==0)
{
BUZZER=!BUZZER;
}
}
else if(Buzz==2)
{
if(time%70==0)
{
BUZZER=!BUZZER;
}
}
P2 |= 0xF0;

switch(LedT0)
{
case 0:
P0 = table[Led1];
P2_4 = 0;
LedT0 = 1;
break;
case 1:
P0 = table[Led2];
P2_5 = 0;
LedT0 = 2;
break;
case 2:
P0 = table[Led3];
P2_6 = 0;
P0_5=1;
LedT0 = 3;
break;
case 3:
P0 = table[Led4];
P2_7 = 0;
LedT0 = 0;
break;
default:
LedT0 = 0;
break;
}
}
//
void delay1(int i)
{
int j,k;
for(j=0;j<i;j++)
{
for(k=0;k<125;k++);
}

}
//
void she()
{
unsigned int a;
unsigned char Ledn;
for(;;)
{
if(P3_3==0)
{
for (a=0; a<1000; a++);

if(!P3_3)
{
if(Led1<9)

{
Led1=9;
}
Led1++;
if(Led1>15)
{
Led1=10;
}
if(Led1==10)

{

Led2=h_temp/100;
Led3=h_temp%100/10;
Led4=h_temp%10;
}
else if(Led1==11)
{
Led2=l_temp/100;
Led3=l_temp%100/10;
Led4=l_temp%10;
}
else
{
Led2=0;
Led3=0;
Led4=0;
}
while(!P3_3);
}
}
if(P3_4==0)
{
for (a=0; a<1000; a++);

if(!P3_4)
{
if(Ledn==0)
{
Led2+=1;
if(Led2==10)
Led2=0;
}
else if(Ledn==1)
{
Led3+=1;
if(Led3==10)
Led3=0;
}
else
{
Led4+=1;
if(Led4==10)
Led4=0;
}
while(!P3_4);
}
}
else if(!P3_5)
{
for (a=0; a<1000; a++);

if(!P3_5)
{
if(Ledn==0)
{
Ledn=1;
}
else if(Ledn==1)
{
Ledn=2;
}
else
{
Ledn=0;
}
while(!P3_5);
}
}
else if(!P3_6)
{
for (a=0; a<1000; a++);

if(!P3_6)
{
if(Led1==10)
{
h_temp= Led4+Led3*10+Led2*100;

}
else if(Led1==11)
{
l_temp= Led4+Led3*10+Led2*100;

}
else
{

}
break;
while(!P3_6);
}
}
else if(!P3_7)
{
for (a=0; a<1000; a++);

if(!P3_7)
{
break;
while(!P3_7);
}
}

}

}
void main(void)
{
unsigned int temp,a;
unsigned char Ledn;
TMOD = 0x01;
TH0 = 0xF6;
TL0 = 0x3D;
TR0 = 1;
ET0 = 1;
TF0 = 0;
EA = 1;

LedT0 = 0;

Led1 = 0;
Led2 = 0;
Led3 = 0;
Led4 = 0;
Ledn = 0;
P1=0Xfe;
for(a=0;a<8;a++)
{
P1<<=1;
delay1(200);
}
P1=0xff;
for(;;)
{
if(time>350)
{
time=0;
temp=ReadTemperature();
if(!flag)
{
Led1 = temp/1000;
Led2 = temp%1000/100;
Led3 = temp%100/10;
Led4 = temp%10;
}
else
{
Led1 = 17;
Led2 = temp%1000/100;
Led3 = temp%100/10;
Led4 = temp%10;

}
}

if(P3_3==0)
{
for (a=0; a<1000; a++);

if(!P3_3)
{
she();
// while(!P3_3);
}
}
if(temp>=h_temp)
{
Buzz=1;
P1=0XF0;

}
else if(temp<=l_temp)
{
Buzz=2;
P1=0X0F;

}
else if(Buzz)
{
Buzz=0;
BUZZER=1;
P1=0XFF;
}

}

}

Ⅸ 18b20和51单片机实现温度显示,求程序

//按照我的电路图我这是四位有负温度显示你可以看一下。有什么问题可以问我?

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

created:2010/07/27

created:27:7:201010:27

filename:D:KeilDebugds18b20.c

filepath:D:KeilDebug

filebase:ds18b20

fileext:c

author:HonguoZHU

purpose:

//DS18B20的读写程序,数据脚P2.7

//温度传感器18B20汇编程序,采用器件默认的12位转化

//最大转化时间750微秒,显示温度-55到+125度,显示精度

//为0.1度,显示采用4位LED共阳显示测温值

//P0口为段码输入,P34~P37为位选

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

#include"reg51.h"

#include"intrins.h"//_nop_();延时函数用

#defineDisdataP0//段码输出口

#definediscanP3//扫描口

#defineucharunsignedchar

#defineuintunsignedint

#defineREADROM_18b20_CM0x33

#defineMATCHROM_18b20_CM0x55

#defineSKIPROM_18b20_CM0xCC

#defineSEARCHROM_18b20_CM0xF0

#defineALARMSEARCH_18b20_CM0xEC

#defineCONVERTT_CM0x44

#defineRSCRATCHPAD_CM0xBE

#defineWSCRATCHPAD_CM0x4E

#defineCSCRATCHPAD_CM0x48

#defineRECALLE2_CM0xB8

#defineRPOWERSUNNLY_CM0xB4

sbitDQ=P2^7;//温度输入口

sbitDIN=P0^7;//LED小数点控制

//

//

//**************温度小数部分用查表法***********//

ucharcodeditab[16]=

{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

//

ucharcodedis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};

//共阳LED段码表"0""1""2""3""4""5""6""7""8""9""不亮""-"

ucharcodescan_con[4]={0x8f,0x4f,0x2f,0x1f};//列扫描控制字

uchardatatemp_data[2]={0x00,0x00};//读出温度暂放

uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用

//

//

//

/*****************11us延时函数*************************/

//

voiddelay(uintt)

{

for(;t>0;t--);

}

//

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

scan()

{

chark;

for(k=0;k<4;k++)//4位LED扫描控制

{

Disdata=0xff;//

discan=scan_con[k];//位选

Disdata=dis_7[display[k]];//数据显示

if(k==1)

{

DIN=0;

}//小数点显示

delay(300);

}

}

//

//

/****************DS18B20复位函数************************/

ow_reset(void)

{

charpresence=1;

while(presence)

{

while(presence)

{

DQ=1;_nop_();_nop_();//从高拉倒低

DQ=0;

delay(50);//550us

DQ=1;

delay(6);//66us

presence=DQ;//presence=0复位成功,继续下一步

}

delay(45);//延时500us

presence=~DQ;

}

DQ=1;//拉高电平

}

//

//

/****************DS18B20写命令函数************************/

//向1-WIRE总线上写1个字节

voidwrite_byte(ucharval)

{

uchari;

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

{

DQ=1;_nop_();_nop_();//从高拉倒低

DQ=0;_nop_();_nop_();_nop_();_nop_();//5us

DQ=val&0x01;//最低位移出

delay(6);//66us

val=val/2;//右移1位

}

DQ=1;

delay(1);

}

//

/****************DS18B20读1字节函数************************/

//从总线上取1个字节

ucharread_byte(void)

{

uchari;

ucharvalue=0;

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

{

DQ=1;_nop_();_nop_();

value>>=1;

DQ=0;_nop_();_nop_();_nop_();_nop_();//4us

DQ=1;_nop_();_nop_();_nop_();_nop_();//4us

if(DQ)

{value|=0x80;}

delay(6);//66us

}

DQ=1;

return(value);

}

//

/****************读出温度函数************************/

//

uintread_temp()

{

uinttemp;

//ow_reset();//总线复位

//delay(200);

//write_byte(SKIPROM_18b20_CM);//发命令

//write_byte(CONVERTT_CM);//发转换命令

ow_reset();

delay(1);

write_byte(SKIPROM_18b20_CM);//发命令

write_byte(RSCRATCHPAD_CM);

temp_data[0]=read_byte();//读温度值的第字节

temp_data[1]=read_byte();//读温度值的高字节

temp=temp_data[1];

temp<<=8;

temp=temp|temp_data[0];//两字节合成一个整型变量。

returntemp;//返回温度值

}

//

/****************温度数据处理函数************************/

//二进制高字节的低半字节和低字节的高半字节组成一字节,这个

//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩

//下的低字节的低半字节转化成十进制后,就是温度值的小数部分

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

work_temp(uinttem)

{

ucharn=0;

if(tem>6348)//温度值正负判断

{

tem=65536-tem;

n=1;

}//负温度求补码,标志位置1

display[4]=tem&0x0f;//取小数部分的值

display[0]=ditab[display[4]];//存入小数部分显示值

display[4]=tem>>4;//取中间八位,即整数部分的值

display[3]=display[4]/100;//取百位数据暂存

display[1]=display[4]%100;//取后两位数据暂存

display[2]=display[1]/10;//取十位数据暂存

display[1]=display[1]%10;

/******************符号位显示判断**************************/

if(!display[3])

{

display[3]=0x0a;//最高位为0时不显示

if(!display[2])

{

display[2]=0x0a;//次高位为0时不显示

}

}

if(n)

{

display[3]=0x0b;

}//负温度时最高位显示"-"

}

//

//

/****************主函数************************/

main()

{

uinth;

Disdata=0xff;//初始化端口

discan=0xff;

for(h=0;h<4;h++)//开机显示"0000"

{display[h]=0;}

ow_reset();//开机先转换一次

write_byte(SKIPROM_18b20_CM);//SkipROM

write_byte(CONVERTT_CM);//发转换命令

for(h=0;h<100;h++)//开机显示"0000"

{scan();}

while(1)

{

work_temp(read_temp());//处理温度数据

scan();//显示温度值

}

}

//

//***********************结束**************************//

Ⅹ 51单片机上18B20如何在12864上显示两个小数点

temp <<= 8; //两个字节组合为1个字
temp = temp | a;----在1个字之中,最低四位是小数
f_temp = temp * 0.0625; --这里是除以16,就已经把小数的信息,都弄没了
temp = f_temp * 10 + 0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入

再乘以100,得出的也不是原来的、真正的小数。

阅读全文

与51单片机18b20相关的资料

热点内容
社会学波普诺pdf 浏览:582
解压做食物的小视频 浏览:756
pdf怎么单独设置文件夹 浏览:472
业务逻辑程序员 浏览:659
addto新建文件夹什么意思 浏览:160
有服务器地址怎么安装软件 浏览:659
安卓如何完全清除数据 浏览:690
安卓安卓证书怎么信任 浏览:53
服务器被攻击如何解决 浏览:221
学霸变成程序员 浏览:881
c语言编译错误fatalerror 浏览:441
ipv4内部服务器地址怎么分配 浏览:463
java线程安全的方法 浏览:950
重复命令画梯形 浏览:164
在疫情就是命令 浏览:328
自己搭建一个什么服务器好玩 浏览:253
java基础马士兵 浏览:823
完美世界手游如何查看服务器 浏览:859
光遇安卓与ios什么时候互通 浏览:598
js如何运行时编译 浏览:918