国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

多點(diǎn)溫度監(jiān)測系統(tǒng)及其實(shí)時時間功能的實(shí)現(xiàn)

2015-01-13 02:00
化工自動化及儀表 2015年3期
關(guān)鍵詞:序列號液晶屏溫度傳感器

肖 正 艾 紅

(北京信息科技大學(xué)自動化學(xué)院,北京 100192)

糧食是人類賴以生存的根本,是促進(jìn)國家穩(wěn)定發(fā)展的重要保障。為了防止糧食發(fā)霉變質(zhì),按期對糧倉進(jìn)行溫度測量是糧食儲備中常用的手段。隨著科技的發(fā)展和自動化水平的提高,溫度自動監(jiān)測已經(jīng)成為各行各業(yè)進(jìn)行安全生產(chǎn)和減少損失采取的重要措施之一。為了實(shí)現(xiàn)糧情的溫度自動監(jiān)測,筆者采用STC89C516RD單片機(jī)作為主控制器,使用數(shù)字溫度傳感器DS18B20,并配合鍵盤管理及液晶顯示等外圍電路,設(shè)計(jì)多點(diǎn)溫度監(jiān)測系統(tǒng)及其實(shí)時時間功能。

由于系統(tǒng)由多片數(shù)字式單總線DS18B20溫度傳感器構(gòu)成溫度傳感器網(wǎng)絡(luò),因此,準(zhǔn)確、有效地對每一個溫度傳感器進(jìn)行尋址成為系統(tǒng)設(shè)計(jì)的核心問題。系統(tǒng)設(shè)計(jì)依據(jù)DS18B20 溫度傳感器的操作指令,首先讀取各個傳感器的序列號,并確定傳感器對應(yīng)的各點(diǎn)位置關(guān)系。在讀取溫度數(shù)值時,發(fā)送相應(yīng)的序列號,再讀取匹配的傳感器溫度數(shù)值。有兩條命令用于獲取傳感器序列號:讀ROM命令33H和搜索ROM命令F0H。讀ROM命令在總線上僅有一個傳感器的情況下使用;搜索ROM命令允許總線主機(jī)使用一種處理方法識別總線上所有的傳感器序列號。為了建立64位ROM代碼,即傳感器序列號與測量位置點(diǎn)傳感器之間的關(guān)系,選用讀ROM命令33H,通過單總線把各個位置的傳感器序列號讀取出來,并通過串口調(diào)試助手觀察每個DS18B20的序列號?,F(xiàn)場各溫度傳感器的序列號存放在單片機(jī)的CODE區(qū)內(nèi),軟件設(shè)計(jì)了10行8列的二維數(shù)組來存儲溫度傳感器的64位序列號,具體如下:

code uchar ds[10][8]={0x28,0x3E,0xF0,0xC4,0x00,0x00,0x00,0x71,//第一個傳感器序列號

0x28,0xAE,0xD6,0x98,0x00,0x00,0x00,0x6E,//第二個傳感器序列號

?

0x28,0xE3,0xF1,0xC4,0x00,0x00,0x00,0x32};//第十個傳感器序列號

讀取溫度傳感器序列號流程如圖1所示。

圖1 讀取溫度傳感器序列號流程

2 數(shù)據(jù)通路選擇

在多點(diǎn)溫度的采集過程中要考慮通路的選擇問題,系統(tǒng)采用兩個數(shù)據(jù)通路,分別由單片機(jī)的P1.0和P1.1控制。軟件設(shè)計(jì)中設(shè)置了一個選擇通路字節(jié)DQ_select,通過對DQ_select設(shè)定不同的值來決定選擇哪條通路。數(shù)據(jù)通路選擇流程如圖2所示。

圖2 數(shù)據(jù)通路選擇流程

對于傳感器序列號數(shù)組的選擇,定義了一個全局變量m,通過DQ_select的值對m賦相應(yīng)的值,程序就可以直接通過m值調(diào)用相應(yīng)傳感器序列號。對于初始化程序,讀寫數(shù)據(jù)時通路的選擇也是通過判斷DQ_select的值來決定的。

3 實(shí)時時間顯示和時間設(shè)置功能

3.1 實(shí)時時間顯示

系統(tǒng)設(shè)計(jì)采用一個3V的鋰電池作為備用電源,采用時鐘芯片DS1302實(shí)現(xiàn)實(shí)時時間顯示。在整個系統(tǒng)斷電后,時鐘芯片依然能夠工作。當(dāng)單片機(jī)上電后,直接讀取時鐘芯片DS1302寄存器中的數(shù)據(jù),并在液晶屏上顯示,不必每次都初始化。在修改時間程序中有對時鐘芯片DS1302初始化的程序,只有當(dāng)修改時間時才會對DS1302進(jìn)行初始化,如果時間正常,對時鐘芯片DS1302的操作只需循環(huán)讀取它內(nèi)部寄存器的數(shù)值即可[1]。實(shí)時時間顯示流程如圖3所示。

