基于單片機的作息時間控制系統完整版_第1頁
基于單片機的作息時間控制系統完整版_第2頁
基于單片機的作息時間控制系統完整版_第3頁
基于單片機的作息時間控制系統完整版_第4頁
基于單片機的作息時間控制系統完整版_第5頁
已閱讀5頁,還剩65頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

./目錄一、引言31.1單片機的作息時間控制系統設計的目的和意義31.2方案比較3二、整體設計方框圖4三、模塊電路設計53.1.單片機核心控制模塊53.2鍵盤模塊73.3實時時鐘模塊123.4數據存儲模塊143.5溫度傳感器模塊3.6紅外模塊3.7電機模塊3.8顯示模塊3.9外圍驅動模塊四、單片機軟件系統設計154.1系統實現工作流程 4.2系統流程圖 4.3系統源程序五、元件明細表16六、整機電路圖196.1整體原理圖196.2整體PCB圖206.3整體PCB3D圖七、總結與致謝24八、參考文獻24一、引言1.1單片機作息時間控制系統設計的目的和意義隨著計算機技術的發展和在控制系統中的廣泛應用,以及設備向小型化、智能化發展,作為高新技術之一的單片機以其體積小、功能強、價格低廉、使用靈活等優勢,顯示出了很強的生命力。進入21世紀以來,開發推出單片機的公司很多,各種高性能單片機芯片市場也異常活躍,新技術的不斷采用,更加使單片機的種類、性能以及應用領域不斷擴大和提高。因其功耗低,超高型,低成本,功能完整,在國內越來越受到用戶的重視和廣泛使用。

