主函式
溫度感測器可記錄溫度-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這是標頭檔案附屬c檔案和標頭檔案兩個檔案的某個函式名沒對應一致所產生的警告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(臨時)
氣死,找這個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採用單匯流排協議,即與微控制器介面僅需占用乙個...