單片機遙控的酒店客房燈光控制系統(圖)
上傳人:admin 上傳時間: 2008-09-09 瀏覽次數: 2838 |
前言:本人工作的酒店開業于一九九八年,至今已有七年之久,當初選型設備老化過時,特別對于科技飛速發展的當今。酒店原有的智能控制系統較周邊新開張酒店相比,已跟不上潮流,失去競爭能力。例如原來酒店客房燈光控制系統均采用TCL2.0系列產品,房間的電視、臺燈、地燈、魚缸照明、夜燈、廊燈、吧臺燈等開關與床頭燈調光開關均集中安裝在床頭柜處(如圖1)。由于開關較多且固定在床頭柜側面,客人想開燈時必須先看清開關下面的標記才能正確開燈,有時為開一盞燈竟把所有的開關都按了一遍,使用時極為不便。現在大多數星級酒店都采用微動開關輕觸式集中控制面板,安裝在床頭柜的正上方。雖然較以前直觀,但是開關多且固定仍不是十分方便。本人采用8051系列單片機將原來固定的機械式開關改用遙控控制,這樣一個遙控器就可以控制整個房間的燈光開啟,電源控制箱可以放在床頭柜內;遙控器在放置在床頭柜上,可以任意移動,還可以在遙控面板中間加裝一液晶時鐘(如圖2所示)。美觀且實用即大方便客人的使用。
圖1 老式控制柜
一 硬件電路的設計
1、 遙控發射電路
如圖3所示,為該系統遙控發射器電原理圖,其中P1口作為鍵盤掃描端口,具有16個操作鍵,可分別控制單片機發出16種不同脈沖,執行16種操作。第9腳為單片機的復位腳,采用RC上電復位電路;15腳作為紅外線遙控碼的輸出口,用于輸出38KHz載波編碼。脈沖經9013放大然后由紅外發射管輸出;18、19腳接12M晶振。P1.4P1.7需接上拉電阻。
圖3 遙控發射電路圖
2、 遙控接收電路
如圖4所示,為該系統遙控接收電原理圖,其中P1.0P1.2口作為數碼管的二進制數據輸出,顯示數字為07,0表示最暗,7表示最亮,采用帶鎖存功能的七段譯碼電路74HC4511集成塊譯碼顯示數值。4511的LE端接8051的30腳(地址鎖存允許控制);P0.0P0.7以及P2.2P2.7作為14個電器的電源控制輸出,接口用繼電器隔離輸出。P2.0口為調光脈沖輸出,輸出脈沖由三極管9012放大后經光電耦合器MOC3021驅動雙向可控硅控制負載;P3.0口為交流50Hz同步檢測輸入。系統對市電進行變壓、整流、并經施密特觸發器整形后得到100Hz的方波(周期10ms),作為發送調光脈沖的同步信號,系統采用10ms為一個單位時間的長度,燈的亮度越高,則可控硅導通時間的占空比越大;P3.1口為紅外遙控碼輸入,采用集成紅外線接收路SFH506-38,此集成元件體積小、抗干擾性好、靈敏度高、并且價格低廉。它僅有三個腳,分別是電源正極、電源負極以及信號輸出端,其工作電壓為5V左右,它的主要功能包括放大、選頻、解調幾大部分,要求輸入是已經被調制的信號,經過它的接收放大和解調會在輸出端直接輸出原始信號至P3.1腳。這款紅外線接收電路接收距離可以達8米左右,完全可以滿足客房內的遙控距離(一般客房標準間都在30平米左右);P3.2腳為外部中斷0輸入腳,采用下降沿觸發,當有信號時,第一位碼的低電平啟動中斷程序,實時接收數據幀。第9腳為單片機的復位腳,采用RC上電復位電路;18、19腳接12M晶振。
圖4 遙控接收電路圖
二 系統的遙控功能實現方法
1、 遙控編碼格式
該遙控器采用脈沖個數編碼,不同的脈沖個數代表不同的碼,最小為2個脈沖,最大為17個脈沖。為了使接收可靠,第一位碼寬為3ms,其余為1ms,遙控數據幀間隔大于10ms,如圖5所示。
圖5 遙控脈沖編碼圖
2、 遙控碼的發射
當某個操作鍵按下時,單片機先讀出該鍵值,然后根據鍵值設定的遙控脈沖個數,再調制成38KHz的方波由紅外線發射管發射出去。P3.5端口的輸出調制波如圖5所示。
3、 數據幀的接收處理
當紅外線接收器輸出脈沖幀數據時,第一位碼的低電平將啟動中斷程序,實時接收數據幀。在數據接收時,先對第一位(起始位)碼的碼寬進行驗證。若第一位低電平碼的脈寬小于2ms,將作為錯誤碼處理;否則認為是起始碼,累加器A加1。當間隔位的高電平大于3ms時,結束接收,然后根據累加器A中的脈沖個數,執行相應的輸出操作。圖6為紅外線接收器輸出的一幀遙控碼波形圖。
三 遙控發射及接收控制程序流程圖
1、 遙控發射程序控制流程圖
圖7 遙控發射控制流程圖
2、 遙控接收程序控制流程圖
圖8遙控接收控制流程圖
四 主要程序分析
1、 鍵盤掃描程序
本電路采用44矩陣式鍵盤電路,共16個按健開關可發送16種編碼指令。首先將立即數#0F0H送至P1口,再讀入P1口值與#0F0H相比較,相等則說明沒有鍵按下,返回。不相等則表示有鍵按下,再調用延時消抖程序,確認有鍵按下。轉至行掃描程序確認按鍵所在的行,并將R2賦行號初值,然后調用列掃描程序確認按鍵所在例號。例號與行號初值相加即得按鍵號(送寄存器A)。
KEYWORK: MOV P1,#0F0H ;置P1口輸入狀態
MOV A,P1 ;讀入P1口值
MOV B,A ;P1口值暫存B中
CJNE A,#0F0H,KEYHIT ;不等于#0FFH,轉KEYHIT(有鍵按下)
KEYOUT: RET ;沒有鍵按下返回;
KEYHIT: LCALL DL10MS ;延時去抖動
MOV A,P1 ;再讀入P1口值至A
CJNE A,B,KEYOUY ;A不等于B(是干擾),子程序返回
SETB P1.1 ;有鍵按下,找鍵號開始,查0行
SETB P1.2
SETB P1.3
MOV A,P1 ;讀入P1口值
CJNE A,#0FEH,KEYVAL0 ;P1不等于#0FEH,按下鍵在第0行
SETB P1.0 ;不在第0行,開始查1行
CLR P1.1
MOV A,P1 ;讀入P1口值
CJNE A,#0FDH,KEYVAL1 ;P1口不等于#0FDH,按下鍵在第1行
SETB P1.1 ;不在第1行,開始查2行
CLR P1.2
MOV A,P1 ;讀入P1口值
CJNE A,#0FBH,KEYVAL2 ;P1口不等于#0FBH,按下鍵在第2行
SETB P1.2 ;不在第2行,開始查3行
CLR P1.3
MOV A,P1 ;讀入P1口值
CJNE A,#0F7H,KEYVAL3 ;P1口不等于#0F7H,按下鍵在第3行
LJMP KEYOUT ;不在第3行,子程序返回
KEYVAL0: MOV R2,#00H ;按下鍵在第0行,R2賦行號初值0
LJMP KEYVAL4 ;跳到KEYVAL4
KEYVAL1: MOV R2,#04H ;按下鍵在第1行,R2賦行號初值4
LJMP KEYVAL4 ;跳到KEYVAL4
.
.
KEYVAL4: MOV DPTR,#KEYVALTAB ;翻譯成連續數字
MOV B,A ;P1口值暫存B內
ANL B,#0F0H ;取高四位
MOV R0,#0 ;清R0
KEYVAL5: MOV A,R0 ;查列號開始,R0數據放入A
SUBB A,#04H ;A中數減4
JNC KEYOUT ;借位C為0,查表出錯,返回
MOV A,R0 ;查表次數小于4,繼續查,
MOVC A,@A+DPTR ;查列號表
INC R0 ;R0加1
CJNE A,B,KEYVAL5 ;查得值和P1口值不等,轉KEYVAL5再查
DEC R0 ;查得值和P1口值相等,R0減1
MOV A,R0 ;放入A(R0中數值即為列號值)
ADD A,R2 ;與行號初值相加成為鍵號值(0-15)
KEYVALTAB: DB 0E0H,0D0H,0B0H,07H ;列號對應數據表
;對應列號: 0 1 2 3
用戶名: 密碼: