單片機(jī)溫度控制程序_第1頁
單片機(jī)溫度控制程序_第2頁
單片機(jī)溫度控制程序_第3頁
單片機(jī)溫度控制程序_第4頁
單片機(jī)溫度控制程序_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、單片機(jī)ds18b20溫度計(jì)c語言程序 (2008-09-27 17:01:06) #include #include #include /要用到取絕對值函數(shù)abs()/通過ds18b20測試當(dāng)前環(huán)境溫度, 并通過數(shù)碼管顯示當(dāng)前溫度值, 目前顯示范圍: -55 +125度 sbit wela = p27; /數(shù)碼管位選 sbit dula = p26; /數(shù)碼管段選 sbit ds = p22; int tempvalue; /0-f數(shù)碼管的編碼(共陽極) unsigned char code table=0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80

2、,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e; /0-9數(shù)碼管的編碼(共陽極), 帶小數(shù)點(diǎn) unsigned char code tablewidthdot=0x40, 0x79, 0x24, 0x30,0x19, 0x12, 0x02,0x78, 0x00, 0x10; /延時(shí)函數(shù), 對于11.0592mhz時(shí)鐘, 例i=10,則大概延時(shí)10ms. void delay(unsigned int i) unsigned int j; while(i-) for(j = 0; j 0) i-; ds = 1; /產(chǎn)生一個上升沿, 進(jìn)入等待應(yīng)答狀態(tài) i = 4; whi

3、le(i0) i-; void dswait() unsigned int i; while(ds); while(ds); /檢測到應(yīng)答脈沖 i = 4; while(i 0) i-;/向ds18b20讀取一位數(shù)據(jù)/讀一位, 讓ds18b20一小周期低電平, 然后兩小周期高電平,/之后ds18b20則會輸出持續(xù)一段時(shí)間的一位數(shù)據(jù)bit readbit() unsigned int i; bit b; ds = 0; i+; /延時(shí)約8us, 符合協(xié)議要求至少保持1us ds = 1; i+; i+; /延時(shí)約16us, 符合協(xié)議要求的至少延時(shí)15us以上 b = ds; i = 8; whi

4、le(i0) i-; /延時(shí)約64us, 符合讀時(shí)隙不低于60us要求 return b;/讀取一字節(jié)數(shù)據(jù), 通過調(diào)用readbit()來實(shí)現(xiàn)unsigned char readbyte() unsigned int i; unsigned char j, dat; dat = 0; for(i=0; i8; i+) j = readbit(); /最先讀出的是最低位數(shù)據(jù) dat = (j 1); return dat;/向ds18b20寫入一字節(jié)數(shù)據(jù)void writebyte(unsigned char dat) unsigned int i; unsigned char j; bit b

5、; for(j = 0; j = 1; /寫1, 將dq拉低15us后, 在15us60us內(nèi)將dq拉高, 即完成寫1 if(b) ds = 0; i+; i+; /拉低約16us, 符號要求1560us內(nèi) ds = 1; i = 8; while(i0) i-; /延時(shí)約64us, 符合寫時(shí)隙不低于60us要求 else /寫0, 將dq拉低60us120us ds = 0; i = 8; while(i0) i-; /拉低約64us, 符號要求 ds = 1; i+; i+; /整個寫0時(shí)隙過程已經(jīng)超過60us, 這里就不用像寫1那樣, 再延時(shí)64us了 /向ds18b20發(fā)送溫度轉(zhuǎn)換命令

6、void sendchangecmd() dsinit(); /初始化ds18b20, 無論什么命令, 首先都要發(fā)起初始化 dswait(); /等待ds18b20應(yīng)答 delay(1); /延時(shí)1ms, 因?yàn)閐s18b20會拉低dq 60240us作為應(yīng)答信號 writebyte(0xcc); /寫入跳過序列號命令字 skip rom writebyte(0x44); /寫入溫度轉(zhuǎn)換命令字 convert t/向ds18b20發(fā)送讀取數(shù)據(jù)命令void sendreadcmd() dsinit(); dswait(); delay(1); writebyte(0xcc); /寫入跳過序列號命令

