版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 單片機課程設(shè)計</b></p><p> 基于數(shù)字溫度傳感器的數(shù)字溫度計的設(shè)計</p><p> 1.芯片DS18B20的說明</p><p> 美國Dallas 半導(dǎo)體公司的數(shù)字化溫度傳感器DS1820 是世界上第一片支持 "一線總線"接口的溫度傳感器,在其內(nèi)部使用了在板(ON-B0AR
2、D)專利技術(shù)。全部傳感元件及轉(zhuǎn)換電路集成在形如一只三極管</p><p> 的集成電路內(nèi)。一線總線獨特而且經(jīng)濟的特點,使用戶可輕松地組建傳感器網(wǎng)絡(luò),為測量系統(tǒng)的構(gòu)建引入全新概念?,F(xiàn)在,新一代的DS18B20 體積更小、更經(jīng)濟、更靈活。使你可以充分發(fā)揮“一線總線”的優(yōu)點。</p><p> DS18B20 的主要特性</p><p> 1.1芯片DS18B20的
3、特點</p><p> ?。?)適應(yīng)電壓范圍更寬,電壓范圍:3.0~5.5V,在寄生電源方式下可由數(shù)據(jù)線供電</p><p> ?。?)獨特的單線接口方式,DS18B20 在與微處理器連接時僅需要一條口線即可實現(xiàn)微處理與DS18B20 的雙向通訊</p><p> ?。?)DS18B20 支持多點組網(wǎng)功能,多個DS18B20 可以并聯(lián)在唯一的三線上,實現(xiàn)組網(wǎng)多點測溫
4、</p><p> ?。?)DS18B20 在使用中不需要任何外圍元件,全部傳感元件及轉(zhuǎn)換電路集成在形如一只三極管的集成電路內(nèi)</p><p> (5)溫范圍-55℃~+125℃,在-10~+85℃時精度為±0.5℃</p><p> ?。?)可編程的分辨率為9~12 位,對應(yīng)的可分辨溫度分別為0.5℃、0.25℃、0.125℃和0.0625℃,可以實現(xiàn)
5、高精度測溫。</p><p> ?。?)在9位分辨率最多在93.75ms把溫度轉(zhuǎn)換成數(shù)字,12 位分辨率是最多可在750ms內(nèi)將溫度轉(zhuǎn)換成數(shù)字,速度更快。</p><p> ?。?)溫度測試結(jié)果直接轉(zhuǎn)換成數(shù)字溫度信號,以“一線總線”串行傳輸給CPU,同事科傳送SRC檢驗碼,菊友極強的抗干擾校正能力。</p><p> ?。?)負(fù)壓特性:電源極性接反時芯片不會因發(fā)熱而
6、燒毀,但不會正常工作。</p><p> 2. 液晶顯示器LM016L的說明</p><p><b> 接口信號說明:</b></p><p><b> 下表為控制命令表:</b></p><p> 液晶顯示模塊是一個慢顯示器件,所以在執(zhí)行每條指令之前一定要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙
7、,否則此指令失效。要顯示字符時要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖一是016L的內(nèi)部顯址。</p><p><b> 圖一</b></p><p><b> 液晶顯示簡介</b></p><p><b> ?、僖壕э@示原理</b></p><p> 液晶
8、顯示的原理是利用液晶的物理特性,通過電壓對其顯示區(qū)域進(jìn)行控制,有電就有顯示,這樣即可以顯示出圖形。液晶顯示器具有厚度薄、適用于大規(guī)模集成電路直接驅(qū)動、易于實現(xiàn)全彩色顯示的特點,目前已經(jīng)被廣泛應(yīng)用在便攜式電腦、數(shù)字?jǐn)z像機、PDA移動通信工具等眾多領(lǐng)域。</p><p><b> ?、谝壕э@示器的分類</b></p><p> 液晶顯示的分類方法有很多種,通??砂雌滹@示
9、方式分為段式、字符式、點陣式等。除了黑白顯示外,液晶顯示器還有多灰度有彩色顯示等。如果根據(jù)驅(qū)動方式來分,可以分為靜態(tài)驅(qū)動(Static)、單純矩陣驅(qū)動(Simple Matrix)和主動矩陣驅(qū)動(Active Matrix)三種。</p><p><b> ?、圩址娘@示</b></p><p> 用LCD顯示一個字符時比較復(fù)雜,因為一個字符由6×8或8&
10、#215;8點陣組成,既要找到和顯示屏幕上某幾個位置對應(yīng)的顯示RAM區(qū)的8字節(jié),還要使每字節(jié)的不同位為“1”,其它的為“0”,為“1”的點亮,為“0”的不亮。這樣一來就組成某個字符。但由于內(nèi)帶字符發(fā)生器的控制器來說,顯示字符就比較簡單了,可以讓控制器工作在文本方式,根據(jù)在LCD上開始顯示的行列號及每行的列數(shù)找出顯示RAM對應(yīng)的地址,設(shè)立光標(biāo),在此送上該字符對應(yīng)的代碼即可。 </p>
11、;<p> 3. 總體電路流程圖</p><p><b> 4. 總體電路設(shè)計</b></p><p> LCD與AT89C51的連接,(如圖一所示)將LCD的D0~D7引腳分別與單片機的P0.1~P0.7相連,使LCD能接受來自單片機的信號。</p><p><b> 電路如圖二所示</b><
12、/p><p> 如圖可見,電路主要是由AT89C51芯片和LM016L和蜂鳴器構(gòu)成了主要電路。開關(guān)的控制,可調(diào)整溫度的范圍。</p><p><b> 5.系統(tǒng)程序設(shè)計</b></p><p><b> 程序清單 :</b></p><p> #include <AT89X51.H>
13、;</p><p> #include <intrins.h></p><p> #include<absacc.h></p><p> #define uint unsigned int</p><p> #define unchar unsigned char</p><p> u
14、nchar templ,temph,i,y,z,n;</p><p> unchar a,b;//LCD的變量</p><p> unchar sign=0;//標(biāo)志變量</p><p> bit k;//判斷正負(fù)變量</p><p> sbit dq=P3^5;</p><p> sbit rs=P2^
15、0;//LCD顯示的定義取值</p><p> sbit rw=P2^1;</p><p> sbit e=P2^2;</p><p> sbit bf=P0^7;</p><p> sbit DQ=P2^5;</p><p><b> //鍵盤定義</b></p><
16、;p> sbit read=P3^0;</p><p> sbit incH=P3^2;</p><p> sbit desH=P3^3;</p><p> sbit reset=P3^4;</p><p><b> //蜂鳴器</b></p><p> sbit BUZZER=
17、P2^6;</p><p> float t4,t5,t6,t7,tt;//溫度轉(zhuǎn)換的變量</p><p><b> uint tp;</b></p><p> unchar temperature,Htemp,Ltemp;</p><p> unchar D1,D2,D3;</p><p&g
18、t; uint D4,D5,D6,D9,D7,D8;</p><p> unchar code dis1[]={"0123456789"};</p><p> unchar code dis2[]={"temp:"};</p><p> unchar code dis3[]={"WARN"};&l
19、t;/p><p> unchar code dis4[]={"Htemp:"};</p><p> unchar code dis5[]={"working"};</p><p> unchar code dis6[]={"Ltemp:"};</p><p> bit flag
20、_1820_1;</p><p> bit flag_1820_2;</p><p> void delay_ms(unsigned char time);</p><p> void ledshow(void);</p><p> void keypress(void);</p><p> void ini
21、t(void);</p><p> void gettemp();</p><p> void init1820(void);</p><p> void write1820(unchar);</p><p> unsigned char read1820(void);</p><p> void delay
22、_us(unchar);</p><p> void delay3(unchar);</p><p><b> /* 延時*/</b></p><p> void delay(uint t)</p><p><b> {uint i;</b></p><p> w
23、hile(t--)</p><p> { for(i=0;i<125;i++)</p><p><b> {}</b></p><p><b> }</b></p><p><b> }</b></p><p><b> //L
24、CD顯示函數(shù)</b></p><p> void delay1(unchar time)</p><p> {unchar n;</p><p><b> n=0;</b></p><p> while(n<time)</p><p><b> {n++;}
25、</b></p><p><b> return;</b></p><p><b> }</b></p><p> void delay3(unchar x)</p><p> { for(y=x;y>0;y--)</p><p> for(z=
26、x;z>0;z--);</p><p><b> }</b></p><p> unchar testBF()</p><p> { bit result;</p><p> rs=0;rw=1;e=1;</p><p> _nop_();_nop_();_nop_();_nop
27、_();</p><p> result=bf;e=0;</p><p> return result;</p><p><b> }</b></p><p> void writecmd(unchar ZL)</p><p> { while(testBF()==1);</p&g
28、t;<p> rs=0;rw=0;e=0;</p><p> _nop_();_nop_();</p><p> P0=ZL;e=1;</p><p> _nop_();_nop_();_nop_();_nop_();</p><p><b> e=0;</b></p><p&
29、gt;<b> }</b></p><p> void pos(unchar pos)</p><p> {writecmd(pos|0x80);</p><p><b> }</b></p><p> void writedate(unchar date)</p><
30、;p> {while(testBF()==1);</p><p> rs=1;rw=0;e=0;</p><p> _nop_();_nop_();</p><p> P0=date;e=1;</p><p> _nop_();_nop_();_nop_();_nop_();</p><p><b
31、> e=0;</b></p><p><b> }</b></p><p> void init()</p><p> {delay3(20);</p><p> writecmd(0x38);</p><p> delay3(30);</p><
32、;p> writecmd(0x0d);</p><p> delay3(30);</p><p> writecmd(0x06);</p><p> delay3(30);</p><p> writecmd(0x01);</p><p> delay3(30);</p><p&g
33、t;<b> }</b></p><p><b> //鍵盤程序</b></p><p><b> //主程序</b></p><p> void main(void)</p><p><b> {</b></p><p>
34、; TMOD=0x01;</p><p> TH0=50000/256;</p><p> TL0=50000%256;</p><p> Htemp=124;Ltemp=-24;</p><p><b> P3=0xFF;</b></p><p><b> init();
35、</b></p><p> if(sign==0)</p><p><b> {</b></p><p> EA=1;TR0=1;ET0=1;</p><p> EX0=0; //關(guān)閉外部中斷0</p><p> EX1=0; //關(guān)閉外部中斷1 </p
36、><p><b> while(1)</b></p><p><b> {</b></p><p> if(read==0)</p><p><b> {</b></p><p> delay3(2000);</p><p>
37、; if(read==0)</p><p><b> {</b></p><p><b> sign++;</b></p><p><b> }</b></p><p><b> }</b></p><p><b&g
38、t; }</b></p><p><b> }</b></p><p> if(sign==1)</p><p><b> {</b></p><p> BUZZER=1; //關(guān)閉蜂鳴器</p><p> EX0=1; //開啟外部中斷0
39、</p><p> EX1=1; //開啟外部中斷1</p><p><b> init();</b></p><p><b> pos(0);</b></p><p> for(i=0;i<6;) </p><p> { writedate(dis4[
40、i]);i++;</p><p><b> }</b></p><p> D6=Htemp%10;</p><p> D7=Htemp%100/10;</p><p> D8=Htemp/100;</p><p><b> pos(0x6);</b></p&g
41、t;<p> writedate(dis1[D8]);</p><p> writedate(dis1[D7]);</p><p><b> }</b></p><p> if(sign==2)</p><p><b> {</b></p><p>
42、 BUZZER=1; //關(guān)閉蜂鳴器</p><p> EX0=1; //開啟外部中斷0</p><p> EX1=1; //開啟外部中斷1</p><p><b> init();</b></p><p><b> pos(0);</b></p><
43、p> for(i=0;i<6;) </p><p> { writedate(dis6[i]);i++;}</p><p> D6=Htemp%10;</p><p> D7=Htemp%100/10;</p><p> D8=Htemp/100;</p><p><b> pos(
44、0x6);</b></p><p> writedate(dis1[D8]);</p><p> writedate(dis1[D7]);</p><p> writedate(dis1[D6]);</p><p><b> }</b></p><p> if(sign&g
45、t;2)</p><p> { sign=0;}</p><p><b> }</b></p><p><b> //中斷程序</b></p><p> void int0(void) interrupt 0</p><p><b> {</
46、b></p><p> EX0=0; //關(guān)外部中斷0</p><p> if(desH==0&&sign==1)</p><p><b> {</b></p><p><b> Htemp--;</b></p><p> if(Ht
47、emp<Ltemp)</p><p> Htemp=Ltemp;</p><p><b> }</b></p><p> else if(desH==0&&sign==2)</p><p><b> {</b></p><p><b>
48、 Ltemp--;</b></p><p><b> }</b></p><p><b> }</b></p><p> /*****外部中斷1服務(wù)程序*****/</p><p> void int1(void) interrupt 2</p><p>
49、;<b> {</b></p><p> EX1=0; //關(guān)外部中斷1</p><p> if(incH==0&&sign==1)</p><p><b> {</b></p><p><b> Htemp++;</b></p>
50、<p><b> }</b></p><p> else if(incH==0&&sign==2)</p><p><b> {</b></p><p><b> Ltemp++;</b></p><p> if(Ltemp>Hte
51、mp)</p><p> Ltemp=Htemp;</p><p><b> } </b></p><p><b> }</b></p><p> //定時器T0服務(wù)程序</p><p> void isr_t0(void) interrupt 1</p&g
52、t;<p> {TH0=50000/256;</p><p> TL0=50000%256;</p><p> TMOD=0x10;</p><p> TH1=50000/256;</p><p> TL1=50000%256;</p><p> gettemp();</p>
53、<p> delay(50);</p><p> if (tp<Htemp)</p><p> { BUZZER=1;</p><p> pos(0x04);</p><p> for(i=0;i<7;)</p><p><b> {</b></p>
54、;<p> writedate(dis5[i]);</p><p><b> i++;</b></p><p><b> }</b></p><p> pos(0x40);</p><p> for(i=0;i<5;)</p><p> {wr
55、itedate(dis2[i]);</p><p><b> i++;}</b></p><p> D1=(unchar)(tp%10);</p><p> D2=(unchar)(tp%100/10);</p><p> D3=(unchar)(tp/100);</p><p> D4
56、=(uint)(tt*10);</p><p> D5=((uint)(tt*100))%10;</p><p><b> if(k==1)</b></p><p> {pos(0x46);</p><p> writedate('-');}</p><p><b&g
57、t; else</b></p><p> {pos(0x46);</p><p> writedate();}</p><p> pos(0x47);</p><p> writedate(dis1[D3]);</p><p> writedate(dis1[D2]);</p>&
58、lt;p> writedate(dis1[D1]);</p><p> writedate('.');</p><p> writedate(dis1[D4]);</p><p> writedate(dis1[D5]);</p><p> writedate(0xdf);</p><p&g
59、t; writedate('C');</p><p><b> }</b></p><p><b> else</b></p><p> { init();</p><p> pos(0x04);</p><p> for(i=0;i<4
60、;)</p><p><b> {</b></p><p> writedate(dis3[i]);</p><p><b> i++;}</b></p><p><b> BUZZER=0;</b></p><p><b> }&l
61、t;/b></p><p><b> }</b></p><p> //DS18B20讀取溫度</p><p> void gettemp()</p><p><b> { </b></p><p> init1820();</p><p
62、> write1820(0xcc);</p><p> write1820(0x44);</p><p> init1820();</p><p> write1820(0xcc);</p><p> write1820(0xbe);</p><p> templ=read1820();//低8位(其
63、中的第四位是小數(shù)點后的)</p><p> temph=read1820();//高8位(其中前五位是符號值)</p><p> z=temph;//把符號位留下判斷正負(fù)</p><p> k=(bit)(z>>7);</p><p> if(k==1) //負(fù)數(shù)就取反加一</p><p>
64、; { templ=~templ;</p><p> templ=templ+1;</p><p> temph=~temph;</p><p><b> }</b></p><p><b> else</b></p><p> {templ=templ;&l
65、t;/p><p> temph=temph;}</p><p><b> n=templ;</b></p><p><b> y=n&0x01;</b></p><p> t7=y*0.0625;</p><p><b> n>>=1;&l
66、t;/b></p><p> y=n&0x01;//小數(shù)點最后的數(shù)</p><p> t4=y* 0.125;</p><p><b> n>>=1;</b></p><p><b> y=n&0x01;</b></p><p>
67、t5=y* 0.25;</p><p><b> n>>=1;</b></p><p><b> y=n&0x01;</b></p><p><b> t6=y*0.5;</b></p><p> tt=t4+t5+t6+t7;</p>
68、<p> init1820();</p><p> tp=temph*256+templ;</p><p> temperature=tp;</p><p><b> tp=tp>>4;</b></p><p><b> }</b></p><p
69、><b> //1820初始化</b></p><p> void init1820()</p><p><b> {</b></p><p> DQ = 1; _nop_();</p><p> DQ = 0; </p><p> delay_u
70、s(125); //延時510us,</p><p> delay_us(125);</p><p> DQ = 1; </p><p> delay_us(15); </p><p> while(DQ) </p><p> { _nop_(); }</p><p&
71、gt; delay_us(60); </p><p> DQ = 1; </p><p><b> }</b></p><p> //******write********</p><p> void write1820(unchar a)</p><p><b>
72、 {</b></p><p><b> unchar i;</b></p><p> for(i=0;i<8;i++)</p><p> {if(a & 0x01) //低位在前;</p><p> {DQ = 0; </p><p> _nop_();
73、_nop_();_nop_();</p><p> DQ = 1; } </p><p><b> else</b></p><p> DQ = 0; </p><p> _nop_();_nop_();_nop_(); </p><p> delay_us(30); &l
74、t;/p><p> DQ = 1; </p><p> _nop_(); </p><p><b> a >>= 1;</b></p><p><b> }</b></p><p><b> }</b></p&
75、gt;<p> //*******read************</p><p> unsigned char read1820(void)</p><p><b> {</b></p><p> unsigned char i;</p><p> unsigned char tmp=0;<
76、;/p><p> DQ = 1; _nop_(); </p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p> tmp >>= 1; </p><p> DQ = 0; </p><
77、p> _nop_(); </p><p> DQ = 1; </p><p> delay_us(2); </p><p><b> _nop_();</b></p><p> if(DQ) </p><p> tmp |= 0x80;</p&
78、gt;<p> delay_us(30); </p><p> DQ = 1; _nop_(); </p><p><b> }</b></p><p> return tmp; }</p><p> void delay_us(unchar a)</p><p>
79、;<b> {</b></p><p> while(--a);</p><p><b> }</b></p><p> void delay_ms(unchar a)</p><p><b> {</b></p><p> unchar i
80、,j;</p><p> for(i=0;i<a;i++)</p><p> for(j=0;j<200;j++)</p><p><b> {</b></p><p><b> _nop_();</b></p><p><b> _nop_(
81、);</b></p><p><b> }</b></p><p> } </p><p><b> 6.總結(jié)</b></p><p> 1)在編寫程序的過程中,遇到一些C語言的語法問題,需要查找資料或者咨詢同學(xué)才能完成。</p><
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 傳感器課程設(shè)計-數(shù)字溫度計
- 單片機課程設(shè)計--基于數(shù)字溫度傳感器的數(shù)字溫度計報告
- 單片機課程設(shè)計基于數(shù)字溫度傳感器的數(shù)字溫度計課程設(shè)計報告
- 數(shù)字溫度計課程設(shè)計---基于51單片機數(shù)字溫度計設(shè)計
- 課程設(shè)計---數(shù)字溫度計
- 數(shù)字溫度計課程設(shè)計
- 數(shù)字溫度計課程設(shè)計
- 數(shù)字溫度計課程設(shè)計
- 數(shù)字溫度計課程設(shè)計
- 數(shù)字溫度計課程設(shè)計
- 課程設(shè)計-數(shù)字溫度計
- 數(shù)字溫度計課程設(shè)計---基于51單片機數(shù)字溫度計設(shè)計
- 數(shù)字溫度計的課程設(shè)計
- 課程設(shè)計---數(shù)字溫度計設(shè)計
- 數(shù)字溫度計的課程設(shè)計
- 數(shù)字溫度計課程設(shè)計 (2)
- 數(shù)字溫度計課程設(shè)計 (2)
- 數(shù)字溫度計課程設(shè)計 (2)
- 數(shù)字溫度計課程設(shè)計 (3)
- 數(shù)字溫度計課程設(shè)計報告
評論
0/150
提交評論