|
節(jié)日彩燈控制器設(shè)計(jì)
TIM截圖20190115185942.png (75.7 KB, 下載次數(shù): 21)
下載附件
2019-1-15 18:59 上傳
1. 設(shè)計(jì)要求
以單片機(jī)為核心,設(shè)計(jì)一個(gè)節(jié)日彩燈控制器:
P1.2—開始,按此鍵則燈開始流動(dòng)(由上而下)。
P1.3—停止,按此鍵則停止流動(dòng),所有燈為暗。
P1.4—上,按此鍵則燈由上向下流動(dòng)。
P1.5—下,按此鍵則燈由下向上流動(dòng)。
P1.6—向外,按此鍵則燈由中間向兩邊流動(dòng)。
P1.7—向中,按此鍵則燈由兩邊向中間流動(dòng)。
2. 實(shí)驗(yàn)原理
本題目本質(zhì)上是由按鍵控制功能的流水燈,LED工作的方式通過鍵盤的掃描實(shí)現(xiàn)。其中的LED采取共陽極接法,通過依次向連接LED的I/O口送出低電平,可實(shí)現(xiàn)題目要求的功能。本題目需要控制的流水燈較多,共48個(gè),需要I/O口擴(kuò)展。
3. Proteus仿真
晶振頻率為11.0592MHz。仿真結(jié)果根據(jù)按鍵變化。
單片機(jī)匯編語言源碼:
- ORG 0000H
- AJMP MAIN ;/ 復(fù)位入口,跳主程序MAIN
- ORG 0003H ;/ INT0*中斷入口
- LJMP KEY_INT ;/ 跳向INTO*的中斷服務(wù)子程序KEY_INT
- ORG 0100H ;/ 主程序入口
- MAIN: MOV SP,60H ;/ 重新設(shè)堆棧指針
- SETB IT0 ;/ INTO*為跳沿觸發(fā)
- MOV IP,#01H ;/ INTO*為高優(yōu)先級(jí)
- SETB EA ;/ 總中斷允許
- SETB EX0 ;/ 允許INTO*中斷
- MOV P1,0FFH ;/ P1口寫入全1,設(shè)置P1口為輸入狀態(tài)
- ORG 0300H ;/ 中斷入口,查詢掃描鍵盤
- KEY_INT: MOV A,P1 ;/ 讀入8個(gè)按鍵的狀態(tài)
- CPL A ;/ 取反,鍵閉合的相應(yīng)位為1
- JZ RETURN ;/ 如A中內(nèi)容為0,則無鍵閉合,返回
- LCALL D10ms ;/ A非全0,可能有鍵閉合,延時(shí)10ms,軟件去抖
- MOV A,P1 ;/ 重讀8個(gè)按鍵的狀態(tài),鍵閉合相應(yīng)位為0
- CPL A ;/ 取反,鍵閉合的相應(yīng)位為1
- JZ RETURN ;/ A中全0,無鍵閉合,返回;非全0,確認(rèn)有鍵閉合
- JB ACC.2,Pkey2 ;/ S2鍵閉合,跳S2鍵處理標(biāo)號(hào)Pkey2
- JB ACC.3,Pkey3 ;/ S3鍵閉合,跳S3鍵處理標(biāo)號(hào)Pkey3
- JB ACC.4,Pkey4 ;/ S4鍵閉合,跳S4鍵處理標(biāo)號(hào)Pkey4
- JB ACC.5,Pkey5 ;/ S5鍵閉合,跳S5鍵處理標(biāo)號(hào)Pkey5
- JB ACC.6,Pkey6 ;/ S6鍵閉合,跳S6鍵處理標(biāo)號(hào)Pkey6
- JB ACC.7,Pkey7 ;/ S7鍵閉合,跳S7鍵處理標(biāo)號(hào)Pkey7
- LJMP RETURN ;/ 查詢結(jié)束,重新開始
- Pkey2: MOV P2,#0BFH ;/ S0鍵處理子程序
- MOV A,#80H ;/ PA口、PB口、PC口方式0輸出的控制字送A
- MOV R0,#7FH ;/ 8255A控制寄存器地址7FH送入R0
- MOVX @R0,A ;/ 方式控制字送入控制寄存器
- START1: MOV DPTR,#TABLE ;/ 指針指向表頭地址
- AP0: MOV A,#00H ;/ 設(shè)置地址偏移量
- MOVC A,@A+DPTR ;/ 查表取得數(shù)據(jù),送A
- CJNE A,#01H,AP1 ;/ 判斷A中數(shù)據(jù)是否為結(jié)束符01H,不是則跳AP1繼續(xù)執(zhí)行
- LJMP START2 ;/ 是結(jié)束符01H,跳START2繼續(xù)執(zhí)行
- AP1: MOV R0,#7CH ;/ PA口地址7CH送入DPTR
- MOVX @R0,A ;/ 將A送PA口輸出
- INC DPTR ;/ 指針加1
- LJMP AP0 ;/ 跳AP0執(zhí)行循環(huán)體
- START2: MOV DPTR,#TABLE ;/ 指針指向表頭地址
- BP0: MOV A,#00H ;/ 設(shè)置地址偏移量
- MOVC A,@A+DPTR ;/ 查表取得數(shù)據(jù),送A
- CJNE A,#01H,BP1 ;/ 判斷A中數(shù)據(jù)是否為結(jié)束字符01H,不是則跳BP1繼續(xù)執(zhí)行
- LJMP START3 ;/ 是結(jié)束符01H,跳START3繼續(xù)執(zhí)行
- BP1: MOV R0,#7DH ;/ PB口地址7DH送入DPTR
- MOVX @R0,A ;/ 將A送PB口輸出
- INC DPTR ;/ 指針加1
- LJMP BP0 ;/ 跳BP0執(zhí)行循環(huán)體
- START3: MOV DPTR,#TABLE ;/ 指針指向表頭地址
- CP0: MOV A,#00H ;/ 設(shè)置地址偏移量
- MOVC A,@A+DPTR ;/ 查表取得數(shù)據(jù),送A
- CJNE A,#01H,CP1 ;/ 判斷A中數(shù)據(jù)是否為結(jié)束字符01H,不是則跳CP1繼續(xù)執(zhí)行
- LJMP LD2 ;/ 是結(jié)束符01H,跳LD2繼續(xù)執(zhí)行
- CP1: MOV R0,#7DH ;/ PC口地址7DH送入DPTR
- MOVX @R0,A ;/ 將A送PC口輸出
- INC DPTR ;/ 指針加1
- LJMP CP0 ;/ 跳CP0執(zhí)行循環(huán)體
- LD2: MOV P2,#7FH
- MOV A,#80H ;/ PA口、PB口、PC口方式0輸出的控制字送A
- MOV R0,#7FH ;/ 8255A控制寄存器地址7FH送入R0
- MOVX @R0,A ;/ 方式控制字送入控制寄存器
- START4: MOV DPTR,#TABLE ;/ 指針指向表頭地址
- AP01: MOV A,#00H ;/ 設(shè)置指針偏移量
- MOVC A,@A+DPTR ;/ 查表取得數(shù)據(jù),送A
- CJNE A,#01H,AP1 ;/ 判斷A中數(shù)據(jù)是否為結(jié)束字符01H,不是則跳AP11繼續(xù)執(zhí)行
- LJMP START5 ;/ 是結(jié)束字符跳START5繼續(xù)執(zhí)行
- AP11: MOV R0,#7CH ;/ PA口地址7CH送入DPTR
- MOVX @R0,A ;/ 將A送PA口輸出
- INC DPTR ;/ 指針加1
- LJMP AP01 ;/ 跳AP01執(zhí)行循環(huán)體
- START5: MOV DPTR,#TABLE
- BP01: MOV A,#00H
- MOVC A,@A+DPTR
- CJNE A,#01H,BP11
- LJMP START6
- BP11: MOV R0,#7DH ;/ PB口地址7DH送入DPTR
- MOVX @R0,A ;/ 將A送PB口輸出
- INC DPTR
- LJMP BP01
- START6: MOV DPTR,#TABLE
- CP01: MOV A,#00H
- MOVC A,@A+DPTR
- CJNE A,#01H,CP11
- LJMP LD3
- CP11: MOV R0,#7DH ;/ PC口地址7DH送入DPTR
- MOVX @R0,A ;/ 將A送PC口輸出
- INC DPTR
- LJMP CP01
- LD3: LJMP RETURN ;/ 跳向中斷返回
- Pkey3: MOV P2,#0FFH ;/ S0鍵處理子程序
- LJMP RETURN ;/ 跳向中斷返回
- Pkey4: LJMP Pkey2
- LJMP RETURN
- Pkey5: MOV P2,#0BFH
- MOV A,#80H ;/ PA口、PB口、PC口方式0輸出的控制字送A
- MOV R0,#7FH ;/ 8255A控制寄存器地址7FH送入R0
- MOVX @R0,A ;/ 方式控制字送入控制寄存器
- START11: MOV DPTR,#TABLE
- AP02: MOV A,#00H
- MOVC A,@A+DPTR
- CJNE A,#01H,AP12
- LJMP START2
- AP12: MOV R0,#7EH ;/ PC口地址7EH送入DPTR
- MOVX @R0,A ;/ 將A送PC口輸出
- INC DPTR
- LJMP AP02
- START21: MOV DPTR,#TABLE
- BP02: MOV A,#00H
- MOVC A,@A+DPTR
- CJNE A,#01H,BP12
- LJMP START3
- BP12: MOV R0,#7DH ;/ PB口地址7DH送入DPTR
- MOVX @R0,A ;/ 將A送PB口輸出
- INC DPTR
- LJMP BP02
- START31: MOV DPTR,#TABLE
- CP02: MOV A,#00H
- MOVC A,@A+DPTR
- CJNE A,#01H,CP12
- LJMP LD2
- CP12: MOV R0,#7CH ;/ PA口地址7CH送入DPTR
- MOVX @R0,A ;/ 將A送PA口輸出
- INC DPTR
- LJMP CP02
- LJMP RETURN
- Pkey6: MOV A,#80H ;/ PA口、PB口、PC口方式0輸出的控制字送A
- MOV R0,#7FH ;/ 8255A控制寄存器地址7FH送入R0
- MOVX @R0,A ;/ 方式控制字送入控制寄存器
- START12: MOV DPTR,#TABLE
- AP03: MOV A,#00H
- MOVC A,@A+DPTR
- CJNE A,#01H,AP13
- LJMP START2
- AP13: MOV R0,#7EH ;/ PC口地址7EH送入DPTR
- MOVX @R0,A ;/ 將A送PC口輸出
- INC DPTR
- LJMP AP03
- START22: MOV DPTR,#TABLE
- BP03: MOV A,#00H
- MOVC A,@A+DPTR
- CJNE A,#01H,BP13
- LJMP START3
- BP13: MOV R0,#7DH ;/ PB口地址7DH送入DPTR
- MOVX @R0,A ;/ 將A送PB口輸出
- INC DPTR
- LJMP BP03
- START32: MOV DPTR,#TABLE
- CP03: MOV A,#00H
- MOVC A,@A+DPTR
- CJNE A,#01H,CP13
- LJMP LD2
- CP13: MOV R0,#7CH ;/ PA口地址7CH送入DPTR
- MOVX @R0,A ;/ 將A送PA口輸出
- INC DPTR
- LJMP CP03
- LJMP RETURN
- Pkey7: MOV A,#80H ;/ PA口、PB口、PC口方式0輸出的控制字送A
- MOV R0,#7FH ;/ 8255A控制寄存器地址7FH送入R0
- MOVX @R0,A ;/ 方式控制字送入控制寄存器
- START13: MOV DPTR,#TABLE
- AP04: MOV A,#00H
- MOVC A,@A+DPTR
- CJNE A,#01H,AP14
- LJMP START2
- AP14: MOV R0,#7CH ;/ PA口地址7CH送入DPTR
- MOVX @R0,A ;/ 將A送PA口輸出
- INC DPTR
- LJMP AP04
- START23: MOV DPTR,#TABLE
- BP04: MOV A,#00H
- MOVC A,@A+DPTR
- CJNE A,#01H,BP14
- LJMP START3
- BP14: MOV R0,#7DH ;/ PB口地址7DH送入DPTR
- MOVX @R0,A ;/ 將A送PB口輸出
- INC DPTR
- LJMP BP04
- START33: MOV DPTR,#TABLE
- CP04: MOV A,#00H
- MOVC A,@A+DPTR
- CJNE A,#01H,CP14
- LJMP LD2
- CP14: MOV R0,#7DH ;/ PC口地址7DH送入DPTR
- MOVX @R0,A ;/ 將A送PC口輸出
- INC DPTR
- LJMP CP04
- LJMP RETURN ;/ 跳向中斷返回
- D10ms: MOV R7,#25 ;/ 延時(shí)10ms子程序,采用雙重循環(huán)
- D1: MOV R6,#200
- DJNZ R6,[ DISCUZ_CODE_1 ]nbsp; ;/ R6減1非0,原地跳轉(zhuǎn)
- DJNZ R7,D1
- RET
- RETURN: RETI ;/ INTO*中斷返回
- TABLE: DB 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH
- DB 01H
- END
復(fù)制代碼
|
-
-
流水燈.docx
2019-1-15 18:58 上傳
點(diǎn)擊文件名下載附件
18.03 KB, 下載次數(shù): 21
|