|
單片機課程設計:基于基于PIC16F877A單片機的八路溫度巡回檢測系統設計
課 程 設 計
八路溫度巡回檢測系統設計
院 (系): XXXXXX學院
專 業: XXXXXX
學 號: XXXXXXX
學生姓名: XXX
指導老師: XXX
摘 要
本文介紹了一種基于PIC16F877A單片機,利用DS18B20對多路溫度采集,并進行溫度的控制與檢測,并通過12864液晶顯示出來。系統中通過控制按鈕實現了實時各路的報警溫度,并且實現多路與任一單路溫度顯示切換,從而既可以進行多路的檢測又可以進行任一單路的監控,而且還有數字跟圖形兩種顯示方式更為直觀。在溫度超過設定溫度時溫度跟時間通過24C02存儲起來,以便查看,同時可以通過固定電話遠程報警,還能將溫度上傳至PC機,進行后續處理。
關鍵詞:溫度檢測;單片機;串行通訊;DS18B20;
目 錄
1 系統設計 7
2 主芯片:PIC16F877A單片機簡介 9
2.1 PIC單片機的優越之處: 9
2.2 PIC16F877A引腳圖及主要性能 10
2.3 最小系統 11
2.3.1復位功能 11
2.3.2 系統時鐘 12
2.4 設計心得總結 12
3 LCD12864液晶原理介紹及接口實現 12
3.1 液晶顯示模塊概述 12
3.2 液晶引腳說明 13
3.3 接口時序 14
3.4 具體指令介紹 15
3.5 顯示坐標關系 19
3.5.1、圖形顯示坐標 19
3.5.2 漢字顯示坐標 20
3.6 與單片機的接口實現 21
3.7 設計心得總結 22
4 DS18B20原理介紹及接口實現 22
4.1 DS18B20簡介 22
4.2 DS18B20結構及其工作原理 23
4.3 DS18B20的接口實現 29
4.3.1 硬件設計 29
4.3.2 軟件設計 30
4.4 設計心得總結 31
4.4.1 焊接問題: 31
4.4.2 軟件設計: 31
4.4.3 不足: 31
5 存儲芯片AT24C02簡單介紹及接口實現 32
5.1 AT24C02功能描述管腳定義 32
5.2 管腳定義及接口實現 32
5.3 設計心得 34
6 實時時鐘DS1302簡單介紹及接口實現 34
6.1 DS1302簡介 34
6.2 DS1302結構及工作原理 34
6.3 DS1302的接口實現 35
7 溫度上限報警功能 37
7.1 設計原理 37
7.2 設計心得體會 37
8 與PC串口通訊及VB上位機簡單介紹 38
8.1 與PC串口通信 38
8.2 上位機介紹 39
9 總結 43
附錄 44
部分原理圖: 44
參考文獻: 45
基于PIC單片機的多路溫度監控巡回系統
系統設計
在工業生產和日常生活中,經常要對溫度進行測量與控制,并且有時是對多個點進行溫度測量,比如冷庫溫度監控、環境溫度監測、農業溫室監控、糧庫溫度監控等。在這種情況下,多點溫度檢測系統應運而生。多點溫度檢測系統通常能夠對多個工作點的溫度進行檢測,顯示當前溫度,并能夠對溫度進行存儲和報警,還能將溫度上傳至PC機,進行后續處理。傳統的測溫元件有熱電偶和熱電阻,需很多硬件支持并且電路復雜。本文將設計一款由新型的數字溫度傳感器DS18B20配合單片機,具有溫度檢測、顯示、存儲、自動統計分析及跟電腦通訊連接還利用固定電話遠程報警等功能的多點溫度監控系統。
圖 1.1 多路溫度監控系統模擬應用
溫度監控主系統構架框圖如圖 1.2 所示:
圖 1.2 多路溫度監控系統構架框圖
圖1.3 手工焊接實物圖
主要技術參數
A溫度檢測范圍 : -55℃~+125℃
B測量精度 : 0.0625℃
C 顯示方式: LCD12864顯示
D 報警方式: 固話報警
主芯片:PIC16F877A單片機簡介
2.1 PIC單片機的優越之處:
1 哈佛總線結構:
MCS-51單片機的總線結構是馮-諾依曼型,計算機 在同一個存儲空間取指令和數據,兩者不能同時進行;而PIC單片機的總線結構是哈佛結構,指令和數據空間是完全分開的,一個用于指令,一個用于數據,由于 可以對程序和數據同時進行訪問,所以提高了數據吞吐率。正因為在 PIC單片機中采用了哈佛雙總線結構,所以與常見的微控制器不同的一點是:程序和數據總線可以采用不同的寬度。數據總線都是8位的,但指令總線位數分別位 12、14、16位。
2 流水線結構:
MCS-51單片機的取指和執行采用單指令流水線結構,即取一條指令,執行完后再取下一條指令;而PIC的取指和執行采用雙指令流水線結構,當一條指令被執行時,允許下一條指令同時被取出,這樣就實現了單周期指令。
3 寄存器組:
PIC單片機的所有寄存器,包括I/O口,定時器和程序計數器等都采用RAM結構形式,而且都只需要一個指令周期就可以完成訪問和操作;而MCS-51單片機需要兩個或兩個以上的周期才能改變寄存器的內容。
(4)運行速度高:
由于采用了哈佛總線結構,以及指令的讀取和執行才用了流水作業方式,使得運行速度大大提高。
(5)功耗低:
PIC單片機的功率消耗極低,是目前世界上最低的單片機品種之一。在4MHz時鐘下工作時耗電不超過2mA,在睡眠模式下耗電可以低到1uA以下。
(6)驅動能力強:
I/O端口驅動負載的能力較強,每個I/O引腳吸入和輸出電流的最大值可分別達到25mA和20mA,能夠直接驅動發光二極管LED、光電耦合器或者輕微繼電器等。
(7)外接電路簡潔
PIC單片機片內集成了上電復位電路、I/O引腳上拉電路、看門狗定時器等,可以最大程度減少或免用外接器件,以便實現“純單片機”應用。這樣,不僅方便于開發,而且還可節省用戶的電路空間和制作成本。
(8)程序保密性強
目前,尚無辦法對其直接進行解密拷貝,可以最大限度的保護用戶的程序版權。
2.2 PIC16F877A引腳圖及主要性能
PIC16F877A的詳細引腳如圖2.2-1所示。
圖 2.2-1 PIC16F877A引腳圖 圖 2.2 -2 PIC16F877A實物圖
主要性能參數如下所示:
具有高性能RISC CPU
僅有35條單字指令
100000次擦寫周期
除程序分支指令為兩個周期外,其余均為單周期指令
運行速度: DC―20MHZ始終輸入
DC―200ns 指令周期
8K * 14個 FLASH程序存儲器
368 * 8 個數據存儲器(RAM)字節
256 * 8 EEPRM 數據存儲器字節
提供14個中斷源
功耗低
在5V, 4MHZ 時鐘運行時電流小于 2mA
在3V, 32KHZ 時鐘運行時電流小于20Ua
支持在線串行編程(ICSP)
運行電壓范圍廣,2.0V到5.5V
輸入及輸出電流可達到25mA
Timer0:帶有預分頻器的8位定時器/計數器
Timer1:帶有預分頻器的16位定時器/計數器,在使用外部晶振震蕩時鐘時,在睡眠期間仍能工作
Timer2:帶有8位周期寄存器,預分頻器和后分頻器的8位定時器/計數器。
2個捕捉器,比較器,PWM模塊
其中:
捕捉器是16位,最大分辨率是12.5ns
比較器是16位,最大分辨率是200ns
PWM最大分辨率是10位
10位多通道模數轉換器
2.3 最小系統
2.3.1復位功能
PIC16F877A的復位功能設計得比較完善,實現復位或引起復位的條件和原因可以歸納成4類:人工復位、上電復位、看門狗復位、欠壓復位。
這里簡單介紹一下人工復位
人工復位:無論是單片機在正常運行程序,還是處在睡眠狀態或出現死機狀態,只要在人工復位端MCLR加入低點平信號,就令其復位。
本次設計的電路圖如圖2.3-1所示。
圖 2.3―1 PIC最小系統電路圖 圖2.3―2 最小系統實物圖
2.3.2 系統時鐘
數字電路的工作離不開時鐘信號,每一步細微動作都是在一個共同的時間基準信號協調下完成的。作為時基發生器的時鐘震蕩電路,為整個單片機芯片的工作提供系統時鐘信號,也為單片機與其他外接芯片之間的通訊提供可靠的同步時鐘信號。
PIC16F877A的時鐘電路是由片內的一個反相器和一個反饋電阻,與外接的1個石英晶體和2個電容,共同構成的一個自激多諧振蕩器。電路如圖2.3-1 所示。
2.4 設計心得總結
PIC16F877A的最小系統跟51相似,較為簡單。芯片自身增加了很多功能,如:自帶8路AD轉換、增加SPI總線,引腳復位功能多等。芯片自身功能的增加給設計帶來了很多靈活性,同時也是學習的難點。
LCD12864液晶原理介紹及接口實現
3.1 液晶顯示模塊概述
12864A-1漢字圖形點陣液晶顯示模塊,可顯示漢字及圖形,內置8192個中文漢字(16X16點陣)、128個字符(8X16點陣)及64X256點陣顯示RAM(GDRAM)。
主要技術參數和顯示特性:
電源:VDD 3.3V~+5V 內置升壓電路,無需負壓 ;
顯示內容:128列× 64行
顯示顏色:黃綠
顯示角度:6:00鐘直視
LCD類型:STN
與MCU接口:8位或4位并行/3位串行
配置LED背光
多種軟件功能:光標顯示、畫面移位、自定義字符、睡眠模式等
3.2 液晶引腳說明
引腳號 引腳名稱 方向 功能說明 1 VSS - 模塊的電源地 2 VDD - 模塊的電源正端 3 V0 - LCD驅動電壓輸入端 4 RS CS H/L 并行的指令/數據選擇信號;串行的片選信號 5 R/W SID H/L 并行的讀寫選擇信號;串行的數據口 6 E CLK H/L 并行的使能信號;串行的同步時鐘 7 DB0 H/L 數據0 8 DB1 H/L 數據1 9 DB2 H/L 數據2 10 DB3 H/L 數據3 11 DB4 H/L 數據4 12 DB5 H/L 數據5 13 DB6 H/L 數據6 14 DB7 H/L 數據7 15 PSB H/L 并/串行接口選擇:H-并行;L-串行 16 NC 空腳 17 /RET H/L 復位 低電平有效 18 NC 空腳 19 LED_A - 背光源正極(LED+5V) 20 LED_K - 背光源負極(LED-OV)
邏輯工作電壓 VDD :4.5~5.5V
電源地 GND :0V
工作溫度 Ta :0~60℃ 常溫 / -20~75℃(寬溫)
3.3 接口時序
模塊有并行和串行兩種連接方法,本文采用并行接法(時序如下):
8位并行連接時序圖
MPU寫資料到模塊
程序實現如下:
/********************************************************************
* 名 稱:send_i
* 功 能:寫一個字節命令到LCD
* 入口參數:unsigned char x 字符
*******************************************************************/
void send_i unsigned char x
chk_busy ; //檢測LCD是否工作繁忙
rs 0; //設置該字節數據為控制命令
rw 0; //設置此次操作為寫
PORTD x; //送數據口PORTD
e 1; //使能
nop ;
nop ;
nop ;
e 0; //禁止
MPU從模塊讀出資料
程序實現如下:
/*************************************************
讀數據
**************************************************/
unsigned char u8_Lcd12864ReadByte_f void
unsigned char byReturnValue ;
chk_busy ; //檢測LCD是否工作繁忙
TRISD 0XFF; //設置PD口為輸入狀態
PORTD 0xff ; //PD初始化為高電平
rs 1; // 讀置高
rw 1; // 寫置高
e 0; // 使能置低
e 1; // 使能置高
byReturnValue PORTD ; // 讀數據
e 0; // 關使能
TRISD 0X00; // 恢復PD口為輸出
return byReturnValue ; // 返回讀到的數據
3.4 具體指令介紹
1、清除顯示
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L L L L H 功能:清除顯示屏幕,把DDRAM位址計數器調整為“00H”
2、位址歸位
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L L L H X 功能:把DDRAM位址計數器調整為“00H”,游標回原點,該功能不影響顯示DDRAM
3、位址歸位
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L L H I/D S 功能:把DDRAM位址計數器調整為“00H”,游標回原點,該功能不影響顯示DDRAM功能:執行該命令后,所設置的行將顯示在屏幕的第一行。顯示起始行是由Z地址計數器控制的,該命令自動將A0-A5位地址送入Z地址計數器,起始地址可以是0-63范圍內任意一行。Z地址計數器具有循環計數功能,用于顯示行掃描同步,當掃描完一行后自動加一。
4、顯示狀態 開/關
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L H D C B 功能: D 1;整體顯示ON C 1;游標ON B 1;游標位置ON
5、游標或顯示移位控制
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L H S/C R/L X X 功能:設定游標的移動與顯示的移位控制位:這個指令并不改變DDRAM的內容
6、功能設定
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L H DL X 0 RE X X 功能:DL 1(必須設為1) RE 1;擴充指令集動作 RE 0:基本指令集動作
7、設定CGRAM位址
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L H AC5 AC4 AC3 AC2 AC1 AC0 功能:設定CGRAM位址到位址計數器(AC)
8、設定DDRAM位址
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L H AC6 AC5 AC4 AC3 AC2 AC1 AC0 功能:設定DDRAM位址到位址計數器(AC)
9、讀取忙碌狀態(BF)和位址
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L H BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 功能:讀取忙碌狀態(BF)可以確認內部動作是否完成,同時可以讀出位址計數器(AC)的值
10、寫資料到RAM
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
H L D7 D6 D5 D4 D3 D2 D1 D0 功能:寫入資料到內部的RAM(DDRAM/CGRAM/TRAM/GDRAM)
11、讀出RAM的值
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
H H D7 D6 D5 D4 D3 D2 D1 D0 功能:從內部RAM讀取資料(DDRAM/CGRAM/TRAM/GDRAM)
12、 待命模式(12H)
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L L L L H 功能:進入待命模式,執行其他命令都可終止待命模式
13、卷動位址或IRAM位址選擇(13H)
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L L L H SR 功能:SR 1;允許輸入卷動位址 SR 0;允許輸入IRAM位址
14、反白選擇(14H)
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L L H R1 R0 功能:選擇4行中的任一行作反白顯示,并可決定反白的與否
15、睡眠模式(015H)
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L H SL X X 功能:SL 1;脫離睡眠模式 SL 0;進入睡眠模式
16、擴充功能設定(016H)
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L H H X 1 RE G L 功能:RE 1;擴充指令集動作 RE 0;基本指令集動作 G 1;繪圖顯示ON G 0;繪圖顯示OFF
17、設定IRAM位址或卷動位址(017H)
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L H AC5 AC4 AC3 AC2 AC1 AC0 功能:SR 1;AC5~AC0為垂直卷動位址 SR 0;AC3~AC0寫ICONRAM位址
18、設定繪圖RAM位址(018H)
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L H AC6 AC5 AC4 AC3 AC2 AC1 AC0 功能:設定GDRAM位址到位址計數器(AC)
備注、
1、當模塊在接受指令前,微處理順必須先確認模塊內部處于非忙碌狀態,即讀取BF標志時BF需為0,方可接受新的指令;如果在送出一個指令前并不檢查BF標志,那么在前一個指令和這個指令中間必須延遲一段較長的時間,即是等待前一個指令確實執行完成,指令執行的時間請參考指令表中的個別指令說明。
2、“RE”為基本指令集與擴充指令集的選擇控制位元,當變更“RE”位元后,往后的指令集將維持在最后的狀態,除非再次變更“RE”位元,否則使用相同指令集時,不需每次重設“RE”位元。
本次設計液晶初始化如下:
void lcd_init
rst 0; //復位LCD
delay 1 ; //保證復位所需要的時間(1ms)
rst 1; //恢復LCD正常工作
// nop ;
// psb 1; //設置LCD為8位并口通信
send_i 0x30 ; //基本指令操作
send_i 0x01 ; //清除顯示
send_i 0x06 ; //指定在寫入或讀取時,光標的移動方向
send_i 0x0c ; //開顯示,關光標,不閃爍
3.5 顯示坐標關系
3.5.1、圖形顯示坐標
水平方向X―以字節單位
垂直方向Y―以位為單位
/*******************************************
函數名稱:Draw_PM
功 能:在整個液晶屏幕上畫圖
參 數:無
返回值 :無
********************************************/
void Draw_PM const uchar *ptr
uchar i,j,k;
send_i 0x34 ; //打開擴展指令集
i 0x80;
for j 0;j 32;j++
send_i i++ ;
send_i 0x80 ;
for k 0;k 16;k++
send_d *ptr++ ;
i 0x80;
for j 0;j 32;j++
send_i i++ ;
send_i 0x88 ;
for k 0;k 16;k++
send_d *ptr++ ;
send_i 0x36 ; //打開繪圖顯示
send_i 0x30 ; //回到基本指令集
3.5.2 漢字顯示坐標
X坐標 Line1 80H 81H 82H 83H 84H 85H 86H 87H Line2 90H 91H 92H 93H 94H 95H 96H 97H Line3 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH Line4 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH /****************************************************************
* 名 稱: writelcd()
* 功 能: 在LCD上顯示字符串
* 入口參數:const unsigned char *pt 字符串的首地址
**************************************************************/
void writelcd const unsigned char *pt
while *pt //檢測是否達到了字符串最后
send_d *pt++ ; //發送數據給lcd
// 應用如下
const uchar table1[ ] " 基PIC 單片機" ;
const uchar table2[ ] " 多路溫度" ;
const uchar table3[ ] " 巡回檢測系統" ;
const uchar table4[ ] "2009年12月01日" ;
send_i 0x80 ; // 定位在第一行
writelcd table1 ; // 寫:基PIC 單片機
send_i 0x90 ; // 定位在第二行
writelcd table2 ; // 寫:多路溫度
send_i 0x88 ; // 定位在第三行
writelcd table3 ; // 寫:巡回檢測系統
send_i 0x98 ; // 定位在第四行
writelcd table4 ; // 寫:2009年12月01日
3.6 與單片機的接口實現
12864液晶的電路連線圖如圖3.6 -1所示,實物位置如圖3.6 -2所示
圖 3.6 -1 12864液晶電路連接圖
圖 3.6 -2 12864液晶模塊實物圖
設計心得總結
LCD12864與1602相比需要較大的電流驅動,如果出現圖片模糊不清晰或者灰暗,除了檢查背光燈外應考慮電源問題。最好采用大于5V的電源,經7805穩壓管穩壓驅動,以保證電流;掘寗痈1602相似難度不大。中文及圖像顯示是12864最大的特點也是難點,主要是指令較多,還有就是圖像驅動需要了解液晶內部原理。整屏畫圖可以使用PCtoLCD2002把圖片轉換成16進制數,局部畫曲線、直線、圓等需要一些算法,比較復雜
DS18B20原理介紹及接口實現DS18B20是DALLAS公司的
圖4.1DS18B20內部結構圖
DS18B20的內部結構圖如圖4.1所示。由此我們可以看出DS18B20主要由4部分組成:64位ROM、溫度傳感器、非揮發的溫度報警觸發器TH和TL、配置寄存器。DS18B20的管腳排列如圖所示,DQ為數字信號輸入/輸出端;GND為電源地;VDD為外接供電電源輸入端在寄生電源接線方式時接地
圖4.3 DS18B20復位時序圖
程序實現如下:
/********************************************************************
* 名 稱:reset
* 功 能:18b20復位
********************************************************************/
#define DQ RB7
#define DQ_HIGH TRISB7 1
#define DQ_LOW TRISB7 0;DQ 0
void reset
uchar st 1;
DQ_HIGH ; // 先拉至高電平
NOP ;NOP ;
while st
DQ_LOW ; // 低電平
delayus 70,30 ; // 延時503us
DQ_HIGH ; //釋放總線等電阻拉高總線
delayus 4,4 ; //延時60us
if DQ 1 //沒有接收到應答信號,繼續復位
st 1;
else //接收到應答信號
st 0;
delayus 50,10 ; //延時430us
DS18B20的讀時序:
對于DS18B20的讀時序分為讀0時序和讀1時序兩個過程。
對于DS18B20的讀時隙是從主機把單總線拉低之后,在15uS之內釋放單總線,以讓DS18B20把數據傳輸到單總線上。DS18B20在完成一個讀時序過程,至少需要60us才能完成。
圖4.4 DS18B20讀時序圖
/********************************************************************
* 名 稱:read_byte
* 功 能:18b20讀字節
* 出口參數:讀出18B20的內容
********************************************************************/
uch read_byte
uch i;
uch value 0; //讀出溫度
static bit j;
for i 8;i 0;i--
value 1;
DQ_LOW ;
NOP ;NOP ;NOP ;NOP ;NOP ;NOP ; //6us
DQ_HIGH ; //拉至高電平
NOP ;NOP ;NOP ;NOP ;NOP ; //4us
j DQ;
if j value | 0x80;
delay 2, 7 ; //63us
return value ;
DS18B20的寫時序:
對于DS18B20的寫時序仍然分為寫0時序和寫1時序兩個過程。
對于DS18B20寫0時序和寫1時序的要求不同,當要寫0時序時,單總線要被拉低至少60us,保證DS18B20能夠在15us到45us之間能夠正確地采樣IO總線上的“0”電平,當要寫1時序時,單總線被拉低之后,在15us之內就得釋放單總線。
圖4.5 DS18B20寫時序圖
/********************************************************************
* 名 稱:write_byte
* 功 能:寫18b20寫字節
* 入口參數:uch val 待寫的數據
*******************************************************************/
void write_byte uch val
uch i;
uch temp;
for i 8;i 0;i--
temp val & 0x01; //最低位移出
DQ_LOW ;
NOP ;NOP ;NOP ;NOP ;NOP ; //從高拉至低電平,產生寫時間隙
if temp 1 DQ_HIGH ; //如果寫1,拉高電平
delay 2, 7 ; //延時63us
DQ_HIGH ;
NOP ;NOP ;
val val 1; //右移一位
DS18B20內部帶有共9個字節的高速暫存器RAM和電可擦除EEPROM,起結構如表2所示。
表2 DS18B20高速暫存器結構
寄存器內容 字節地址 溫度值低位(LSB) 0 溫度值高位(MSB) 1 高溫限值(TH) 2 低溫限值(TL) 3 配置寄存器 4 保留 5 保留 6 保留 7 CRC校驗值 8
DS18B20所包含的操作指令如表3所示。
表3 DS18B20操作指令
ROM操作指令 指令 約定代碼 功能 讀ROM 33H 讀DS18B20溫度傳感器ROM中的編碼(即64位地址) 匹配ROM 55H 發出命令后接著發出64位ROM編碼,訪問總線上與該編碼對應的芯片 搜索ROM F0H 用于確定掛接在同一總線上DS18B20的個數 跳過ROM CCH 忽略64位ROM地址,直接向DS18B20發溫度變換命令 告警搜索 ECH 執行后只有問多超過上限或下限的芯片才響應 RAM操作指令 指令 約定代碼 功能 溫度轉換 44H 啟動DS18B20溫度轉換。12位轉換時長典型值750ms 讀暫存器 BEH 讀內部RAM中9字節的數據。 寫暫存器 4EH 向RAM第2、3字節寫上、下限溫度數據,緊跟命令之后傳送2字節數據 復制暫存器 48H 將RAM中第2、3字節的內容復制到內部EEPROM中 重調EEPROM B8H 將EEPROM中內容恢復到RAM中第3、4字節
溫度數據在高速暫存器RAM的第0和第1個字節中的存儲格式如下表4所示。
表4 DS18B20溫度數據存儲格式
位7 位6 位5 位4 位3 位2 位1 位0 23 22 21 20 2-1 2-2 2-3 2-4 位15 位14 位13 位12 位11 位10 位9 位8 S S S S S 26 25 24
DS18B20在出廠是默認配置為12位,其中最高位為符號位,即溫度值共11位,單片機在讀取數據時,一次會讀2字節共16位,讀完后將低11位的二進制數轉化為十進制數后再乘以0.0625便為所測的實際溫度值。另外,還需要判斷溫度的正負。前5個數字為符號位,這5位同時變化,我們只需要判斷11位就可以了。前5位為1時,讀取的溫度為負值,且測到的數值需要取反加1再乘以0.0625才可得到實際溫度值。前5位為0時,讀取的溫度為正值,且溫度為正值時,只要將測得的數值乘以0.0625即可得到實際溫度值。考慮到實際使用的需要,在這里我們只使用一個DS18B20,故每次操作前只需復位后發出Skip ROM指令(即跳過ROM指令)再讀出溫度的正值、并精確到小數點后一位,即可滿足設計需求。
/*****************************************************************
* 名 稱:get_temp
* 功 能:啟動溫度轉換
*****************************************************************/
void get_tem
uchar tem1,tem2,num;
float aaa;
reset ; //復位
write_byte 0xCC ; //跳過ROM
write_byte 0x44 ; //溫度轉換
for num 100;num 0;num-- //確保溫度轉換完成所需要的時間
reset ; //再次復位,等待從機應答
write_byte 0xCC ; //忽略ROM匹配
write_byte 0xBE ; //發送讀溫度命令
tem1 read_byte ; //讀出溫度低8
tem2 read_byte ; //讀出溫度高8位
shu tem2 4|tem1 4 ; //溫度整數部分
aaa tem2*256+tem1 *6.25; //溫度小數部分
temper int aaa; //強制轉換成整型
a1 temper/1000; //取溫度十位
a2 temper%1000/100; //取個位
a3 temper%100/10; //小數點后個位
a4 temper%10; //小數點后十位
DS18B20的接口實現
4.3.1 硬件設計
DS18B20在本次設計中接線圖如圖4.6 所示,實驗板硬件圖如圖4.7所示
這次實驗只焊了兩個溫度傳感器而已,其他兩個用法一樣,留作外接口,可以方便外用。
圖4.6 DS18B20原理圖 圖4.7 DSB18B20硬件連接實物圖
4.3.2 軟件設計
根據DS18B20約定的通訊協議,每次使用DS18B20之前都必須經過三個步驟,即先復位DS18B20,接著發出ROM操作指令,然后才可以發出RAM操作指令以進行溫度轉換等命令。本系統將實現讀出DS18B20的溫度并實時顯示到LCD12864上,分辨率為0.0625℃。由于DS18B20對時序要求很嚴格,所以在程序設計時,時序要多加注意一點,不過數字不是死的,只要控制合理控制也不是掃描大問題。 DS18B20首次初始化時開啟溫度轉換,之后每1s進行一次DS18B20的溫度讀取和轉換,具體實現效果圖如圖4.8 流程圖如圖4.9所示
圖 4.8溫度采集效果實物圖
圖4.9 DS18B20讀取溫度流程圖
設計心得總結
4.4.1 焊接問題:
焊接DS18B20時,速度要快,如果高溫的電烙鐵持續接觸傳感器很容易燒掉DS18B20,因為電烙鐵一般溫度為350 ~ 450度,而傳感器承受溫度為125度。我曾經因此燒壞了兩個傳感器,得此痛訓!
4.4.2 軟件設計:
DS18B20時序要求較為嚴格,這里的嚴格不是說一定要按手冊的時間一摸一樣而是說相對其他芯片來說嚴格了一點。如果讀取不到溫度應該檢查一下時序時間設計問題。再有一個難點就是溫度轉換問題。溫度能顯示到小數點后4位,如果要將溫度全部讀出,應該將整數部分乘以10000再加上小數部分,化浮點數為整數,當然也可以直接采用浮點數相乘。開機會出現85C那是18B20復位值
4.4.3 不足:
此次設計沒有處理溫度負數情況,如果要處理應該判斷最高位符號位,然后取反加一。
18B20可單總線掛多個,這里IO口有剩再加上為了程序設計簡單采用了并口方式。
存儲芯片AT24C02簡單介紹及接口實現AT24C02功能描述AT24C02是一個2K位串行CMOS E2PROM, 內部含有256個8位字節,CATALYST公司的先進CMOS技術實質上減少了器件的功耗。AT24C02有一個16字節頁寫緩沖器。該器件通過IC總線接口進行操作,有一個專門的寫保護功能。AT24C02支持IC,總線數據傳送協議IC,總線協議規定任何將數據傳送到總線的器件作為發送器。任何從總線接收數據的器件為接收器。數據傳送是由產生串行時鐘和所有起始停止信號的主器件控制的。主器件和從器件都可以作為發送器或接收器,但由主器件控制傳送數據(發送或接收)的模式,通過器件地址輸入端A0、A1和A2可以實現將最多8個AT24C02器件連接到總線上。 SCL 串行時鐘
AT24C02串行時鐘輸入管腳用于產生器件所有數據發送或接收的時鐘,這是一個輸入管腳。
SDA 串行數據/地址
AT24C02 雙向串行數據/地址管腳用于器件所有數據的發送或接收,SDA 是一個開漏輸出管腳,可與其它開漏輸出或集電極開路輸出進行線或(wire-OR)。
A0、A1、A2 器件地址輸入端
這些輸入腳用于多個器件級聯時設置器件地址,當這些腳懸空時默認值為0。當使用AT24C02 時最大可級聯8個器件。如果只有一個AT24C02被總線尋址,這三個地址輸入腳(A0、A1、A2 )可懸空或連接到Vss,如果只有一個AT24C02被總線尋址這三個地址輸入腳(A0、A1、A2 )必須連接到Vss。
WP 寫保護
如果WP管腳連接到Vcc,所有的內容都被寫保護只能讀。當WP管腳連接到Vss 或懸空允許器件進行正常的讀/寫操作
設計心得
A0、A1、A2 器件地址輸入端實時時鐘DS1302簡單介紹及接口實現DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發方式一次傳送多個字節的時鐘信號或RAM數據。DS1302內部有一個31×8的用于臨時性存放數據的RAM寄存器。DS1302是DS1202的升級產品,與DS1202兼容,但增加了主電源/后背電源雙電源引腳,同時提供了對后背電源進行涓細電流充電的能力。DS1302 的控制字如圖2所示。控制字節的最高有效位 位7 必須是邏輯1,如果它為0,則不能把數據寫入DS1302中,位6如果為0,則表示存取日歷時鐘數據,為1表示存取RAM數據;位5至位1指示操作單元的地址;最低有效位 位0 如為0表示要進行寫操作,為1表示進行讀操作,控制字節總是從最低位開始輸出。 數據輸入輸出 I/O ,在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數據被寫入DS1302,數據輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數據,讀出數據時從低位0位到高位7。 DS1302一共有12個寄存器,其中有7個寄存器與日歷、時鐘相關,存放的數據位為BCD碼形式,其日歷、時間寄存器及其控制字見
圖6.3DS1302日歷、時間寄存器
此外,DS1302 還有年份寄存器、控制寄存器、充電寄存器、時鐘突發寄存器及與RAM相關的寄存器等。時鐘突發寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內容。 DS1302與RAM相關的寄存器分為兩類:一類是單個RAM單元,共31個,每個單元組態為一個8位的字節,其命令控制字為C0H~FDH,其中奇數為讀操作,偶數為寫操作;另一類為突發方式下的RAM寄存器,此方式下可一次性讀寫所有的RAM的31個字節,命令控制字為FEH 寫 、FFH 讀 。
圖6.4 DS1302初始化
此外,DS1302 還有年份寄存器、控制寄存器、充電寄存器、時鐘突發寄存器及與RAM相關的寄存器等。時鐘突發寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內容。 DS1302與RAM相關的寄存器分為兩類:一類是單個RAM單元,共31個,每個單元組態為一個8位的字節,其命令控制字為C0H~FDH,其中奇數為讀操作,偶數為寫操作;另一類為突發方式下的RAM寄存器,此方式下可一次性讀寫所有的RAM的31個字節,命令控制字為FEH 寫 、FFH 讀 。DS1302與單片機的連接電路圖如圖6.5所示:
圖 6.5 DS1302硬件連接圖
備用電池可用來斷電保護,當主電源斷開之后,備用電池開始工作,起到備用作用,繼續保持時鐘的準確性
溫度上限報警功能
7.1 設計原理
固話報警的設計原理非常簡單,把電話外殼拆出來之后,里面的按鍵其實就是一個矩陣鍵盤,為了簡化設計,這里只說明重撥按鍵,因為只需要重撥按鍵就可以工作完全滿足我們功能了。拆出來后下一步就是找出重撥鍵對應的引腳,先找到重撥鍵位置然后通過萬用表就可以測出重撥鍵對應的兩個引腳線,這個過程相當簡單,通過肉眼也能很快找出來。其他按鍵找出方法相同,不過本次設計無需用到不再闡述。
圖7.1 固話內部電路 圖7.2改裝后的固話
找出重撥鍵引腳之后通過外線引出來,中間通過一個繼電器連接單片機既可工作。如圖7.3所示。
圖 7.3 固話報警連接圖
上限溫度通過軟件設計設定也可以通過功能按鍵設定,當滿足條件達到上限溫度,單片機引腳觸發高電平引發繼電器工作既可實現自動重撥。固話的重撥號碼要事先先設定好。
7.2 設計心得體會
沒有做不到,只有想不到,一個非常簡單的小小改裝就可以實現一個遠程報警功能,其實生活就是缺少發現。
與PC串口通訊及VB上位機簡單介紹
8.1 與PC串口通信
目前較為常用的串口有9針串口(DB9)和25針串口(DB25)。最為簡單且常用的是三線制接地法,即地、接收數據和發送數據三腳相連,本文只涉及到最為基本的接法,且直接用RS232相連,電路圖如圖8.1所示
圖8.1串口通信電路圖
本系統串行通信采用異步通信方式。協議如下:1.
一幀數據由1位起始位、8位數據位、無奇偶校驗位、1位停止位共10位組成。
2. 波特率設為00bps。單片機串行口按方式1工作,波特率由定時器T1控制,
PC機串口波特率通過VB通訊控件的Settings屬性設置,為保證數據傳送的準確性,兩者的波特率必須一致。 上位機利用Visual Basic 6.0編程。用VB6.0開發串行通信程序有兩種法,一種是利用Windows的API函數;另一種是采用VB6.0的通信控件MSComm。利用API函數編寫串行通信程序較為復雜,需要掌握大量的通信知識,其優點是可實現的功能更豐富、應用面更廣泛,適合于編寫較為復雜的低層次通信程序。而VB6.0的MSComm通信控件提供了標準的事件處理函數、事件、方法,并通過控件屬性對串口參數進行設置,比較容易地解決了串口通信問題。
MSComm是VB6.0提供的ActiveX控件,使用前需將該控件添加到VB工具欄。MSComm控件具有功能完善的串口數據發送和接受功能,有兩種處理通信的方式,即事件驅動方式和查詢方式,事件驅動方式是利用MSComm控件的OnComm事件捕獲并處理通信錯誤事件,是處理串行端口交互作用的一種非常有效的方法;查詢方式是通過檢查CommEvent屬性的值來判斷事件和錯誤。 下面Declare Function GetTickCount Lib "kernel32" As Long
Sub TimeDelay t As Long
'時間延遲子程序,單位是毫秒 ms
Dim TT&
TT GetTickCount
Do
DoEvents
Loop Until GetTickCount - TT t
End Sub
'等待RS字符串返回,或是時間到達
'Comm是通信控件名稱
'RS是欲等待的字符
'DT是最長的等待時間
'正常時返回值是所得的完整字符串,不正常時返回值是空字符串
Function WaitRS Comm As MSComm, RS As String, DT As Long As String
Dim Buf$, TT As Long
Buf ""
TT GetTickCount
Do
Buf Buf & Comm.Input
Loop Until InStr 1, Buf, RS 0 Or GetTickCount - TT DT
If InStr 1, Buf, RS 0 Then
WaitRS Buf
Else
WaitRS ""
End If
End Function
Option Explicit
Dim NowX As Integer '現在的X軸位置
Dim PlotNo As Long '最長的X軸范圍
Dim PreValue As Single '前一個測量值
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'當選擇通信端口的Combo控件被選中后激活此事件
'若用戶改變通信端口時,關閉通信端口
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmbCOM_Click
'若通信端口號碼和現在的選擇一樣時就不必理會,直接跳出此子程序
If cmbCOM.ListIndex + 1 MSComm1mPort Then Exit Sub
Timer1.Enabled False '關閉定時器
TimeDelay 100
If MSComm1.PortOpen Then
MSComm1.PortOpen False '關閉通信端口
End If
lblMsg.Caption "已停止檢測并關閉通訊端口"
cmdOpenCOM.Enabled True '允許使用【打開通信端口】按鈕
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'單擊【結束】按鈕后激活此事件
'使用End命令將系統結束
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdEnd_Click
MSComm1.PortOpen False '關閉通信端口
End
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'單擊【打開通信端口】按鈕后激活此事件
'將MSComm控件的參數設置好,并打開
'激活【開始檢測】按鈕
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdOpenCOM_Click
'判斷端口號碼是否落在1--16之間
If cmbCOM.ListIndex 0 And cmbCOM.ListIndex 16 Then
MSComm1mPort cmbCOM.ListIndex + 1
Else
MsgBox "指定通信端口時發生錯誤!", vbCritical + vbOKOnly, "系統信息"
Exit Sub
End If
'激活錯誤檢測機制
On Error GoTo comErr
MSComm1.Settings "119200,n,8,1" '設定通信參數
MSComm1.PortOpen True '打開通信端口
cmdOpenCOM.Enabled False '將此按鈕設為禁用狀態
cmdStart.Enabled True '激活【開始檢測】按鈕
lblMsg.Caption "可單擊【開始檢測】按鈕,執行檢測的工作。"
Exit Sub
comErr:
MsgBox "打開通信端口時發生錯誤!請確定通信端口存在且正常。", vbCritical + vbOKOnly, "系統信息"
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'單擊【開始檢測】按鈕后激活此事件
'將定時器激活或關閉,并顯示對應的文字在按鈕上,以指示用戶操作
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdStart_Click
Timer1.Enabled Not Timer1.Enabled
If Timer1.Enabled Then
cmdStart.Caption "停止檢測"
Else
cmdStart.Caption "開始檢測"
lblMsg.Caption "已停止檢測"
End If
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'窗體的Load事件
'輸入圖形暫時設為灰色,表示無狀態信息進入
'將通訊端口號碼及站號填入Combo控件;并默認二者的選項是第一個
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub Form_Load
Dim i%
PlotNo 100
cmbCOM.Clear
cmbCOM.AddItem "COM1"
cmbCOM.AddItem "COM2"
cmbCOM.AddItem "COM3 USB "
cmbCOM.AddItem "COM4 USB "
cmbCOM.AddItem "COM5"
cmbCOM.AddItem "COM6"
cmbCOM.AddItem "COM7"
cmbCOM.AddItem "COM8"
cmbCOM.AddItem "COM9"
cmbCOM.AddItem "COM10"
cmbCOM.AddItem "COM11"
cmbCOM.AddItem "COM12"
cmbCOM.AddItem "COM12"
cmbCOM.AddItem "COM14"
cmbCOM.AddItem "COM15"
cmbCOM.AddItem "COM16"
cmbCOM.ListIndex 0
cmdStart.Enabled False
'以下設定繪圖范圍, Xmin,Y - X,YMin
picVoltage.Scale 0, 50 - PlotNo, 0
picVoltage.DrawWidth 2 '使用兩個像素寬度的畫筆
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'定時器的Timer事件引發后,就不斷地執行其中的程序。
'將模擬讀值命令送出,再取得返回字符串并判斷。
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub Timer1_Timer
Dim Buf$, ValueStr As Single, Pos1%
Buf$ Buf$ + MSComm1.Input '讀取變量
TimeDelay 2150
ValueStr Val Mid Buf, Pos1 + 1, 7 '分離出正號以后的數值
lblValue.Caption "" '清空上一次數據
lblValue.Caption Format ValueStr, "00.0" & "℃" '顯示在畫面上
If NowX 0 Then
picVoltage.Cls '清除圖形
picVoltage.PSet 0, ValueStr '設定起點
Else
'以下判斷現在的讀值是否大于前一次的讀值,若是,則以紅色繪線
'若否,則以藍色繪線
'If ValueStr PreValue + 0.01 Then
picVoltage.Line - NowX, ValueStr , RGB 255, 0, 0 '由上一次的位置畫至此點
'Else
' picVoltage.Line - NowX, ValueStr , RGB 0, 0, 255 '由上一次的位置畫至此點
'End If
End If
PreValue ValueStr
NowX NowX + 1 '位置加1
If NowX PlotNo Then NowX 0 '超過范圍則數值歸零
End Sub
9 總結
本系統的設計更加人性化,可以對4路設定不同的上限報警溫度,這樣在需要不同溫度的測量中更具有優勢,當然更多路溫度的設計方法也一樣。并且報警方面只稍微改動了一下固話就達到了遠程報警的功能,溫度較大變化時還會自動存儲同時時間也會儲存起來,可以給操作人員提供更多的信息。
本系統所需的元器件價格低廉,單片機資源利用率比較高。4個開關實現的功能比較多,使操作人員操作更加方便。
在溫度數據的處理上精度可達到0.0625℃,可以滿足一定場合的用途。
可改進之處:本系統雖然已經實現了大部分功能但仍可繼續改造。如果遠程測溫等,通過無線模塊可實現采集到的溫度傳送到控制臺,進行遠程監控,無需到現場。圖9.1是通過NRF24L01在開發板上實現的功能。由于精力問題沒有實現到這個系統上。
圖 9.1 遠程測溫測試
附錄
部分原理圖:
參考文獻
[1] 陳洪財. 單片機C語言和匯編語言實用開發技術[M].[2] 劉和平等[M]. 北京航空航天大學出版社 2003-1-1
[3] 李學海. PIC單片機實用教程―基礎篇[M]. 北京航空航海大學出版社, 2007-02
[4] 李學海.PIC單片機實用教程―提高篇[M]. 北京航空航海大學出版社,2007-02
[5] 能昌會.時鐘芯片DS1302在單片機系統中的應用[J].電子制作,2007年,11期
[6] 郭天祥.新概念51單片機C語言教程:入門、提高、開發、拓展[M].電子工業出版社,2009-02 147-167、342-349、394-409
[7] 龍脈工作室.51單片機C語言應用開發技術大全[M].人民郵電出版社.2008-9
[8] 張越 嵌入式與SOC ,2008:54~56
[10] 廖琪梅,韓彬,楊文昭,屈景輝.基于單總線器件DSl8820的溫度測量儀[J]《國外電子元器件》2008年第2期2008,2 國外電子元器件-CNKIDSl8B20與單片機的接口及編程技術[J]. 河北工業科技.第24卷第4期,2007,7
[12]張俊芳,張忠民,劉利民.智能單片機溫度控制系統[J].遼寧工程技術大學學報,2004:69~71
[13]龔紅軍.單片機溫度控制系統[J].電氣時代,2002:66~67
[14]吳金戌,沈慶陽,郭庭吉.單片機時間與應用[J].清華大學出版社,2002:36~38
[15] 李江全,張麗,芩紅蕾. Visual Basic串口通信與測控應用技術實戰詳解 人民郵電出版社