8位竞赛抢答器程序与仿真图

更新时间:2024-04-23 02:58:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

8位竞赛抢答器的设计

设计要求

以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0~S7表示。

设置一个系统清除和抢答控制开关S,开关由主持人控制。

抢答器具有锁存与显示功能。即选手按按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止。

抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。 当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间为0.5s左右。

参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。

如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。

通过键盘改变抢答的时间,原理与闹钟时间的设定相同,将定时时间的变量置为全局变量后,通过键盘扫描程序使每按下一次按键,时间加1(超过30时置0)。同时单片机不断进行按键扫描,当参赛选手的按键按下时,用于产生时钟信号的定时计数器停止计数,同时将选手编号(按键号)和抢答时间分别显示在LED上。

程序:

ORG 0000H LJMP MAIN ORG 0003H LJMP SHESH ORG 000BH LJMP IT0P ORG 0100H

MAIN: MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H SETB EA SETB ET0 跳沿触发。 SETB EX0 SETB IT0 MOV R4,#30 MOV R3,#0AH

//定时器 T0工作于方式1 //1秒的初值

//开总中断,T0中断,外部中断0开启,外部中断

// R4存放30,用于存放倒计时初值

MOV R7,#0AH // 个十百初始显示\,R3存放选手编号,R7存放倒计时的十位,R6存放倒计时的个位 MOV R6,#0AH MOV R0,#30 //R0存放倒计时的显示值,初值设为30 LCALL XIANSH2 STAR: setb P3.6 //关喇叭 MOV R1,#00H 从等待中断中返回到初始

//=========复位部分程序====== FW: JNB P3.1,FW1 JMP FW FW1: LCALL DELAY JNB P3.1,FW2 JMP FW FW2: MOV R3,#0BH 的代码

MOV A,R4 MOV R0,A LCALL XIANSH1

//=========开始部分程序====== SAM: JNB P3.0,PK JMP SAM PK: JNB P3.0,PK1 JMP SAM PK1: MOV R3,#0BH SETB TR0 MOV R2,#0AH HERE: CJNE R1,#01H,YY 入STAR

JMP STAR YY: JMP HERE

//=======中断程序======= IT0P: CLR TR0 DEC R2 CJNE R2,#05H,JX0 clr P3.6

JX0: CJNE R2,#00H,JX1 setb P3.6 DEC R0 LCALL XIANSH1 MOV R2,#0AH JX1: LCALL SAMO

CJNE R1,#01H,JX2 返回 JMP RETURN JX2: JNB P3.1,PK2 JMP CZ PK2: LCALL DELAY //选手按键,复位按键,无人抢答的标志位,用于 //预判 复位键按下否 //去抖动,判断是否真按下 //复位按下,则存放选手编号的R3,放入\灭\//倒计时初值R4放入显示倒计时寄存器R0中 //扫描开始键是否按下 //按下则R3存\灭\代码, //启动定时器 //中断次数设为10次,刚好1秒 //若R1中存放的选手按键标志位为1,则转 //否则继续循环 等待中断 // 中断5次后,开启扬声器 //中断10次后,关闭扬声器,这样喇叭响0.5秒 //R2中再存入中断次数 //扫描选手按键标志位R1,未按下则转JX2 ,按下则 //检测复位键按下否

JNB P3.1,QFW JMP CZ

QFW: MOV R1,#01H JMP RETURN //按下则返回 CZ: CJNE R0,#00H,CZ1 //倒计时是否计时完毕 clr P3.6 //及时完毕 无人抢答则扬声器开启 LCALL DELAY5 MOV R1,#01H JMP RETURN CZ1: MOV TH0,#3CH MOV TL0,#0B0H SETB TR0 RETURN: RETI

//========选手键盘扫描程序======== SAMO: JNB P1.0,XS1 JNB P1.1,XS2 JNB P1.2,XS3 JNB P1.3,XS4 JNB P1.4,XS5 JNB P1.5,XS6 JNB P1.6,XS7 JNB P1.7,XS80 RETURN2:RET XS80: LJMP XS8 XS1: LCALL DELAY JNB P1.0,XS11 JMP RETURN2 XS11: MOV R1,#01H setb P3.6 MOV R3,#01H LCALL XIANSH1 JMP RETURN2 XS2: LCALL DELAY

JNB P1.1,XS22 JMP RETURN2 XS22: MOV R1,#01H setb P3.6 MOV R3,#02H LCALL XIANSH1 JMP RETURN2 XS3: LCALL DELAY