7、字 skip rom writebyte(0xbe); /寫入讀取數(shù)據(jù)令字 read scratchpad/獲取當(dāng)前溫度值int gettmpvalue() unsigned int tmpvalue; int value; /存放溫度數(shù)值 float t; unsigned char low, high; sendreadcmd(); /連續(xù)讀取兩個字節(jié)數(shù)據(jù) low = readbyte(); high = readbyte(); /將高低兩個字節(jié)合成一個整形變量 /計(jì)算機(jī)中對于負(fù)數(shù)是利用補(bǔ)碼來表示的 /若是負(fù)值, 讀取出來的數(shù)值是用補(bǔ)碼表示的, 可直接賦值給int型的value tmpva

8、lue = high; tmpvalue 0 ? 0.5 : -0.5); /大于0加0.5, 小于0減0.5 return value;unsigned char const timecount = 3; /動態(tài)掃描的時(shí)間間隔/顯示當(dāng)前溫度值, 精確到小數(shù)點(diǎn)后一位/若先位選再段選, 由于io口默認(rèn)輸出高電平, 所以當(dāng)先位選會使數(shù)碼管出現(xiàn)亂碼void display(int v) unsigned char count; unsigned char datas = 0, 0, 0, 0, 0; unsigned int tmp = abs(v); datas0 = tmp / 10000; d

9、atas1 = tmp % 10000 / 1000; datas2 = tmp % 1000 / 100; datas3 = tmp % 100 / 10; datas4 = tmp % 10; if(v 0) /關(guān)位選, 去除對上一位的影響 p0 = 0xff; wela = 1; /打開鎖存, 給它一個下降沿量 wela = 0; /段選 p0 = 0x40; /顯示-號 dula = 1; /打開鎖存, 給它一個下降沿量 dula = 0; /位選 p0 = 0xfe; wela = 1; /打開鎖存, 給它一個下降沿量 wela = 0; delay(timecount); for(

10、count = 0; count != 5; count+) /關(guān)位選, 去除對上一位的影響 p0 = 0xff; wela = 1; /打開鎖存, 給它一個下降沿量 wela = 0; /段選 if(count != 2) p0 = tabledatascount; /顯示數(shù)字 else p0 = tablewidthdotdatascount; /顯示帶小數(shù)點(diǎn)數(shù)字 dula = 1; /打開鎖存, 給它一個下降沿量 dula = 0; /位選 p0 = _crol_(0xfd, count); /選擇第(count + 1) 個數(shù)碼管 wela = 1; /打開鎖存, 給它一個下降沿量 w

11、ela = 0; delay(timecount); void main() unsigned char i; while(1) /啟動溫度轉(zhuǎn)換 sendchangecmd(); /顯示5次 for(i = 0; i 40; i+) display(tempvalue); tempvalue = gettmpvalue(); 1.18b20跳過查詢序列號是因?yàn)橐话愣际菃蝹€應(yīng)用,18b20只是自帶唯一的id,而不是唯一的地址,所以除非你用之前先把每個的id讀出來存起來,否則是不能一線多個器件一起用的,也就是為什么大多數(shù)都是直接skip掉,因?yàn)楹苌贂捎盟哪莻€多器件尋址功能。2.0xcc就是跳過

12、序列號的命令,0x44就是啟動溫度轉(zhuǎn)換的命令,建議你看看18b20的datasheet。3.nop就是機(jī)器執(zhí)行一下空指令,一般都是延遲用的,如果單片機(jī)是12mhz的標(biāo)準(zhǔn)51,一個nop指令可以延遲1us。#include #include #define uchar unsigned char#define uint unsigned intsbit dq=p37; sbit s1=p10;sbit s2=p11;uchar temp;uchar du();void xie(uchar dat);void ds1820();void delay(uint t);bit flag;uchar d

13、uwendu();void yanshi();uint a=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; void yanshi(void) uchar a,b,c; for(c=167;c0;c-) for(b=171;b0;b-) for(a=16;a0;a-); _nop_ (); void yanshi1(void) unsigned char a,b; for(b=35;b0;b-) for(a=25;a0;a-);void delay(uint t)while(t-); void ds1820() dq=1; _nop_();

14、 dq=0; delay(80); /530us_nop_();dq=1; delay(14); /delay 100 us/14_nop_();_nop_();_nop_();if(dq=0)flag = 1; /detect 1820 success!elseflag = 0; /detect 1820 fail! delay(20); /20 _nop_(); _nop_(); dq = 1; void xie(uchar dat)uint i; for(i=0;i=1; delay(4); uchar du() uchar i,va; for(i=0;i=1; dq=1; if(dq)va|=0x80; delay(4); return va; uchar duwendu()uchar a,b;ds1820();xie(0xcc); /跳過

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論