基于單片機的智能型家居窗簾控制電路的設計_第1頁
基于單片機的智能型家居窗簾控制電路的設計_第2頁
基于單片機的智能型家居窗簾控制電路的設計_第3頁
基于單片機的智能型家居窗簾控制電路的設計_第4頁
基于單片機的智能型家居窗簾控制電路的設計_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

緒言1.1課題背景隨著時尚元素與家居生活的逐步融合,人們對于家居裝飾也提出了更高的要求。談到家居裝飾,窗簾所發(fā)揮的作用絕對是功不可沒。現(xiàn)如今,通透的玻璃窗正在變成現(xiàn)代建筑設計中的流行元素。大陽臺、外飄窗、陽光住宅開始成為一種時尚和高品質生活的體現(xiàn)。而對家居裝飾起到點睛之筆的窗簾,也尤如一股勢不可擋的旋風,吹遍家居賣場,吹進了百姓的家。現(xiàn)在市場上的智能窗簾有如下特點:無線遙控;2.半自動手動控制;3.環(huán)境亮度控制;4.時間自動控制;5.電機工作鳴響提示和整點報時功能。這種簡約風格的新型窗飾不僅僅是我們看風景的眼睛,也成為家居中一道美麗風景。在秋冬季節(jié)里,透過智能窗飾傳來的濃濃暖意,讓你更接近自然,從舒適到陶醉,十分妥帖的個性化“定制”對陽光的需求——生活像是在旅行,愜意中帶著情調。雖然遙控自動窗簾系統(tǒng)在我國還剛剛興起,但其發(fā)展前景廣闊,推廣和應用自動窗簾系統(tǒng)具有重要的現(xiàn)實意義。1.2課題的研究方向自動窗簾機的控制方式大體上有三種:聲控、光控、時控,聲控和遙控屬于半自動類;而光控雖屬全自動式,但因光敏器件的靈敏度,冬夏等不同季節(jié)的光照度的不同,以及人們對起閉窗簾在時間上的要求不同,而難以實施和普及。因此,時控式的全自動窗簾機便成了專業(yè)以及業(yè)余電子設計人員的熱門課題。本電路設計利用價格相對便宜的單片機作為主要控制器件,通過步進電機的正反轉模擬窗簾開啟關閉,實現(xiàn)以下功能:[1]無線遙控功能;[2]半手動控制功能;[3]根據(jù)環(huán)境亮度自動控制功能;[4]定時控制功能??紤]到單片機IO口有限,比市場上的少了正點報時功能?;趩纹瑱C的智能型家居窗簾控制電路的設計2系統(tǒng)總體方案設計2.1系統(tǒng)方案確定根據(jù)任務書要求:[1]能根據(jù)時間定時開關窗簾;[2]能根據(jù)光的亮度自動開關窗簾;[3]能用紅外遙控器控制窗簾開啟關閉;為滿足上述要求,確定的方案原理圖圖2.1如下:紅外接收模塊紅外接收模塊遙控器按鍵模塊STC89C52RC單片機時鐘模塊光控模塊步進電機顯示模塊電源模塊 圖2.1系統(tǒng)方案原理框圖按鍵模塊除了定時外,還可在遙控器失靈后手動控制,防止意外情況。2.2模塊器件選擇為使基于單片機控制的紅外線遙控系統(tǒng)在實際使用過程中具有較高的性能/價格比,所以對該系統(tǒng)的原器件作了精心挑選。按在實際工作中的作用,可分為以下幾個部分:STC89C52RC單片機是整個電路的核心,它控制其它模塊來完成各種復雜的操作;紅外線一體化接受HS0038負責接受命令;芯片DS1302負責時鐘的運行及設置參數(shù);AT24C02用來存儲數(shù)據(jù);LCD1602用來顯示各種數(shù)據(jù),包括實時時間、定時時間、電機運行狀態(tài)等。下面重點說明下STC89C52RC單片機以及簡單介紹下部分其他器件(其他器件會在相應電路中詳細介紹)。2.2.1STC89C52RC單片機STC89C52RC有很寬的工作電源電壓,可為2.7~6V,當工作在3V時,電流相當于6V工作時的1/4。STC89C52RC工作于12Hz時,動態(tài)電流為5.5mA,空閑態(tài)為1mA,掉電狀態(tài)僅為20nA。引腳圖如圖2.2:圖2.2STC89C52RC引腳圖STC89C52RC的特點·STC89C52RC與MCS-51系列的單片機在指令系統(tǒng)和引腳上完全兼容;·片內有4k字節(jié)在線可重復編程快擦寫程序存儲器;·全靜態(tài)工作,工作范圍:0Hz~24MHz;·三級程序存儲器加密;·128×8位內部RAM;·32位雙向輸入輸出線;·兩個十六位定時器/計數(shù)器·五個中斷源,兩級中斷優(yōu)先級;·一個全雙工的異步串行口;·間歇和掉電兩種工作方式·超強抗干擾:

高抗靜電(ESD保護)

,輕松過

2KV/4KV快速脈沖干擾;·寬電壓,不怕電源抖動

·寬溫度范圍,-40℃~85℃

;

·禁止ALE輸出;;

·超低功耗:

[1]掉電模式:典型功耗<0.1

μ

A

;

[2]空閑模式:典型功耗2mA

[3]正常工作模式:典型功耗4mA-7mA

;

[4]掉電模式可由外部中斷喚醒,適用于電池供電系統(tǒng),如水表、氣表、便攜設備等.

