电竞比分网-中国电竞赛事及体育赛事平台

分享

第八課 溫度檢測DS18B20《中學生C51單片機易學實戰(zhàn)入門教程》

 岐岐feng 2018-03-26

第八課 溫度檢測DS18B20

實驗準備:

DS18B20

LCD1602

第八課 溫度檢測DS18B20《中學生C51單片機易學實戰(zhàn)入門教程》

課程內(nèi)容:

一、 模塊分析:

僅一條總線,既用于傳命令,又用于傳數(shù)據(jù)。

單總線的所有處理均從初始化開始。

1) 初始化

第八課 溫度檢測DS18B20《中學生C51單片機易學實戰(zhàn)入門教程》

t0時刻總線拉高,然后即把總線(P37)電平拉低(給0),延時480—960微秒然后把總線拉高(給1),延時480微秒

(在這480微秒時間內(nèi)DS18B20會響應,單模塊可以忽略,多模塊才需要判斷)

如果要判斷DS18B20是否存在,可以先延時100微秒,判斷總線電平是否為0然后再繼續(xù)延時380微秒

第八課 溫度檢測DS18B20《中學生C51單片機易學實戰(zhàn)入門教程》

第八課 溫度檢測DS18B20《中學生C51單片機易學實戰(zhàn)入門教程》

3)寫入 基本數(shù)據(jù) 0 與 1 的判斷

第八課 溫度檢測DS18B20《中學生C51單片機易學實戰(zhàn)入門教程》

寫0時序:

t0總線先拉高再拉低,延時>60微秒,

然后總線拉高,延時>1微秒

寫1時序:

t0總線先拉高再拉低,延時4微秒,

然后總線拉高,延時>60微秒

4)讀數(shù)據(jù)

第八課 溫度檢測DS18B20《中學生C51單片機易學實戰(zhàn)入門教程》

t0時刻總線拉高,再拉低,延時4微秒,再拉高,延時10秒,準備收數(shù)據(jù)。

然后,接收總線數(shù)據(jù)(即判斷 總線 是 0 或 1,這是由DS18B20送出的)。

延時50微秒,總線拉高。

5)傳數(shù)據(jù),字節(jié)傳送時,先傳送低位

一、 分功能塊編代碼,可放入 function.h中

sbit D18B20=P3^7; //ds18b20 端口

//TempDelay(80); //530uS

//TempDelay(14); //100uS

//_nop_(); //1.085uS(11.0529M) 1us(12M)

//可用 KEIL調(diào)試模式檢測

//http://blog.sina.com.cn/s/blog_980e19e00101b5dh.html

void TempDelay (uchar us) //延時處理

{

while(us--);

}

void Init18b20 (void) //18B20初始化

{

D18B20=1;

D18B20=0;

TempDelay(80); //delay 530 uS//80

D18B20=1;

TempDelay(34); //delay 480 uS//70

D18B20 = 1;

}

void write_byte (uchar dat) //18B20寫入一個字節(jié)

{

uchar i;

for (i=0;i<>

{

D18B20 = 0;

_nop_(); //用空指令延時

D18B20=dat&0x01; //取出最低位放入總線

TempDelay(5); //delay 45 uS //5

D18B20=1;

dat>>= 1; //準備下一位數(shù)據(jù)

}

}

//說明 一次1bit的讀取最少需要60us 兩次讀取之間需要至少1us的恢復時間

// 單次讀取1bit 總線拉低不能超過15us 然后馬上拉高

uchar read_byte (void) //讀18B20的一個字節(jié)

{

uchar i,u=0;

for(i=0;i<>

{

D18B20 = 0;

u >>= 1; //右移,騰出左邊的一位存數(shù),同時有延時效果

D18B20 = 1;

if(D18B20==1) u |= 0x80; //存入 數(shù)據(jù)

TempDelay (4);

}

return(u);

}

//讀出溫度函數(shù)

//返回為溫度值 溫度值為short變量 有正負

short read_temp() //short可以表示-32768~+32767

{

uchar TL,TH;

uchar temp;

short t;

Init18b20 (); //總線復位

write_byte(0xcc); //發(fā)命令

write_byte(0x44); //發(fā)轉(zhuǎn)換命令

Init18b20(); //復位

write_byte(0xcc); //發(fā)命令

write_byte(0xbe); //發(fā)送讀溫度命令

TL=read_byte(); //讀溫度值的低字節(jié)

TH=read_byte(); //讀溫度值的高字節(jié)

t=TH;

if(TH>7)

{

TH=~TH;

TL=~TL;

temp=0;//溫度為負

}else temp=1;

t<>

t+=TL; // 兩字節(jié)合成一個整型變量。

t=(float)t*0.0625; //0.0625為12位溫度采集的分辨率 t為采集的數(shù)值 這里擴大10倍提取小數(shù)點后一位

if(temp)return t;

else return -t;

}

LCD1602 顯示溫度時,要先判斷正負,負的要顯示 – 號,實現(xiàn)以上代碼段后,主程序就簡單了,當然,簡單的背后還有前幾節(jié)課的支撐。

void main()

{

short temp;

lcd_init(); // 1602初始化

lcd_ wcmd (0x80); //設置顯示位置為第一行的第1個字符

while(1)

{

lcd_ wcmd (0x80);

temp =read_temp();

lcd_wdat(temp %10000/1000+0x30);

lcd_wdat(temp %1000/100+0x30);

lcd_wdat(temp %100/10+0x30);

lcd_wdat(temp %10+0x30);

}

}

后記:

自這課之后,基本可以使用不同的器件玩下開發(fā)了,例如加液晶屏,時鐘控制等.

各種器件,一般都附帶有廠家的例程或者能從網(wǎng)上找到例程.只要仔細分析時序圖,把例程中代碼"搬運"一下到自己的代碼中,略加修改,即可用,不需要重復花時間去開發(fā)對應驅(qū)動,這就是平常所講的不要重復造"輪子".

編程思想,并不是把所有代碼放一堆在一個文件中,而是把想實現(xiàn)的功能細分為簡單的功能模塊(用各個 .h頭文件 #include作關聯(lián)調(diào)用),然后專心設計每一個簡單模塊,這是C語言開發(fā)軟件常用的一種模式.

另外.并不是跟著教程學會了基本的編程與幾個器件的使用,就表示會了單片機開發(fā)了,只有當自己能夠獨立完成一個完整的系統(tǒng),例如 洞洞板+液晶+時鐘+蜂鳴器+本課的溫度器件,動手焊接線路,構造一個完整的代碼結(jié)構和模塊化編程,實現(xiàn)整點報時及報室溫,再想牛點的話,排上幾個LED點陣,模擬指針時鐘特效,等等.當一個完整的系統(tǒng)是自己一點一點建成后,可以向人展示成品時,也就入門了.

再之后,可以玩點步進電機,超聲波,紅外,數(shù)模轉(zhuǎn)換,無線傳送,3寸或5寸屏液晶漢字顯示,控制家電,控制PC,... ...

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多