1緒論
1.1研究的背景和意義
溫度是一個和人們生活環境有著密切關系的物理量,也是一種在生產、科研、生活中需要測量和控制的重要物理量,同時它也是一種最基本的環境參數。人民的生活與環境溫度息息相關,很多方面都離不開溫度。例如,發電廠鍋爐的溫度必須控制在一定的范圍之內 。沒有合適的溫度環境,許多電子設備不能正常工作。可見,研究溫度的測量具有重要的理論意義和推廣價值。
隨著現代計算機和自動化技術的發展,作為各種信息的感知、采集、轉換、傳輸相處理的功能器件,溫度傳感器的作用日益突出,成為自動檢測、自動控制系統和計量測試中不可缺少的重要技術工具,其應用已遍及工農業生產和日常生活的各個領域。本設計就是為了滿足人們在生活生產中對溫度測量系統方面的需求。
1.2電路的工作原理
溫度的測量通常可以用兩種方式來實現:一種是用熱敏電阻之類的器件,于感溫效應,熱敏電阻的阻值能夠隨溫度發生變化 。將隨溫度變化的電壓或電流采集過來,進行A\D轉換后,發送到單片機進行數據處理,通過顯示電路就可以將溫度顯示出來。這種設計需要用到A\D轉換電路,其測溫電路比較麻煩。第二種方法就是我們所設計的用溫度傳感器芯片,溫度傳感器芯片能把溫度信號轉換成數字信號,直接發送給單片機,轉換后通過顯示電路顯示即可。這種方法電路結構簡單,設計方便。
系統的框架圖如圖1-1:
圖1-1 系統框圖(見附件)
2設計方案
2.1測溫系統的功能要求
溫度系統的功能要求如下:
1.精度為0.1℃。
2.能夠通過顯示器顯示測量的溫度值。
2. 2顯示器的選擇
顯示器可以目前可采用LED顯示器和LCD液晶顯示器兩種。但是采用傳統的七段數碼LED顯示器。LED雖然價格便宜,但使用起來不方便顯示效果不好。采用LCD液晶屏進行顯示。LCD液晶顯示器是一種低壓、微功耗的顯示器件,只要2~3伏就可以工作,工作電流僅為幾微安,是任何顯示器無法比擬的,同時可以顯示大量信息,除數字外,還可以顯示文字、曲線,比傳統的數碼LED顯示器顯示的界面有了質的提高。在儀表和低功耗應用系統中得到了廣泛的應用。優點為:
1 顯示質量高,由于液晶顯示器的每一個點收到信號后就一直保持那種色彩和亮度恒定發光 。
2 數字式接口,液晶顯示器都是數字式的,和單片機的接口簡單操作也很方便。
雖然LCD顯示器的價格比數碼管要貴,但它的顯示效果好,是當今顯示器的主流,所以采用LCD 作為顯示器。 本系統采用較為常用的液晶顯示器LCD1602來顯示測溫系統所測得的溫度。
2.3溫度傳感器的選擇
本系統采用數字化溫度傳感器DS18B20,是 “一線總線”接口的溫度傳感器。一線總線獨特而且經濟的特點,使用戶可輕松地組建傳感器網絡,為測量系統的構建引入全新概念。現在,新一代的“DS1820”體積更小、更經濟、更靈活。使您可以充分發揮“一線總線”的長處。
由于DS18B20將溫度傳感器、信號放大調理、A/D轉換、接口全部集成于一芯片,與單片機連接簡單、方便,所以溫度傳感器采用DS18B20。
3硬件電路設計
3.1測溫系統硬件電路的總體設計
硬件電路主要分為 C51控制電路、復位電路、時鐘電路、顯示電路和測溫電路五大部分。
圖3-1-1為 C51控制電路

圖3-1-1 C51電路
圖3-1-2時鐘電路

圖3-1-2 時鐘電路
圖3-1-3復位電路

圖3-1-3 復位電路
圖3-1-4顯示電路

圖3-1-4 顯示電路
圖3-1-5溫度傳感器電路

圖3-1-5 溫度傳感器電路
總體的電路圖如圖3-1-6