本設計是一個具有打鈴、當前環境溫度顯示、教室燈光、廣播、校門開關的自動控制等功能的作息時間控制系統。同時該系統也是一可調式萬年歷,采用SG12864液晶具有良好的菜單式人機界面更使本系統增色不少。它利用PCF8563實時時鐘芯片計時,進行年歷計算,并用SG12864將當前日期、星期、時間出來;在進行時間計算,分每加一時,都與規定的作息時間比較,如果相等則進行相應的控制或動作。由單片機核心控制模塊、鍵盤模塊、電機模塊、實時時鐘模塊、紅外模塊、液晶顯示模塊、溫度傳感器模塊、數據存儲模塊、外圍驅動模塊九部分組成,系統擴展16個矩陣按鍵用于打鈴時間調整及時間校正。現代機關企業,特別是學校要求對時間加以控制,要按時打鈴及播放廣播,以保證學習與工作的正常運行。本設計實現了這些功能,給學校及其他機關企業帶來方便,整體性好,人性化強、可靠性高,實現了對時間控制的智能化。1.2方案比較作息時間控制系統的設計有很多方案可以實現,其主流技術主要有以下幾種:〔1用可編程邏輯器件〔如CPLD、FPGA來實現,而在本設計中如要實現功能相對來說比較復雜,必須得用到FPGA來實現,而FPGA的價格相對較貴,且系統設計比較困難。〔2用PLC來實現,PLC其實就是一被封裝起來的單片機,里面設有監控程序,并對I/O端口進行了光電隔離。這樣一來使得PLC性能穩定且容易使用,且只需簡單外圍電路就可以實現該系統功能,但PLC比較昂貴,這樣會使成本增高而失去市場競爭。〔3就是用555定時器產生時鐘脈沖和數字芯片〔如74LS14來實現,但要來實現本設計需要大量的數字芯片,使得系統穩定性下降,生產難度加大,而且成本會增加。〔4就是應用單片充當主控器來再加上適量的外圍實現此功能,且單片機價格便宜,性能穩定。應用的外圍器件相對較少,這就提高了系統的穩定性,且單片機控制簡易,開發工具簡單,很容易大批量生產。經過以上比較,最終我們選擇第〔4種方案來實施。二.整體設計方框圖三.模塊電路設計3.1單片機核心控制模塊A.核心器件的選擇單片機是本設計的核心器件,因此單片機的選擇決定了該設計的穩定和性能,目前單片機市場種類繁多,有幾千種不同型號,單片機的選擇應遵循在能滿足性能條件下盡可能的選擇功耗小資源少價格低,而且貨源充足的。現在主流單片機種類有以下幾類:PIC單片機:是MICROCHIP公司的產品,其突出的特點是體積小,功耗低,精簡指令集,抗干擾性好,可靠性高,有較強的模擬接口,代碼保密性好,大部分芯片有其兼容的FLASH程序存儲器的芯片。EMC單片機:是XX義隆公司的產品,有很大一部分與PIC8位單片機兼容,且相兼容產品的資源相對比PIC的多,價格便宜,有很多系列可選,但抗干擾較差。ATMEL單片機<51單片機>:ATMEL公司的8位單片機有AT89、AT90兩個系列,AT89系列是8位Flash單片機,與8051系列單片機相兼容,靜態時鐘模式;AT90系列單片機是增強RISC結構、全靜態工作方式、內載在線可編程Flash的單片機,也叫AVR單片機。PHLIPIS51PLC系列單片機<51單片機>:PHILIPS公司的單片機是基于80C51內核的單片機,嵌入了掉電檢測、模擬以及片內RC振蕩器等功能,這使51LPC在高集成度、低成本、低功耗的應用設計中可以滿足多方面的性能要求。HOLTEK單片機:XX盛揚半導體的單片機,價格便宜,種類較多,但抗干擾較差,適用于消費類產品。TI公司單片機<51單片機>:XX儀器提供了TMS370和MSP430兩大系列通用單片機.TMS370系列單片機是8位CMOS單片機,具有多種存儲模式、多種外圍接口模式,適用于復雜的實時控制場合;MSP430系列單片機是一種超低功耗、功能集成度較高的16位低功耗單片機,特別適用于要求功耗低的場合。最后我們決定選用ATMEL公司的AT89S51單片機,AT89S51是ATMEL公司生產的低功耗,高性能、高性價比的CMOS8位單片機,片內含4Kbytes的可系統編程的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準8051指令系統及引腳。它集Flash程序存儲器既可在線編程〔ISP也可用傳統方法進行編程及通用8位微處理器于單片芯片中,AT89S51含有128×8字節內部RAM、32個可編程I/O口線、2個16位定時/計數器、6個中斷源和全雙工串行UART通道,已能滿足系統控制需求。B.模塊電路設計 單片機運行需要滿足幾個條件,首先必需提供電源,還時鐘振蕩源,還有復位。由于十二個時鐘周期構成一個機器周期,在這里為方便計算我們選取晶振頻率為12MHZ的晶振,因為晶振產生的信號比較弱,電容選取范圍只能是小于30PF,在這里我們選取C1、C2為22PF。當單片機的復位端持續為兩個機器周期高電平時產生復位,因此復位電路的參數需要根據晶振來決定,單片機控制系統一般都要求達到上電復位,因此這就對電容和電阻的選擇有一定的要求,這可以通過計算來得出元件參數,但單片機最小系統的參數有一個經驗值,在這里我們選用取R2100Ω、R110K,C3取10UF。由于單片機的P0口結構的特殊性,需加上拉電阻,這里我們選取阻值為10K的電阻,而耐壓值的選擇我們則只須選擇大于7.5V就行了。C.模塊電路圖3.2鍵盤模塊A.鍵盤電路選擇鍵盤可以有幾種選擇:一種是利用鍵盤LED芯片〔如HD7279、HD8279、MAX7219等,一種則是直接利用單片機I/O口搭建鍵盤電路。采用鍵盤LED芯片,具有編程簡單,抗干擾能力強、穩定性好、功能強大等特點,但其成本比較高,而且占用額外的功耗和空間,通常用在對鍵盤讀取要求較高的場合。而普通的鍵盤電路,則有電路簡單,成本低等特點,但其抗干擾能力較前者弱。而鍵盤電路結構又分為直接型和矩陣型,直接型具有編程、電路簡單等特點,但占用的I/O口比較多,適用于只需少量鍵盤的場合。矩陣型具有電路、編程復雜等特點,但占用I/O口少,比較適應于要求鍵盤比較多的場合。而本設計的顯示電路是采用的LCD顯示,且對鍵盤讀取要求也不是太高,采取鍵盤芯片不能充分利用其功能,有點浪費。且單片機I/O口比較緊張,所以決定采用普通矩陣鍵盤。B.模塊電路設計 在本設計中有用到數字鍵0-9,且還有上、下、左、右、確定、取消鍵。一共十六個鍵,剛好可用8個I/O口組成4*4矩陣鍵盤。而矩陣鍵盤的搭建比較簡單,只需遵循行列相交搭建就行,而必需在行或列添加上拉電阻,而上拉電阻的選取就只需遵循上拉電流小于單片機最大灌電流就行,在這里我們選取10K的電阻來充當上拉電阻。C.模塊電路圖3.3實時時鐘模塊A.核心器件選擇 在單片機內部,可以利用定時器進行計時,也可以實現功能,但利用內部定時器進行計時會產生計時不精確,且增加了CPU的負擔和編程的難度,再就是掉電重啟后時間會全部被初始化。因此我們采用實時時鐘芯片,實時時鐘芯片的種類繁多。在這里我們選用PCF8563實時時鐘芯片。PCF8563是低功耗的CMOS實時時鐘/日歷芯片,它提供一個可編程時鐘輸出,一個中斷輸出和掉電檢測器,所有的地址和數據通過I2C總線接口串行傳遞。最大總線速度為400Kbits/s,每次讀寫數據后,內嵌的字地址寄存器會自動產生增量,可編程時鐘輸出剛好可以為紅外發射管提供載波信號。特性*低工作電流:典型值為0.25μA〔VDD=3.0V,Tamb=25℃時。*世紀標志*大工作電壓范圍:1.0~5.5*低休眠電流;典型值為0.25μA<VDD=3.0V,Tamb=25℃>*400KHz的I2C總線接口〔VDD=1.8~5.5V時。*可編程時鐘輸出頻率為:32.768KHz,1024Hz,32Hz,1Hz。*報警和定時器。*掉電檢測器。*內部集成的振蕩器電容。*片內電源復位功能。*I2C總線從地址:讀,0A3H;寫,0A2H。*開漏中斷引腳。PCF8563有16個8位寄存器:一個可自動增量的地址寄存器,一個內置32.768KHz的振蕩器〔帶有一個內部集成的電容,一個分頻器〔用于給實時時鐘RTC提供源時鐘,一個可編程時鐘輸出,一個定時器,一個報警器,一個掉電檢測器和一個400KHzI2C總線接口。所有16個寄存器設計成可尋址的8位并行寄存器,但不是所有位都有用。前兩個寄存器〔內存地址00H,01H用于控制寄存器和狀態寄存器,內存地址02H~08H用于時鐘計數器〔秒~年計數器,地址09H~0CH用于報警寄存器〔定義報警條件,地址0DH控制CLKOUT管腳的輸出頻率,地址0EH和0FH分別用于定時器控制寄存器和定時器寄存器。秒、分鐘、小時、日、月、年、分鐘報警、小時報警、日報警寄存器,編碼格式為BCD,星期和星期報警寄存器不以BCD格式編碼。當一個RTC寄存器被讀時,所有計數器的內容被鎖存,因此,在傳送條件下,可以禁止對時鐘/日歷芯片的錯讀。一個或多個報警寄存器MSB〔AE=AlarmEnable報警使能位清0時,相應的報警條件有效,這樣,一個報警將在每分鐘至每星期范圍內產生一次。設置報警標志位AF〔控制/狀態寄存器2的位3用于產生中斷,AF只可以用軟件清除。8位的倒計數器〔地址0FH由定時器控制寄存器〔地址0EH控制,定時器控制寄存器用于設定定時器的頻率〔4096,64,1,或1/60Hz,以及設定定時器有效或無效。定時器從軟件設置的8位二進制數倒計數,每次倒計數結束,定時器設置標志位TF,定時器標志位TF只可以用軟件清除,TF用于產生一個中斷〔/INT,每個倒計數周期產生一個脈沖作為中斷信號。TI/TP控制中斷產生的條件。當讀定時器時,返回當前倒計數的數值。管腳CLKOUT可以輸出可編程的方波。CLKOUT頻率寄存器〔地址0DH;參見表23決定方波的頻率,CLKOUT可以輸出32.768KHz<缺省值>,1024,32,1Hz的方波。CLKOUT為開漏輸出管腳,通電時有效,無效時為高阻抗。表1PCF8563寄存器結構地址寄存器名稱D7D6D5D4D3D2D1D000H控制/狀態寄存器1TEST0STOP0TTESTC00001H控制/狀態寄存器2000TI/TPAFTFAIETIE02H秒寄存器VL00~59BCD碼格式數03H分寄存器-00~59BCD碼格式數04H時寄存器-00~23BCD碼格式數05H日寄存器-00~31BCD碼格式數06H星期寄存器-00~06BCD碼格式數07H月/世紀寄存器C00~12BCD碼格式數08H年寄存器00~99BCD碼格式數09H分鐘報警寄存器AE00~59BCD碼格式數0AH時鐘報警寄存器AE00~23BCD碼格式數0BH日報警寄存器AE00~31BCD碼格式數0CH星期報警寄存器AE00~06BCD碼格式數0DHCLKOUT頻率寄存器FE-----FD1FD00EH定時控制寄存器TETD1TD00FH定時器倒計時數值寄存器定時器倒數計數數值B.模塊電路設計 本模塊電路比較簡單,只需注意一個地方,那就是實時時鐘芯片一般裝有后備電池,以保證當斷電時仍繼續計時,這就需要考慮一個當斷電時電流反灌而損壞電源的問題,還有就是當從斷電狀態進入上電電壓的瞬時上升會造成電池壽命的縮短,因此我們在電源和地之間需加一二極管和緩沖電容,二極管的選取只須考慮最大正向整流電流和最大反向電壓,在這里們選取4148,而緩沖電容則選取0.047F。而晶振必須選取32.768KHZ,在晶振和地之間須串聯一耦合電容,耦合電容只須小于35P就可以了,在這里我們先取18P。C.模塊電路圖2.4數據存儲模塊A.核心器件選擇 本模塊的設計是為了增加在線調整作息時間,以更適應現實生活中的需要。而數據存儲芯片,我們采用非掉電易失的串行EEPROM芯片進行存儲。串行EEPROM中,較為典型的有ATMEL公司的AT24CXX系列以及該公司生產的AT93CXX系列,較為著名的半導體廠家,包括Microchip,國家半導體廠家等,都有AT93CXX系列EEPROM產品。AT24CXX系列的串行電可改寫及可編程只讀存儲器EEPROM有10種型號,其中典型的型號有AT24C01A/02/04/08/16等5種,它們的存儲容量分別是1024/2048/4096/8192/16384位,也就是128/256/512/1024/2048字節。這個系列一般用于低電壓,低功耗的工業和商業用途,并且可以組成優化的系統。信息存取采用2線串行接口。這里我們就24C02的結構特點,其它系列比較類似。AT24C02有地址線A0~A2,串行時鐘引腳SDA,串行時鐘輸入引腳SCL,寫保護引腳WP等引腳。很明顯,其引腳較少,對組成的應用系統可以減少布線,提高可靠性。各引腳的功能和意義如下:①VCC引腳,電源+5V。②GND引腳,地線。③SCL引腳,串行時鐘輸入端。在時鐘的正跳沿即上升沿時把時鐘寫入EEPROM;在時鐘的負跳沿即下降沿時把數據從EEPROM中讀出來。④SDA引腳,串行數據I/O端,用于輸入和輸出串行數據。這個引腳是漏極開路的埠,故可以組成"線或"結構。⑤A0,A1,A2引腳,是芯片地址引腳。在型號不同時意義有些不同,但都要接固定電平。⑥WP引腳,寫保護端。這個端提供了硬件數據保護。當把WP接地時,允許芯片執行一般讀寫操作;當把WP接VCC時,則對芯片實施寫保護。內存的組織:對于不同的型號,內存的組織不一樣,其關鍵原因在于內存容量存在差異。對于AT24CXX系列的EEPROM,其典型型號的內存組織如下。AT24C01A:內部含有128個字節,故需要7位地址對其內部字節進行尋址AT24C02:內部含有256個字節,故需要8位地址對其內部字節進行讀寫。起始狀態:當SCL為高電平時,SDA由高電平變到低電平則處于起始狀態。起始狀態應處于任何其它命令之前。停止狀態:當SCL處于高電平時,SDA從低電平變到高電平則處于停止狀態。在執行完讀序列信號之后,停止命令將把EEPROM置于低功耗的備用方式<StandbyMode>.應答信號:應答信號是由接受資料的器件發出的。當EEPROM接受完一個寫入資料之后,會在SDA上發一個"0"應答信號。反之,當單片機接受完來自EEPROM的資料后,單片機也應向SDA發ACK信號。ACK信號在第9個時鐘周期時出現。備用方式<StandbyMode>:AT24C01A/02/04/08/16都具有備用方式,以保證在沒有讀寫操作時芯片處于低功耗狀態。在下面兩種情況中,EEPROM都會進入備用方式:第一,芯片通電的時候;第二,在接到停止位和完成了任何內部操作之后。AT24C01等5種典型的EEPROM在進入起始狀態之后,需要一個8位的"器件地址字"去啟動內存進行讀或寫操作。在寫操作中,它們有"字節寫","頁面寫"兩種不同的寫入方法。在讀操作中,有"現行地址讀",隨機讀和"順序讀"種各具特點的讀出方法。下面分別介紹器件尋址,寫操作和讀操作。①器件尋址:所謂器件尋址<DeviceAddressing>就是用一個8位的器件地址字<DeviceAddressWord>去選擇內存芯片。在邏輯電路中的AT24CXX系列的5種芯片種,即AT24C01A/02/04/08/16中,如果和器件地址字相比較結果一致,則讀芯片被選中。下面對器件尋址的過程和意義加以說明。②芯片的操作地址D7D6D5D4D3D2D1D01010A2A1A0R/W用于內存EEPROM芯片尋址的器件地址字如圖所示。它有4種方式,分別對應于1K/2K,4K,8K和16K位的EEPROM芯片。從圖中看出:器件地址字含有3個部分。第一部分是高4位,它們稱為EEPROMAT24C01A/02/04/08/16的標識第二部分稱為硬布線地址,它們是標識后的3位。第三部分是最低位,它是讀/寫操作選擇位。第一部分:器件標識,器件地址字的最高4位。這4位的內容恒為"1010",用于標識EEPROM器件AT24C01A/02/04/08/16。第二部分:硬布線地址,是與器件地址字的最高4位相接的低3位。硬布線地址的3位有2種符號:Ai<i=0~2>,Pj<j=0~2>其中Ai表示外部硬布線地址位。對于AT24C10A/02這兩種1K/2K位的EEPROM芯片,硬布線地址為"A2,A1,A0"。在應用時,"A2,A1,A0"的內容必須和EEPROM芯片的A2,A1,A0的硬布線情況,即邏輯連接情況相比較,如果一樣,則芯片被選中;否則,不選中。AT24C01/02:真正地址=字地址。第三部分:讀/寫選擇位,器件地址字的最低位,并用R/W表示。當R/W=1時,執行讀操作;當R/W=0時,執行寫操作。當EEPROM芯片被選中時,則輸出"0";如果EEPROM芯片沒有被選中,則它回到備用方式。被選中的芯片。其以后的輸入,輸出情況視寫入和讀出的內容而定。③寫操作:AT24C01A/02/04/08/16這5種EEPROM芯片的寫操作有2種:一種是字節寫,另一種是頁面寫。字節寫:這種寫方式只執行1個字節的寫入。字節寫的過程如圖所示,其寫入過程分外部寫和內部寫兩部分,分別說明如下。在起始狀態中,首先寫入8位的器件地址。則EEPROM芯片會產生一個"0"信號ACK輸出作為應答;接著,寫入8位的字地址,在接受了字地址之后,EEPROM芯片又產生一個"0"應答信號ACK;隨后,寫入8位資料,在接受了資料之后,芯片又產生一個"0"信號ACK作為應答。到此為止,完成了一個字節寫過程,故應在SDA端產生一個停止狀態,這是外部寫過程。在這個過程中,控制EEPROM的單片機應在EEPROM的SCL,SDA端送入恰當的信號。當然在一個字節寫過程結束時,單片機應以停止狀態結束寫過程。在這時,EEPROM進入內部定時的寫周期,以便把接受的數據寫入到存儲單元中。在EEPROM的內部寫周期中,其所有輸入被屏蔽,同時不響應外部信號直到寫周期完成。這是內部寫過程。內部寫過程大約需要10ms時間。內部寫過程處于停止狀態與下一次起始狀態之間。頁面寫:這種寫入方式執行含若干字節的1個頁面的寫入。對于AT24C01A/02,它們的1個頁面含8個字節;頁面寫的開頭部分和字節寫一樣。在起始狀態,首先寫入8位器件地址;待EEPROM答當了"0"信號ACK之后,寫入8位字地址;又待芯片應答了"0"信號ACK之后,寫入8位資料。隨后頁面寫的過程則和字節寫有區別。當芯片接受了第一個8位資料并產生應答信號ACK之后,單片機可以連續向EEPROM芯片發送共為1頁面的資料。對于AT24C01A/02,可發送共1個頁面的8個字節〔連第一個8位資料在內。對于AT24C04/08/16,則共可發送1個頁面共16個字節〔連第一個8位資料在內。當然,每發一個字節都要等待芯片的應答信號ACK。之所以可以連續向芯片發送1個頁面資料,是因為字地址的低3~4位在EEPROM芯片內部可實現加1,字地址的高位不變,用于保持頁面的行地址。頁面寫和字節寫兩者一樣可,都分為外部寫和內部寫過程。應答查詢:應答查詢是單片機對EEPROM各種狀態的一種檢測。單片機查詢到EEPROM有應答"0"信號ACK輸出,則說明其內部定時寫的周期結束,可以寫入新的內容。單片機是通過發送起始狀態及器件地址進行應答查詢的。由于器件地址可以選擇芯片,則檢測芯片送出到SDA的狀態就可以知道其是否有應答了。④讀操作:讀操作的啟動是和寫操作類同的。它一樣需要圖所示的器件地址字。和寫操縱不同的就是信號為時執行讀操作。讀操縱有3種方式,即現行地址讀,隨機讀和順序讀。下面分別說明它們的工作過程。現行地址讀:在上次讀或寫操縱完成之后。芯片內部字地址計數器會加1,產生現行地址。只要沒有再執行讀或寫操作,這個現行地址就會在EEPROM芯片保持接電的期間一直保存。一旦器件地址選中EEPROM芯片,并且有R/W=1,則在芯片的應答信號ACK之后把讀出的現行地址的資料送出。現行地址的資料輸出時,就由單片機一位一位接受,接收后單片機不用向EEPROM發應答信號ACK"0"電平,但應保證發出停止狀態的信號以結束現行地址讀操作。現行地址讀會產生地址循環覆蓋現象,但和寫操縱的循環覆蓋不同。在寫操縱中,地址的循環覆蓋是現行頁面的最后一個字節寫入之后,再行寫入則覆蓋同一頁面的第一個字節。而在現行地址讀操縱中,地址的循環覆蓋是在最后頁面的最后一個字節讀出之后,再行讀出才覆蓋第一個頁面的第一個字節。隨機讀:隨機讀和現行地址讀的最大區別在于隨機讀會執行一個偽寫入過程以把字地址裝入EEPROM芯片中,然后執行讀出,顯然,隨機讀有2個步驟。第一,執行偽寫入——把字地址送入EEPROM,以選擇需讀的字節。第二,執行讀出——根據字地址讀出對應內容。當EEPROM芯片接收了器件地址及字地址時,在芯片產生應答信號ACK之后,單片機必須再產生一個起始狀態,執行現行地址讀,這時單片機再發出器件地址并且令R/W=1,則EEPROM應答器件地址并行輸出被讀數據。在資料讀出時由單片機執行一位一位接收,接收完畢后,單片機不用發"0"應答信號ACK,但必須產生停止狀態以結束隨機讀過程。應該注意:在隨機讀的第二個步驟是執行現行地址讀的,由于第一個步驟時芯片接收了字地址,故現行地址就是所送入的字地址。順序讀:順序讀可以用現行地址讀或隨機讀進行啟動。它和現行地址讀。隨機讀的最大區別在于:順序讀在讀出一批資料之后才由單片機產生停止狀態結束讀操作;而現行地址讀和隨機讀在讀出一個資料之后就由單片機產生停止狀態結束讀操作。執行順序讀時,首先執行現行讀或隨機讀的有關過程,在讀出第一個資料之后,單片機輸出"0"應答信號ACK。在芯片接收應答信號ACK后,就會對字地址進行計數加1,隨后串行輸出對應的字節。當字地址計數達到內存地址的極限時,則字地址會產生覆蓋,順序讀將繼續進行。只有在單片機不再產生"0"應答信號ACK,而在接收資料之后馬上產生停止狀態,才會結束順序讀操作。B.模塊電路設計 本模塊電路簡單,只須將三地址端和寫保護接地就可以了。C.模塊電路圖3.5溫度傳感器模塊A.核心器件選擇Dallas半導體公司的數字化溫度傳感器DS1820是世界上第一片支持"一線總線"接口的溫度傳感器。現場溫度直接以"一線總線"的數字方式傳輸,大大提高了系統的抗干擾性。適合于惡劣環境的現場溫度測量,如:環境控制、設備或過程控制、測溫類消費電子產品等。與前一代產品不同,新的產品支持3V~5.5V的電壓范圍,使系統設計更靈活、方便。DS18B20測量溫度范圍為-55°C~+125°C,在-10~+85°C范圍內,精度為±0.5°C。DS18B20可以程序設定9~12位的分辨率,及用戶設定的報警溫度存儲在EEPROM中,掉電后依然保存。DS18B20內部結構DS18B20內部結構主要由四部分組成:64位光刻ROM、溫度傳感器、非揮發的溫度報警觸發器TH和TL、配置寄存器。DS18B20的管腳排列如下:DQ為數字信號輸入/輸出端;GND為電源地;VDD為外接供電電源輸入端〔在寄生電源接線方式時接地。光刻ROM中的64位序列號是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼。64位光刻ROM的排列是:開始8位〔28H是產品類型標號,接著的48位是該DS18B20自身的序列號,最后8位是前面56位的循環冗余校驗碼〔CRC=X8+X5+X4+1。光刻ROM的作用是使每一個DS18B20都各不相同,這樣就可以實現一根總線上掛接多個DS18B20的目的。DS18B20中的溫度傳感器可完成對溫度的測量,以12位轉化為例:用16位符號擴展的二進制補碼讀數形式提供,以0.0625℃/LSB形式表達,其中S為符號位。LSByte:Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0232221202-12-22-32-4MSByte:Bit15Bit14Bit13Bit12Bit11Bit10Bit9Bit8SSSSS262524這是12位轉化后得到的12位數據,存儲在18B20的兩個8比特的RAM中,二進制中的前面5位是符號位,如果測得的溫度大于0,這5位為0,只要將測到的數值乘以0.0625即可得到實際溫度;如果溫度小于0,這5位為1,測到的數值需要取反加1再乘以0.0625即可得到實際溫度。例如+125℃的數字輸出為07D0H,+25.0625℃的數字輸出為0191H,-25.0625℃的數字輸出為FF6FH,-55℃的數字輸出為FC90H。溫度數據輸出〔二進制數據輸出〔十六進制+125℃000001111101000007D0h+85℃00000101010100000550h+25.0625℃00000001100100010191h+10.125℃000000001010001000A2h+0.5℃00000000000010000008h0℃00000000000000000000h-0.5℃1111111111111000FFF8h-10.125℃1111111101011110FF5Eh-25.0625℃1111111001101111FE6Fh-55℃1111110010010000FC90hDS18B20溫度傳感器的存儲器DS18B20溫度傳感器的內部存儲器包括一個高速暫存RAM和一個非易失性的可電擦除的E2RAM,后者存放高溫度和低溫度觸發器TH、TL和結構寄存器。暫存存儲器包含了8個連續字節,前兩個字節是測得的溫度信息,第一個字節的內容是溫度的低八位,第二個字節是溫度的高八位。第三個和第四個字節是TH、TL的易失性拷貝,第五個字節是結構寄存器的易失性拷貝,這三個字節的內容在每一次上電復位時被刷新。第六、七、八個字節用于內部計算。第九個字節是冗余檢驗字節。該字節各位的意義如下:TMR1R011111低五位一直都是1,TM是測試模式位,用于設置DS18B20在工作模式還是在測試模式。在DS18B20出廠時該位被設置為0,用戶不要去改動。R1和R0用來設置分辨率,如下表所示:〔DS18B20出廠時被設置為12位分辨率設置表:R1R0分辨率溫度最大轉換時間009位93.75ms0110位187.5ms1011位375ms1112位750ms根據DS18B20的通訊協議,主機控制DS18B20完成溫度轉換必須經過三個步驟:每一次讀寫之前都要對DS18B20進行復位,復位成功后發送一條ROM指令,最后發送RAM指令,這樣才能對DS18B20進行預定的操作。復位要求主CPU將數據線下拉500微秒,然后釋放,DS18B20收到信號后等待16~60微秒左右,后發出60~240微秒的存在低脈沖,主CPU收到此信號表示復位成功。B.模塊電路設計 本模塊接口電路簡單,在這里不對電路進行講解了。C.模塊電路圖3.6紅外模塊A.核心元件選擇紅外通信是利用950nm近紅外波段的紅外線作為傳遞信息的媒體,即通信信道。發送端采用脈時調制〔PPM方式,將二進制數字信號調制成某一頻率的脈沖序列,并驅動紅外發射管以光脈沖的形式發送出去;接收端將接收到的光脈轉換成電信號,再經過放大、濾波等處理后送給解調電路進行解調,還原為二進制數字信號后輸出。紅外發送器電路包括脈沖振蕩器、驅動管Q1和Q2、紅外發射管Q3等部分。其中脈沖振蕩器用以產生38kHz的脈沖序列作為載波信號;紅外發射管Q3用來向外發射950nm的紅外光束。紅外發送器的工作原理為:串行數據由單片機的串行輸出端DATA送出并驅動Q1管,數位"0"使Q1管導通,通過Q2管調制成38kHz的載波信號,并利用紅外發射管Q3以光脈沖的形式向外發送。數位"1"使Q1管截止,紅外發射管Q3不發射紅外光。若傳送的波特率設為1200bps,則每個數位"0"對應32個載波脈沖調制信號的時序,如圖1所示。圖1調制信號時序圖紅外接收電路選用專用紅外接收模塊。該接收模塊是一個三端元件,使用單電源+5V電源,具有功耗低、抗干擾能力強、輸入靈敏度高、對其它波長〔950nm以外的紅外光不敏感的特點,其內部結構框圖如圖2所示。圖2紅外接收模塊內部結構框圖接收模塊的工作原理為:首先,通過紅外光敏元件將接收到的載波頻率為38kHz的脈沖調制紅外光信號轉化為電信號,再由前置放大器和自動增益控制電路進行放大處理。然后,通過帶通濾波器和進行濾波,濾波后的信號由解調電路進行解調。最后,由輸出級電路進行反向放大輸出。為保證紅外接收模塊接收的準確性,要求發送端載波信號的頻率應盡可能接近38kHz,因此在設計脈沖振蕩器時,要選用精密元件并保證電源電壓穩定。再有,發送的數位"0"至少要對應14個載波脈沖,這就要求傳送的波特率不能超過2400bps。B.模塊電路設計 紅外發射二極管的額定電流為5-50mA在這里我選取限流電阻R10470Ω,而從PCF8563產生的信號比較微弱,須加上拉電阻,在這里選取R810K的上拉電阻。為減少噪聲影響我們在基極和載波信號間加一抗干擾電阻R9,阻值為1K。在接收管處為增加輸出信號強度和減少噪聲影響,輸出端也加一拉電阻R11,阻值為10K,由于本設計是利用單片機中斷以做出及時響應,在這里輸出需加一反向器然后再送入單片才能達到控制功能,在這里我采用74LS04。C.模塊電路圖3.7電機模塊A.核心器件選擇 電機分直流電機和步進電機,而步進電機力矩大且便于精準控制,步進電動機有三線式、五線式、六線式三種,但其控制方式均相同,必須以脈沖電流來驅動。若每旋轉一圈以20個勵磁信號來計算,則每個勵磁信號前進18度,其旋轉角度與脈沖數成正比,正、反轉可由脈沖順序來控制。步進電動機的勵磁方式可分為全步勵磁及半步勵磁,其中全步勵磁又有1相勵磁及2相勵磁之分,而半步勵磁又稱1-2相勵磁。圖為步進電動機的控制等效電路,適應控制A、B、/A、/B的勵磁信號,即可控制步進電動機的轉動。每輸出一個脈沖信號,步進電動機只走一步。因此,依序不斷送出脈沖信號,即可步進電動機連續轉動。1相勵磁法:在每一瞬間只有一個線圈導通。消耗電力小,精確度良好,但轉矩小,振動較大,每送一勵磁信號可走18度。若欲以1相勵磁法控制步進電動機正轉,其勵磁順序如圖所示。若勵磁信號反向傳送,則步進電動機反轉。勵磁順序:A→B→C→D→ASTEPABCD110002010030010400012相勵磁法:在每一瞬間會有二個線圈同時導通。因其轉矩大,振動小,故為目前使用最多的勵磁方式,每送一勵磁信號可走18度。若以2相勵磁法控制步進電動機正轉,其勵磁順序如圖所示。若勵磁信號反向傳送,則步進電動機反轉。勵磁順序:AB→BC→CD→DA→ABSTEPABCD111002011030011410011-2相勵磁法:為1相與2相輪流交替導通。因分辨率提高,且運轉平滑,每送一勵磁信號可走9度,故亦廣泛被采用。若以1相勵磁法控制步進電動機正轉,其勵磁順序如圖所示。若勵磁信號反向傳送,則步進電動機反轉。勵磁順序:A→AB→B→BC→C→CD→D→DA→ASTEPABCD1100021100300104011050010600117000181001電動機的負載轉矩與速度成反比,速度愈快負載轉矩愈小,當速度快至其極限時,步進電動機即不再運轉。所以在每走一步后,程序必須延時一段時間。B.模塊電路設計 剛憑單片機的I/O口是無法驅動步進電機的,因此需要加驅動芯片,在這里我們選擇ULN2003,ULN2003是耐高壓、大電流NPN達林頓管,恰好能滿足驅動需求,在輸出端串聯一小電阻以減少噪聲干擾,在這里電阻取20Ω。C.模塊電路圖3.8顯示模塊A.核心器件選擇顯示可用LED數碼管或LCD顯示,LCD顯示器具有顯示豐富、功耗低、低閃爍和低幅射等特點。為使人機界面更加和諧豐富在這里我們采用128*64LCD顯示器。本設計采用內置控制器、不帶字庫的圖形點陣液晶顯示模塊,點陣數為128×64。它主要由行驅動器/列驅動器及128×64全點陣液晶顯示器組成,可完成圖形顯示也可以顯示8×4個<16×16點陣>漢字。主要技術參數和性能:1電源VDD+5V模塊內自帶-10V負壓用于LCD的驅動電壓2顯示內容128<列>64<行>點3全屏幕點陣4七種指令5與CPU接口采用8位數據總線并行輸入輸出和8條控制線6占空比1/647工作溫度-10+55存儲溫度-20+60模塊主要硬件構成說明<結構框圖>IC1、IC2為列驅動器,IC1控制模塊的右半屏,IC2控制模塊的左半屏,IC3為行驅動器。IC1、IC2、IC3含有以下主要功能器件,了解如下器件有利于對LCD模塊的編程。1指令寄存器<IR>IR是用于寄存指令碼,與數據寄存器數據相對應,當D/I=0時在E信號下降沿的作用下指令碼寫入IR2數據寄存器<DR>DR用于寄存數據,與指令寄存器寄存指令相對應,當D/I=1時在下降沿作用下,圖形顯示數據寫入DR,或在E信號高電平作用下,由DR讀到DB7~DB0數據總線,DR和DDRAM之間的數據傳輸是模塊內部自動執行的。3忙標志BFBF標志提供內部工作情況,BF=1表示模塊在內部操作,此時模塊不接受外部指令和數據;BF=0時模塊為準備狀態,隨時可接受外部指令和數據。利用STATUSREAD指令可以將BF讀到數據總線從而檢驗模塊之工作狀態。4顯示控制觸發器DFF用于模塊屏幕顯示開和關的控制,DFF=1為開顯示,DDRAM的內容就顯示在屏幕上;DFF=0為關顯示。DDF的狀態是指令DISPLAYON/OFF和RST信號控制的。5XY地址計數器XY地址計數器是一個9位計數器高,3位是X地址計數器,低6位為Y地址計數器。XY地址計數器實際上是作為DDRAM的地址指針,X地址計數器為DDRAM的頁指針,Y地址計數器為DDRAM的Y地址指針。X地址計數器沒有記數功能,只能用指令設置。Y地址計數器具有循環記數功能,各顯示數據寫入后Y地址自動加1,Y地址指針從0到63。6顯示數據RAMDDRAMDDRAM是存儲圖形顯示數據的,數據為1表示顯示選擇,數據為0表示顯示非選擇。7Z地址計數器Z地址計數器是一個6位計數器,此計數器具備循環記數功能,用于顯示行掃描同步,當一行掃描完成此地址計數器自動加1,指向下一行掃描數據,RST復位后Z地址計數器為0。Z地址計數器可以用指令DISPLAYSTARTLINE預置,因此顯示屏幕的起始行就由此指令控制,即DDRAM的數據從哪一行開始顯示在屏幕的第一行,此模塊的DDRAM共64行,屏幕可以循環滾動顯示64行。3.模塊的外部接口外部接口信號如下表所示管腳號管腳名稱LEVER管腳功能描述1VSS0電源地2VDD5.0V電源電壓3V05.0V-13V液晶顯示器驅動電壓4D/IH/LD/I=H表示DB7~DB0為顯示數據D/I=L表示DB7~DB0為顯示指令數據5R/WH/LR/W=HE=H數據被讀到DB7~DB0R/W=LE=HL數據被寫到IR或DR6EH/LR/W=LE信號下降沿鎖存DB7~DB0R/W=HE=HDDRAM數據讀到DB7~DB07DB0H/L數據線8DB1H/L數據線9DB2H/L數據線10DB3H/L數據線11DB4H/L數據線12DB5H/L數據線13DB6H/L數據線14DB7H/L數據線15CS1H/LH:選擇芯片<右半屏>信號16CS2H/LH:選擇芯片<左半屏>信號17RETH/L復位信號,低電平復位18VEE-10VLCD驅動負電壓19ELAC背光板電源20ELAC背光板電源4.指令說明指令表:指令指令碼功能R/WD/ID7D6D5D4D3D2D1D0顯示ON/OFF0000111111/0控制顯示器的開關不影響DDRAM中數據和內部狀態顯示起始行0011顯示起始行063指定顯示屏從DDRAM中哪一行開始顯示數據設置X地址0010111X07設置DDRAM中的頁地址〔X地址設置Y地址0001Y地址063設置地址〔Y地址讀狀態10BUSY0ON/OFFRST0000讀取狀態RES1:復位0:正常ON/OFF1:顯示開0:顯示關BUSY0:READY1:INOPERATION寫顯示數據01顯示數據將數據線上的數據DB7DB0寫入DDRAM讀顯示數據11顯示數據將DDRAM上的數據讀入線數據DB7DB01顯示開關控制<DISPLAYON/OFF>代碼R/WD/IDB7DB6DB5DB4DB3DB2DB1DB0形式000011111DD=1:開顯示<DISPLAYON>意即顯示器可以進行各種顯示操作D=0:關顯示<DISPLAYOFF>意即不能對顯示器可以進行各種顯示操作2設置顯示起始行代碼R/WD/IDB7DB6DB5DB4DB3DB2DB1DB0形式0011A5A4A3A2A1A0顯示起始行是由Z地址計數器控制的,A5~A0的6位地址自動送入Z地址計數器起始行的地址可以是0~63的任意一行。例如選擇A5~A0是62則起始行與DDRAM行的對應關系如下DDRAM行62630123……2829屏幕顯示行123456……31323設置頁地址代碼R/WD/IDB7DB6DB5DB4DB3DB2DB1DB0形式0010111A2A1A0所謂頁地址就是DDRAM的行地址,8行為一頁,模塊共64行即8頁,A2~A0表示0~7頁讀寫數據對地址沒有影響,頁地址由本指令或RST信號改變復位后頁地址為0,頁地址與DDRAM的對應關系見DDRAM地址表:4設置Y地址<SETYADDRESS>代碼R/WD/IDB7DB6DB5DB4DB3DB2DB1DB0形式0001A5A4A3A2A1A0此指令的作用是將A5~A0送入Y地址計數器,作為DDRAM的Y地址指針,在對DDRAM進行讀寫操作后,Y地址指針自動加1,指向下一個DDRAM單元。DDRAM地址表:5讀狀態<STATUSREAD>代碼R/WD/IDB7DB6DB5DB4DB3DB2DB1DB0形式00BUSY0ON/OFFRETA3A2A1A0當R/W=1D/I=0時,在E信號為H的作用下,狀態分別輸出到數據總線DB7~DB0的相應位。ON/OFF表示DFF觸發器的狀態。RSTRST=1表示內部正在初始化,此時組件不接受任何指令和數據。6寫顯示數據<WRITEDISPLAYDATE>代碼R/WD/IDB7DB6DB5DB4DB3DB2DB1DB0形式01D7D6D5D4D3D2D1D0D7~D0為顯示數據,此指令把D7~D0寫入相應的DDRAM單元,Y地指針自動加1。7讀顯示數據<READDISPLAYDATE>代碼R/WD/IDB7DB6DB5DB4DB3DB2DB1DB0形式11D7D6D5D4D3D2D1D0此指令把DDRAM的內容D7~D0讀到數據總線DB7~DB0,Y地址指針自動加1。B.核心電路設計 SG12864內置數字芯片控制器,可以直接和單片機I/O口進行對接,在這里不作介紹。C.模塊電路圖3.9外圍驅動模塊A.模塊電路設計 本模塊電路是用來控制打鈴和教室燈光。而課鈴和燈光都是由220V交流電驅動,這對單片機有很強的干擾。因此在設計時必需考濾到電氣隔離的問題,在這里我們采用光電耦合器進行電氣隔離,再用繼電器來達到弱電控制強電的目的。 而剛憑單片機的I/O口是無法驅動光電耦合器的,因些要對單片機引腳信號進行放大,在這里我們采用一個三極管8550進行放大,而為了提高抗噪能力和保護三極管需在三極管基極加一電阻,我們這里取10K。在發射極的需加一限流電阻,取值1K,為更好的保護元器件在電源端并上一濾波電容,取值0.1uF。 繼電器線圈具有儲能作用,當斷電時由于電磁感應會產生一個很高的反電熱,為此兩端需加一回路來消除反電勢。在這里是直流電路所以只需在線圈兩端加一續流二極管。在這里還是用三極管進行驅動,取限流電阻R19為100。前偏置電阻R17為1K,后偏置電阻為10K。B.模塊電路圖四、單片機系統設計4.1系統實現工作流程 本系統采用PCF8563計時并產生日期、星期、時間數據,當單片機上電復位時,首先初始化單片機內部資源,開中斷、初始化定時器和全局變量、設置外部中斷觸發方式,然后對PCF8563進行初始化讓其在精確計時模式下運行并在每一分鐘產生一個中斷信號,接下來就由單片機對PCF8563產生的日期、時間數據進行讀取,將讀取到的數據和存儲器E2PROM中的數據進行比較,判斷當前日期是否是在假期內,如果在假期內那就關掉外部中斷0,也就屏蔽掉教室燈光、打鈴和廣播。然后就進入主循環,在循環內首先對窗口計數字節進行判斷,然后根據相應的窗口計數值進行相應窗口的顯示〔如時間界面、主菜單界面、時間調整界面、打鈴設置界面,接下來對校門控制標志位進行判定,如果控制標志位為1則啟動電機,當電機轉動的弧長達到預設值,則關閉電機,同時置電機狀態標志位〔表示校門已經是打開狀態,并啟動定時器0,當定時器計時達到15S時則又啟動電機,但此次電機為反轉〔也就是校門開始關閉。校門的控制標志位的修改則是由外部中斷1來控制的,當有人或物體靠近校門時,人或物體就會擋住紅外發射管發射的載波,紅外接收管就會產生一低電平,從而引發單片機的外部中斷1,從而置位控制標志位,從而啟動電機就達到校門自動開關的效果,而當有人或物體經過到校門的打開只需要微秒級的時間,已遠遠能滿足控制需求。而本設計中的溫度傳感器模塊則是,使用數字接口芯片DS18B20單片機可以直接向其讀取溫度數據,再經轉換就能實現溫度的實時顯示,且DS18B20的精度可達0.0625℃。4.2系統流程圖A.主程序流程圖B.外部中斷0流程圖C.外部中斷1流程圖4.3系統源程序#include<reg52.h>#include<intrins.h>#include"code_number.h"http://#include"I2c.h"http://#include"DS18B20.H"http://#include"Main.h"#defineucharunsignedchar#defineuintunsignedint#defineDISP_ON0x3f#defineDISP_OFF0x3e#defineCOL_ADD0x40#definePAGE_ADD0xb8 //8:星期;20:月份;40以上:小時、月份、日期#defineSTART_LINE0xc0#definePCF8563_Start0x00#definePCF8563_Stop0x20#definePCF8563Time_Ineffect0x83#definePCF8563Time_UnIneffect0x03sbitHD7279_Key=P1^4;sbitHD7279_Clk=P1^5;sbitHD7279_Dat=P1^6;sbitHD7279_CS=P1^7;sbitLED_CONTROL=P3^5;sbitJOW_CONTROL=P2^5;sbitTELEVISE_CONTROL=P2^5;sbitSG12864_CS1=P2^4;sbitSG12864_CS2=P2^3;sbitSG12864_E=P2^2;sbitSG12864_RW=P2^1;sbitSG12864_DI=P2^0;sbitSDA=P3^7;/*模擬I2C數據傳送位*/sbitSCL=P3^6;/*模擬I2C時鐘控制位*/sbitMotorStepper_A=P1^0;sbitMotorStepper_B=P1^1;sbitMotorStepper_C=P1^2;sbitMotorStepper_D=P1^3;ucharcodeMotorStepper_Data[]={0x0e,0x0c,0x0d,0x09,0x0b,0x03,0x07,0x06};bitack;/*應答標志位*/uchardataDisp_Count1,Disp_Count2,Temperature[2];ucharWindow_Count,Page_Count,TimeRevision_Count,JowRevision_Count,Help_Byte[7];ucharTime_Count,Time_Sec,MotorStepper_Count;bitMotorStepper_Start,MotorStepper_State,MotorStepper_Sign;sbitDQ=P3^4;bitDS18B20_Bit; //用來檢查是否存在DS18B20存在置1否則清零/*******************************************************************延時函數延時為11+7*zus函數原型:voidDS18B20_delay<ucharz>功能: 用來響應DS18B20時序********************************************************************/voidDS18B20_delay<ucharz> { while<z-->; }/*******************************************************************DS18B20初始化函數函數原型:DS18B20_Init<>功能: 對DS18B20進行復位,如果復位成功則置DS18B20_Bit,否則則清零DS18B20_Bit.********************************************************************/voidDS18B20_Init<>{ uchari; DQ=1; _nop_<>; DQ=0; DS18B20_delay<75>; DQ=1; _nop_<>;_nop_<>;_nop_<>; i=8; while<i--> { if<!DQ> break; } if<i!=65535> { DS18B20_Bit=1; DS18B20_delay<31>; DQ=1; } else { DQ=1; DS18B20_Bit=0; }}/*******************************************************************DS18B20字節寫函數函數原型:Write_DS18B20<uchardat>功能: 向DS18B20寫入字節數據********************************************************************/voidDS18B20_Write<uchardat>{ uchari; bitk; for<i=0;i<8;i++> //一個字節八位,從低位開始發送 { k=0x01&dat; //判斷最低位是否為1,用來發送 DQ=0; DS18B20_delay<1>; DQ=k; DS18B20_delay<6>; DQ=1; _nop_<>; dat>>=1; //發送數據右移一位 } DQ=1;}/*******************************************************************DS18B20雙字節讀取函數函數原型:Read_Temperature功能:向DS18B20讀取雙字節數據********************************************************************/voidDS18B20_Read<>{ uchari,j; for<i=0;i<2;i++> { for<j=0;j<8;j++> { Temperature[i]>>=1; DQ=1; _nop_<>;_nop_<>; DQ=0; _nop_<>;_nop_<>;_nop_<>; DQ=1; DS18B20_delay<1>; if<DQ> { Temperature[i]=Temperature[i]|0x80; } DS18B20_delay<6>; } }}/*******************************************************************DS18B20溫度讀取函數函數原型:Get_Temperature<>功能:啟動溫度轉換并讀取溫度,溫度存儲在temperature中********************************************************************/voidGet_Temperature<>{ DQ=1; DS18B20_Init<>; if<DS18B20_Bit> { DS18B20_Write<0xcc>; DS18B20_Write<0x44>; DS18B20_delay<200>; DS18B20_Init<>; DS18B20_Write<0xcc>; DS18B20_Write<0xbe>; DS18B20_Read<>; }}/*******************************************************************總線延時函數函數原型:voidDelay_5us<>功能:響應I2c時序********************************************************************/voidDelay_5us<>{ _nop_<>;_nop_<>; _nop_<>;_nop_<>;}/*******************************************************************起動總線函數函數原型:voidStart_I2c<>;功能:啟動I2C總線,即發送I2C起始條件.********************************************************************/voidStart_I2c<>{SDA=1;/*發送起始條件的數據信號*/_nop_<>;SCL=1;Delay_5us<>;/*起始條件建立時間大于4.7us,延時*/SDA=0;/*發送起始信號*/Delay_5us<>;/*起始條件鎖定時間大于4μs*/SCL=0;/*鉗住I2C總線,準備發送或接收數據*/Delay_5us<>;}/*******************************************************************結束總線函數函數原型:voidStop_I2c<>;功能:結束I2C總線,即發送I2C結束條件.********************************************************************/voidStop_I2c<>{SDA=0;/*發送結束條件的數據信號*/_nop_<>;/*發送結束條件的時鐘信號*/SCL=1;/*結束條件建立時間大于4us*/Delay_5us<>;SDA=1;/*發送I2C總線結束信號*/Delay_5us<>;}/*******************************************************************字節數據發送函數函數原型:voidSendByte<ucharc>;功能:將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對此狀態位進行操作.<不應答或非應答都使ack=0>發送數據正常,ack=1;ack=0表示被控器無應答或損壞。********************************************************************/voidSendByte<ucharc>{ucharBitCnt;for<BitCnt=0;BitCnt<8;BitCnt++>/*要傳送的數據長度為8位*/{if<<c<<BitCnt>&0x80>SDA=1;/*判斷發送位*/elseSDA=0;Delay_5us<>;SCL=1;/*置時鐘線為高,通知被控器開始接收數據位*/Delay_5us<>;/*保證時鐘高電平周期大于4μs*/SCL=0;}Delay_5us<>;SDA=1;/*8位發送完后釋放數據線,準備接收應答位*/Delay_5us<>;SCL=1;Delay_5us<>;if<SDA==1>ack=0;elseack=1;/*判斷是否接收到應答信號,由從機返回*/SCL=0;Delay_5us<>;}/*******************************************************************字節數據接收函數函數原型:ucharRcvByte<>;功能:用來接收從器件傳來的數據,并判斷總線錯誤<不發應答信號>,發完后請用應答函數應答從機。********************************************************************/ucharRcvByte<>{ucharretc;ucharBitCnt;retc=0;SDA=1;/*置數據線為輸入方式*/for<BitCnt=0;BitCnt<8;BitCnt++>{Delay_5us<>;SCL=0;/*置時鐘線為低,準備接收數據位*/Delay_5us<>;/*時鐘低電平周期大于4.7μs*/SCL=1;/*置時鐘線為高使數據線上數據有效*/Delay_5us<>;retc=retc<<1;if<SDA==1>retc=retc+1;/*讀數據位,接收的數據位放入retc中*/}SCL=0;Delay_5us<>;return<retc>;}/********************************************************************應答子函數<用于主機讀取數據后,應答從機>函數原型:voidAck_I2c<bita>;功能:主控器進行應答信號<可以是應答或非應答信號,由位參數a決定>********************************************************************/voidAck_I2c<bita>{if<a==0>SDA=0;/*在此發出應答或非應答信號*/elseSDA=1;Delay_5us<>;SCL=1;Delay_5us<>;/*時鐘低電平周期大于4μs*/SCL=0;/*清時鐘線,鉗住I2C總線以便繼續接收*/Delay_5us<>;}/*******************************************************************向有子地址器件發送多字節數據函數函數原型:bitISendStr<ucharsla,ucharsuba,ucahr*s,ucharno>;功能:從啟動總線到發送地址,子地址,數據,結束總線的全過程,從器件地址sla,子地址suba,發送內容是s指向的內容,發送no個字節。如果返回1表示操作成功,否則操作有誤。注意:使用前必須已結束總線。********************************************************************/bitISendStr<ucharsla,ucharsuba,uchar*s,ucharno>{uchari;Start_I2c<>;/*啟動總線*/SendByte<sla>;/*發送器件地址*/if<ack==0>return<0>;SendByte<suba>;/*發送器件子地址*/if<ack==0>return<0>;for<i=0;i<no;i++>{SendByte<*s>;/*發送數據*/if<ack==0>return<0>;//檢測從機發送過來的應答位,ack由sendbyte函數返回s++;}Stop_I2c<>;/*結束總線*/return<1>;}/*******************************************************************向有子地址器件讀取多字節數據函數函數原型:bitIRcvStr<ucharsla,ucharsuba,ucahr*s,ucharno>;功能:從啟動總線到發送地址,子地址,讀數據,結束總線的全過程,從器件地址sla,子地址suba,讀出的內容放入s指向的存儲區,讀no個字節。如果返回1表示操作成功,否則操作有誤。注意:使用前必須已結束總線。********************************************************************/bitIRcvStr<ucharsla,ucharsuba,uchar*s,ucharno>{uchari;Start_I2c<>;/*啟動總線*/SendByte<sla>;/*發送器件地址*/if<ack==0>return<0>;SendByte<suba>;/*發送器件子地址*/if<ack==0>return<0>;Start_I2c<>;/*重新啟動總線*/SendByte<sla+1>;if<ack==0>return<0>;for<i=0;i<no-1;i++>{*s=RcvByte<>;/*接收數據*/Ack_I2c<0>;/*讀完一個數據,就發送一個應答位*/s++;}*s=RcvByte<>;Ack_I2c<1>;/*全部讀完,發送非應位*/Stop_I2c<>;/*結束總線*/return<1>;}//*************************************延時函數*****************************************//voidSG12864_Delay<uintz>{ uintx,y; for<x=z;x>0;x--> for<y=10;y>0;y-->;}//**************************************com_write***************************************//voidSG12864_CMDWrite<ucharw_cmd> { SG12864_RW=0; SG12864_DI=0; P0=w_cmd; SG12864_Delay<0>; SG12864_E=1; SG12864_Delay<0>; SG12864_E=0; }//*************************************data_write***************************************//voidSG12864_DATWrite<ucharw_data> { SG12864_RW=0; SG12864_DI=1; P0=w_data; SG12864_Delay<0>; SG12864_E=1; SG12864_Delay<0>; SG12864_E=0; }//*************************************lcd16*16填充*************************************//voidSG12864_16Pad<ucharpad_data,ucharrow,ucharline>{ uchark; SG12864_CMDWrite<PAGE_ADD+<line<<1>>; SG12864_CMDWrite<COL_ADD+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論