肖 正 艾 紅
(北京信息科技大學自動化學院,北京 100192)
糧食是人類賴以生存的根本,是促進國家穩定發展的重要保障。為了防止糧食發霉變質,按期對糧倉進行溫度測量是糧食儲備中常用的手段。隨著科技的發展和自動化水平的提高,溫度自動監測已經成為各行各業進行安全生產和減少損失采取的重要措施之一。為了實現糧情的溫度自動監測,筆者采用STC89C516RD單片機作為主控制器,使用數字溫度傳感器DS18B20,并配合鍵盤管理及液晶顯示等外圍電路,設計多點溫度監測系統及其實時時間功能。
由于系統由多片數字式單總線DS18B20溫度傳感器構成溫度傳感器網絡,因此,準確、有效地對每一個溫度傳感器進行尋址成為系統設計的核心問題。系統設計依據DS18B20 溫度傳感器的操作指令,首先讀取各個傳感器的序列號,并確定傳感器對應的各點位置關系。在讀取溫度數值時,發送相應的序列號,再讀取匹配的傳感器溫度數值。有兩條命令用于獲取傳感器序列號:讀ROM命令33H和搜索ROM命令F0H。讀ROM命令在總線上僅有一個傳感器的情況下使用;搜索ROM命令允許總線主機使用一種處理方法識別總線上所有的傳感器序列號。為了建立64位ROM代碼,即傳感器序列號與測量位置點傳感器之間的關系,選用讀ROM命令33H,通過單總線把各個位置的傳感器序列號讀取出來,并通過串口調試助手觀察每個DS18B20的序列號。現場各溫度傳感器的序列號存放在單片機的CODE區內,軟件設計了10行8列的二維數組來存儲溫度傳感器的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 讀取溫度傳感器序列號流程
在多點溫度的采集過程中要考慮通路的選擇問題,系統采用兩個數據通路,分別由單片機的P1.0和P1.1控制。軟件設計中設置了一個選擇通路字節DQ_select,通過對DQ_select設定不同的值來決定選擇哪條通路。數據通路選擇流程如圖2所示。

圖2 數據通路選擇流程
對于傳感器序列號數組的選擇,定義了一個全局變量m,通過DQ_select的值對m賦相應的值,程序就可以直接通過m值調用相應傳感器序列號。對于初始化程序,讀寫數據時通路的選擇也是通過判斷DQ_select的值來決定的。
系統設計采用一個3V的鋰電池作為備用電源,采用時鐘芯片DS1302實現實時時間顯示。在整個系統斷電后,時鐘芯片依然能夠工作。當單片機上電后,直接讀取時鐘芯片DS1302寄存器中的數據,并在液晶屏上顯示,不必每次都初始化。在修改時間程序中有對時鐘芯片DS1302初始化的程序,只有當修改時間時才會對DS1302進行初始化,如果時間正常,對時鐘芯片DS1302的操作只需循環讀取它內部寄存器的數值即可[1]。實時時間顯示流程如圖3所示。

圖3 實時時間顯示流程
DS1302初始化主要是進行設置運行位及打開電池充電等操作。設置時間數據是將需要顯示的時間數據存儲到DS1302的存儲器內,程序設計如下:
void Set1302(uchar*pClock)
{ uchar i;
uchar ucAddr=0x80;
W1302(0x8e,0x00);//控制命令,WP=0,寫保護禁止
W1302(0xC0,0x01);//寫RAM寄存器
for(i=7;i>0;i--)
{W1302(ucAddr,*pClock);//秒、分、時、星期、日、月、年
pClock++;
ucAddr+=2;
}
W1302(0x8e,0x80);//控制命令,WP=1,寫保護
}
其中,pClock中存儲的是需要設置的時間數據,按照DS1302寄存器的順序,依次存儲秒、分、時、星期、日、月和年的BCD碼。
讀取操作是將DS1302存儲器中的數據讀出來,并在液晶屏上顯示,如果要實現液晶屏顯示實時時間數據,則循環執行讀取和顯示操作,程序設計如下:
while(1){ Get1302(ppClock);//讀取DS1302寄存器中的數據
display_1302(ppClock);//在LCD上顯示數據
}
Get1302(ppClock)是讀取DS1302寄存器中的數據,并存儲在ppClock數組中;display_1302(ppClock)是調用液晶顯示函數,顯示ppClock中的數據。如果要顯示當前時間,則在溫度監測系統菜單選項上選擇“時間顯示”功能,按“確認”鍵后進入時間顯示畫面(圖4)。