圖3-1-6 總體圖
3.2LCD1602顯示器的簡介和電路設計
1602液晶顯示是一種專門用來顯示字母、數字、符號等的點陣型液晶模塊。1602LCD是指顯示的內容為16X2,即可以顯示兩行,每行16個字符液晶模塊(顯示字符和數字)市面上字符液晶大多數是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780寫的控制程序可以很方便地應用于市面上大部分的字符型液晶。
1602采用的16腳接口,第1腳:GND為電源地。第2腳:VCC接5V電源正極。第3腳:V0為液晶顯示器對比度調整端。第4腳:RS為寄存器選擇,高電平1時選擇數據寄存器、低電平0時選擇指令寄存器。第5腳:RW為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。第6腳:E端為使能端,高電平時讀取信息,負跳變時執行指令。第7~14腳:D0~D7為8位雙向數據端。第15~16腳:空腳或背燈電源。15腳背光正極,16腳背光負極。
在本系統設計中采用7~14腳接51單片機的P2口,1腳和3腳接地,2腳接電源VCC,4、5、6腳分別接單片機的P1.5、P1.6、P1.7端口。
3.3 DS18B20的簡介和電路的設計
DS18B20是一種支持“一線總線”接口的溫度傳感器,它具有微型化,低功耗,高性能,抗干擾能力強,易配微處理器等優點,可直接將溫度轉化成數字信號處理器處理。測量的溫度范圍是—55~125℃,測溫誤差0.5℃。可編程分辨率9~12位,對應的可分辨溫度分別為0.5℃,0.25℃,0.125℃和0.0625℃。其工作電源即可在遠端引入,也可采用寄生電源方式產生。DS18B20引腳定義:
(1)DQ為數字信號輸入/輸出端;
(2)GND為電源地;
(3)VDD為外接供電電源輸入端(在寄生電源接線方式時接地)。DS18B20與單片機的連接方式比較簡單,只需要把DS18B20的數據線DQ與51單片機的一根并口連接即可。本設計采用DQ連接單片機的P1.0,GND端口接地,VCC接電源。
4軟件設計及程序編寫
4.1總體的程序設計思路
系統程序主要包括主程序,讀出溫度子程序,溫度轉換命令子程序,計算溫度子程序,顯示溫度程序,序初始化程序等。
主程序的流程如圖4-1所示。
圖4-1 主程序流程圖
4.2 LCD1602顯示器的編程
LCD1602液晶模塊的讀寫操作、屏幕和光標的操作都是通過指令編程來實現的。
指令1:清顯示,指令碼01H,光標復位到地址00H位置。 指令2:光標復位,光標返回到地址00H。 指令3:光標和顯示模式設置 I/D:光標移動方向,高電平右移,低電平左移 S:屏幕上所有文字是否左移或者右移。高電平表示有效低電平則無效。指令4:顯示開關控制。 D:控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示 C:控制光標的開與關,高電平表示有光標,低電平表示無光標 B:控制光標是否閃爍,高電平閃爍,低電平不閃爍。指令5:光標或顯示移位 S/C:高電平時移動顯示的文字,低電平時移動光標。指令6:功能設置命令 DL:高電平時為4位總線,低電平時為8位總線 N:低電平時為單行顯示,高電平時雙行顯示 F: 低電平時顯示5x7的點陣字符,高電平時顯示5x10的點陣字符。 指令7:字符發生器RAM地址設置。 指令8:DDRAM地址設置。指令9:讀忙信號和光標地址 BF:為忙標志位,高電平表示忙,-如果為低電平表示不忙。 指令10:寫數據。指令11:讀數據。
LCD1602的讀寫時序圖如圖4-2-1和4-2-2。

圖4-2-1讀操作時序

