很簡(jiǎn)單,很基礎(chǔ)的,共享給大家
完整的課程設(shè)計(jì)下載:
數(shù)字溫度計(jì)的設(shè)計(jì).doc
(525 KB, 下載次數(shù): 190)
2016-6-6 15:57 上傳
點(diǎn)擊文件名下載附件
摘 要隨著“信息時(shí)代”的到來(lái),作為獲取信息的手段——傳感器技術(shù)得到了顯著的進(jìn)步,其應(yīng)用領(lǐng)域越來(lái)越廣泛,對(duì)其要求越來(lái)越高,需求越來(lái)越迫切。傳感器技術(shù)已成為衡量一個(gè)國(guó)家科學(xué)技術(shù)發(fā)展水平的重要標(biāo)志之一。因此,了解并掌握傳感器的基本結(jié)構(gòu)、工作原理及特性是非常重要的。在日常生活及工農(nóng)業(yè)生產(chǎn)中,經(jīng)常要用到溫度的檢測(cè)及控制,傳統(tǒng)的測(cè)溫元件有熱電偶和熱電阻。而熱電偶和熱電阻測(cè)出的一般都是電壓,再轉(zhuǎn)換成對(duì)應(yīng)的溫度,需要比較多的外部硬件支持, 其缺點(diǎn)如下:1. 硬件電路復(fù)雜;2. 軟件調(diào)試復(fù)雜;3. 制作成本高。為了提高對(duì)傳感器的認(rèn)識(shí)和了解,尤其是對(duì)溫度傳感器的深入研究以及其用法與用途,基于實(shí)用、廣泛和典型的原則而設(shè)計(jì)了本系統(tǒng)。本文利用單片機(jī)結(jié)合傳感器技術(shù)開(kāi)發(fā)設(shè)計(jì),文中把傳感器理論與單片機(jī)實(shí)際應(yīng)用有機(jī)結(jié)合,詳細(xì)地講述了利用溫度傳感器DS18B20測(cè)量環(huán)境溫度,同時(shí)51單片機(jī)在現(xiàn)代電子產(chǎn)品中廣泛應(yīng)用以及其技術(shù)已經(jīng)非常成熟,DS18B20可以直接讀出被測(cè)溫度值,而且采用三線制與單片機(jī)相連,減少了外部的硬件電路,具有低成本和易使用的特點(diǎn)。 關(guān)鍵詞: 信息時(shí)代 溫度傳感器 51單片機(jī)
目 錄
摘 要 目 錄 第一章 緒論 1.1 背景 1.2 設(shè)計(jì)目的 1.2.1掌握溫度計(jì),報(bào)警系統(tǒng)的設(shè)計(jì)、組裝與調(diào)試方法。 1.2.2熟悉仿真軟件(proteus)的使用。 1.2.3重點(diǎn)掌握單片機(jī)的使用及其各引腳的功能。 第二章 原理分析 2.1原理框圖 2.2 原理分析 第三章 實(shí)現(xiàn)過(guò)程 3.1顯示電路 3.2數(shù)碼管驅(qū)動(dòng)電路 3.3報(bào)警電路 3.4數(shù)字溫度傳感器 3.5單片機(jī)最小系統(tǒng)電路 3.6 按鍵電路 3.7數(shù)字溫度計(jì)的實(shí)物圖 3.8系統(tǒng)板上硬件連錢(qián) 3.9 系統(tǒng)調(diào)試與分析 3.10 元件清單及程序代碼 心得體會(huì)
1.1 背景 在日常生活及工農(nóng)業(yè)生產(chǎn)中,經(jīng)常要用到溫度的檢測(cè)及控制,傳統(tǒng)的測(cè)溫元件有熱電偶和熱電阻。而熱電偶和熱電阻測(cè)出的一般都是電壓,再轉(zhuǎn)換成對(duì)應(yīng)的溫度,需要比較多的外部硬件支持, 其缺點(diǎn)如下:1. 硬件電路復(fù)雜;2. 軟件調(diào)試復(fù)雜;3. 制作成本高。為了提高對(duì)傳感器的認(rèn)識(shí)和了解,尤其是對(duì)溫度傳感器的深入研究以及其用法與用途,基于實(shí)用、廣泛和典型的原則而設(shè)計(jì)了本系統(tǒng)。 1.2 設(shè)計(jì)目的 1.2.1掌握溫度計(jì),報(bào)警系統(tǒng)的設(shè)計(jì)、組裝與調(diào)試方法。 1.2.2熟悉仿真軟件(proteus)的使用。 1.2.3重點(diǎn)掌握單片機(jī)的使用及其各引腳的功能。 第二章 原理分析 2.1原理框圖 protues仿真圖
Protues仿真圖顯示當(dāng)前溫度30℃ 2.2 原理分析 整個(gè)系統(tǒng)由單片機(jī)控制,溫度傳感器采用18B20。18b20采用單總線方式與單片機(jī)相連.把采集到得溫度信息傳給單片機(jī)。單片機(jī)采集到的溫度輸出到四個(gè)數(shù)碼管上進(jìn)行顯示。當(dāng)四位數(shù)碼管顯示的溫度超過(guò)上限值時(shí)可以實(shí)現(xiàn)報(bào)警功能。 DS18B20原理與分析 DS18B20是美國(guó)DALLAS半導(dǎo)體公司繼DS1820之后最新推出的一種改進(jìn)型智能溫度傳感器。與傳統(tǒng)的熱敏電阻相比,他能夠直接讀出被測(cè)溫度并且可根據(jù)實(shí)際要求通過(guò)簡(jiǎn)單的編程實(shí)現(xiàn)9~12位的數(shù)字值讀數(shù)方式。可以分別在93.75 ms和750 ms內(nèi)完成9位和12位的數(shù)字量,并且從DS18B20讀出的信息或?qū)懭隓S18B20的信息僅需要一根口線(單線接口)讀寫(xiě),溫度變換功率來(lái)源于數(shù)據(jù)總線,總線本身也可以向所掛接的DS18B20供電,而無(wú)需額外電源。因而使用DS18B20可使系統(tǒng)結(jié)構(gòu)更趨簡(jiǎn)單,可靠性更高。他在測(cè)溫精度、轉(zhuǎn)換時(shí)間、傳輸距離、分辨率等方面較DS1820有了很大的改進(jìn),給用戶帶來(lái)了更方便的使用和更令人滿意的效果。 1.DS18B20簡(jiǎn)介 (1)獨(dú)特的單線接口方式:DS18B20與微處理器連接時(shí)僅需要一條口線即可實(shí)現(xiàn)微處理器與DS18B20的雙向通訊。 (2)在使用中不需要任何外圍元件。 (3)可用數(shù)據(jù)線供電,電壓范圍:+3.0~ +5.5 V。 (4)測(cè)溫范圍:-55 ~+125 ℃。固有測(cè)溫分辨率為0.5 ℃。 (5)通過(guò)編程可實(shí)現(xiàn)9~12位的數(shù)字讀數(shù)方式。 (6)用戶可自設(shè)定非易失性的報(bào)警上下限值。 (7)支持多點(diǎn)組網(wǎng)功能,多個(gè)DS18B20可以并聯(lián)在惟一的三線上,實(shí)現(xiàn)多點(diǎn)測(cè)溫。 (8)負(fù)壓特性,電源極性接反時(shí),溫度計(jì)不會(huì)因發(fā)熱而燒毀,但不能正常工作。 DS18B20的測(cè)溫原理 DS18B20的測(cè)溫原理如圖2所示,圖中低溫度系數(shù)晶振的振蕩頻率受溫度的影響很小〔1〕,用于產(chǎn)生固定頻率的脈沖信號(hào)送給減法計(jì)數(shù)器1,高溫度系數(shù)晶振隨溫度變化其震蕩頻率明顯改變,所產(chǎn)生的信號(hào)作為減法計(jì)數(shù)器2的脈沖輸入,圖中還隱含著計(jì)數(shù)門(mén),當(dāng)計(jì)數(shù)門(mén)打開(kāi)時(shí),DS18B20就對(duì)低溫度系數(shù)振蕩器產(chǎn)生的時(shí)鐘脈沖后進(jìn)行計(jì)數(shù),進(jìn)而完成溫度測(cè)量。計(jì)數(shù)門(mén)的開(kāi)啟時(shí)間由高溫度系數(shù)振蕩器來(lái)決定,每次測(cè)量前,首先將-55 ℃所對(duì)應(yīng)的基數(shù)分別置入減法計(jì)數(shù)器1和溫度寄存器中,減法計(jì)數(shù)器1和溫度寄存器被預(yù)置在 -55 ℃ 所對(duì)應(yīng)的一個(gè)基數(shù)值。減法計(jì)數(shù)器1對(duì)低溫度系數(shù)晶振產(chǎn)生的脈沖信號(hào)進(jìn)行減法計(jì)數(shù),當(dāng)減法計(jì)數(shù)器1的預(yù)置值減到0時(shí)溫度寄存器的值將加1,減法計(jì)數(shù)器1的預(yù)置將重新被裝入,減法計(jì)數(shù)器1重新開(kāi)始對(duì)低溫度系數(shù)晶振產(chǎn)生的脈沖信號(hào)進(jìn)行計(jì)數(shù),如此循環(huán)直到減法計(jì)數(shù)器2計(jì)數(shù)到0時(shí),停止溫度寄存器值的累加,此時(shí)溫度寄存器中的數(shù)值即為所測(cè)溫度。圖2中的斜率累加器用于補(bǔ)償和修正測(cè)溫過(guò)程中的非線性,其輸出用于修正減法計(jì)數(shù)器的預(yù)置值,只要計(jì)數(shù)門(mén)仍未關(guān)閉就重復(fù)上述過(guò)程,直至溫度寄存器值達(dá)到被測(cè)溫度值,這就是DS18B20的測(cè)溫原理。 第三章 實(shí)現(xiàn)過(guò)程 3.1顯示電路 四位共陽(yáng)LED數(shù)碼管:用來(lái)顯示溫度的大小,可直接讀取,溫度精確到0.1℃。四位數(shù)碼管如圖所示,從左到右依次是百位,十位,個(gè)位,十分位。 圖 1 數(shù)碼管 3.2數(shù)碼管驅(qū)動(dòng)電路 三極管8050:來(lái)驅(qū)動(dòng)四位數(shù)碼管,如下圖所示三極管Q1 、Q2 、Q3、Q4。 圖 2 三極管8050 3.3報(bào)警電路 三極管8550驅(qū)動(dòng)蜂鳴器:如下圖所示三極管Q6來(lái)驅(qū)動(dòng)蜂鳴器BUZ1。 圖 3 三極管8550、蜂鳴器BUZ1 3.4數(shù)字溫度傳感器 數(shù)字溫度傳感器DS18B20:如下圖所示 圖 4 DS18B20 3.5單片機(jī)最小系統(tǒng)電路 單片機(jī)最小化系統(tǒng):如下圖所示系統(tǒng)工作時(shí),最小化系統(tǒng)運(yùn)行。
圖 5 最小化系統(tǒng) 3.6 按鍵電路 按鍵:如圖所示按鍵K1為進(jìn)入/退出設(shè)置鍵;K2為增加鍵;K3為減少鍵。
圖 6 按鍵
3.7數(shù)字溫度計(jì)的實(shí)物圖 數(shù)字溫度計(jì)顯示當(dāng)前溫度25.7℃ I
圖7 數(shù)字溫度計(jì)實(shí)物圖 3.8系統(tǒng)板上硬件連錢(qián) 1). 把“單片機(jī)系統(tǒng)“區(qū)域中的P0.0-P0.7端口用8芯排線依次連接到數(shù)碼管A-DP端口上; (2). 把“單片機(jī)系統(tǒng)”區(qū)域中的P3.0-P3.2端口用線連接到按鍵K1-K3的一端上,如圖表7所示,其他所有連線按圖表7連接即可。 (3)把單片機(jī)的P2.0端口接數(shù)碼管的位選3,P2.1端口接數(shù)碼管的位選2,P2.2端口接數(shù)碼管的位選1,P2.3端口接數(shù)碼管的位選4。 (4).電源可用外接電源(用手機(jī)充電器可做電源),但必須申明電源小于+5V當(dāng)然也不能太小 3.9 系統(tǒng)調(diào)試與分析 在系統(tǒng)制作和調(diào)試過(guò)程中遇到了不少問(wèn)題,下面是具體問(wèn)題與解決方法。 檢查之后發(fā)現(xiàn)原來(lái)是4個(gè)8550三極管管腳接錯(cuò),改正之后該問(wèn)題即解決了。 ②4個(gè)數(shù)碼管亮度不一樣 8550管腳改正過(guò)后,顯示不一樣了,但4個(gè)數(shù)碼管亮度不一樣。當(dāng)某一個(gè)數(shù)碼管顯示的字段較少,比如“1”時(shí),亮度較強(qiáng),但是當(dāng)顯示的字段較多比如“8”時(shí),亮度較暗。分析其原因是:共陰數(shù)碼管限流電阻用在控制位選的共陰極的輸入端,這樣當(dāng)顯示“1”時(shí),電流相對(duì)集中,顯示“8”字段較多,電流分配后較小,因此“1”顯示時(shí)比顯示“8”時(shí)亮。 解決方法:減小這里的限流電阻,使其流入數(shù)碼管的電流變的很大,這樣在較大電流時(shí),即使字段多的電流較小,也比原來(lái)大了。這樣就減小了差距,雖然還是有差距但已不太明顯。 3.10 元件清單及程序代碼 元件清單: 單片機(jī)AT89C52:1個(gè) 40引腳底座:1個(gè) DS18B20:1個(gè) 蜂鳴器:1個(gè) 三極管:8050 5個(gè);8550 1個(gè) 電阻:1k 6個(gè);10K 1個(gè) 電容:極性電容10uf 1個(gè);瓷片電容10pf 2個(gè) 按鍵:3個(gè) 晶振:1個(gè) 四位共陽(yáng)數(shù)碼管:1個(gè) 程序代碼: - #include
- #define uchar unsigned char
- #define uint unsigned int
- sbit d1=P2^2;
- sbit d2=P2^1;
- sbit d3=P2^0;
- sbit d4=P2^3;
- sbit key1=P3^0;
- sbit key2=P3^1;
- sbit key3=P3^2;
- sbit beep=P3^3;
- sbit DS=P1^2;
- sbit ACC_7=ACC^7;
- uint count=1000,alarm=300;
- uchar shu;
- uchar shi,fen,ri,yue,nian,xq,miao,ss;
- uint temp; // 溫度變量
- uchar flag;
- uchar code tab[]=
- {0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90
- };
- uchar code tab1[]=//小數(shù)點(diǎn)點(diǎn)亮
- {0x40,0x79,0x24,0x30,
- 0x19,0x12,0x02,0x78,0x00,0x10
- };
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- }
- void dsreset()//發(fā)復(fù)位
- {
- uint i;
- DS=0;
- i=103;
- while(i>0)i--;
- DS=1;
- i=4;
- while(i>0)i--;
- }
- uchar tmpread() //讀取一字節(jié)
- {
- uchar j,k,dat;
- uint i;
- for(j=1;j<=8;j++)
- {
- DS=0;i++; //延時(shí)
- DS=1;i++;i++;
- k=DS;
- i=8;while(i>0)i--;
- dat=(k<<7)|(dat>>1);//讀出的數(shù)據(jù)最低位在最前面存一個(gè)字節(jié)在DAT里
- }
- return(dat);
- }
- void tmpwritebyte(uchar dat) //寫(xiě)一個(gè)字節(jié)
- {
- uint i;
- uchar j;
- bit testb;
- for(j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1;
- if(testb) //寫(xiě) 1
- {
- DS=0;
- i++;i++;
- DS=1;
- i=8;while(i>0)i--;
- }
- else
- {
- DS=0; //寫(xiě) 0
- i=8;while(i>0)i--;
- DS=1;
- i++;i++;
- }
- }
- }
- void tmpchange() //DS18B20溫度變換
- {
- dsreset();
- delay(1);
- tmpwritebyte(0xcc); //跳過(guò)讀取內(nèi)存rom
- tmpwritebyte(0x44); //開(kāi)始轉(zhuǎn)換
- }
- uint tmp() //讀取溫度
- {
- float tt;
- uchar a,b;
- dsreset();
- delay(1);
- tmpwritebyte(0xcc);
- tmpwritebyte(0xbe);
- a=tmpread(); //a為低字節(jié)8位
- b=tmpread(); //b為高字節(jié)8位
- temp=b; //temp為溫度值UINT 16bit
- temp<<=8; //兩個(gè)字節(jié)組合到一起
- temp=temp|a;
- if(b>127)
- {
- flag=1;
- ss=flag;
- temp=~temp+1;
- }
- tt=temp*0.0625; // temp/16 則是溫度的真實(shí)值tt.7位整數(shù),4位小數(shù)
- temp=tt*10+0.5; // 擴(kuò)大十倍取出了第一位小數(shù)
- return(temp);
- }
- void displayTemp(uint temp) //顯示溫度程序
- {
- uchar ge,shi,bai,qian,ser;
- d1=0;
- d1=0;
- d3=0;
- d4=0;
- dsreset();
- ser=temp/10; //分離出三位要顯示的數(shù)字
- SBUF=ser;
- qian=temp/1000;
- bai=temp/100%10; // 百位數(shù)字
- shi=temp/10%10; // 十位數(shù)字
- ge=temp%10; // 個(gè)位數(shù)字
- if(flag==1)
- {
- flag=0;
- P0=0xbf;
- d1=1;
- delay(2);
- d1=0;
- }
- if(qian!=0)
- {
- P0=tab[qian];
- d1=1;
- delay(2);
- d1=0;
- }
- else
- {
- P0=0xff;
- d1=1;
- delay(2);
- d1=0;
- }
- if(temp>99)
- {
- P0=tab[bai];
- d2=1;
- delay(2);
- d2=0;
- }
- P0=tab1[shi];
- d3=1;
- delay(2);
- d3=0;
- P0=tab[ge];
- d4=1;
- delay(2);
- d4=0;
- }
- uint keyscan()
- {
- if(key1==0)
- {
- delay(5);
- if(key1==0)
- {
- while(!key1);
- shu++;
- }
-
-
- }
- if(key2==0)
- {
- delay(5);
- if(key2==0)
- {
- while(!key2);
- count=count+10;
- if(shu==2)
- {
- alarm+=10;
- }
-
- }
- }
- if(key3==0)
- {
- delay(5);
- if(key3==0)
- {
- while(!key3);
- count=count-10;
- if(shu==2)
- {
- alarm-=10;
- }
- }
- }
- return(count);
-
- }
-
- void main()
- {
- beep=0;
- delay(10);
- while( 1 )
- {
- tmpchange();
- if(shu==0)
- {
- displayTemp(tmp( ));
- }
- keyscan();
- if(shu==1)
- {
- displayTemp(count);
- }
- if(shu==2)
- {
- displayTemp(alarm);
- }
- if(shu==3)
- {
- shu=0;
- }
- if(temp>count||(temp<alarm))
- {
- beep=0;
-
- }
- else
- beep=1;
-
- }
- }
-
-
復(fù)制代碼
|