單片機與嵌入式系統(tǒng)課程設(shè)計 院 系:自動化學(xué)院 題 目:帶串口通信的溫度監(jiān)測儀器設(shè)計 專 業(yè) 班 別:自動化155 提 交 日 期: 2018年5月
帶串口通信的溫度監(jiān)測儀器設(shè)計 摘要:本設(shè)計采用的主控芯片是ATMEL公司的AT89C51單片機,數(shù)字溫度傳感器是DALLAS公司的DS18B20。本設(shè)計用數(shù)字傳感器DS18B20測量溫度,測量精度高,傳感器體積小,使用方便。所以本次設(shè)計的數(shù)字溫度計在工業(yè)、農(nóng)業(yè)、日常生活中都有廣泛的應(yīng)用。
隨著現(xiàn)代信息技術(shù)的飛速發(fā)展和傳統(tǒng)工業(yè)改造的逐步實現(xiàn),能夠獨立工作的溫度檢測和顯示系統(tǒng)應(yīng)用于諸多領(lǐng)域。單片機技術(shù)已經(jīng)廣泛應(yīng)用社會生活的各個領(lǐng)域,已經(jīng)成為一種非常實用的技術(shù)。51單片機是最常用的一種單片機。本次設(shè)計的數(shù)字溫度計采用的是DS18B20數(shù)字溫度傳感器,DS18B20是一種可組網(wǎng)的高精度數(shù)字式溫度傳感器,并可使測量電路變得簡單、可靠。 1 總體功能 基本實現(xiàn)串口通信程序,實現(xiàn)當(dāng)儀器通過串口接收到字符“A”時,儀器通過串口發(fā)送內(nèi)容格式為“DD.DTDDU”的字符串,其中第1-4位“DD.D”為采集的溫度,第5位為字符“T”,為溫度標(biāo)識,第6-7位“DD”為溫度上限值,第8位為字符“U”,為溫度上限值標(biāo)識。 2 硬件設(shè)計 
圖 1 硬件圖 放置器件有1個AT89C51單片機,1個DS18B20溫度傳感器,1個COMPIM串口,1個RESPACK-8,1個Buzzer,1個LED-GREEN,1個CRYSTAL,5個10k電阻和5個按鈕,3個1nF電容。 AT89C51單片機: 4k 字節(jié)Flash 閃速存儲器,128字節(jié)內(nèi)部RAM,32 個I/O 口線,兩個16位定時/計數(shù)器,一個5向量兩級中斷結(jié)構(gòu),一個全雙工串行通信口,片內(nèi)振蕩器及時鐘電路。同時,AT89C51可降至0Hz的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式。空閑方式停止CPU的工作,但允許RAM,定時/計數(shù)器,串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存RAM中的內(nèi)容,但振蕩器停止工作并禁止其它所有部件工作直到下一個硬件復(fù)位。 VCC:供電電壓。 GND:接地。 P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P0口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的低八位。在FIASH編程時,P0 口作為原碼輸入口,當(dāng)FIASH進行校驗時,P0輸出原碼,此時P0外部必須接上拉電阻。 P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗時,P1口作為低八位地址接收。 P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當(dāng)P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。 P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 P3口也可作為AT89C51的一些特殊功能口,如下表所示: 口管腳 備選功能 P3.0 RXD(串行輸入口) P3.1 TXD(串行輸出口) P3.2 /INT0(外部中斷0) P3.3 /INT1(外部中斷1) P3.4 T0(計時器0外部輸入) P3.5 T1(計時器1外部輸入) P3.6 /WR(外部數(shù)據(jù)存儲器寫選通) P3.7 /RD(外部數(shù)據(jù)存儲器讀選通) P3口同時為閃爍編程和編程校驗接收一些控制信號。 RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST腳兩個機器周期的高電平時間。 ALE/PROG:當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的低位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。 /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。 /EA/VPP:當(dāng)/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。 XTAL2:來自反向振蕩器的輸出。 采用集成芯片DS18B20:DS18B20是DALLAS公司生產(chǎn)的一線式數(shù)字溫度傳感器,每一片芯片內(nèi)部都有一個全球惟一的64 位編碼,在多路測溫時就是通過匹配這個編碼(ID)來確定下一步對那一個溫度傳感器進行操作,故在同一總線上可以掛接多個傳感器芯片。該芯片具有三引腳TO-92小體積封裝形式,DS18B20數(shù)字溫度計是DALLAS公司生產(chǎn)的1-Wire器件,即單總線器件,具有線路簡單,體積小等特點。DS18B20數(shù)字溫度傳感器接線方便,在不同的場合當(dāng)中其“封裝”形式多樣,如管道式,螺紋式,磁鐵吸附式,不銹鋼封裝式,型號多種多樣,有LTM8877,LTM8874等等。故DS18B20的體積小,使用方便,封裝形式多樣等優(yōu)點,使其特別適合在一些空間比較小以及溫度變化的速度比較緩慢的環(huán)境中工作。 圖 2 DS18B20的封裝形式 DS18B20的64位ROM的結(jié)構(gòu)開始8位是產(chǎn)品類型的編號,接著是每個器件的惟一的序號,共有48位,最后8位是前面56位的CRC檢驗碼,這也是多個DS18B20可以采用一線進行通信的原因。溫度報警觸發(fā)器TH和TL,可通過軟件寫入戶報警上下限。 DS18B20溫度傳感器的內(nèi)部存儲器還包括一個高速暫存RAM和一個非易失性的可電擦除的EEPRAM。高速暫存RAM的結(jié)構(gòu)為8字節(jié)的存儲器,結(jié)構(gòu)如圖2-3所示。 圖 3 DS18B20的高速暫存RAM的結(jié)構(gòu) 頭2個字節(jié)包含測得的溫度信息,第3和第4字節(jié)TH和TL的拷貝是易失的,每次上電復(fù)位時被刷新。第5個字節(jié),為配置寄存器,它的內(nèi)容用于確定溫度值的數(shù)字轉(zhuǎn)換分辨率,DS18B20工作時寄存器中的分辨率轉(zhuǎn)換為相應(yīng)精度的溫度數(shù)值。 當(dāng)DS18B20接收到溫度轉(zhuǎn)換命令后,開始啟動轉(zhuǎn)換。轉(zhuǎn)換完成后的溫度值就以16位帶符號擴展的二進制補碼形式存儲在高速暫存存儲器的第1、2字節(jié)。單片機可以通過單線接口讀出該數(shù)據(jù),讀數(shù)據(jù)時低位在先,高位在后,數(shù)據(jù)格式以0.0625℃/LSB形式表示。 3 單片機程序設(shè)計(宋體,小四,加粗) 3.1 主程序 - <font color="rgb(0, 0, 0)"><font face="Calibri"><font style="font-size: 12pt">void main()
- {
- int temp;
- int datas1[] = {0, 0, 0, 0, 0};
-
- UsartConfiguration();
- LcdInit(); //初始化LCD1602
- LcdWriteCom(0x85); //寫地址 80表示初始地址
- LcdWriteData('C');
- SETTEMP=32;
- datas1[0]=SETTEMP/10;
- datas1[1]=SETTEMP%10;
- LcdWriteCom(0x80+0x40+9);
- LcdWriteData(datas1[0]+'0');
- LcdWriteCom(0x80+0x40+10);
- LcdWriteData(datas1[1]+'0');
- while(1)
- {
- temp=Ds18b20ReadTemp();
- LcdDisplay(temp);
- Delay1ms(1000);//1s鐘刷一次
- if(k1==0)
- {
- Delay1ms(10);
- SETTEMP=SETTEMP+1;
- Delay1ms(1000);//1s鐘刷一次
- datas1[0]=SETTEMP/10;
- datas1[1]=SETTEMP%10;
- LcdWriteCom(0x80+0x40+9);
- LcdWriteData(datas1[0]+'0');
- LcdWriteCom(0x80+0x40+10);
- LcdWriteData(datas1[1]+'0');
- }
- if(k2==0)
- {
- Delay1ms(10);
- SETTEMP=SETTEMP-1;
- datas1[0]=SETTEMP/10;
- datas1[1]=SETTEMP%10;
- LcdWriteCom(0x80+0x40+9);
- LcdWriteData(datas1[0]+'0');
- LcdWriteCom(0x80+0x40+10);
- LcdWriteData(datas1[1]+'0');
- }
- }
- }</font></font></font>
復(fù)制代碼
3.2 各程序模塊 3.2.1 溫度采集程序模塊 使用DS18B20溫度傳感器進行測量,其中1引腳接地,2引腳接AT89C51的P3.7引腳,3引腳接電源。 
圖 4 溫度采集模塊 #include"temp.h" void Ds18b20WriteByte(unsigned char dat) { unsigned int i,j; for(j=0;j<8;j++) { DSPORT=0; //每寫入一位數(shù)據(jù)之前先把總線拉低1us i++; DSPORT=dat&0x01; //然后寫入一個數(shù)據(jù),從最低位開始 i=6; while(i--); //延時68us,持續(xù)時間最少60us DSPORT=1; //然后釋放總線,至少1us給總線恢復(fù)時間才能接著寫入第二個數(shù)值 dat>>=1; } } unsigned char Ds18b20ReadByte() { unsigned char byte,bi; unsigned int i,j; for(j=8;j>0;j--) { DSPORT=0;//先將總線拉低1us i++; DSPORT=1;//然后釋放總線 i++; i++;//延時6us等待數(shù)據(jù)穩(wěn)定 bi=DSPORT; //讀取數(shù)據(jù),從最低位開始讀取 /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/ byte=(byte>>1)|(bi<<7); i=4; //讀取完之后等待48us再接著讀取下一個數(shù) while(i--); } return byte; } void Ds18b20ChangTemp() { Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳過ROM操作命令 Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令 } void Ds18b20ReadTempCom() { Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳過ROM操作命令 Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令 } int Ds18b20ReadTemp() { int temp=0; unsigned char tmh,tml; Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令 Ds18b20ReadTempCom(); //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令 tml=Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節(jié) tmh=Ds18b20ReadByte(); //再讀高字節(jié) temp=tmh; temp<<=8; temp|=tml; return temp; } 3.2.2 液晶顯示和聲光報警程序模塊 使用LM016L液晶進行顯示,其中1引腳VSS接地,2引腳VDD和3引腳VEE接電源。4引腳RS接單片機AT89C51的P2.6引腳, 5引腳RW接單片機AT89C51的P2.5,引腳6 E接單片機AT89C51的P2.7引腳,7引腳到14引腳即D0到D7分別接P0.0到P0.7。 
圖 5 液晶顯示模塊 放置一個led-green和buzzer,接線如下。 
圖 6 報警模塊 void LcdDisplay(int temp) //lcd顯示 { unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組 float tp;
LcdWriteCom(0x80); //寫地址 80表示初始地址 tp=temp; temp=tp*0.0625*100+0.5; if((temp/100)>(SETTEMP-1)) { beep=0; } else { beep=1; } //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點 //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就 datas[1] = temp % 10000 / 1000; datas[2] = temp % 1000 / 100; datas[3] = temp % 100 / 10; datas[4] = temp % 10;
str[0]=datas[1]+'0'; str[1]=datas[2]+'0'; str[2]='.'; str[3]=datas[3]+'0'; str[4]='T'; str[5]=SETTEMP/10+'0'; str[6]=SETTEMP%10+'0'; str[7]='U'; LcdWriteCom(0x80); //寫地址 80表示初始地址 LcdWriteData('t'); LcdWriteCom(0x81); //寫地址 80表示初始地址 LcdWriteData('e'); LcdWriteCom(0x82); //寫地址 80表示初始地址 LcdWriteData('m'); LcdWriteCom(0x83); //寫地址 80表示初始地址 LcdWriteData('p'); LcdWriteCom(0x84); //寫地址 80表示初始地址 LcdWriteData(':'); LcdWriteCom(0x85); //寫地址 80表示初始地址 LcdWriteData('0'+datas[1]); //十位 LcdWriteCom(0x86); //寫地址 80表示初始地址 LcdWriteData('0'+datas[2]); //個位 LcdWriteCom(0x87); //寫地址 80表示初始地址 LcdWriteData('.'); //顯示 ‘.’ LcdWriteCom(0x88); //寫地址 80表示初始地址 LcdWriteData('0'+datas[3]); //顯示小數(shù)點 LcdWriteCom(0x89); //寫地址 80表示初始地址 LcdWriteData('C'); //顯示小數(shù)點 LcdWriteCom(0x80+0x40); //寫地址 80表示初始地址 for(i=0;i<=8;i++) { LcdWriteData(CNCHAR); } LcdWriteCom(0x80+0x40+13); LcdWriteData('C'); // datas1[0]=SETTEMP/10; // datas1[1]=SETTEMP%10; // LcdWriteCom(0x80+0x40+9); // LcdWriteData(datas1[0]+'0'); // LcdWriteCom(0x80+0x40+10); // LcdWriteData(datas1[1]+'0'); LcdWriteCom(0x80+0x40+11); LcdWriteData('.'); LcdWriteCom(0x80+0x40+12); LcdWriteData('0'); } 3.2.4 串口通信程序模塊 將AT89C51的TXD連接COMPIM的TXD, AT89C51的RXD連接COMPIM的RXD,實現(xiàn)數(shù)據(jù)的接受發(fā)送。 
圖 7 串口模塊 //串口配置 SCON &= (uint8_t)((uint8_t)( ~( UART_MODE | UART_RX ))); //清SM0 SM1 REN SCON |= (uint8_t)( UART_8BAUDRATE_VOLATILE | UART_RX );
//TIM1配置 TMOD &= (uint8_t)((uint8_t)( ~TIM1_MODE )); TMOD |= TIM1_MODE_2; //8位自動重裝 PCON = 0x00; TH1 = 0xFD; //波特率默認(rèn)配置為9600 TL1 = 0xFD;
TI = 1; //清發(fā)送標(biāo)志 TR1 = 1; //使能定時器 } uint8_t drv_uart_rx_bytes( uint8_t* RxBuffer ) { uint8_t l_RxLength = 0; uint16_t l_UartRxTimOut = 0x7FFF;
while( l_UartRxTimOut-- ) //在超時范圍內(nèi)檢測數(shù)據(jù) { if( 0 != RI ) //檢測是否接收到數(shù)據(jù) { RI = 0; //清標(biāo)志位 *RxBuffer = SBUF; //讀數(shù)據(jù) RxBuffer++; l_RxLength++; l_UartRxTimOut = 0x7FFF;//重置超時檢測 } } return l_RxLength; //等待超時,數(shù)據(jù)接收完成 } 4仿真測試分析 基本實現(xiàn)串口通信程序,實現(xiàn)當(dāng)儀器通過串口接收到字符“A”時,儀器通過串口發(fā)送內(nèi)容格式為“DD.DTDDU”的字符串,其中第1-4位“DD.D”為采集的溫度,第5位為字符“T”,為溫度標(biāo)識,第6-7位“DD”為溫度上限值,第8位為字符“U”,為溫度上限值標(biāo)識。 且AT89C51單片機雙擊加入hex文件,雙擊串口進行設(shè)置,如波特率,串口號,校驗位等,使用虛擬串口軟件虛擬串口線,用串口調(diào)試助手進行仿真調(diào)試。 
圖 8 仿真框圖 5.結(jié)語 軟件設(shè)計中,把程序按功能分模塊的話能提高編程效率,把問題一一解決,同時使問題簡單化。 總的來說,自己從這次獨立的課程設(shè)計中收獲了一些知識與經(jīng)驗,一些從書本中學(xué)之不來的東西,不是說理論無用,而這恰恰是在理論的土壤中開出的花朵,是在理論的肩膀望見的更寬廣的道路!成功來之不易,自主動手動腦實踐,小小的成果亦能帶來碩大的喜悅!
完整的Word格式文檔51黑下載地址:
單片機.docx
(351.45 KB, 下載次數(shù): 31)
2018-6-29 15:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|