STC89C52RC的引腳[1]電源:①VCC-芯片電源,接+5V;②VSS-接地端;[2]時鐘:XTAL1、XTAL2-晶體振蕩電路反相輸入端和輸出端。[3]控制線:控制線共有4根:ALE/PROG:地址鎖存允許/片內EPROM編程脈沖①ALE功能:用來鎖存P0口送出的低8位地址②PROG功能:片內有EPROM的芯片,在EPROM編程期間,此引腳輸入編程脈沖。PSEN:外ROM讀選通信號。RST/VPD:復位/備用電源。①RST(Reset)功能:復位信號輸入端。②VPD功能:在Vcc掉電情況下,接備用電源。EA/Vpp:內外ROM選擇/片內EPROM編程電源。①EA功能:內外ROM選擇端。②Vpp功能:片內有EPROM的芯片,在EPROM編程期間,施加編程電源Vpp。[4]I/O口線:P0、P1、P2、P3共四個八位口。P0口是三態(tài)雙向口,通稱數(shù)據(jù)總線口,因為只有該口能直接用于對外部存儲器的讀/寫操作。P0口也用以輸出外部存儲器的低8位地圖1址。由于是分時輸出,故應在外部加鎖存器將此地址數(shù)據(jù)鎖存,地址鎖存,信號用ALE。P1口是專門供用戶使用的I/O口,是準雙向口。P2口是從系統(tǒng)擴展時作高8位地址線用。不擴展外部存儲器時,P2口也可以作為用戶I/O口線使用,P2口也是準雙向口。P3口是雙功能口,該口的每一位均可獨立地定義為第一I/O功能或第二I/O功能。作為第一功能使用時操作同P1口。P3口的第二功能如表2.1所示。表2.1P3口第二功能端口引腳各個功能P3.0RXD(串行口輸入端)P3.1TXD(串行口輸出端)P3.2(外部中斷0請求輸入端,低電平有效)P3.3(外部中斷1請求輸入端,低電平有效)P3.4T0(定時器/計數(shù)器0計數(shù)脈沖輸入端)P3.5T1(定時器/計數(shù)器1計數(shù)脈沖輸入端)P3.6(外部數(shù)據(jù)存儲器寫選通信號輸入端,低電平有效)P3.7(外部數(shù)據(jù)存儲器讀選通信號輸入端,低電平有效)2.2.2LCD1602液晶顯示屏LCD1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊。它由若干個5X7或者5X11等點陣字符位組成,每個點陣字符位都可以顯示一個字符,每位之間有一個點距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因為如此所以它不能很好地顯示圖形(用自定義CGRAM,顯示效果也不好)。1602LCD是指顯示的內容為16X2,即可以顯示兩行,每行16個字符液晶模塊(顯示字符和數(shù)字)。2.2.3DS1302時鐘芯片DS1302是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級產品,與DS1202兼容,但增加了主電源/后備電源雙電源引腳,同時提供了對后備電源進行涓細電流充電的能力。3系統(tǒng)硬件電路設計3.1單片機時鐘電路片內電路與片外器件就構成一個時鐘產生電路,CPU的所有操作均在時鐘脈沖同步下進行。片內振蕩器的振蕩頻率非常接近晶振頻率,一般多在1.2MHz~24MHz之間選取。C2、C3是反饋電容,其值在20pF~100pF之間選取,典型值為30pF。本電路選用的電容為30pF,晶振頻率為12MHz。振蕩周期=1/12μS;機器周期=1μS;指令周期=1~4μS;XTAL1和XTAL2:片內振蕩電路輸入線,這兩個端子用來外接石英晶體和微調電容。在石英晶體的兩個管腳加交變電場時,它將會產生一定頻率的機械變形,而這種機械振動又會產生交變電場,上述物理現(xiàn)象稱為壓電效應。一般情況下,無論是機械振動的振幅,還是交變電場的振幅都非常小。但是,當交變電場的頻率為某一特定值時,振幅驟然增大,產生共振,稱之為壓電振蕩。這一特定頻率就是石英晶體的固有頻率,也稱諧振頻率。即用來連接STC89C52RC片內OSC的定時反饋回路。石英晶振起振后要能在XTAL2線上輸出一個3V左右的正弦波,以便使STC89C52RC片內的OSC電路按石英晶振相同頻率自激振蕩。通常,OSC的輸出時鐘頻率fosc為0.5MHz-16MHz,典型值為12MHz或者11.0592MHz。電容C2和C3可以幫助起振,典型值為30pF,調節(jié)它們可以達到微調fosc的目的。如圖3.1所示.圖3.1單片機時鐘電路3.2單片機復位電路單片機在開機時都需要復位,以便中央處理CPU以及其他功能部件都處于一個確定的初始狀態(tài),并從這個狀態(tài)開始工作。單片機的復位后是靠外部電路實現(xiàn)的,在時鐘電路工作后,只要在單片機的RST引腳上出現(xiàn)24個時鐘振蕩脈沖(2個機器周期)以上的高電平,單片機便可實現(xiàn)初始化狀態(tài)復位,如圖3.2所示。圖3.2單片機復位電路3.3電源電路通過220V轉12V變壓器輸入,再經橋式整流電路后,輸入直流12V電壓。C1、C2是12伏的電源濾波電容,大電容C1旁邊并聯(lián)一個小電容的目的是降低高頻內阻,因為大的電解電容一般采用卷繞工藝制造,所以等效電感較大,小電容可以提供一個小內阻的高頻通道,降低電源全頻帶內阻。之后經過3端集成穩(wěn)壓芯片LM7805穩(wěn)壓后輸出+5V電壓VCC,為步進電機電路、紅外接收電路、顯示電路、時鐘芯片提供電源,5V電源經過二極管D5、限流電阻R1=5K后,為DS1302提供VDD電壓,BATTERY是直流供電電源,電壓為3V左右,在本電路中為了節(jié)省成本,使用兩節(jié)5號可充電電池。市電正常的情況下,VDD電源為DS1302供電的同時,也為電池充電,從而延長電池的使用壽命,當市電停電的時候,電池為DS1302供電,DS1302在掉電狀態(tài)下維持時鐘的正常,如圖3.3所示。圖3.3電源電路3.4顯示電路顯示電路設計采用的是液晶LCD1602(仿真時用LM016L代替)來顯示實時時間、步進電機運行狀態(tài)等內容。由于P0口帶負載能力差,故需接上拉電阻(這里用1K的排阻),P0口作為數(shù)據(jù)口連接LCD1602的7~14口,來傳輸數(shù)據(jù)及指令。P2.5接LCD1602的4腳RS(數(shù)據(jù)/命令選擇端),P2.6接LCD1602的5腳R/W(讀寫選擇端),P2.7接LCD1602的6腳E(使能信號)。電位器RV1用來調節(jié)LCD1602的亮度,如圖3.4所示。圖3.4LCD1602顯示電路3.4.1LCD1602管腳介紹1602共16個管腳,但是編程用到的主要管腳不過三個,分別為:RS(數(shù)據(jù)命令選擇端4腳),R/W(讀寫選擇端5腳),E(使能信號6腳);以后編程便主要圍繞這三個管腳展開進行初始化,寫命令,寫數(shù)據(jù)。以下具體闡述這三個管腳:RS為寄存器選擇,高電平選擇數(shù)據(jù)寄存器,低電平選擇指令寄存器。R/W為讀寫選擇,高電平進行讀操作,低電平進行寫操作。E端為使能端,后面和時序聯(lián)系在一起。除此外,D0~D7(7~14腳)分別為8位雙向數(shù)據(jù)線,第1腳:VSS為地電源;第2腳:VDD接5V正電源;第3腳:液晶顯示偏壓。3.4.2LCD1602操作時序表3.1操作時序RSR/W操作說明00寫入指令碼到D0~D701讀從D0~D7輸出的狀態(tài)字10寫數(shù)據(jù)到D0~D711從D0~D7讀數(shù)據(jù)3.4.3LCD1602指令集0x38設置16*2顯示,5*7點陣,8位數(shù)據(jù)接口;0x01清屏;0x0f開顯示,顯示光標,光標閃爍;0x08只開顯示;0x0e開顯示,顯示光標,光標不閃爍;0x0c開顯示,不顯示光標;0x06地址+1,當寫入數(shù)據(jù)的時候光標右移;0x02地址計數(shù)器AC=0(此時地址為0x80),光標歸原點,但是DDRAM中內容不變;0x18光標和顯示一起向左移動;3.5DS1302時鐘電路本電路采用DS1302時鐘芯片(DS1302主要特點是采用串行數(shù)據(jù)傳輸),采用32768Hz晶振,兩個電源Vcc1及Vcc2接電源VDD,這樣如果沒有交流電的供電也可以由可充電電池供電,起了掉電保護,防止實時時間數(shù)據(jù)丟失。2腳X1(晶振引腳)及3腳X2(晶振引腳)接32786Hz的晶振,晶振旁接兩個6pf的起振電容,5腳RST(復位引腳)與單片機的P1.7相連,6腳I/O(數(shù)據(jù)輸入輸出引腳)與單片機的P1.6相連,7腳CLK(串行時鐘輸入引腳)與單片機的P1.5相連,如圖3.5所示。圖3.5DS1302時鐘電路3.5.1DS1302簡介DSl302是美國Dallas公司生產的一種串行實時時鐘/日歷芯片,以串行方式與單片機進行數(shù)據(jù)傳送,它能夠向單片機提供:秒、分、時、日、月、年、及星期等實時時間信息,并能夠對閏年天數(shù)自動調整,日歷有效至2100年。DSl302由雙電源中較大者供電,使系統(tǒng)在沒有主電源的情況下也能保持時鐘的連續(xù)運行。片內具有31個字節(jié)靜態(tài)RAM,可用來保存重要數(shù)據(jù)。DSl302具有引腳少、體積小、價格低等優(yōu)點,得到了廣泛應用。本文對其進行詳細分析和闡述并在分析其時序的基礎上給出了DSl302與單片機連接的接口電路和通訊子程序。3.5.2DS1302芯片引腳DS1302的引腳功能描述如表3.2所示:表3.2DS1302引腳描述引腳號名稱說明引腳號名稱說明1Vcc2備用電源引腳5CE復位引腳2X1晶振引腳6I/O串行輸入輸出引腳3X2晶振引腳7SCLK串行時鐘輸入引腳4GND電源地引腳8Vcc1主電源引腳3.5.3DS1302內部寄存器DS1302串行實時時鐘芯片主要由移位寄存器、控制邏輯、振蕩器、實時時鐘及31個字節(jié)RAM組成,其內部結構如表3.3所示。數(shù)據(jù)傳送前,必須把置為高電平且把提供地址和命令信息的8位字節(jié)裝入到移位寄存器。在進行單字節(jié)傳送或多字節(jié)傳送時,開始的8位命令字節(jié)用于指定40個字節(jié)(31個字節(jié)RAM和9個字節(jié)時鐘寄存器)中哪個將被訪問。表3.3DS1302內部寄存器寄存器名命令字取值范圍各位內容寫讀76543210秒寄存器80H81H00--59CH10SECSEC分鐘寄存器82H83H00--59010MINMIN小時寄存器84H85H01--12或00--2312/240A/MHRHR日期寄存器86H87H01--28,29,30,310010DATEDATE月份寄存器88H89H01--1200010MMONTH周日寄存器8AH8BH01--1200000DAY年份寄存器8CH8DH00--9910YEARYEAR從上面可以看出,DS1302的寄存器存的是BCD碼,用的時候要轉換回十進制碼。3.5.4DS1302數(shù)據(jù)傳輸方式對DS1302進行任何數(shù)據(jù)傳送時,第一個數(shù)據(jù)字節(jié)必須是命令字節(jié),格式如表3.4所示,其最高有效位MSB(位7)必須為邏輯1。如果它是零,禁止寫DS1302。位6為邏輯0時指定傳送時鐘/日歷數(shù)據(jù);邏輯1指定傳送RAM數(shù)據(jù)。位1至5指定進行輸入或輸出的特定寄存器的地址。最低有效位LSB(位0)為邏輯0時指定時進行寫操作(輸入);邏輯1指定進行讀操作(輸出)。命令字節(jié)總是從最低有效LSB(位0)開始輸入[07]。表3.4命令字1RAM__CKA4A3A2A1A0RD__WR3.6AT24C02數(shù)據(jù)存儲電路本電路采用AT24C02芯片,AT24C02支持I2C協(xié)議(一種總線數(shù)據(jù)傳送協(xié)議),總線協(xié)議規(guī)定任何將數(shù)據(jù)傳送到總線的器件作為發(fā)送器。任何從總線接收數(shù)據(jù)的器件為接收器。數(shù)據(jù)傳送是由產生串行時鐘和所有起始停止信號的主器件控制的。A0、A1、A2接地表示該器件的地址為00H,SCK接單片機的P1.0腳,SDA接單片機的P1.1腳,如圖3.6所示。圖3.6AT24C02數(shù)據(jù)存儲電路3.6.1AT24C02簡介CAT24WC02是一個2K位串行CMOSE2PROM,內部含有256個8位字節(jié),CATALYST公司的先進CMOS技術實質上減少了器件的功耗。CAT24WC01有一個8字節(jié)頁寫緩沖器,CAT24WC02/04/08/16有一個16字節(jié)頁寫緩沖器,該器件通過I2C總線接口進行操作有一個專門的寫保護功能。3.6.2AT24C02芯片引腳AT24C02引腳描述如表3.5所示:表3.5AT24C02引腳描述引腳名稱功能描述A0,A1,A2器件地址選擇SDA串行數(shù)據(jù)/地址SCL串行時鐘WP寫保護Vcc+1.8V~6.0V工作電壓Vss電源地SCL串行時鐘:AT24C02串行時鐘輸入管腳用于產生器件所有數(shù)據(jù)發(fā)送或接收的時鐘,這是一個輸入管腳。SDA串行數(shù)據(jù)/地址:AT24C02雙向串行數(shù)據(jù)/地址管腳用于器件所有數(shù)據(jù)的發(fā)送或接收,SDA是一個開漏輸出管腳,可與其它開漏輸出或集電極開路輸出進行線或(wire-OR)。A0、A1、A2器件地址輸入端:這些輸入腳用于多個器件級聯(lián)時設置器件地址,當這些腳懸空時默認值為0。當使用AT24C02時最大可級聯(lián)8個器件。如果只有一個AT24C02被總線尋址,這三個地址輸入腳(A0、A1、A2)可懸空或連接到Vss,如果只有一個AT24C02被總線尋址這三個地址輸入腳(A0、A1、A2)必須連接到Vss。WP寫保護:如果WP管腳連接到Vcc,所有的內容都被寫保護只能讀。當WP管腳連接到Vss或懸空允許器件進行正常的讀/寫操作。3.6.3I2C總線介紹I2C(Inter-IntegratedCircuit)總線是由PHILIPS公司推出的一種串行總線,是具備多主機系統(tǒng)所需的包括總線裁決和高低速器件同步功能的高性能串行總線。I2C總線只有兩根雙向信號線。一根是數(shù)據(jù)線SDA,另一根是時鐘線SCL。SDA單片機A單片機單片機A單片機BA/D或D/A日歷時鐘其他I2C外圍設備SRAM或E2PROMSCLSDASCLSDASCLSDASCLSDASCLSDASCLSDA圖3.7I2C總線圖每個接到I2C總線上的器件都有唯一的地址。主機與其它器件間的數(shù)據(jù)傳送可以是由主機發(fā)送數(shù)據(jù)到其它器件,這時主機即為發(fā)送器。由總線上接收數(shù)據(jù)的器件則為接收器。在多主機系統(tǒng)中,可能同時有幾個主機企圖啟動總線傳送數(shù)據(jù)。為了避免混亂,I2C總線要通過總線仲裁,以決定由哪一臺主機控制總線。I2C總線進行數(shù)據(jù)傳送時,時鐘信號為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有在時鐘線上的信號為低電平期間,數(shù)據(jù)線上的高電平或低電平狀態(tài)才允許變化。SCLSDA要求數(shù)允許數(shù)據(jù)要求數(shù)據(jù)穩(wěn)定變化據(jù)穩(wěn)定圖3.8I2C數(shù)據(jù)傳送時序圖SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始信號;SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號SCLSDA起始信號S終止信號P圖3.9I2C總線起始停止時序圖起始和終止信號都是由主機發(fā)出的,在起始信號產生后,總線就處于被占用的狀態(tài);在終止信號產生后,總線就處于空閑狀態(tài)。連接到I2C總線上的器件,若具有I2C總線的硬件接口,則很容易檢測到起始和終止信號。3.7步進電機28BYJ-48電路3.7.128BYJ_48電路圖由于步進電機的驅動電流較大,單片機不能直接驅動,一般都是使ULN2003達林頓陣列驅動,當然,使用下拉電阻或三極管也是可以驅動的,只不過效果不是那么好,產生的扭力比較小,故本系統(tǒng)用了ULN2003驅動,如圖3.10所示。圖3.1028BYJ-48步進電機電路3.7.228BYJ_48相關概念相數(shù):產生不同對極N、S磁場的激磁線圈對數(shù)。常用m表示。拍數(shù):完成一個磁場周期性變化所需脈沖數(shù)或導電狀態(tài)用n表示,或指電機轉過一個齒距角所需脈沖數(shù),以四相電機為例,有四相四拍運行方式即AB-BC-CD-DA-AB,四相八拍運行方式即A-AB-B-BC-C-CD-D-DA-A.步距角:對應一個脈沖信號,電機轉子轉過的角位移用θ表示。θ=360度(轉子齒數(shù)J*運行拍數(shù))。四拍運行時步距角為θ=360度/(50*4)=1.8度(俗稱整步),八拍運行時步距角為θ=360度/(50*8)=0.9度(俗稱半步)。3.7.328BYJ_48驅動時序對應一個脈沖信號,步進電機28BYJ_48是四相五線制的,用四相四拍驅動,其驅動時序如表3.6所示:表3.6步進電機驅動時序表步序控制位工作狀態(tài)DCBA10011AB20010B30110BC4100C51100CD61000D71001DA80001A3.7.428BYJ_48特點[1]給步進脈沖就轉,不給步進脈沖電機就不轉;