圖4 時間顯示畫面
當備用電池沒電或時間發生錯誤后,進入時間設置功能畫面修改時間,按照圖5上的提示輸入數值,如果輸入的數值符合相應的時間數值,按“確認”鍵后,液晶屏上的“?”會消失。時間設置流程如圖6所示。

圖5 時間設置功能液晶顯示畫面
程序設計的難點是輸入數據和液晶屏顯示數據與游標的位置能否相對應,程序的核心是通過flag值決定液晶屏顯示的字符。
多點監測系統的溫度報警數據采用存儲器芯片24C256存儲。報警歷史數據顯示時調出存儲在24C256中的報警數據,并將讀出的數據在液晶屏上顯示。程序設計的難點在于每次報警后存儲的數據較多,每一次報警數據都需要在液晶屏上分兩屏顯示[2]。因此當數據較多時,使用鍵盤的上下箭頭來翻屏會用到大量的顯示代碼,同時需要許多判斷性語句來決定顯示的數據,報警歷史數據顯示流程如圖7所示。

圖6 時間設置流程

圖7 報警歷史數據顯示流程
顯示信息包括報警時間、報警的房間號、報警時的溫度、上限報警設定值、下限報警設定值及報警標志等。例如調用一次報警歷史數據,在液晶屏上顯示畫面如圖8所示。
報警歷史數據顯示程序中由于每次可以讀出最新的4個報警歷史數據,所以必須根據翻屏后flag的值判斷要讀取的歷史報警數據,地址的選擇程序如下:

圖8 報警歷史數據顯示畫面
if(flag==1|flag==2)addr=0x0000;//寫入地址,第一個數據
if(flag==3|flag==4)addr=0x0010;//寫入地址,第二個數據
if(flag==5|flag==6)addr=0x0020;//寫入地址,第三個數據
if(flag==7|flag==8)addr=0x0030;//寫入地址,第四個數據
通過flag的值判斷顯示畫面程序如下:
if(flag==1|flag%2==1)//顯示每個報警參數的第一屏信息
{ lcd_clock_word();
W_1byte(0,0,0x98);
for(i=0;string1[i]!=′ 主站蜘蛛池模板: 97视频免费看| 国产区在线看| 亚洲精品第1页| 久操线在视频在线观看| 精品免费在线视频| 成人午夜天| 亚洲欧美日韩动漫| 欧美区国产区| 韩国v欧美v亚洲v日本v| 福利在线一区| A级毛片无码久久精品免费| 亚洲欧美日韩中文字幕在线| 国产18在线| 久草性视频| 婷婷亚洲综合五月天在线| 日韩在线观看网站| 亚洲国产欧美国产综合久久 | 真人免费一级毛片一区二区| 国产亚洲精品资源在线26u| 人妻免费无码不卡视频| 亚洲国产在一区二区三区| 搞黄网站免费观看| 久久久久九九精品影院| 成年午夜精品久久精品| 久久亚洲高清国产| 免费女人18毛片a级毛片视频| 亚洲日本韩在线观看| 国产在线观看99| 国产自在线播放| 国产欧美精品午夜在线播放| 亚洲V日韩V无码一区二区| 亚洲黄网视频| 亚洲日本韩在线观看| 波多野结衣一区二区三区四区视频| 精品国产网| 亚洲色图欧美在线| 国产一级毛片网站| 欧美午夜小视频| 韩国福利一区| 成人亚洲天堂| 99精品伊人久久久大香线蕉| 18禁色诱爆乳网站| 日韩在线影院| 99精品视频播放| 久久国语对白| 久久人妻xunleige无码| 国产精品任我爽爆在线播放6080| 国产黑丝一区| 色窝窝免费一区二区三区| 欧美一区二区三区国产精品| 高清欧美性猛交XXXX黑人猛交| 91黄视频在线观看| 奇米精品一区二区三区在线观看| 一级黄色片网| 国产三级a| 97超爽成人免费视频在线播放| 成人国产精品视频频| 欧美日韩高清| 精品少妇三级亚洲| 色香蕉网站| 欧洲免费精品视频在线| 99久久精品国产精品亚洲 | 国产无码高清视频不卡| 日韩精品高清自在线| 白丝美女办公室高潮喷水视频 | 欧美成人精品在线| 国产中文一区a级毛片视频 | 国产精品自在在线午夜区app| 日韩在线影院| 色成人综合| 欧美精品xx| 久久熟女AV| 亚洲日本精品一区二区| 国产一区二区三区在线观看免费| 国产日韩欧美一区二区三区在线 | 91人妻在线视频| 亚洲天堂啪啪| 国产精品9| 人人爱天天做夜夜爽| 免费va国产在线观看| 婷婷中文在线| 国产菊爆视频在线观看|