節日彩燈控制器設計
TIM截圖20190115185942.png (75.7 KB, 下載次數: 21)
下載附件
2019-1-15 18:59 上傳
1. 設計要求
以單片機為核心,設計一個節日彩燈控制器:
P1.2—開始,按此鍵則燈開始流動(由上而下)。
P1.3—停止,按此鍵則停止流動,所有燈為暗。
P1.4—上,按此鍵則燈由上向下流動。
P1.5—下,按此鍵則燈由下向上流動。
P1.6—向外,按此鍵則燈由中間向兩邊流動。
P1.7—向中,按此鍵則燈由兩邊向中間流動。
2. 實驗原理
本題目本質上是由按鍵控制功能的流水燈,LED工作的方式通過鍵盤的掃描實現。其中的LED采取共陽極接法,通過依次向連接LED的I/O口送出低電平,可實現題目要求的功能。本題目需要控制的流水燈較多,共48個,需要I/O口擴展。
3. Proteus仿真
晶振頻率為11.0592MHz。仿真結果根據按鍵變化。
單片機匯編語言源碼:
- ORG 0000H
- AJMP MAIN ;/ 復位入口,跳主程序MAIN
- ORG 0003H ;/ INT0*中斷入口
- LJMP KEY_INT ;/ 跳向INTO*的中斷服務子程序KEY_INT
- ORG 0100H ;/ 主程序入口
- MAIN: MOV SP,60H ;/ 重新設堆棧指針
- SETB IT0 ;/ INTO*為跳沿觸發
- MOV IP,#01H ;/ INTO*為高優先級
- SETB EA ;/ 總中斷允許
- SETB EX0 ;/ 允許INTO*中斷
- MOV P1,0FFH ;/ P1口寫入全1,設置P1口為輸入狀態
- ORG 0300H ;/ 中斷入口,查詢掃描鍵盤
- KEY_INT: MOV A,P1 ;/ 讀入8個按鍵的狀態
- CPL A ;/ 取反,鍵閉合的相應位為1
- JZ RETURN ;/ 如A中內容為0,則無鍵閉合,返回
- LCALL D10ms ;/ A非全0,可能有鍵閉合,延時10ms,軟件去抖
- MOV A,P1 ;/ 重讀8個按鍵的狀態,鍵閉合相應位為0
- CPL A ;/ 取反,鍵閉合的相應位為1
- JZ RETURN ;/ A中全0,無鍵閉合,返回;非全0,確認有鍵閉合
- JB ACC.2,Pkey2 ;/ S2鍵閉合,跳S2鍵處理標號Pkey2
- JB ACC.3,Pkey3 ;/ S3鍵閉合,跳S3鍵處理標號Pkey3
- JB ACC.4,Pkey4 ;/ S4鍵閉合,跳S4鍵處理標號Pkey4
- JB ACC.5,Pkey5 ;/ S5鍵閉合,跳S5鍵處理標號Pkey5
- JB ACC.6,Pkey6 ;/ S6鍵閉合,跳S6鍵處理標號Pkey6
- JB ACC.7,Pkey7 ;/ S7鍵閉合,跳S7鍵處理標號Pkey7
- LJMP RETURN ;/ 查詢結束,重新開始
- 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 ;/ 設置地址偏移量
- MOVC A,@A+DPTR ;/ 查表取得數據,送A
- CJNE A,#01H,AP1 ;/ 判斷A中數據是否為結束符01H,不是則跳AP1繼續執行
- LJMP START2 ;/ 是結束符01H,跳START2繼續執行
- AP1: MOV R0,#7CH ;/ PA口地址7CH送入DPTR
- MOVX @R0,A ;/ 將A送PA口輸出
- INC DPTR ;/ 指針加1
- LJMP AP0 ;/ 跳AP0執行循環體
- START2: MOV DPTR,#TABLE ;/ 指針指向表頭地址
- BP0: MOV A,#00H ;/ 設置地址偏移量
- MOVC A,@A+DPTR ;/ 查表取得數據,送A
- CJNE A,#01H,BP1 ;/ 判斷A中數據是否為結束字符01H,不是則跳BP1繼續執行
- LJMP START3 ;/ 是結束符01H,跳START3繼續執行
- BP1: MOV R0,#7DH ;/ PB口地址7DH送入DPTR
- MOVX @R0,A ;/ 將A送PB口輸出
- INC DPTR ;/ 指針加1
- LJMP BP0 ;/ 跳BP0執行循環體
- START3: MOV DPTR,#TABLE ;/ 指針指向表頭地址
- CP0: MOV A,#00H ;/ 設置地址偏移量
- MOVC A,@A+DPTR ;/ 查表取得數據,送A
- CJNE A,#01H,CP1 ;/ 判斷A中數據是否為結束字符01H,不是則跳CP1繼續執行
- LJMP LD2 ;/ 是結束符01H,跳LD2繼續執行
- CP1: MOV R0,#7DH ;/ PC口地址7DH送入DPTR
- MOVX @R0,A ;/ 將A送PC口輸出
- INC DPTR ;/ 指針加1
- LJMP CP0 ;/ 跳CP0執行循環體
- 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 ;/ 設置指針偏移量
- MOVC A,@A+DPTR ;/ 查表取得數據,送A
- CJNE A,#01H,AP1 ;/ 判斷A中數據是否為結束字符01H,不是則跳AP11繼續執行
- LJMP START5 ;/ 是結束字符跳START5繼續執行
- AP11: MOV R0,#7CH ;/ PA口地址7CH送入DPTR
- MOVX @R0,A ;/ 將A送PA口輸出
- INC DPTR ;/ 指針加1
- LJMP AP01 ;/ 跳AP01執行循環體
- 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 ;/ 延時10ms子程序,采用雙重循環
- D1: MOV R6,#200
- DJNZ R6,[ DISCUZ_CODE_1 ]nbsp; ;/ R6減1非0,原地跳轉
- DJNZ R7,D1
- RET
- RETURN: RETI ;/ INTO*中斷返回
- TABLE: DB 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH
- DB 01H
- END
復制代碼
|