圖4-2-2 寫操作時序
由以上的數據我們可以對LCD1602進行寫程序如下:
初始化程序:
void init()
{
wc51r(0x01) ; //清屏
wc51r(0x38) ; //使用8位數據,顯示兩行,使用5x7的字形 wc51r(0x0c) ; //顯示器開,光標關,字符不閃
wc51r(0x06) ; //字符不動,光標右移一格
}
查忙函數
void fbusy()
{
P2 = 0xff ;
RS = 0 ;
RW = 1 ;
E = 0 ;
E = 1 ;
while(P2 & 0x80) //查忙
{
E = 0 ;
E = 1 ;
}
}
寫數據函數
void wc51r(uchar i)
{
fbusy() ;
E = 0 ;
RS = 0 ;
RW = 0 ; //寫入指令
E = 1 ;
P2 = i ;
E = 0 ;
}
讀數據函數
void wc51ddr(uchar i)
{
fbusy() ;
E = 0 ;
RS = 1 ;
RW = 0 ;
E = 1 ; //寫數據
P2 = i ;
E = 0 ;
}
4.3DS18B20溫度傳感器的編程
DS18B20的溫度檢測與數字數據輸出全集成于一個芯片之上 。其一個工作周期可分為兩個部分,即溫度檢測和數據處理。在講解其工作流程之前我們有必要了解DS18B20的內部存儲器資源。DS18B20共有三種形態的存儲器資源,它們分別是:ROM 只讀存儲器,用于存放DS18B20的ID編碼,其前8位是單線系列編碼 ,后面48位是芯片唯一的序列號,最后8位是以上56的位的CRC碼 。數據在出產時設置不由用戶更改。DS18B20共64位ROM。RAM 數據暫存器,用于內部計算和數據存取,數據在掉電后丟失,DS18B20共9個字節RAM,每個字節為8位。第1、2個字節是溫度轉換后的數據值信息,第3、4個字節是用戶EEPROM 的鏡像。在上電復位時其值將被刷新。第5個字節則是用戶第3個EEPROM的鏡像。第6、7、8個字節為計數寄存器,是為了讓用戶得到更高的溫度分辨率而設計的,同樣也是內部溫度轉換、計算的暫存單元。第9個字節為前8個字節的CRC碼。EEPROM 非易失性記憶體,用于存放長期需要保存的數據,上下限溫度報警值和校驗數據,DS18B20共3位EEPROM,并在RAM都存在鏡像,以方便用戶操作。單片機對DS18B20的操作流程有:
1.初始化。初始化時序如圖4-3-1

圖4-3-1
2.控制器發送ROM指令:雙方打完了招呼之后最要將進行交流了,ROM指令共有條,每一個工作周期只能發一條,ROM指令分別是讀ROM數據、指定匹配芯片、跳躍ROM、芯片搜索、報警芯片搜索。ROM指令為8位長度,功能是對片內的64位光刻ROM進行操作。其主要目的是為了分辨一條總線上掛接的多個器件并作處理。單總線上可以同時掛接多個器件,并通過每個器件上所獨有的ID號來區別,一般只掛接單個DS18B20芯片時可以跳過ROM指令。
3.控制器發送存儲器操作指令:在ROM指令發送給DS18B20之后,緊接著就是發送存儲器操作指令了。操作指令同樣為8位,共6條,存儲器操作指令分別是寫RAM數據、讀RAM數據、將RAM數據復制到EEPROM、溫度轉換、將EEPROM中的報警值復制到RAM、工作方式切換。存儲器操作指令的功能是命令DS18B20作什么樣的工作,是芯片控制的關鍵。
4.執行數據的或者寫,時序如圖4-3-2


