畢業設計做的項目,用proteus和keil軟件做的搶答器,下面是仿真原理圖:
11.png (319.32 KB, 下載次數: 51)
下載附件
2018-6-2 18:09 上傳
0.png (49.15 KB, 下載次數: 56)
下載附件
2018-6-2 18:23 上傳
單片機匯編語言源程序如下:
- SO BIT 2FH.0 ;發聲標志
- RESET EQU P2.0 ;搶答復位與設定時間
- STA EQU P2.1 ;搶答開始
- TTIME EQU 10H ;暫存時間16進制
- TIME EQU 15H ;時間10進制
- PL EQU 12H ;搶答到的人
- TEAM EQU 39H ;搶答到的人所在組
- ;LCD n的程序為顯示子程序
- ;F0為時間是否已到與
- KEY0 EQU P3.3
- KEY1 EQU P3.4
- FLAGT EQU 2FH.1 ;是否進HOLDON循環標志
- ANS EQU P2.2 ;回答按鍵
- FLAG0 EQU 2FH.2 ;選手編號跳出循環標志
- WRO EQU P2.6 ;搶答正確與否
- RIG EQU P2.7
- ORG 0000H
- LJMP MAIN
- ORG 000BH
- LJMP T00
- ORG 001BH
- LJMP T11
- ;******************************************************************************************************
- ;初始設置
- MAIN:
- MOV SP,#50H
- MOV 18H,#0FFH
- MOV TMOD,#11H
- MOV TH0,#3CH
- MOV TL0,#0B0H
- MOV TH1,#0FCH
- MOV TL1,#18H
- SETB EA
- SETB ET0
- SETB ET1
- SETB TR1
- CLR F0
- CLR SO
- CLR KEY0 ;矩陣式鍵盤初始化
- SETB KEY1
- ;******************************************************************************************************
- ;復位位置
- INI:
- CLR SO ;停止發聲
- CLR FLAGT
- CLR FLAG0
- CLR TR0
- MOV TTIME,#30 ;設置30S計時時間
- MOV PL,#00
- MOV A,TTIME ;計時時間10進制
- MOV B,#10
- DIV AB
- SWAP A
- ADD A,B
- MOV TIME,A ;TIME計時時間10進制
- MOV 11H,#20 ;設置11H計時中間點1秒
- LCALL Init_M7219 ;數碼管等器件初始顯示
- LCALL LCD2 ;顯示ready
- LCALL DELAYX
- ;******************************************************************************************************
- ;判斷開關是否按下
- ST0:
- LCALL DISPLAY
- JB RESET,ST1 ;判斷是否需要調整時間
- JNB SO,NEXT1
- JNB RESET,INI ;作弊復位
- NEXT1:
- LCALL DELAYX
- INC TTIME ;這里設置為加1調整,
- MOV A,TTIME
- MOV B,#10
- DIV AB
- SWAP A
- ADD A,B
- MOV TIME,A ;顯示時間進制轉換
- MOV A,TTIME
- CLR C
- CJNE A,#31,ST1 ;最高允許30s,也是默認值
- MOV TTIME,#01H
- MOV TIME,#01H ;超出30s重置為1s開始
- ;******************************************************************************************************
- ;判斷是否有人作弊
- ST1:
- LCALL MAT
- MOV A,P1
- CPL A
- MOV B,A
- JZ NEXT
- MOV CHEATER,#00H;
- DEAL0: ;將P0口讀到的數據轉換至對應作弊選手編號(移位)
- CLR C ;移位前準備
- RRC A
- CLR C
- INC CHEATER ;移位計數,獲得作弊選手號
- JNZ DEAL0
- MOV A,CHEATER
- MOV A,#00H
- ADD A,TEAM
- ADD A,CHEATER ;得到編號
- MOV B,#10
- DIV AB
- MOV TEAM,A
- MOV CHEATER,B
- SETB SO ;發聲報警
- LCALL LCD1
- NEXT:
- JB STA,ST0 ;沒有開關按下,返回判斷是否修正時間,否則執行搶答
- LCALL LCD3
- SETB F0 ;循環標志,后續用于跳出循環,時間到可使之置0
- SETB TR0 ;啟動定時
- LCALL DELAYSO ;短暫發聲
- ;******************************************************************************************************
- ;關鍵循環,用于判斷是否有按下
- START:
- JNB F0,HOLDON ;時間是否已到
- LCALL MAT ;矩陣式鍵盤子程序
- MOV A,P1
- XRL A,#0FFH
- JNZ HOLDON
- LJMP START
- ;******************************************************************************************************
- ;時間到或者有人搶答,轉入此循環等待
- HOLDON:
- MOV 17H,A ;A數據暫存
- CLR TR0 ;有人搶答停止計時
- H1:
- JB F0,H2
- LCALL LCD4 ;LCD顯示結束
- H2:
- JNB F0,HOLD
- LCALL LCD5 ;LCD顯示搶答成功
- HOLD:
- MOV A,17H ;數據恢復
- JZ CONTINUE ;用于下面移位轉換循環的執行條件
- MOV PL,#00H;
- SETB FLAGT ;有人搶答才置1
- DEAL: ;轉換
- CLR C
- RRC A
- CLR C ;移位轉換
- INC PL
- JNZ DEAL
- CONTINUE:
- JB FLAG0,KO
- ADD A,TEAM
- ADD A,PL ;得到編號
- MOV B,#10
- DIV AB
- MOV TEAM,A
- MOV PL,B
- SETB FLAG0
- MOV 17H,#00H
- SJMP KO
- ST00:
- LJMP INI
- KO:
- JNB FLAGT,$+6
- JNB ANS,ANSWER ;回答倒計時
- JNB RESET,ST00 ;按下復位鍵后回到起始狀態,但由于此處轉移字節已超過128B,所以迂回使用了LJMP
- SETB SO
- LCALL DISPLAY
- AJMP HOLD ;否則維持狀態
- ;******************************************************************************************************
- ;回答倒計時
- ANSWER:
- CLR SO ;停止報警
- MOV TTIME,#31 ;默認回答倒計時30S
- SETB TR0
- LCALL LCD6 ;LCD顯示
- L1:
- JNB TR0,L3 ;封鎖
- JB WRO,L2 ;回答正確與否
- LCALL LCD7
- CLR TR0
- L2:
- JB RIG,L1
- LCALL LCD8
- CLR TR0
- L3:
- JB RESET,$
- LJMP INI
- ;******************************************************************************************************
- ;矩陣式鍵盤子程序
- MAT:
- CPL KEY0
- CPL KEY1
- JB KEY0,ELSE0
- MOV TEAM,#00H
- RET
- ELSE0:
- MOV TEAM,#08H
- RET
- ;******************************************************************************************************
- ;MAX7219顯示程序
- M7219_CLK BIT P3.2
- M7219_DIN BIT P3.0
- M7219_LOAD BIT P3.1
- LED_BUF EQU 50H
- SET_MODEL EQU 0FFH
- SET_BRIGHT EQU 04H
- SET_LIMIT EQU 03H
- SET_NORMAL EQU 01H
- SET_START EQU 01H
- DISPLAY:
- MOV A,#00H
- JNB FLAGT,GVA0;是否搶答
- MOV A,PL
- GVA0:
- MOV B,A;TTIME送端口
- MOV A,#01H
- LCALL w_7219;放入MAX7290子程序
- JB FLAGT,GVA
- MOV A,#00H
- SJMP GVA2
- GVA:
- MOV A,TEAM
- GVA2:
- MOV B,A
- MOV A,#02H
- LCALL w_7219
- MOV A,TIME
- ANL A,#0FH
- MOV B,A
- MOV A,#03H
- LCALL w_7219
- MOV A,TIME
- SWAP A
- ANL A,#0FH
- MOV B,A
- MOV A,#04H
- LCALL w_7219
- LCALL DELAY
- RET
- INIT_M7219: ;初始化MAX7219
- MOV A,#0BH
- MOV B,#SET_LIMIT
- LCALL W_7219
- MOV A,#09H
- MOV B,#SET_MODEL
- LCALL W_7219
- MOV A,#0AH ;設置亮度
- MOV B,#SET_BRIGHT ;15/32亮度
- LCALL W_7219
- MOV A,#0FH
- MOV B,#SET_NORMAL
- LCALL W_7219
- MOV A,#0CH
- MOV B,#SET_START
- LCALL W_7219
- RET
- DISP:
- MOV R0,#LED_BUF
- MOV R4,#01H
- MOV R3,#SET_LIMIT
- DISP1:
- MOV A,@R0
- MOV B,A
- MOV A,R4
- LCALL W_7219
- INC R0
- INC R4
- DJNZ R3,DISP1
- RET
- W_7219:
- CLR M7219_CLK
- CLR M7219_DIN
- CLR M7219_LOAD ;置LOAD=0
- LCALL SD_7219 ;傳送7219的地址
- MOV A,B
- LCALL SD_7219 ;傳送數據
- SETB M7219_LOAD ;數據裝載
- CLR M7219_DIN
- RET
- SD_7219: ;向7219送地址與數據
- MOV R2,#08H
- C_SD: CLR C
- CLR M7219_CLK
- RLC A
- MOV M7219_DIN,C ;準備數據
- NOP
- SETB M7219_CLK ;上升沿將數據傳入
- NOP
- NOP
- CLR M7219_CLK
- DJNZ R2,C_SD
- RET
- ;******************************************************************************************************
- ;LCD顯示程序
- RS EQU P2.3
- RW EQU P2.4
- E EQU P2.5
- LCD EQU P0
- BF EQU P0.7
- CHEATER EQU 36H
- ;LCD顯示區 (LCD顯示內容)
- LCD1:
- LCALL LCDINI
- MOV A,#84H
- LCALL W_CMD
- MOV DPTR,#TAB
- MOV R7,#0 ;CHEAT
- LP1:
- MOV A,R7
- MOVC A,@A+DPTR
- LCALL W_DATA
- INC R7
- CJNE R7,#06,LP1
- MOV A,#32;空格
- LCALL W_DATA
- MOV A,#30H
- ADD A,TEAM
- LCALL W_DATA
- MOV A,#30H
- ADD A,CHEATER
- LCALL W_DATA
- MOV A,#0C6H
- ACALL W_CMD
- LP2:
- MOV A,R7
- MOVC A,@A+DPTR
- LCALL W_DATA
- INC R7
- CJNE R7,#11,LP2
- RET
- LCD2:
- LCALL LCDINI
- MOV A,#85H
- LCALL W_CMD
- MOV DPTR,#READY
- MOV R7,#0 ;READY
- LP11:
- MOV A,R7
- MOVC A,@A+DPTR
- LCALL W_DATA
- INC R7
- CJNE R7,#5,LP11
- RET
- LCD3:
- LCALL LCDINI
- MOV A,#84H
- LCALL W_CMD
- MOV DPTR,#REACING
- MOV R7,#0 ;REACING
- LP111:
- MOV A,R7
- MOVC A,@A+DPTR
- LCALL W_DATA
- INC R7
- CJNE R7,#7,LP111
- RET
- LCD4:
- LCALL LCDINI
- MOV A,#86H
- LCALL W_CMD
- MOV DPTR,#OVER
- MOV R7,#0 ;OVER
- LP1111:
- MOV A,R7
- MOVC A,@A+DPTR
- LCALL W_DATA
- INC R7
- CJNE R7,#4,LP1111
- RET
- LCD5:
- LCALL LCDINI
- MOV A,#86H
- LCALL W_CMD
- MOV DPTR,#DONE
- MOV R7,#0 ;DONE
- LP11111:
- MOV A,R7
- MOVC A,@A+DPTR
- LCALL W_DATA
- INC R7
- CJNE R7,#4,LP11111
- RET
- LCD6:
- LCALL LCDINI
- MOV A,#83H
- LCALL W_CMD
- MOV DPTR,#ANSWERING
- MOV R7,#0 ;ANSWERING
- LP111111:
- MOV A,R7
- MOVC A,@A+DPTR
- LCALL W_DATA
- INC R7
- CJNE R7,#9,LP111111
- RET
- LCD7:
- LCALL LCDINI
- MOV A,#85H
- LCALL W_CMD
- MOV DPTR,#RIGHT
- MOV R7,#0 ;RIGHT
- LP1111111:
- MOV A,R7
- MOVC A,@A+DPTR
- LCALL W_DATA
- INC R7
- CJNE R7,#5,LP1111111
- RET
- LCD8:
- LCALL LCDINI
- MOV A,#85H
- LCALL W_CMD
- MOV DPTR,#WRONG
- MOV R7,#0 ;WRONG
- LP111111111:
- MOV A,R7
- MOVC A,@A+DPTR
- LCALL W_DATA
- INC R7
- CJNE R7,#5,LP111111111
- RET
- ;LCD初始化
- LCDINI:
- MOV A,#38H
- LCALL W_CMD
- MOV A,#0CH
- LCALL W_CMD
- MOV A,#06H
- LCALL W_CMD
- MOV A,#01H
- LCALL W_CMD
- RET
- W_CMD:
- ACALL WAIT
- CLR RS
- CLR RW
- MOV LCD,A
- SETB E
- CLR E
- RET
- W_DATA:
- ACALL WAIT
- SETB RS
- CLR RW
- MOV LCD,A
- SETB E
- CLR E
- RET
- WAIT:
- MOV R6,#20
- W1:
- MOV R5,#250
- DJNZ R5,$
- DJNZ R6,W1
- RET
- ;******************************************************************************************************
- ;延遲1
- DELAY: ;延遲用于MAX7219,7219在循環中寫入不能過快
- MOV R7,#02H
- DELAY0:
- MOV R6,#0AH
- DELAY1:
- MOV R5,#0AH
- DELAY2:
- DJNZ R5,DELAY2
- DJNZ R6,DELAY1
- DJNZ R7,DELAY0
- RET
- ;延遲2
- DELAYX: ;RESET鍵軟件防抖動,以及長按設置時間時的時間輪轉速度
- LCALL DELAY
- LCALL DELAY
- LCALL DELAY
- LCALL DELAY
- DJNZ 18H,DELAYX
- RET
- ;延遲3
- DELAYSO: ;開始開關按下短時發聲延時
- SETB SO
- ACALL DELAYX
- CLR SO
- RET
- ;******************************************************************************************************
- ;中斷
- ;定時器T0中斷
- T00: ;定時器t0中斷
- MOV TH0,#3CH
- MOV TL0,#0B0H ;50ms定時
- DJNZ 11H,RETI1
- MOV 11H,#20 ;1s定時
- MOV A,TTIME
- DEC A
- MOV B,#10
- DIV AB
- SWAP A
- ADD A,B
- MOV TIME,A ;定時進制轉換16轉10
- LCALL DISPLAY
- DJNZ TTIME,RETI1
- CLR TR0 ;自停止
- CLR F0 ;時間到無人搶答清零F0跳出檢測循環
- SETB SO ;發聲
- RETI1:
- RETI
- ;定時器1中斷,頻率1KHZ,用于喇叭發聲
- T11:
- MOV TH1,#0FCH
- MOV TL1,#18H
- JNB SO, RETT11 ;判斷發聲標志位SO
- CPL P3.7
- RETT11:
- RETI
- ;******************************************************************************************************
- ;LCD顯示表
- TAB:
- DB 'PLAYER'
- DB 'CHEAT'
- READY:
- DB 'READY'
- REACING:
- DB 'REACING'
- OVER:
- DB 'OVER'
- DONE:
- DB 'DONE'
- ANSWERING:
- DB 'ANSWERING'
- RIGHT:
- DB 'RIGHT'
- WRONG:
- DB 'WRONG'
- END
復制代碼
所有資料51hei提供下載:
程序及仿真.rar
(36.86 KB, 下載次數: 25)
2018-6-2 18:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|