導航:首頁 > 操作系統 > 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相關的資料

熱點內容
vr怎麼看視頻演算法 瀏覽:84
手機app如何申報個人所得稅零申報 瀏覽:690
如何截獲手機app連接的ip 瀏覽:330
冰箱壓縮機是否需要電容 瀏覽:344
python列表每一行數據求和 瀏覽:274
自己有一台伺服器可以玩什麼 瀏覽:656
社會學波普諾pdf 瀏覽:584
解壓做食物的小視頻 瀏覽:758
pdf怎麼單獨設置文件夾 瀏覽:474
業務邏輯程序員 瀏覽:659
addto新建文件夾什麼意思 瀏覽:160
有伺服器地址怎麼安裝軟體 瀏覽:659
安卓如何完全清除數據 瀏覽:690
安卓安卓證書怎麼信任 瀏覽:53
伺服器被攻擊如何解決 瀏覽:221
學霸變成程序員 瀏覽:881
c語言編譯錯誤fatalerror 瀏覽:441
ipv4內部伺服器地址怎麼分配 瀏覽:464
java線程安全的方法 瀏覽:952
重復命令畫梯形 瀏覽:166