[2]步進脈沖頻率高,步進電機轉得快;步進脈沖頻率低,步進電機轉得慢;

[3]改變各相的通電方式(叫脈沖分配)可以改變步進電機的運行方式;

[4]改變通電順序,可以控制步進電機的正、反轉。3.7.528BYJ_48驅動芯片ULN2003ULN2003是一個單片高電壓、高電流的達林頓晶體管陣列集成電路。它是由7對NPN達林頓管組成的,它的高電壓輸出特性和陰極箝位二極管可以轉換感應負載。ULN2003是一個7路反向器電路,即當輸入端為高電平時ULN2003輸出端為低電平,當輸入端為低電平時ULN2003輸出端為高電平,繼電器得電吸合。單個達林頓對的集電極電流是500mA。達林頓管并聯(lián)可以承受更大的電流。此電路主要應用于繼電器驅動器,字錘驅動器,燈驅動器,顯示驅動器(LED氣體放電),線路驅動器和邏輯緩沖器。ULN2003的每對達林管都有一個2.7k歐姆的串聯(lián)電阻,可以直接和TTL或5VCMOS裝置。功能特點:高電壓輸出50V

輸出鉗位二極管

,輸入兼容各種類型的邏輯電路

,應用繼電器驅動器,500mA額定集電極電流(單個輸出)。引腳說明:[1]IN1~IN7(引腳1~7):脈沖輸入端;[2]OUT1~OUT7(引腳10~16):脈沖輸出端;[3]GND(引腳8):電源地;[4]COM(引腳9):電源正極。圖3.11ULN2003引腳圖本系統(tǒng)中,P1.0接IN1,P1.1接IN2,P1.3接IN3,P1.4接IN4;OUT1接步進電機28BYJ_48A(藍色的線),OUT2接接步進電機28BYJ_48B(粉色的線),OUT3接接步進電機28BYJ_48C(黃色的線),OUT1接接步進電機28BYJ_48D(橙色的線)。3.8紅外接收電路3.8.1紅外接收電路圖紅外線接收電路使用一個集成紅外接收器,型號是HS0038,靜態(tài)時輸出端輸出高電平,當接收到紅外信號后,按紅外信號的數(shù)據(jù)波形輸出負脈沖數(shù)據(jù)信號。紅外信號輸出到單片機的P3.3,該口對應的第二功能是外部中斷1(INT1),利用該口的第二功能,一旦紅外線信號到來,P3.3被拉低,單片機中止當前的工作轉移到接收、處理紅外信號,如圖3.12所示。圖3.12紅外接收電路3.8.2紅外接收探頭HS0038紅外接收探頭,接收紅外信號頻率為38kHz,周期約26μs。紅外接收頭電路一體化的紅外接收裝置將遙控信號的接受、放大、檢波、整形集一體,并且輸出可以讓單片機識別的TTL信號,這樣大大簡化了接收電路的復雜程度和電路的設計工作,方便使用。在本系統(tǒng)中我們采用紅外一體化接收頭HS0038,示意圖如圖3.13所示。HS0038黑色環(huán)氧樹脂封裝,不受日光、熒光燈等光源干擾,內附磁屏蔽,功耗低,靈敏度高。在用小功率發(fā)射管發(fā)射信號情況下,其接收距離可達35m。它能與TTL、COMS電路兼容。HS0038為直立側面收光型。它接收紅外信號頻率為38kHz,周期約26μs,同時能對信號進行放大、檢波、整形,得到TTL電平的編碼信號。三個管腳分別是地、+5V電源、解調信號輸出端。HS00381GND2VCC3脈沖輸出端圖3.13HS0038引腳示意圖3.9光控電路光控電路由光敏電阻LDR、滑動變阻器VR組成,利用單片機的P2.4完成對環(huán)境亮度的測試工作。VRVccP2.4LDR光敏電阻圖3.14光控電路圖3.10窗簾框架設計窗簾框架構造設計包括窗簾微動開關連接電路設計和窗簾架的制作與設計。本設計中的微動開關通過電容、電阻組成的復位電路與單片機的復位引腳相連,微動開關安裝在窗簾滑桿上,當窗簾移動到預定位置時,觸動微動開關,使單片機復位,此時電機停轉,窗簾停到指定位置,如圖3.15所示。右半窗簾右半窗簾步進電機主動輪步進電機主動輪從從動輪微動開關微動開關左半窗簾左半窗簾圖3.15窗簾框架圖4系統(tǒng)軟件設計單片機電路只有軟件和硬件都正確才能使電路達到預計的目標,因此,軟件的編寫也是相當重要的。本系統(tǒng)的軟件編程部分的編寫主要分為LCD1602顯示程序、時鐘芯片DS1302控制程序、時間調整和定時時間程序、步進電機控制程序、紅外解碼程序、數(shù)據(jù)存儲程序、光控程序這七大類。4.1LCD1602顯示程序4.1.1LCD1602的初始化過程LCD1602的初始化(復位)過程[1]延時15mS,寫指令38H(不檢測忙信號);[2]延時5mS,寫指令38H(不檢測忙信號);[3]延時5mS,寫指令38H(不檢測忙信號,以后每次寫指令、讀/寫數(shù)據(jù)操作均需要檢[4]測忙信號);[5]寫指令38H:顯示模式設置(即16*2行顯示,5*7點陣,8位數(shù)據(jù));[6]寫指令08H:顯示關閉;[7]寫指令01H:顯示清屏;[8]寫指令06H:整屏不移動,光標自動右移;[9]寫指令0CH:開顯示不顯示光標;4.1.2LCD1602的程序流程圖開始開始初始化單片機發(fā)寫命令液晶是否應答準備寫入數(shù)據(jù)執(zhí)行顯示命令清屏并光標復位否是圖4.1LCD1602顯示程序流程圖4.2DS1302時鐘芯片控制程序DS1302與微處理器進行數(shù)據(jù)交換時,首先由微處理器向電路發(fā)送命令字節(jié),命令字節(jié)最高位MSB(D7)必須為邏輯0,如果D7=1,則禁止寫DS1302,即寫保護(0X00禁止寫保護、0X80打開寫保護);

