微控制器Ds18b20溫度感測器的學習(附踩雷清單)

2021-10-05 15:54:34 字數 4030 閱讀 6869

主函式

溫度感測器可記錄溫度-55~125攝氏度

#include

"reg52.h"

#include

"temp.h"

//這個標頭檔案要寫上,否則會報錯!!!

typedef

unsigned

int u16;

typedef

unsigned

char u8;

sbit lsa=p2^2;

//數碼管用74ls138解碼器來控制,所以有了這些東西

sbit lsb=p2^3;

sbit lsc=p2^4;

char num=0;

//有用。在後面解釋

u8 displaydata[8]

;//工具陣列,接受num轉換過來的16進製制數,傳遞給smg段陣列

//上面這個陣列這個要寫成比5大的數因為要顯示6位數碼管,然後拼寫注意一下!

u8 code smgduan[10]

=;//數碼管段選,從0~9

void

delay

(u16 i)

void

datapros

(int temp)

//參數列別忘了!!!因為你主函式呼叫這個函式是要傳進實參的!!

else

//如果從溫度感測器裡讀取的溫度是0或者正數

displaydata[1]

=smgduan[temp/

10000];

//因為數碼管我們只用右邊的6位,而且我們讓temp多×了100,所以這裡/10000

//所以這裡剝離temp的百位給displaydata陣列存著 陣列下標為0的數字你已經占用了,這裡必須為1開始

displaydata[2]

=smgduan[temp%

10000

/1000];

//剝離temp的十位給displaydata陣列存著

displaydata[3]

=smgduan[temp%

1000

/100]|

0x80

;//注意這些數字要寫對!

//剝離temp的個位給displaydata陣列存著,因為還要顯示小數點,所以

//我們必須讓數碼管的dp位亮著,就0x80(因為dp位為數碼管段選位的最高位)即可。

displaydata[4]

= smgduan[temp %

100/10]

;//剝離temp的小數點後一位給displaydata陣列存著

displaydata[5]

= smgduan[temp %10]

;//剝離temp的小數點後二位給displaydata陣列存著

}void

digdisplay()

p0=displaydata[

5-i]

;//傳送disp陣列裡存著的num剝離出的位給p0管,注意,這裡是5-i,因為

//數碼管第0位是在最右側,第7位在最左側,所以遵循」千百十個小數點後1小數點後2「這樣的從左至右順序來讓

//數碼管顯示數字

delay

(100);

//間隔1us掃瞄一次

p0=0x00

;//數碼管消隱

//從p0=displaydata....到p0=0x00;這裡,寫在for迴圈裡switch外!!!!記下}}

intmain()

}

temp.c檔案

#include

"temp.h"

//#include "reg52.h"

void

delay1ms

(uint y)

}//較為精確的延時1ms的函式

//下面為溫度感測器初始化函式

uchar ds18b20init()

}return1;

//初始化成功,注意return1的位置!!別寫while迴圈裡!!

}//漏了個},注意

void

ds18b20writebyte

(uchar dat)

}uchar ds18b20readbyte()

return byte;

//讀取完畢,返回讀取的乙個位元組

}void

ds18b20changetemp()

void

ds18b20readtempcom()

//函式名拼寫問題。。。。所以會有警告,給老子注意!!!!!!!!!

intds18b20readtemp()

temp.**件

#ifndef _temp_h_

#define _temp_h_

#include

"reg52.h"

//這個別丟,很重要

#ifndef uchar

//這少了c

#define uchar unsigned char

#endif

#ifndef uint

#define uint unsigned int

#endif

//兩個重定義,ifndef 如果沒有則定義的意思,然後下面就define,define完了別忘了endif

//來終止if(或說define),這個格式務必記好!!!

sbit dsport=p3^7;

//定義溫度感測器使用的io口,這裡dsport是溫傳器的名字

void

delay1ms

(uint )

;uchar ds18b20init()

;//溫度感測器初始化函式

void

ds18b20writebyte

(uchar com)

;//寫入溫度感測器的資料函式

uchar ds18b20readbyte()

;//讀取溫度感測器裡的一位元組的資料函式

void

ds18b20changetemp()

;//變換溫度感測器資料的函式

void

ds18b20readtempcom()

;//傳送讀取溫度感測器裡的溫度的命令

intds18b20readtemp()

;//讀取溫度感測器裡溫度的資料函式

//這裡定義為int是方便主函式的呼叫。

//以上宣告全域性函式

#endif

注意函式名的拼寫,這裡函式名又臭又長。

如果函式名在標頭檔案、標頭檔案附屬c檔案、主函式c檔案不一致,則會報錯:

*** warning l16: uncalled segment, ignored for overlay process

segment: ?pr?ds18b20readtemcom?temp

*** warning l1: unresolved external symbol

symbol: ds18b20readtempcom

module: temp.obj (temp)

*** warning l2: reference made to unresolved external

symbol: ds18b20readtempcom

module: temp.obj (temp)

address: 05f1h

翻譯:***警告l16:未呼叫段,忽略覆蓋過程

段:公關? ds18b20tempcom ? temp

***警告l1:外部符號未解析

象徵:ds18b20readtempcom

模組:temp.obj(臨時)

***警告l2:引用外部未解析

象徵:ds18b20readtempcom

模組:temp.obj(臨時)

這是標頭檔案附屬c檔案和標頭檔案兩個檔案的某個函式名沒對應一致所產生的警告

氣死,找這個bug找了半天!

51微控制器 DS18B20溫度感測器

我是初學者,僅供參考微笑 include include include typedef unsigned char uint8 typedef unsigned int uint16 sbit dq p3 2 sbit smg3 p1 3 sbit smg2 p1 2 sbit smg1 p1 1...

51微控制器 溫度感測器DS18B20

溫度感測器是各種感測器中最常用的一種,早期使用的是模擬溫度感測器,如熱敏電阻,隨著環境溫度的變化,它的阻值也發生線性變化,用處理器採集電阻兩端的電壓,然後根據某個公式就可以計算出當前環境溫度。美國dallas半導體公司推出的數位化溫度感測器ds18b20採用單匯流排協議,即與微控制器介面僅需占用乙個...

51微控制器 溫度感測器DS18B20

溫度感測器是各種感測器中最常用的一種,早期使用的是模擬溫度感測器,如熱敏電阻,隨著環境溫度的變化,它的阻值也發生線性變化,用處理器採集電阻兩端的電壓,然後根據某個公式就可以計算出當前環境溫度。美國dallas半導體公司推出的數位化溫度感測器ds18b20採用單匯流排協議,即與微控制器介面僅需占用乙個...