欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于單片機匯編語言和proteus的最新搶答器設計
[打印本頁]
作者:
xianzhezhishi
時間:
2018-6-2 18:10
標題:
基于單片機匯編語言和proteus的最新搶答器設計
畢業設計做的項目,用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
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1