圖3 實(shí)時時間顯示流程

DS1302初始化主要是進(jìn)行設(shè)置運(yùn)行位及打開電池充電等操作。設(shè)置時間數(shù)據(jù)是將需要顯示的時間數(shù)據(jù)存儲到DS1302的存儲器內(nèi),程序設(shè)計(jì)如下:

void Set1302(uchar*pClock)

{ uchar i;

uchar ucAddr=0x80;

W1302(0x8e,0x00);//控制命令,WP=0,寫保護(hù)禁止

W1302(0xC0,0x01);//寫RAM寄存器

for(i=7;i>0;i--)

{W1302(ucAddr,*pClock);//秒、分、時、星期、日、月、年

pClock++;

ucAddr+=2;

}

W1302(0x8e,0x80);//控制命令,WP=1,寫保護(hù)

}

其中,pClock中存儲的是需要設(shè)置的時間數(shù)據(jù),按照DS1302寄存器的順序,依次存儲秒、分、時、星期、日、月和年的BCD碼。

讀取操作是將DS1302存儲器中的數(shù)據(jù)讀出來,并在液晶屏上顯示,如果要實(shí)現(xiàn)液晶屏顯示實(shí)時時間數(shù)據(jù),則循環(huán)執(zhí)行讀取和顯示操作,程序設(shè)計(jì)如下:

while(1){ Get1302(ppClock);//讀取DS1302寄存器中的數(shù)據(jù)

display_1302(ppClock);//在LCD上顯示數(shù)據(jù)

}

Get1302(ppClock)是讀取DS1302寄存器中的數(shù)據(jù),并存儲在ppClock數(shù)組中;display_1302(ppClock)是調(diào)用液晶顯示函數(shù),顯示ppClock中的數(shù)據(jù)。如果要顯示當(dāng)前時間,則在溫度監(jiān)測系統(tǒng)菜單選項(xiàng)上選擇“時間顯示”功能,按“確認(rèn)”鍵后進(jìn)入時間顯示畫面(圖4)。

圖4 時間顯示畫面

3.2 時間設(shè)置功能

當(dāng)備用電池沒電或時間發(fā)生錯誤后,進(jìn)入時間設(shè)置功能畫面修改時間,按照圖5上的提示輸入數(shù)值,如果輸入的數(shù)值符合相應(yīng)的時間數(shù)值,按“確認(rèn)”鍵后,液晶屏上的“?”會消失。時間設(shè)置流程如圖6所示。

圖5 時間設(shè)置功能液晶顯示畫面

程序設(shè)計(jì)的難點(diǎn)是輸入數(shù)據(jù)和液晶屏顯示數(shù)據(jù)與游標(biāo)的位置能否相對應(yīng),程序的核心是通過flag值決定液晶屏顯示的字符。

4 報警歷史數(shù)據(jù)顯示

多點(diǎn)監(jiān)測系統(tǒng)的溫度報警數(shù)據(jù)采用存儲器芯片24C256存儲。報警歷史數(shù)據(jù)顯示時調(diào)出存儲在24C256中的報警數(shù)據(jù),并將讀出的數(shù)據(jù)在液晶屏上顯示。程序設(shè)計(jì)的難點(diǎn)在于每次報警后存儲的數(shù)據(jù)較多,每一次報警數(shù)據(jù)都需要在液晶屏上分兩屏顯示[2]。因此當(dāng)數(shù)據(jù)較多時,使用鍵盤的上下箭頭來翻屏?xí)玫酱罅康娘@示代碼,同時需要許多判斷性語句來決定顯示的數(shù)據(jù),報警歷史數(shù)據(jù)顯示流程如圖7所示。

圖6 時間設(shè)置流程

圖7 報警歷史數(shù)據(jù)顯示流程

顯示信息包括報警時間、報警的房間號、報警時的溫度、上限報警設(shè)定值、下限報警設(shè)定值及報警標(biāo)志等。例如調(diào)用一次報警歷史數(shù)據(jù),在液晶屏上顯示畫面如圖8所示。

報警歷史數(shù)據(jù)顯示程序中由于每次可以讀出最新的4個報警歷史數(shù)據(jù),所以必須根據(jù)翻屏后flag的值判斷要讀取的歷史報警數(shù)據(jù),地址的選擇程序如下:

圖8 報警歷史數(shù)據(jù)顯示畫面

if(flag==1|flag==2)addr=0x0000;//寫入地址,第一個數(shù)據(jù)

if(flag==3|flag==4)addr=0x0010;//寫入地址,第二個數(shù)據(jù)

if(flag==5|flag==6)addr=0x0020;//寫入地址,第三個數(shù)據(jù)

if(flag==7|flag==8)addr=0x0030;//寫入地址,第四個數(shù)據(jù)

通過flag的值判斷顯示畫面程序如下:

if(flag==1|flag%2==1)//顯示每個報警參數(shù)的第一屏信息

{ lcd_clock_word();

W_1byte(0,0,0x98);

for(i=0;string1[i]!=′