版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 畢業(yè)設(shè)計 題 目: 基于單片機的自動微灌 溉控制器的設(shè)計與實現(xiàn) 院 系: 專 業(yè): 測控技術(shù)與儀器 班級學號: 學生姓名: 指導教師: 成 績: 年 月 日目 錄1 方案設(shè)計11.1 設(shè)計任務(wù)要求11.2 硬件方案設(shè)計11.3 編程語言與調(diào)試環(huán)境選擇12 系統(tǒng)硬件設(shè)計22.1 單片機的選擇22.1.1 主要功能特性22.1.2 stc89c52各引腳功能32.1.3 復(fù)位電路的設(shè)計52.1.4 時鐘電路設(shè)計52.2 濕度采集轉(zhuǎn)換模塊設(shè)計62.2.1 濕度傳感器的選擇62.2.2 濕度采集接口電路設(shè)計72.3 濕度顯示電路設(shè)計82.3.1 lcd顯示件選擇82.3.2 顯示接口電路設(shè)計92.4
2、 鍵盤電路設(shè)計92.4.1 按鍵功能設(shè)計92.4.2 鍵盤接口電路設(shè)計102.5 自動灌溉電路設(shè)計102.6 報警電路設(shè)計113 系統(tǒng)軟件設(shè)計123.1 軟件系統(tǒng)總體工作流程123.2 濕度采集模塊設(shè)計133.3 鍵盤控制模塊設(shè)計133.4 lcd顯示模塊設(shè)計133.5 自動灌溉模塊設(shè)計143.6 報警模塊設(shè)計14i參考文獻15附錄a 硬件原理圖16附錄b 程序代碼17附錄c 實物圖28ii沈陽理工大學應(yīng)用技術(shù)學院本科畢業(yè)設(shè)計1 方案設(shè)計1.1 設(shè)計任務(wù)要求本設(shè)計的目的是設(shè)計一個基于單片機的自動微灌溉控制器,主要是通過對土壤水分的檢測與設(shè)定值的對比來實現(xiàn)灌溉的自動控制,并具有顯示、按鍵和報警功
3、能。其基本要求如下: 檢測功能:通過水分傳感器,實現(xiàn)自動測量土壤水分的功能。顯示功能:顯示傳感器檢測到的土壤水分的測量值,以及土壤水分的設(shè)定值。灌溉功能:當實際測量值低于預(yù)設(shè)值時,啟動水泵進行自動灌溉;超過預(yù)設(shè)值時,停止灌溉。報警功能:當實際測量值低于預(yù)設(shè)值時,報警提醒。按鍵功能:通過按鍵對濕度的設(shè)定值進行調(diào)整。1.2 硬件方案設(shè)計該系統(tǒng)以單片機作為主控芯片,單片機的型號選擇目前主流的8位單片機stc89c52。對于土壤水分的檢測采用水分傳感器。該傳感器利用電阻變化測量水分濕度。可以將濕度這個非電量信號轉(zhuǎn)換為03.7v的電壓信號。由于該傳感器輸出為模擬信號,而單片機只能接收數(shù)字信號,因此需要用
4、到a/d轉(zhuǎn)換器,并選用pcf8591芯片。添加按鍵使設(shè)定的濕度值可進行調(diào)整,以適應(yīng)不同作物對濕度的需要,擴大應(yīng)用范圍。測量結(jié)果需要顯示,顯示器件選擇lcd1602控制模塊。與led顯示器件相比,lcd可顯示字符、數(shù)據(jù),能夠更好的區(qū)分顯示的參數(shù)內(nèi)容,顯示內(nèi)容豐富、直觀。當采集到的濕度值低于預(yù)設(shè)值時,啟動水泵進行自動灌溉。同時,設(shè)置報警功能,當采集到的濕度值低于預(yù)設(shè)值時蜂鳴器報警,用于提示。1.3 編程語言與調(diào)試環(huán)境選擇軟件編程采用單片機c51編程語言,該語言比匯編語言編程難度低,還可以實現(xiàn)對硬件資源的訪問,運行速度能夠滿足要求,是一種比較理想的方案。本次設(shè)計使用keilc51,stc89c52開
5、發(fā)板對系統(tǒng)進行開發(fā)和調(diào)試。2 系統(tǒng)硬件設(shè)計本系統(tǒng)硬件包括:濕度采集轉(zhuǎn)換模塊、單片機、按鍵控制、lcd顯示、報警電路等部分的設(shè)計。系統(tǒng)整體電路框圖如圖2.1所示。stc89c52單片機水泵控制lcd顯示報警按鍵輸入濕度采集轉(zhuǎn)換模塊 圖2.1 系統(tǒng)整體電路框圖 2.1 單片機的選擇本系統(tǒng)中我們采用stc公司生產(chǎn)的stc89c52單片機作為主控芯片。stc89c52是一種功耗低、性能高的cmos8位微控制器,還具有8k在系統(tǒng)可編程的flash存儲器。stc89c52使用經(jīng)典的mcs-51內(nèi)核,但做了很多的改進使得芯片具有傳統(tǒng)51單片機不具備的功能。在單一芯片上,擁有1個8位中央處理器cpu和在系統(tǒng)內(nèi)
6、可編程flash,使得stc89c52為許多嵌入式的控制應(yīng)用提供高靈活有效的解決方案。指令代碼完全兼容傳統(tǒng)80511。2.1.1 主要功能特性stc89c52的標準功能如下:8k字節(jié)的flash存儲器;512字節(jié)隨機存取存儲器ram;32位i/o口線;內(nèi)部置有4kb eeprom,max810復(fù)位電路;3個16位定時器/計數(shù)器;4個外部中斷;一個7向量的4級中斷結(jié)構(gòu)(兼容傳統(tǒng)51的5向量的2級中斷結(jié)構(gòu));全雙工串行口。此外stc89c52靜態(tài)邏輯操作可以降低到0hz,支持2種軟件可選擇節(jié)電模式??臻e模式下,cpu停止工作,允許ram、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,ram內(nèi)
7、容被保存,振蕩器被凍結(jié),單片機一切工作停止,直到下一個中斷或硬件復(fù)位為止。最高運作頻率35mhz,6t/12t可選2。2.1.2 stc89c52各引腳功能stc89c52為40腳雙列直插封裝的8位通用微處理器,管腳如圖2.2所示。圖2.2 stc89c52引腳圖stc89c52的引腳功能說明如下:vcc(第40引腳):接電源。vss(第20引腳):接地端。p0口(p0.0p0.7):p0口是一個8位雙向i/o接口。當其用作輸出端口時,每一個引腳都能驅(qū)動8個ttl負載。若對端口p0寫入1,則可以作為高阻抗輸入。連接外部存儲器或擴充外設(shè)時,p0口也作為低8位地址線和8位數(shù)據(jù)線。此時,p0口的內(nèi)部
8、上拉電阻有效。flash rom編程時,p0口接收指令;校驗程序時,p0口輸出指令。在驗證時,要在外面接上拉電阻。p1口(p1.0p1.7):p1口是一個帶有內(nèi)部上拉電阻的8位準雙向i/o接口。p1口的輸出緩沖器可以驅(qū)動4個ttl輸入。若對端口寫入1,則可以通過內(nèi)部的上拉電阻將端口拉到高電位,將其用作輸入口使用。在p1口作為輸入口使用時,由于存在內(nèi)部上拉電阻,被外部拉低的那些引腳都會輸出一個電流。在編程和校驗時接收低8位地址,每一位可以獨立的輸入/輸出。p2口(p2.0p2.7):p2口是一個8位準雙向i/o接口。p2口的輸出緩沖器可以驅(qū)動4個ttl輸入。若對端口寫入1,則可以通過內(nèi)部的上拉電
9、阻將端口拉到高電位,將其用作輸入口使用。在p1口作為輸入口使用時,由于存在內(nèi)部上拉電阻,被外部拉低的那些引腳都會輸出一個電流。連接外部存儲器或擴充外設(shè)時,作為高8位地址線,在編程和校驗時接受高位地址和控制信號。p3端口(p3.0p3.7):p3是一個帶有內(nèi)部上拉電阻的8位準雙向i/o接口。p3口的輸出緩沖器可以驅(qū)動4個ttl輸入。若對端口寫入1,則可以通過內(nèi)部的上拉電阻將端口拉到高電位,將其用作輸入口使用。在p1口作為輸入口使用時,由于存在內(nèi)部上拉電阻,被外部拉低的那些引腳都會輸出一個電流。p3口除作為一般i/o口外,還有其他一些復(fù)用功能,如表2.1所示。表2.1 p3口引腳復(fù)用功能端口引腳第
10、二功能p3.0rxd(串行口輸入)p3.1txd(串行口輸出)p3.2int0(外部中斷0輸入)p3.3int1(外部中斷1輸入)p3.4t0(定時/計數(shù)器0外部輸入)p3.5t1(定時/計數(shù)器1外部輸入)p3.6wr(外部數(shù)據(jù)存儲器寫信號)p3.7rd(外部數(shù)據(jù)存儲器讀信號)rst(9引腳):復(fù)位及提供后備電源。當輸入連續(xù)兩個機器周期以上高電平時為有效,用來完成單片機的復(fù)位初始化操作。完成看門狗計時后,rst引腳輸出高電平。特殊寄存器auxr上的disrto位可以禁用此功能。在disrto默認狀態(tài)下,復(fù)位高電平才有效。ale(30引腳):ale地址輸出鎖存信號,訪問外部存儲器時作為地址鎖存信
11、號,eprom編程時輸入編程脈沖。在一般情況下,ale以晶振六分之一的固定頻率輸出脈沖,可用來作為外部定時器或時鐘使用。如果需要,對地址位8eh的sfr的第0位置1,ale操作將會無效。若這一位置1,ale在執(zhí)行mov或movx指令時有效。不然,ale將會被微弱拉高。(31引腳):外部/內(nèi)部程序存儲器選擇信號。為高電平時,表示選擇內(nèi)部程序存儲器。注意加密方式1時,將內(nèi)部鎖定位reset。為低電平時,表示選擇外部程序存儲器。對于內(nèi)部沒有程序存儲器的單片機,必須接地。xtal1(19引腳):外接晶體振蕩器或外部時鐘。xtal2(18引腳):外接晶體振蕩器或外部時鐘3。2.1.3 復(fù)位電路的設(shè)計為了
12、使cpu和系統(tǒng)各個部件都處于確定的初始狀態(tài),并且從初始狀態(tài)開始工作,單片機在啟動時需要復(fù)位。整個復(fù)位電路包括芯片內(nèi)、外兩部分。外部電路產(chǎn)生復(fù)位信號(rst)發(fā)送至施密特觸發(fā)器,然后由片內(nèi)復(fù)位電路在每個機器周期的s5p2時刻對施密特觸發(fā)器的輸出進行采樣,最后才得到內(nèi)部復(fù)位操作需要的信號。復(fù)位操作有上電復(fù)位與按鍵復(fù)位兩種方式。本系統(tǒng)采用的是上電復(fù)位操作,上電復(fù)位是通過外部復(fù)位電路的電容充電來實現(xiàn)的這佯,只要電源vcc的上升時間不超過1ms,就可以實現(xiàn)自動上電復(fù)位,即接通電源就成了系統(tǒng)的復(fù)位初始化。電路如圖2.3所示4。圖2.3 復(fù)位電路圖圖中,通過對10uf電解電容的充電來實現(xiàn)上電復(fù)位功能。2.1
13、.4 時鐘電路設(shè)計單片機系統(tǒng)里都有晶振,在單片機系統(tǒng)里晶振作用非常大,全程叫晶體振蕩器。它結(jié)合單片機內(nèi)部電路產(chǎn)生單片機所需的時鐘頻率。單片機晶振提供的時鐘頻率越高,那么單片機運行速度就越快。單片接的一切指令的執(zhí)行都是建立在單片機晶振提供的時鐘頻率。單片機晶振的作用是為系統(tǒng)提供基本的時鐘信號。通常一個系統(tǒng)共用一個晶振,便于各部分保持同步。stc89c52內(nèi)部有一個用于構(gòu)成片內(nèi)振蕩器的高增益反向放大器,引腳xtal1和xtal2分別是此放大器的輸入端和輸出端。這個放大器與作為反饋元件的片外石英晶體可構(gòu)成一個自激振蕩器。振蕩電路的連接方法如圖2.4所示。圖2.4 振蕩電路圖2.2 濕度采集轉(zhuǎn)換模塊設(shè)
14、計2.2.1 濕度傳感器的選擇傳感器是檢測系統(tǒng)中與被測對象直接發(fā)生聯(lián)系的部分,是信息輸入的窗口,它為檢測系統(tǒng)提供必要的原始信息。檢測系統(tǒng)獲取信息的質(zhì)量也往往是由傳感器的性能一次性確定。為了能使其輸出在精度要求范圍內(nèi)反映被測量,傳感器必須具備一定的基本特性,因為只有這樣傳感器的輸出才能作為其輸出的量度。土壤濕度傳感器主要是用來測量土壤含水量,可以用作土壤墑情的監(jiān)測、農(nóng)業(yè)灌溉與林業(yè)防護。眼下常用到的濕度傳感器有fdr型和tdr型。眼下比較流行的是fdr型5。frd頻域反射儀是一種常用于測量土壤水分的儀器,它是利用電磁脈沖原理,根據(jù)電磁波在介質(zhì)中的傳播頻率來測量土壤的表觀介電常數(shù),由此得到土壤的容積
15、含水量5。經(jīng)過比較各種土壤水分傳感器的性能參數(shù),本系統(tǒng)選用了yl-100型土壤水分傳感器,其外形如圖2.5所示。這是一個簡易的水分傳感器利用電阻變化測量水分濕度。當土壤缺水時,傳感器輸出的模擬值將減小,反之將增大。表面做了金屬化處理,可以延長它的使用壽命。測量精度相對于數(shù)字集成濕度傳感器較低,但價格相對便宜,能滿足大部分植物的需求。圖2.5 yl-100型土壤水分傳感器外形圖2.2.2 濕度采集接口電路設(shè)計由于水分傳感器輸出為模擬信號,而單片機只能接收數(shù)字信號,因此需要用到a/d轉(zhuǎn)換器,并選用pcf8591芯片作為轉(zhuǎn)換芯片。pcf8591是一種單電源、功耗低的8位cmos型a/d、d/a轉(zhuǎn)換芯
16、片,它有4路模擬量輸入通道、1個i2c總線接口和一路模擬量輸出通道。該器件i2c從地址的低三位由芯片的a0、a1和a2三個地址引腳決定,所以在不增加任何硬件的情況下同一條i2c總線最多可以連接8個同類型的器件。此器件具有片上跟蹤保持、多路模擬量輸入、8位a/d轉(zhuǎn)換和8位d/a轉(zhuǎn)換等功能6。pcf8591的引腳說明如圖2.6所示。 圖2.6 pcf8591引腳排列圖ain0ain3:輸入模擬信號。a0a2:引腳的地址端。vdd、vss:接電源。sda、scl:i2c總線的數(shù)據(jù)線、時鐘線。osc:內(nèi)部時鐘輸出端,外部時鐘輸入端。ext:外部、內(nèi)部時鐘選擇線,在使用內(nèi)部時鐘時ext接地。agnd:模
17、擬信號地。aout:d/a轉(zhuǎn)換輸出端。vref:基準電源端。接口電路如圖2.7所示。圖2.7 fcf8591接口電路2.3 濕度顯示電路設(shè)計2.3.1 lcd顯示件選擇在這里我們采用1602工業(yè)字符型液晶,能夠同時顯示的內(nèi)容為16*2,即可以顯示兩行,每行16個字符。1602字符型lcd通常有14根引腳或者16根引腳,其中多出來的2根引腳為背光電源線15腳和地線16腳,它的控制原理和14腳的lcd完全一樣,引腳排列如圖2.8所示。 圖2.8 lcd1602引腳圖引腳說明如下:第1腳:vss為電源地。第2腳:vcc接5v電源正極。第3腳:v0是液晶顯示器的對比度調(diào)整端口,如果接正電源,則對比度弱
18、;如果接地電源則對比度高。第4腳:rs是寄存器選擇線,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指令寄存器。第5腳:rw是讀寫信號線,若為高電平1時,則進行讀操作;若為低電平0時,則進行寫操作。第6腳:e端為使能端,高電平1時讀取信息,負跳變時執(zhí)行指令。第714腳:d0d7為8位雙向輸入/輸出端。第1516腳:背燈電源或空腳。15腳為背光正極,16腳為背光負極7。2.3.2 顯示接口電路設(shè)計 顯示接口電路如圖2.9所示。圖2.9 lcd接口電路圖2.4 鍵盤電路設(shè)計2.4.1 按鍵功能設(shè)計在單片機系統(tǒng)中,按接口形式把鍵盤分為兩大類:編碼式鍵盤與非編碼式鍵盤。由硬件邏輯電路來編碼式鍵盤完成鍵識別的
19、工作和可靠措施。每一按鍵,鍵盤會自動的提供出該按鍵讀數(shù),于此同時用產(chǎn)生的選通脈沖來通知給微處理器。這種鍵盤比較容易使用,但是硬件結(jié)構(gòu)復(fù)雜,主機任務(wù)會相對繁重。而非編碼式鍵盤主要包括有獨立按鍵結(jié)構(gòu)的鍵盤與有矩陣按鍵結(jié)構(gòu)的鍵盤兩種。矩陣結(jié)構(gòu)鍵盤適合用于按鍵數(shù)量較多的場合,由行線與列線來組成,按鍵在行列交叉點的位置上,節(jié)省i/o口。獨立按鍵結(jié)構(gòu)就是各個按鍵互相獨立,每一個按鍵都單獨使用一根i/o口線,每根i/o口線按鍵的工作不會受其他i/o口線按鍵的影響。所以,用輸入電平狀態(tài)的檢測可以很方便的確定是哪個按鍵按下。此鍵盤是用于按鍵較少或操作速度較高的場合8。由于本次設(shè)計只用到2個鍵,所以采用獨立式鍵盤
20、,在程序設(shè)計中采用查詢的方式來識別按鍵。本次設(shè)計共2個鍵,分別為s1增大預(yù)設(shè)值,s2減小預(yù)設(shè)值。 2.4.2 鍵盤接口電路設(shè)計鍵盤接口電路如圖2.10所示。圖2.10 鍵盤接口電路圖2.5 自動灌溉電路設(shè)計在智能微灌溉控制系統(tǒng)中,采集到的參數(shù)在進行數(shù)據(jù)處理之后,與給出的標準參數(shù)給定值進行比較,如果低于給定值則驅(qū)動相應(yīng)的外部灌溉電路,對目標區(qū)域進行微灌溉;超過給定值則停止灌溉。本設(shè)計采用了繼電器電路來驅(qū)動相應(yīng)的外部灌溉電路用來實施對植物的灌溉。繼電器電路如圖2.11所示。圖2.11 繼電器電路圖2.6 報警電路設(shè)計在智能微灌溉控制系統(tǒng)中,采集到的參數(shù)在進行數(shù)據(jù)處理之后,與給出的標準參數(shù)給定值進行
21、比較,如果低于給定值則報警。系統(tǒng)采用蜂鳴器電路作為報警電路。報警電路如圖2.12所示。圖2.12 報警電路圖3 系統(tǒng)軟件設(shè)計本次設(shè)計軟件系統(tǒng)主要包括:濕度采集轉(zhuǎn)換模塊、鍵盤控制模塊、lcd顯示模塊、繼電器驅(qū)動模塊等。3.1 軟件系統(tǒng)總體工作流程當單片機上電復(fù)位后,系統(tǒng)開始運行程序,相對濕度值會實時顯示在液晶顯示器上。當按下濕度調(diào)整功能鍵時,lcd顯示器上會有相應(yīng)顯示。啟動水分傳感器測量土壤的含水量,將測量的濕度值與設(shè)定值進行比較,若采集到的相對濕度值低于設(shè)定值則由繼電器驅(qū)動相應(yīng)的外部灌溉電路,對目標區(qū)域進行微噴灌并報警;超過設(shè)定值則停止灌溉與報警。系統(tǒng)整體的軟件流程方式如圖3.1所示。開始系統(tǒng)
22、初始化土壤濕度數(shù)據(jù)采集a/d轉(zhuǎn)換lcd顯示按鍵輸入否低于預(yù)設(shè)濕度值?是驅(qū)動水泵進行灌溉并報警高于預(yù)設(shè)濕度值?否是停止灌溉與報警結(jié)束圖3.1 系統(tǒng)整體流程圖3.2 濕度采集模塊設(shè)計數(shù)據(jù)采集的主要任務(wù)是不斷地采集土壤的濕度參數(shù),通過stc89c52讀取濕度再進行計算處理,最后送到lcd液晶顯示器進行顯示。工作流程如圖3.2所示。初始化啟動a/d轉(zhuǎn)換讀出a/d轉(zhuǎn)換后的數(shù)值返回圖3.2 數(shù)據(jù)采集子程序流程圖3.3 鍵盤控制模塊設(shè)計本系統(tǒng)采用獨立式鍵盤,采用查詢的方式來識別按鍵。兩個按鍵分別為s1、s2。s1接p0.6口,s2接p0.7口。3.4 lcd顯示模塊設(shè)計本次設(shè)計顯示模塊采用1602液晶屏,對
23、它的操作主要是將一些固定的字符寫入1602的寄存器中,當需要顯示時調(diào)用即可,以達到在液晶上顯示的效果。單片機p1口與lcd1602的d0-d7相接,p3.4、p3.5、p3.6分別與lcd1602的rs、rw、e。程序流程如圖3.3所示。lcd初始化允許寫數(shù)據(jù)否判斷l(xiāng)cd忙?否寫數(shù)據(jù)顯示返回圖3.3 lcd顯示流程圖3.5 自動灌溉模塊設(shè)計通過stc89c52給出處理信號??刂破魍ㄟ^繼電器來控制電磁閥的通斷電,進而控制水泵的灌溉動作。繼電器輸出由單片機p2.7引腳控制。3.6 報警模塊設(shè)計當測量的濕度值小于設(shè)定值時,與蜂鳴器相連的單片機io口置0,蜂鳴器進行報警。蜂鳴器接單片機p2.6口。報警
24、部分流程如圖3.4所示。是否低于預(yù)設(shè)值?否是發(fā)出報警停止報警圖3.4 報警部分流程圖參考文獻1 彭世彰,丁加麗基于單片機技術(shù)的灌溉控制系統(tǒng)的設(shè)計與實現(xiàn)j水利水電科技進展,2004,2:202 韓麗娟,鄧玉鳳單片機的開發(fā)技巧及其應(yīng)用研究j科技信息,2009,4:213 廖功磊,周小波,謝崇平農(nóng)業(yè)節(jié)水灌溉數(shù)字化智能控制系統(tǒng)研究j四川農(nóng)機,2006,5:324 王世華基于單片機的火炮裝藥溫度實時測量裝置設(shè)計d南京:南京理工大學,20075 何健綿羊牧草行為圖像采集裝置的設(shè)計d內(nèi)蒙古:內(nèi)蒙古農(nóng)業(yè)大學,20136 何希才傳感器及其應(yīng)用電路m北京:電子工業(yè)出版社,2001:142-1437 陳衛(wèi)華基于at
25、89c52單片機的智能微噴灌控制系統(tǒng)設(shè)計d天津:天津大學,20108 于麗秋調(diào)頻多工數(shù)據(jù)廣播系統(tǒng)的設(shè)計與實現(xiàn)d北京:北京交通大學,2011附錄a 硬件原理圖圖a 硬件原理圖附錄b 程序代碼lcd顯示子程序:#include 1602.h#include delay.hsbit rs = p34; /定義端口 sbit rw = p35;sbit en = p36;#define rs_clr rs=0 #define rs_set rs=1#define rw_clr rw=0 #define rw_set rw=1 #define en_clr en=0#define en_set en=1
26、#define dataport p1/*- 判忙函數(shù)-*/ bit lcd_check_busy(void) dataport= 0xff; rs_clr; rw_set; en_clr; _nop_(); en_set; return (bit)(dataport & 0x80); /*- 寫入命令函數(shù)-*/ void lcd_write_com(unsigned char com) / while(lcd_check_busy(); /忙則等待 delayms(5); rs_clr; rw_clr; en_set; dataport= com; _nop_(); en_clr; /*-
27、寫入數(shù)據(jù)函數(shù)-*/ void lcd_write_data(unsigned char data) /while(lcd_check_busy(); /忙則等待 delayms(5); rs_set; rw_clr; en_set; dataport= data; _nop_(); en_clr; /*- 清屏函數(shù)-*/ void lcd_clear(void) lcd_write_com(0x01); delayms(5); /*- 寫入字符串函數(shù)-*/ void lcd_write_string(unsigned char x,unsigned char y,unsigned char *
28、s) if (y = 0) lcd_write_com(0x80 + x); /表示第一行 else lcd_write_com(0xc0 + x); /表示第二行 while (*s) lcd_write_data( *s); s +; /*- 寫入字符函數(shù)-*/ void lcd_write_char(unsigned char x,unsigned char y,unsigned char data) if (y = 0) lcd_write_com(0x80 + x); else lcd_write_com(0xc0 + x); lcd_write_data( data); /*- 初
29、始化函數(shù)-*/ void lcd_init(void) lcd_write_com(0x38); /*顯示模式設(shè)置*/ delayms(5); lcd_write_com(0x38); delayms(5); lcd_write_com(0x38); delayms(5); lcd_write_com(0x38); lcd_write_com(0x08); /*顯示關(guān)閉*/ lcd_write_com(0x01); /*顯示清屏*/ lcd_write_com(0x06); /*顯示光標移動設(shè)置*/ delayms(5); lcd_write_com(0x0c); /*顯示開及光標設(shè)置*/ /
30、*- 設(shè)定二個自定義字符,lcd1602中自定義字符的地址為0x00-0x07,即可定義8個字符這里我們設(shè)定把一個自定義字符放在0x00位置(000),另一個放在0x01位子(001)-*/void lcd_user_chr(void) /第一個自定義字符 lcd_write_com(0x40); /01 000 000 第1行地址 (d7d6為地址設(shè)定命令形式d5d4d3為字符存放位置(0-7),d2d1d0為字符行地址(0-7)) lcd_write_data(0x00); /xxx 11111 第1行數(shù)據(jù)(d7d6d5為xxx,表示為任意數(shù)(一般用000),d4d3d2d1d0為字符行數(shù)
31、據(jù)(1-點亮,0-熄滅) lcd_write_com(0x41); /01 000 001 第2行地址 lcd_write_data(0x04); /xxx 10001 第2行數(shù)據(jù) lcd_write_com(0x42); /01 000 010 第3行地址 lcd_write_data(0x0e); /xxx 10101 第3行數(shù)據(jù) lcd_write_com(0x43); /01 000 011 第4行地址 lcd_write_data(0x0e); /xxx 10001 第4行數(shù)據(jù) lcd_write_com(0x44); /01 000 100 第5行地址 lcd_write_data
32、(0x0e); /xxx 11111 第5行數(shù)據(jù) lcd_write_com(0x45); /01 000 101 第6行地址 lcd_write_data(0x1f); /xxx 01010 第6行數(shù)據(jù) lcd_write_com(0x46); /01 000 110 第7行地址 lcd_write_data(0x04); /xxx 11111 第7行數(shù)據(jù) lcd_write_com(0x47); /01 000 111 第8行地址 lcd_write_data(0x00); /xxx 00000 第8行數(shù)據(jù) /第二個自定義字符 lcd_write_com(0x48); /01 001 00
33、0 第1行地址 lcd_write_data(0x03); /xxx 00001 第1行數(shù)據(jù) lcd_write_com(0x49); /01 001 001 第2行地址 lcd_write_data(0x03); /xxx 11011 第2行數(shù)據(jù) lcd_write_com(0x4a); /01 001 010 第3行地址 lcd_write_data(0x00); /xxx 11101 第3行數(shù)據(jù) lcd_write_com(0x4b); /01 001 011 第4行地址 lcd_write_data(0x00); /xxx 11001 第4行數(shù)據(jù) lcd_write_com(0x4c)
34、; /01 001 100 第5行地址 lcd_write_data(0x00); /xxx 11101 第5行數(shù)據(jù) lcd_write_com(0x4d); /01 001 101 第6行地址 lcd_write_data(0x00); /xxx 11011 第6行數(shù)據(jù) lcd_write_com(0x4e); /01 001 110 第7行地址 lcd_write_data(0x00); /xxx 00001 第7行數(shù)據(jù) lcd_write_com(0x4f); /01 001 111 第8行地址 lcd_write_data(0x00); /xxx 00000 第8行數(shù)據(jù) 延時子程序:#
35、include delay.h/*- us延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值 unsigned char 是定義無符號字符變量,其值的范圍是 0255 這里使用晶振12m,精確延時請使用匯編,大致延時 長度如下 t=tx2+5 us -*/void delayus2x(unsigned int t) while(-t);/*- ms延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值 unsigned char 是定義無符號字符變量,其值的范圍是 0255 這里使用晶振12m,精確延時請使用匯編-*/void delayms(unsigned int
36、t) while(t-) /大致延時1ms delayus2x(245); delayus2x(245); iic協(xié)議:#include i2c.h#include delay.h#define _nop() _nop_() /定義空指令 bit ack; /應(yīng)答標志位sbit sda=p21;sbit scl=p20;/*- 啟動總線-*/void start_i2c() sda=1; /發(fā)送起始條件的數(shù)據(jù)信號 _nop(); scl=1; _nop(); /起始條件建立時間大于4.7us,延時 _nop(); _nop(); _nop(); _nop(); sda=0; /發(fā)送起始信號 _
37、nop(); /起始條件鎖定時間大于4 _nop(); _nop(); _nop(); _nop(); scl=0; /鉗住i2c總線,準備發(fā)送或接收數(shù)據(jù) _nop(); _nop();/*- 結(jié)束總線-*/void stop_i2c() sda=0; /發(fā)送結(jié)束條件的數(shù)據(jù)信號 _nop(); /發(fā)送結(jié)束條件的時鐘信號 scl=1; /結(jié)束條件建立時間大于4 _nop(); _nop(); _nop(); _nop(); _nop(); sda=1; /發(fā)送i2c總線結(jié)束信號 _nop(); _nop(); _nop(); _nop();/*- 字節(jié)數(shù)據(jù)傳送函數(shù) 函數(shù)原型: void send
38、byte(unsigned char c);功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對 此狀態(tài)位進行操作.(不應(yīng)答或非應(yīng)答都使ack=0 假) 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。-*/void sendbyte(unsigned char c) unsigned char bitcnt; for(bitcnt=0;bitcnt8;bitcnt+) /要傳送的數(shù)據(jù)長度為8位 if(cbitcnt)&0x80)sda=1; /判斷發(fā)送位 else sda=0; _nop(); scl=1; /置時鐘線為高,通知被控器開始接收數(shù)據(jù)位 _nop
39、(); _nop(); /保證時鐘高電平周期大于4 _nop(); _nop(); _nop(); scl=0; _nop(); _nop(); sda=1; /8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應(yīng)答位 _nop(); _nop(); scl=1; _nop(); _nop(); _nop(); if(sda=1)ack=0; else ack=1; /判斷是否接收到應(yīng)答信號 scl=0; _nop(); _nop();/*- 字節(jié)數(shù)據(jù)傳送函數(shù) 函數(shù)原型: unsigned char rcvbyte();功能: 用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號), 發(fā)完后請用應(yīng)答函數(shù)。 -
40、*/unsigned char rcvbyte() unsigned char retc; unsigned char bitcnt; retc=0; sda=1; /置數(shù)據(jù)線為輸入方式 for(bitcnt=0;bitcnt8;bitcnt+) _nop(); scl=0; /置時鐘線為低,準備接收數(shù)據(jù)位 _nop(); _nop(); /時鐘低電平周期大于4.7us _nop(); _nop(); _nop(); scl=1; /置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效 _nop(); _nop(); retc=retc1; if(sda=1)retc=retc+1; /讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 _nop(); _nop(); scl=0; _nop(); _nop(); return(retc);/*- 非應(yīng)答子函數(shù)原型: void noack_i2c(void); -*/void noack_i2c(void) sda=1; _nop(); _nop(); _nop(); scl=1; _nop(); _nop(); /時鐘低電平周期大于4
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024屆貴州省貴陽市普通中學高三入學考試數(shù)學試題試卷
- Unit2 A new student Story time(說課稿)-2024-2025學年譯林版(三起)英語五年級上冊
- 布草收發(fā)勞務(wù)合同
- 裱花師傅勞動合同總結(jié)
- 頂板事故應(yīng)急演練
- 物聯(lián)網(wǎng)通信導論課件
- 姿態(tài)敏感器相關(guān)行業(yè)投資規(guī)劃報告范本
- 緩控釋制劑相關(guān)行業(yè)投資方案
- 電工材料:電氣相關(guān)項目投資計劃書范本
- 濕法混合顆粒機相關(guān)行業(yè)投資方案
- 水產(chǎn)產(chǎn)品采購合同三篇
- 專項學習 像工程師那樣(教學設(shè)計)- 2023-2024學年科學四年級上冊 蘇教版
- 城區(qū)綠地養(yǎng)護服務(wù)費項目成本預(yù)算績效分析報告
- 2025屆江蘇省南通市海安市海安高級中學高三下學期一??荚嚿镌囶}含解析
- 2024年全國職業(yè)院校技能大賽(節(jié)水系統(tǒng)安裝與維護賽項)考試題庫(含答案)
- 2024年美團商家入駐完整協(xié)議書
- 人教版小學3-6年級英語單詞情況帶音標2
- 人教版八年級上冊英語各單元作文范文匯編
- 肌鈣蛋白-石磊
- 《大學生職業(yè)生涯規(guī)劃》 教案全套 宗敏-第1-10章 生涯規(guī)劃導論-創(chuàng)業(yè)
- 鏈家二手房買賣合同協(xié)議書
評論
0/150
提交評論