第八課 溫度檢測DS18B20實驗準備:DS18B20 LCD1602 課程內(nèi)容:一、 模塊分析:僅一條總線,既用于傳命令,又用于傳數(shù)據(jù)。 單總線的所有處理均從初始化開始。 1) 初始化t0時刻總線拉高,然后即把總線(P37)電平拉低(給0),延時480—960微秒然后把總線拉高(給1),延時480微秒 (在這480微秒時間內(nèi)DS18B20會響應,單模塊可以忽略,多模塊才需要判斷) 如果要判斷DS18B20是否存在,可以先延時100微秒,判斷總線電平是否為0然后再繼續(xù)延時380微秒 3)寫入 基本數(shù)據(jù) 0 與 1 的判斷寫0時序:t0總線先拉高再拉低,延時>60微秒, 然后總線拉高,延時>1微秒 寫1時序:t0總線先拉高再拉低,延時4微秒, 然后總線拉高,延時>60微秒 4)讀數(shù)據(jù)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,... ... |
|
|