基于單片機(jī)的作息時(shí)間控制系統(tǒng)完整版_第1頁
基于單片機(jī)的作息時(shí)間控制系統(tǒng)完整版_第2頁
基于單片機(jī)的作息時(shí)間控制系統(tǒng)完整版_第3頁
基于單片機(jī)的作息時(shí)間控制系統(tǒng)完整版_第4頁
基于單片機(jī)的作息時(shí)間控制系統(tǒng)完整版_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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

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

評論

0/150

提交評論