圖4-3-2
由以上數據我們可以對DS18B20進行編程如下;
//初始化函數
uchar res (void)
{
uchar presence ;
DQ = 0 ;
delay(50) ; //CPU將數據下拉500us
DQ = 1 ; //釋放數據線等待
delay (3) ;
presence = DQ ; //DS18B20發出信號
delay (25) ;
return (presence) ;
}
//從單總線上讀一個字節函數
uchar read_byte (void)
{ //讀數據時,數據以字節的最低有效位先從總線移出
uchar i ;
uchar dat = 0 ;
for (i=8 ; i > 0 ; i--) //一位一位的讀數據
{
dat>>=1 ; //讓從總線上的數據從高位移到地位
DQ = 0 ;
DQ = 1 ;
delay (1) ;
if(DQ) dat |=0x80 ; //把數據最高位置1
delay (6) ;
}
return (dat) ;
}
//向單總線上寫一字節函數
void write_byte(uchar dat)
{
uchar i ;
for (i = 8 ; i > 0 ; i-- )
{
DQ = 0 ;
DQ = dat&0x01 ; //數據從字節自最低位開始傳輸
delay(5) ; //15us后DS18B20在總線上采樣
DQ = 1 ;
dat >>=1 ; //寫完后釋放總線
}
delay (5) ;
}
//讀取溫度函數
void read_temperature(void)
{
res () ; //初始化
write_byte(0xCC) ; //跳過ROM
write_byte(0xBE) ; //讀暫存器指令
temp.c[1] = read_byte() ; //讀取到的第一個字節為溫度
temp.c[0] = read_byte() ; //讀取到的第一個字節為溫度
res () ; //復位
write_byte(0xCC) ; //跳過ROM
write_byte(0x44) ; //溫度轉換指令
return ;
}
4.4主程序的編寫
主程序主要是讓DS18B20上測量的溫度在LCD1602上顯示出來程序如下:
#include <reg52.h> //頭文件
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^0 ;
sbit RS = P1^7 ; //端口定義
sbit RW = P1^6 ;
sbit E = P1^5 ;
union
{
uchar c[2] ;
uint x ;
} temp ;
uchar flag ; //溫度正負的標志1為正,0為負
uint cc , cc2 ; //保存溫度值
float cc1 ;
uchar buff1[13] = {"temperature :"} ; //LCD初始化顯示
uchar buff2[6] = {"+00.0"} ;
延時函數
void delay (uint j)
{
While(j--) ;
}
主函數
void main()
{
uchar k ;
delay (10) ;
E = 0 ; //LCD1602執行寫操作
flag = 0 ;
init() ;
wc51r(0x80) ; //寫入顯示起始地址
for (k = 0 ; k < 13 ; k++)
{
wc51ddr(buff1[k]) ; //寫入提示信息
}
while (1)
{
delay (10000) ;
read temperature () ; //讀取溫度
cc = tamp.c[0]*256.0 + tamp.c[1] ;
if(temp.c[0] > 0xf8)
{
flag = 1 ;
cc =~cc + 1 ;
}
else flag = 0 ;
cc1 = cc*0.0625 ; //計算出數值
cc2 = cc1*100 ; //放大便于讀取
buff2[1] = cc2/1000 + 0x30 ;
if (buff2[1] == 0x30)
buff2[1] = 0x20 ; //取出十位
buff2[2] = cc2/100 - (cc2/1000)*10 + 0x30 ;//取出個位
buff2[4] = cc2/10 -(cc2/100)*10 + 0x30 ;//取出小數位
if (flag == 1)
buff2[0] = '-' ;
else
buff2[0] = '+' ;
wc51r(0xc5) ; //寫入緩沖區的起始地址為第2行第6列
for (k = 0 ; k<6 ; k++)
{
wc51ddr(buff2[k]) ; //顯示溫度
}
}
}
5軟件仿真及性能分析
將寫好的程序在KEIL中進行調試載入程序后在protues中仿真后得到如圖5-1所示的結果

圖5-1
進過仿真后我們可以看到可以很容易的測得溫度值并且顯示出來,測溫的速度比較快。在日常使用的時候可以及時的測量溫度為人們的日常生產和生活帶來方便。
6總結
經過幾個周的不斷學習和努力,基與C51單片機的溫度測量系統的設計基本完成了。本次設計的基C51單片機的溫度測量系統是一種比較簡單的溫度測量系統,它可以 對溫度實現測量 。系統采用單總線技術,按照DS18B20的通信協議,由主機向DS18B20發送命令,讀取DS18B20轉換的溫度,從而實現對多個環境的溫度的測量。本文介紹了用C51單片機控制DS18B20,著重分析各單元電路的設計,以及各電路與單片機的接口技術。最后還給出系統的軟件的設計過程,使用了C語言進行程序設計。本文是采用模塊化的方式進行敘述,對各模塊的設計進行了比較詳細地闡述。經過這一次設計,我學了不少的知識,學會了怎樣查閱資料和利用工具書,和在設計一個東西之前要做好哪些準備和要考慮的東西。通過這次設計,我更加深刻地認識到只有將書本與具體的實踐相結合,才會有真正的收獲,才能鞏固自已的所學,認識到自己的不足。
參考文獻:
[1]謝維成、楊家國.單片機原理與應用及C51程序設計(第3版)[M].北京:清華大學出版社,2014
[2]張越、張炎、趙延軍.基于單總線器件DS18B20溫度傳感器的數字溫度計微電子學[J].2007
[3]馬洪芹用單片機控制液晶模塊顯示[J].電子科技.2008
[4]澎偉.單片機C語言程序設計實訓100例——基于8051+Proteus仿真基. 北京: 北京電子工業出版社.2009