JNB P1.2,XS33 JMP RETURN2 XS33: MOV R1,#01H setb P3.6 MOV R3,#03H LCALL XIANSH1 JMP RETURN2 XS4: LCALL DELAY

//延时1秒 //R1设1 //中断返回 //计时器初值重装 //预扫描 选手按键是否按下 //未按下则返回 //去抖动再判是否按下 //按下则 显示1号 扬声器关闭 //按下则 显示2号 扬声器关闭 //按下则 显示3号 扬声器关闭 JNB P1.3,XS44 JMP RETURN2 XS44: MOV R1,#01H setb P3.6 MOV R3,#04H LCALL XIANSH1 JMP RETURN2 XS5: LCALL DELAY

JNB P1.4,XS55 JMP RETURN2 XS55: MOV R1,#01H setb P3.6 MOV R3,#05H LCALL XIANSH1 JMP RETURN2 XS6: LCALL DELAY

JNB P1.5,XS66 JMP RETURN2 XS66: MOV R1,#01H setb P3.6 MOV R3,#06H LCALL XIANSH1 JMP RETURN2 XS7: LCALL DELAY

JNB P1.6,XS77 JMP RETURN2 XS77: MOV R1,#01H setb P3.6 MOV R3,#07H LCALL XIANSH1 JMP RETURN2 XS8: LCALL DELAY

JNB P1.7,XS88 JMP RETURN2 XS88: MOV R1,#01H setb P3.6 MOV R3,#08H LCALL XIANSH1 JMP RETURN2 //=========显示程序====== XIANSH1:MOV A,R0 MOV B,#0AH 位 DIV AB MOV R7,A

MOV R6,B XIANSH2:SETB P0.4 CLR P0.5

CLR P0.6

//按下则 显示4号 扬声器关闭

//按下则 显示5号 扬声器关闭

//按下则 显示6号 扬声器关闭

//按下则 显示7号 扬声器关闭

//按下则 显示8号 扬声器关闭

//R0中存放的倒计时显示值 除10 分出十位和个

//十位存入R7中 //个位存入R6中

//选择选手编号的数码管

MOV A,R3 MOV DPTR,#SEGTAB //调入代码 MOVC A,@A+DPTR MOV P2,A //显示选手编号 CLR P0.4 SETB P0.5 //选择显示十位的数码管 CLR P0.6 MOV A,R7 MOV DPTR,#SEGTAB //调入代码 MOVC A,@A+DPTR MOV P2,A //显示十位 CLR P0.4 CLR P0.5 //选择显示个位的数码管 SETB P0.6 MOV A,R6 MOV DPTR,#SEGTAB //调入代码 MOVC A,@A+DPTR MOV P2,A //显示个位 RET

//=======抢答时间设置程序====== SHESH:INC R0 //倒计时初值加1 CJNE R0,#31,BQL //倒计时初值设置超过30 自动清零 MOV R0,#00H BQL: MOV R3,#0BH MOV A,R0 //倒计时初值存入其专用寄存器R4中,这样可以全局不变,R0会倒计时中递减而改变 MOV R4,A LCALL XIANSH1 RETI

//====10ms延时程序(去抖动)==== DELAY: MOV R7,#20 D1: MOV R6,#248 D2: DJNZ R6,D2 DJNZ R7,D1 RET

//1s延时程序(无人抢答报警)==== DELAY5:MOV R7,#40 DL1: MOV R6,#50 DL2: MOV R5,#248 DL3: DJNZ R5,DL3 DJNZ R6,DL2 DJNZ R7,DL1 RET

//======数码管显示调用代码======

SEGTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,8EH,0FFH //0,1,2,3,4,5,6,7,8,9,F,灭 END

说明:

仿真开始 显示FFF;

按下 复位 键 显示倒计时初值,起初设的是30秒;

再按下 设时 键,按一下计数初值加1,到30自动清零; 按下 开始 键 开始倒计时,每减一,有0.5秒的声响;

当有选手按下,则倒计时停止,显示当前倒计时数值和选手编号; 若在倒计时计数到0,无人抢答 则有1秒声响的报警。

说明:

仿真开始 显示FFF;

按下 复位 键 显示倒计时初值,起初设的是30秒;

再按下 设时 键,按一下计数初值加1,到30自动清零; 按下 开始 键 开始倒计时,每减一,有0.5秒的声响;

当有选手按下,则倒计时停止,显示当前倒计时数值和选手编号; 若在倒计时计数到0,无人抢答 则有1秒声响的报警。

本文来源:https://www.bwwdw.com/article/q0ap.html

Top