數(shù)據(jù)輸入時,時鐘的上升沿數(shù)據(jù)必須有效,數(shù)據(jù)的輸出在時鐘的下降沿。如果為低電平,那么所有的數(shù)據(jù)傳送將被中止且I/0引腳變?yōu)楦咦锠顟B(tài)。上電時,在Vcc>2.5伏之前,必須為邏輯0。當把驅動至邏輯1狀態(tài)時,SCLK必須為邏輯0。單字節(jié)數(shù)據(jù)輸入跟隨在寫命令字節(jié)的8個SCLK周期之后,在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位0位到高位7。開始開始變量初始化使DS1302不具備寫保護復位后產生一個高電平寫DS1302地址地址增加向該地址寫數(shù)據(jù)數(shù)據(jù)是否寫完復位后產生一個高電平寫DS1302地址地址增加將該地址數(shù)據(jù)讀出數(shù)據(jù)是否讀完顯示數(shù)據(jù)NYNY圖4.2DS1302讀寫流程圖4.3時間調整和定時時間程序這里采用的是按鍵中斷實現(xiàn)的,因為在編寫程序時發(fā)現(xiàn)實時刷新時間函數(shù)和按鍵調整時間和定時有沖突。首先,按中斷鍵key4,調中斷(置標志位flag=1),返回主函數(shù)后將執(zhí)行時間定時和時間調整掃面程序。如果按key5鍵,則進入定時開關窗簾程序;如果按key6,則進入調整時間函數(shù)。程序流程圖如圖4.3所示:key4按下否key4按下否調整時間函數(shù)執(zhí)行完否執(zhí)行調整時間函數(shù)是調整時間函數(shù)執(zhí)行完否執(zhí)行調整時間函數(shù)key6按下否是key6按下否是否Key5按下否否否Key5按下否是執(zhí)行定時時間函數(shù)定時時間函數(shù)執(zhí)行完否執(zhí)行定時時間函數(shù)定時時間函數(shù)執(zhí)行完否清標志位,返回主函數(shù)是是是圖4.3時間調整和定時時間程序4.4步進電機控制程序4.4.1步進電機轉動方式(一)要實現(xiàn)步進電機的轉動,可以用以下兩種方式:(1)8拍的方式八個狀態(tài):[1]在A與A-正電壓,B與B-不給電懸空;[2]在A與A-正電壓,B與B-也給正電壓;[3]A與A-不給電壓懸空,B與B-正電壓;[4]A與A-給負電壓,B與B-給正電壓;[5]A與A-給負電壓,B與B-不給懸空;[6]A與A-給負電壓,B與B-給負電壓;[7]A與A-不給電懸空,B與B-給負電壓;[8]A與給正電壓,B與B-給負電壓;按以上八個狀態(tài)輪流供電,控制一下脈寬應該就可以了。

