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