四個引腳各一根控制線:A~H表示各線時序

A

B

C

D

E

F

G

HA

1

1

0

0

0

0

0

1A-

0

0

0

1

1

1

0

0B

0

1

1

1

0

0

0

0B-

0

0

0

0

0

1

1

14.4.2步進電機轉動方式(二)4拍的方式:

電流驅動。下面的a~和b~表示反向電流。兩相雙二拍:ab

-a~b

a~b~

-ab~

為一個轉向。ab

-ab~-a~b~

a~b

為反向。ABCDA1001 A-0110B1100B-00114.4.3步進電機控制程序流程圖4.4停止鍵按下否停止鍵按下否反轉鍵按key5下否電機停止函數(shù)主函數(shù)步進電機按鍵掃描函數(shù)電機反轉函數(shù)電機正轉函數(shù)正轉鍵按key6下否否是是否是否否圖4.4步進電機程序流程圖4.5HS0038紅外解碼程序4.5.1紅外編碼波形說明這里采用的是6122型遙控器,載波波形使用455KHz晶體,經內部分頻電路,信號被調制在37.91KHz,占空比為三分之一。數(shù)據(jù)格式包括了引導碼、用戶碼、數(shù)據(jù)碼、數(shù)據(jù)反碼,編碼總共占32位。數(shù)據(jù)反碼是數(shù)據(jù)碼相反的編碼,編碼時可用對于數(shù)據(jù)的糾錯,其紅外波形圖如圖4.5所示。圖4.5紅外波形圖引導碼由一個9ms的載波波形和4.5ms的關斷時間構成,它作為隨后發(fā)射的碼的引導,這樣當接收系統(tǒng)是由微處理器構成的時候,能更有效地處理碼的接收與檢測及其它各項控制之間的時序關系。編碼采用脈沖位置調制方式(PPM)。每次8位的碼被傳送之后,它們的反碼也被傳送,減少了系統(tǒng)的誤碼率。用戶碼或者數(shù)據(jù)碼中的每一位可以是“1”,也可以是“0”。區(qū)分“0”和“1”是利用脈沖的時間間隔來區(qū)分,這種編碼方式稱為脈沖位置調制方式,簡稱PPM。4.5.2紅外解碼說明圖4.60、1波形圖解碼的關鍵是如何識別“0”和“1”,代碼格式(以接收代碼為準,接收代碼與發(fā)射代碼反向)。從位的定義我們可以發(fā)現(xiàn)“0”、“1”均以0.56ms的低電平開始,不同的是高電平的寬度不同,“0”為0.56ms,“1”為1.68ms,所以必須根據(jù)高電平的寬度區(qū)別“0”和“1”。如果從0.56ms低電平過后,開始延時,0.56ms以后,若讀到的電平為低,說明該位為“0”,反之則為“1”,為了可靠起見,延時必須比0.56ms長些,但又不能超過1.12ms,否則如果該位為“0”,讀到的已是下一位的高電平,因此?。?.12ms+0.56ms)/2=0.84ms最為可靠,一般取0.84ms左右均可;根據(jù)碼的格式,應該等待9ms的起始碼和4.5ms的結果碼完成后才能讀碼。4.5.3紅外解碼流程圖紅外解碼流程圖4.7如下:接收并解碼接收并解碼判斷數(shù)據(jù)格式是否正確跳出中斷比較,轉出執(zhí)行相應動作中斷返回有紅外信號,產生中斷否是圖4.7紅外解碼流程圖4.6數(shù)據(jù)存儲程序AT24C02的1、2、3腳是三條地址線,用于確定芯片的硬件地址(實驗板中直接接地只有一塊器件);第8腳和第4腳分別為正、負電源。第5腳SDA為串行數(shù)據(jù)輸入/輸出,數(shù)據(jù)通過這條雙向I2C總線串行傳送,SDA和SCL都需要和正電源間各接一個5.1K的電阻上拉。第7腳為WP寫保護端,接地時允許芯片執(zhí)行一般的讀寫操作。接電源端時不允許對器件寫。

24C02中帶有片內地址寄存器。每寫入或讀出一個數(shù)據(jù)字節(jié)后,該地址寄存器自動加1,以實現(xiàn)對下一個存儲單元的讀寫。所有字節(jié)均以單一操作方式讀取。為降低總的寫入時間,一次操作可寫入多達8個字節(jié)的數(shù)據(jù)。AT24C02讀寫操作流程圖4.8如下:產生啟動條件產生啟動條件給出從地址等待接收確認給出數(shù)據(jù)地址等待接收確認寫入接收數(shù)據(jù)等待接收確認產生啟動條件給出從地址等待接收確認不做應答產生停止條件產生應答是否最后字節(jié)接收1字節(jié)數(shù)據(jù)產生停止條件NY寫操作流程讀操作流程圖4.8AT24C02讀寫操作流程圖4.7光控程序該子程序中,當有光照時,光敏電阻阻值小,單片機P2.4低電平;天黑后,光照太弱,光敏電阻增大至幾十K歐姆,單片機P2.4端口高電平,通過判斷P2.4口高低電平來實現(xiàn)自動控制。當由天黑變天亮時,執(zhí)行開窗簾函數(shù)(即電機正轉);當由白天進入夜晚時,執(zhí)行關窗簾(即電機反轉)函數(shù)。5總結這次畢業(yè)設計讓我更加熟悉了從理論到實踐的跨越,從當初的查閱圖書,到現(xiàn)在的實物的成功實現(xiàn),這中間有很多值得回味的地方。這次的設計,我用到的軟件主要有word、proteus,keil,protel99se。雖然在系統(tǒng)開發(fā)過程中,好多知識都是隨學隨用,增加了很多不必要的麻煩,但是在不斷的努力以及同學的幫助下,解決了大部分問題。下面就把程序調時時出現(xiàn)的問題簡述下:[1]剛開始時按鍵設置時間函數(shù)與實時刷新時間函數(shù)有點沖突,按鍵按下后,時間刷新程序仍在運行,導致設置不了時間,后來通過中斷置調時按鍵標志位為1進入調整時間函數(shù)死循環(huán)置退出;[2]后面又發(fā)現(xiàn)定時程序與調時程序有沖突(調時程序會寫DS1302,而定時不需要寫),于是又加了個按鍵,結果發(fā)現(xiàn)進入中斷后掃描程序太長,按鍵不太靈敏,而且兩個鍵有影響,于是又把中斷去掉,在主程序掃描置標志位,發(fā)現(xiàn)按鍵太靈敏,就加了點延時;[3]實物上電后,液晶老是閃爍,而且85和正確的時間數(shù)據(jù)交替顯示,因在仿真時把SCLK和I/O接反出現(xiàn)85。于是檢查接線,發(fā)現(xiàn)無誤,又檢查BCD碼轉十進制數(shù)子函數(shù),也沒問題,最后發(fā)現(xiàn)在讀DS1302一個字節(jié)時最后沒有置IO=0,加上后顯示正常;雖然很多錯誤被克服了,但是系統(tǒng)中難免還有很多不足之處,希望各位評委老師和同學給予指正與建議。我相信,只要肯鉆研,只要擠時間,一切自己想要的知識都可以掌握。參考文獻[01]華成英,童詩白.模擬電子技術基礎[M].(第四版).北京:高等教育出版社,2006.[02]張毅剛,彭喜元,彭宇.單片機原理及應用[M].(第二版).北京:高等教育出版社,2010.[03]張家生.電機原理與拖動基礎[M].北京:北京郵電大學出版社,2006.[04]張靖武,周靈彬.單片機系統(tǒng)的PROTEUS設計與仿真[M].北京:電子工業(yè)出版社,2007.[05]STC89C52RC單片機中文資料.[06]ULN2003中文資料.[07]徐發(fā)榮.DS1302、HT1380時鐘芯片與8031單片機的接口技術.國外電子原器件,1999.[08]王明順,吳省.可涓流充電的串行實時時鐘芯片DS1302及其應用.電子技術應用,1996.[09]STC89C51RC/RD+系列單片機器件手冊.[10]彭偉單片機C語言程序設計實訓100例[M],北京:電子工業(yè)出版社,2009.[11]覃韋玲.利用單片機進行紅外線編、解碼遙控[J/OL].電子世界,2002.[12]侯勇,王泊林,顧燕.一體化紅外線接收模塊及其在紅外秒表通訊中的應用.儀器儀表與裝置,2001.5[13]閻石.數(shù)字電子技術[M].(第五版)北京:高等教育出版社,2005.[14]姚福安.電子電路設計與實踐[M].濟南:山東科學技術出版社,2001.[15]沙占友,王彥碰,孟志永等.單片機外圍電路設計.北京:電子工業(yè)出版社,2003.[16]騰飛.智能家居就在眼前[J/OL].中國計算機用戶,2001.[17]穩(wěn)壓芯片7805中文資料.[18]集成紅外接收器HS0038中文資料.[19]鄧奕,馬雙寶,謝龍漢.Protel99SE原理圖與PCB設計[M],北京:人民郵電出本社,2011.[20]張敏敏,陳亮亮.實用智能家居窗簾的設計[J/OL].科技視界,2012.附錄(一)原理圖附錄(二)源程序#include<reg51.h>#defineuintunsignedint#defineucharunsignedcharuchara,miao,shi,fen,ri,yue,nian,week=1,key1n,temp,runstate=0,flag,flag1,motorflag;s[4];uchardingmiao,dingshi,dingfen,dingri,dingyue,dingnian,dingweek,key2n,dingrunstate=0;ucharcodetabD[8]={1,1,0,0,0,0,0,1};ucharcodetabC[8]={0,1,1,1,0,0,0,0};ucharcodetabB[8]={0,0,0,1,1,1,0,0};ucharcodetabA[8]={0,0,0,0,0,1,1,1};ucharcodetabDB[8]={1,0,0,0,0,0,1,1};ucharcodetabCB[8]={0,0,0,0,1,1,1,0};ucharcodetabBB[8]={0,0,1,1,1,0,0,0};ucharcodetabAB[8]={1,1,1,0,0,0,0,0};bitlighttemp;sbitMA=P2^0;sbitMB=P2^1;sbitMC=P2^2;sbitMD=P2^3;sbitlight=P2^4;//光控電路接口#defineyh0x80//LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)#defineer0x80+0x40//LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)//液晶屏的與C51之間的引腳連接定義(顯示數(shù)據(jù)線接C51的P0口)sbitrs=P2^5;sbiten=P2^7;sbitrw=P2^6;//如果硬件上rw接地,就不用寫這句和后面的rw=0了//DS1302時鐘芯片與C51之間的引腳連接定義sbitIO=P1^6;sbitSCLK=P1^5;sbitRST=P1^7;sbitACC0=ACC^0;sbitACC7=ACC^7;//定義AT24C02引腳連接定義sbitscl=P1^0; //AT24C02SCLsbitsda=P1^1; //AT24C02SDAsbitred=P3^3; //HS0038負脈沖接口sbitkey6=P3^6;//正轉按鍵sbitkey7=P3^7;//停止按鍵//校時按鍵與C51的引腳連接定義sbitkey1=P1^2;//調整時間設置鍵sbitkey2=P3^0;//加鍵sbitkey3=P3^1;//減鍵sbitkey4=P1^3;//按鍵中斷sbitkey5=P3^5; //時間定時鍵、步進電機反轉按鍵/**************************************************************/ucharcodetab1[]={"20--"};//年顯示的固定字符ucharcodetab2[]={"::"};//時間顯示的固定字符ucharcodetabrun[]={"SRB"};//運行狀態(tài)顯示/******************************************************1延時函數(shù)*****************************************************/voiddelay(uintxms)//延時函數(shù),ms級{ uintx,y; for(x=xms;x>0;x--) for(y=110;y>0;y--);}voiddelay0(ucharx)//x*0.14MS 延時函數(shù)0.14ms{ uchari;while(x--) { for(i=0;i<13;i++); }}voiddelay1()//功能:延時函數(shù)1,us級{;;}/******************************************************2LCD1602有關子函數(shù)*****************************************************//*在這個程序中,液晶寫入有關函數(shù)會在DS1302的函數(shù)中調用,所以液晶程序要放在前面*/voidwrite_1602com(ucharcom)//****液晶寫入指令函數(shù)****{ rs=0;//數(shù)據(jù)/指令選擇置為指令 rw=0;//讀寫選擇置為寫 P0=com;//送入數(shù)據(jù) delay(1); en=1;//拉高使能端,為制造有效的下降沿做準備 delay(1); en=0;//en由高變低,產生下降沿,液晶執(zhí)行命令}voidwrite_1602dat(uchardat)//***液晶寫入數(shù)據(jù)函數(shù)****{ rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù) rw=0;//讀寫選擇置為寫 P0=dat;//送入數(shù)據(jù) delay(1); en=1;//en置高電平,為制造下降沿做準備 delay(1); en=0;//en由高變低,產生下降沿,液晶執(zhí)行命令}voidlcd_init()//***液晶初始化函數(shù)****{ write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù) write_1602com(0x0c);//開顯示不顯示光標 write_1602com(0x06);//整屏不移動,光標自動右移 write_1602com(0x01);//清顯示 write_1602com(yh+1);//日歷顯示固定符號從第一行第1個位置之后開始顯示 for(a=0;a<14;a++) { write_1602dat(tab1[a]);//向液晶屏寫日歷顯示的固定符號部分 //delay(3); } write_1602com(er+2);//時間顯示固定符號寫入位置,從第2個位置后開始顯示 for(a=0;a<8;a++) { write_1602dat(tab2[a]);//寫顯示時間固定符號,兩個冒號 //delay(3); }}/******************************************************3DS1302有關子函數(shù)*****************************************************/voidwrite_byte(uchardat)//寫一個字節(jié){ ACC=dat; RST=1; for(a=8;a>0;a--) { IO=ACC0; SCLK=0; SCLK=1; ACC=ACC>>1; }}ucharread_byte()//讀一個字節(jié){ RST=1; for(a=8;a>0;a--) { ACC7=IO; SCLK=1; SCLK=0; ACC=ACC>>1; } IO=0; return(ACC);}voidwrite_1302(ucharadd,uchardat)//向1302芯片寫函數(shù)(指定寫入地址,數(shù)據(jù)){ RST=0; SCLK=0; RST=1; write_byte(add); write_byte(dat); SCLK=1; RST=0;}ucharread_1302(ucharadd)//從1302讀數(shù)據(jù)函數(shù),指定讀取數(shù)據(jù)來源地址{ uchartemp; RST=0; SCLK=0; RST=1; write_byte(add); temp=read_byte(); SCLK=1; RST=0; return(temp);}ucharBCD_Decimal(ucharbcd)//BCD碼轉十進制函數(shù),輸入BCD,返回十進制{ucharDecimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F));}voidds1302_init()//1302芯片初始化子函數(shù)(2013-05-18,12:00:00,week4){RST=0;SCLK=0;write_1302(0x8e,0x00);//允許寫,禁止寫保護write_1302(0x80,0x00);//向DS1302內寫秒寄存器80H寫入初始秒數(shù)據(jù)00//write_1302(0x82,0x00);//向DS1302內寫分寄存器82H寫入初始分數(shù)據(jù)00//write_1302(0x84,0x12);//向DS1302內寫小時寄存器84H寫入初始小時數(shù)據(jù)12//write_1302(0x8a,0x06);//向DS1302內寫周寄存器8aH寫入初始周數(shù)據(jù)6//write_1302(0x86,0x18);//向DS1302內寫日期寄存器86H寫入初始日期數(shù)據(jù)07//write_1302(0x88,0x05);//向DS1302內寫月份寄存器88H寫入初始月份數(shù)據(jù)01//write_1302(0x8c,0x13);//向DS1302內寫年份寄存器8cH寫入初始年份數(shù)據(jù)10write_1302(0x8e,0x80);//打開寫保護}//時分秒顯示子函數(shù)voidwrite_sfm(ucharadd,uchardat)//向LCD寫時分秒,有顯示位置加、現(xiàn)示數(shù)據(jù),兩個參數(shù){ uchargw,sw; gw=dat%10;//取得個位數(shù)字 sw=dat/10;//取得十位數(shù)字 write_1602com(er+add);//er是頭文件規(guī)定的值0x80+0x40 write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼 write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼 delay(20); }//年月日顯示子函數(shù)voidwrite_nyr(ucharadd,uchardat)//向LCD寫年月日,有顯示位置加數(shù)、顯示數(shù)據(jù),兩個參數(shù){ uchargw,sw; gw=dat%10;//取得個位數(shù)字 sw=dat/10;//取得十位數(shù)字 write_1602com(yh+add);//設定顯示位置為第一個位置+add write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼 write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼delay(50); }//寫星期子函數(shù)voidwrite_week(ucharweek){ write_1602com(yh+0x0c);//星期字符的顯示位置 switch(week) { case1:write_1602dat('M');//星期數(shù)為1時,顯示 write_1602dat('O'); write_1602dat('N'); break; case2:write_1602dat('T');//星期數(shù)據(jù)為2時顯示 write_1602dat('U'); write_1602dat('E'); break; case3:write_1602dat('W');//星期數(shù)據(jù)為3時顯示 write_1602dat('E'); write_1602dat('D'); break; case4:write_1602dat('T');//星期數(shù)據(jù)為4是顯示 write_1602dat('H'); write_1602dat('U'); break; case5:write_1602dat('F');//星期數(shù)據(jù)為5時顯示 write_1602dat('R'); write_1602dat('I'); break; case6:write_1602dat('S');//星期數(shù)據(jù)為6時顯示 write_1602dat('T'); write_1602dat('A'); break; case7:write_1602dat('S');//星期數(shù)據(jù)為7時顯示 write_1602dat('U'); write_1602dat('N'); break;}}/******************************************************4讀DS1302時間顯示于LCD1602函數(shù)*****************************************************/voidtimegetdisp()//取得并顯示日歷和時間{//讀取秒時分周日月年七個數(shù)據(jù)(DS1302的讀寄存器與寫寄存器不一樣):miao=BCD_Decimal(read_1302(0x81));write_sfm(0x08,miao);//秒,從第二行第8個字后開始顯示(調用時分秒顯示子函數(shù)) fen=BCD_Decimal(read_1302(0x83)); write_sfm(0x05,fen);//分,從第二行第5個字符后開始顯示 shi=BCD_Decimal(read_1302(0x85)); write_sfm(0x02,shi);//小時,從第二行第2個字符后開始顯示 ri=BCD_Decimal(read_1302(0x87));write_nyr(0x09,ri);//日期,從第一行第9個字符后開始顯示 yue=BCD_Decimal(read_1302(0x89)); write_nyr(0x06,yue);//月份,從第一行第6個字符后開始顯示 nian=BCD_Decimal(read_1302(0x8d)); write_nyr(0x03,nian);//年,從第一行第3個字符后開始顯示 week=BCD_Decimal(read_1302(0x8b)); write_week(week);}/******************************************************5按鍵調整時間函數(shù)*****************************************************/voidkeyscan() //按鍵調整時間函數(shù){ if(key1==0)//key1為功能鍵(設置鍵) { delay(9);//延時,用于消抖動 if(key1==0)//延時后再次確認按鍵按下 { while(!key1); key1n++; if(key1n==9) key1n=1;//設置按鍵共有秒、分、時、星期、日、月、年、返回,8個功能循環(huán) switch(key1n) { case1:write_1602com(er+0x09);//設置按鍵按動一次,秒位置顯示光標 write_1602com(0x0f);//設置光標為閃爍 temp=(miao)/10*16+(miao)%10;//秒數(shù)據(jù)寫入DS1302 write_1302(0x8e,0x00); write_1302(0x80,0x80|temp);//miao write_1302(0x8e,0x80); break; case2:write_1602com(er+6);//按2次fen位置顯示光標 //write_1602com(0x0f); break; case3:write_1602com(er+3);//按動3次,shi //write_1602com(0x0f); break; case4:write_1602com(yh+0x0e);//按動4次,week //write_1602com(0x0f); break; case5:write_1602com(yh+0x0a);//按動5次,ri //write_1602com(0x0f); break; case6:write_1602com(yh+0x07);//按動6次,yue //write_1602com(0x0f); break; case7:write_1602com(yh+0x04);//按動7次,nian //write_1602com(0x0f); break; case8: write_1602com(0x0c);//按動到第9次,設置光標不閃爍 TR0=1;//打開定時器temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00); write_1302(0x80,0x00|temp);//miao數(shù)據(jù)寫入DS1302 write_1302(0x8e,0x80); flag=0;break; } } }//加鍵key2 if(key1n!=0)//當key1按下以后,再按以下鍵才有效(按鍵次數(shù)不等于零) { if(key2==0)//上調鍵 { delay(10); if(key2==0) { while(!key2); switch(key1n) { case1:miao++;//設置鍵按動1次,調秒 if(miao>59) miao=0;//秒超過59,再加1,就歸零 write_sfm(0x08,miao);//令LCD在正確位置顯示"加"設定好的秒數(shù) temp=(miao)/10*16+(miao)%10;//十進制轉換成DS1302要求的BCD碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x80,temp);//向DS1302內寫秒寄存器80H寫入調整后的秒數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(er+0x09);//因為設置液晶的模式是寫入數(shù)據(jù)后,光標自動右移,所以要指定返回 //write_1602com(0x0b); break; case2:fen++; if(fen>59) fen=0; write_sfm(0x05,fen);//令LCD在正確位置顯示"加"設定好的分數(shù)據(jù) temp=(fen)/10*16+(fen)%10;//十進制轉換成DS1302要求的BCD碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x82,temp);//向DS1302內寫分寄存器82H寫入調整后的分數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(er+6);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置 break; case3:shi++; if(shi>23) shi=0; write_sfm(2,shi);//令LCD在正確的位置顯示"加"設定好的小時數(shù)據(jù) temp=(shi)/10*16+(shi)%10;//十進制轉換成DS1302要求的BCD碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x84,temp);//向DS1302內寫小時寄存器84H寫入調整后的小時數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(er+3);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位 break; case4:week++; if(week>7) week=1;write_1602com(yh+0x0C);//指定'加'后的周數(shù)據(jù)顯示位置 write_week(week);//指定周數(shù)據(jù)顯示內容temp=(week)/10*16+(week)%10;//十進制轉換成DS1302要求的BCD碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x8a,temp);//向DS1302內寫周寄存器8aH寫入調整后的周數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(yh+0x0e);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位 break; case5:ri++; if(ri>31) ri=1; write_nyr(9,ri);//令LCD在正確的位置顯示"加"設定好的日期數(shù)據(jù) temp=(ri)/10*16+(ri)%10;//十進制轉換成DS1302要求的BCD碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x86,temp);//向DS1302內寫日期寄存器86H寫入調整后的日期數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(yh+10);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位 break; case6:yue++; if(yue>12) yue=1; write_nyr(6,yue);//令LCD在正確的位置顯示"加"設定好的月份數(shù)據(jù) temp=(yue)/10*16+(yue)%10;//十進制轉換成DS1302要求的BCD碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x88,temp);//向DS1302內寫月份寄存器88H寫入調整后的月份數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(yh+7);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位 break; case7:nian++; if(nian>99) nian=0; write_nyr(3,nian);//令LCD在正確的位置顯示"加"設定好的年份數(shù)據(jù)temp=(nian)/10*16+(nian)%10;//十進制轉換成DS1302要求的BCD碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x8c,temp);//向DS1302內寫年份寄存器8cH寫入調整后的年份數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(yh+4);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位 break; } } }//減鍵key3,各句功能參照'加鍵'注釋 if(key3==0) { delay(10);//調延時,消抖動 if(key3==0) { while(!key3); switch(key1n) { case1:miao--; if(miao==-1) miao=59;//秒數(shù)據(jù)減到-1時自動變成59 write_sfm(0x08,miao);//在LCD的正確位置顯示改變后新的秒數(shù)temp=(miao)/10*16+(miao)%10;//十進制轉換成DS1302要求的BCD碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護

溫馨提示

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

評論

0/150

提交評論