;******************************************************************************** ;******************************************************************************** ;* ;*文本名称:抢答器.asm ;*功能:8路抢答,三位显视,答题时间可设,一位清零 ;*编译工具:MedWin(万利仿真软件) ;*编写日期: ;*修改日期: ;*编写作者:zusen ;*修改人: ;*联系方式:zusen@21cn.com ;******************************************************************************** ;******************************************************************************** ;********************************常数和内存分配定义******************************
ISP_DATA EQU 0E2H ISP_ADDRH EQU 0E3H ISP_ADDRL EQU 0E4H ISP_CMD EQU 0E5H ISP_TRIG EQU 0E6H ISP_CONTR EQU 0E7H ISP_IAP_BYTE_READ EQU 1 ISP_IAP_BYTE_PROGRAM EQU 2 ISP_IAP_SECTOR_ERASE EQU 3
T0_SIGN DATA 20H SPRING BIT T0_SIGN.0 T0_ORVE BIT T0_SIGN.1
DISPLAY1 DATA 30H ;显示组数 DISPLAY2 DATA 31H ;显示计数第一位 DISPLAY3 DATA 32H ;显示计数第二位
SCAN DATA 33H ;01时扫描组数,02扫描第一位,03扫描第二位 TS1_TMP DATA 34H DELAY_TIME1 DATA 35H ;延时绶冲 DELAY_TIME2 DATA 36H ;延时绶冲
PLAY_TMPE1 DATA 37H PLAY_TMPE2 DATA 38H
;********************************************************************************* ;********************************程序的开始*************************************** ;*定义中断程序的入口,初始化各寄存器和内存 ;********************************************************************************* ORG 0000H LJMP MAIN ;复位后的第一条指令 ORG 001BH LJMP T1_INT ;定时器0中断程序入口 ORG 0080H MAIN: MOV P0,#00 MOV P2,#00 MOV DISPLAY1,#00 MOV DISPLAY2,#09 MOV DISPLAY3,#00 MOV TS1_TMP,#100 MOV T0_SIGN,#00
MOV TMOD,#10H ;T0设为工作方式一 MOV TH1,#0ecH MOV TL1,#078H ;10ms为时间间隔 SETB EA SETB ET1 ;打开总中断控制器 SETB TR1 ;启动定时器 JNB P3.0,SET_TIME1 MOV ISP_ADDRH,#20H MOV ISP_ADDRL,#00H LCALL READ_ID MOV DISPLAY2,A MOV PLAY_TMPE1,A LCALL DELAY_10ms MOV ISP_ADDRH,#20H MOV ISP_ADDRL,#01H LCALL READ_ID MOV DISPLAY3,A MOV PLAY_TMPE2,A ; JNB P3.0,SET_TIME1 LJMP LOOP SET_TIME1: LJMP SET_TIME ;*********************************************************************************** ;**********************************主程序 ****************************************** ;*函数名称:LOOP ;*功能: 循环检测8组按钮是否按下 ;*入口函数:无 ;*输出数据:无 ;*********************************************************************************** LOOP: JNB P1.0,GROUP_ONE_POOL LOOP1: JNB P1.1,GROUP_TWO_POOL LOOP2: JNB P1.2,GROUP_THREE_POOL LOOP3: JNB P1.3,GROUP_FOUR_POOL LOOP4: JNB P1.4,GROUP_FIVE_POOL LOOP5: JNB P1.5,GROUP_SIX_POOL LOOP6: JNB P1.6,GROUP_SEVEN_POOL LOOP7: JNB P1.7,GROUP_EIGHT_POOL LOOP8: LJMP LOOP ;**********************************地址池 ****************************************** ;*函数名称: ;*功能: ;*入口函数:无 ;*输出数据:无 ;*********************************************************************************** GROUP_ONE_POOL: LJMP GROUP_ONE GROUP_TWO_POOL: LJMP GROUP_TWO GROUP_THREE_POOL: LJMP GROUP_THREE GROUP_FOUR_POOL: LJMP GROUP_FOUR GROUP_FIVE_POOL: LJMP GROUP_FIVE GROUP_SIX_POOL: LJMP GROUP_SIX GROUP_SEVEN_POOL: LJMP GROUP_SEVEN GROUP_EIGHT_POOL: LJMP GROUP_EIGHT ;*********************************************************************************** ;**********************************第一组 ****************************************** ;*函数名称:GROUP_ONE ;*功能: 第一组按下处理程序 ;*入口函数: ;*输出数据: ;*********************************************************************************** GROUP_ONE: SETB SPRING ;有组数响应 MOV DISPLAY1,#01H ;显示第一组抢到控制权 LCALL BUZZER ;响声提示 GROUP_ONE_1: JB T0_ORVE,GROUP_ONE_END ;倒计时结速 JNB P3.0,GROUP_ONE_END ;手动清零 LJMP GROUP_ONE_1 GROUP_ONE_END: CLR T0_ORVE CLR SPRING MOV DISPLAY1,#00H MOV DISPLAY2,PLAY_TMPE1 MOV DISPLAY3,PLAY_TMPE2 LJMP LOOP1 ;*********************************************************************************** ;**********************************第二组 ****************************************** ;*函数名称:GROUP_TWO ;*功能: 第二组按下处理程序 ;*入口函数: ;*输出数据: ;*********************************************************************************** GROUP_TWO: SETB SPRING ;有组数响应 MOV DISPLAY1,#02H ;显示第一组抢到控制权 LCALL BUZZER ;响声提示 GROUP_TWO_1: JB T0_ORVE,GROUP_TWO_END ;倒计时结速 JNB P3.0,GROUP_TWO_END ;手动清零 LJMP GROUP_TWO_1 GROUP_TWO_END: CLR T0_ORVE CLR SPRING MOV DISPLAY1,#00H MOV DISPLAY2,PLAY_TMPE1 MOV DISPLAY3,PLAY_TMPE2 LJMP LOOP2 ;*********************************************************************************** ;**********************************第三组 ****************************************** ;*函数名称:GROUP_THREE ;*功能: 第三组按下处理程序 ;*入口函数: ;*输出数据: ;*********************************************************************************** GROUP_THREE: SETB SPRING ;有组数响应 MOV DISPLAY1,#03H ;显示第一组抢到控制权 LCALL BUZZER ;响声提示 GROUP_THREE_1: JB T0_ORVE,GROUP_TWO_END ;倒计时结速 JNB P3.0,GROUP_THREE_END ;手动清零 LJMP GROUP_THREE_1 GROUP_THREE_END: CLR T0_ORVE CLR SPRING MOV DISPLAY1,#00H MOV DISPLAY2,PLAY_TMPE1 MOV DISPLAY3,PLAY_TMPE2 LJMP LOOP3 ;*********************************************************************************** ;**********************************第四组 ****************************************** ;*函数名称:GROUP_FOUR ;*功能: 第四组按下处理程序 ;*入口函数: ;*输出数据: ;*********************************************************************************** GROUP_FOUR: SETB SPRING ;有组数响应 MOV DISPLAY1,#04H ;显示第一组抢到控制权 LCALL BUZZER ;响声提示 GROUP_FOUR_1: JB T0_ORVE,GROUP_FOUR_END ;倒计时结速 JNB P3.0,GROUP_FOUR_END ;手动清零 LJMP GROUP_FOUR_1 GROUP_FOUR_END: CLR T0_ORVE CLR SPRING MOV DISPLAY1,#00H MOV DISPLAY2,PLAY_TMPE1 MOV DISPLAY3,PLAY_TMPE2 LJMP LOOP4 ;*********************************************************************************** ;**********************************第五组 ****************************************** ;*函数名称:GROUP_FIVE ;*功能: 第五组按下处理程序 ;*入口函数: ;*输出数据: ;*********************************************************************************** GROUP_FIVE: SETB SPRING ;有组数响应 MOV DISPLAY1,#05H ;显示第一组抢到控制权 LCALL BUZZER ;响声提示 GROUP_FIVE_1: JB T0_ORVE,GROUP_FIVE_END ;倒计时结速 JNB P3.0,GROUP_FIVE_END ;手动清零 LJMP GROUP_FIVE_1 GROUP_FIVE_END: CLR T0_ORVE CLR SPRING MOV DISPLAY1,#00H MOV DISPLAY2,PLAY_TMPE1 MOV DISPLAY3,PLAY_TMPE2 LJMP LOOP5 ;*********************************************************************************** ;**********************************第六组 ****************************************** ;*函数名称:GROUP_SIX ;*功能: 第五组按下处理程序 ;*入口函数: ;*输出数据: ;*********************************************************************************** GROUP_SIX: SETB SPRING ;有组数响应 MOV DISPLAY1,#06H ;显示第一组抢到控制权 LCALL BUZZER ;响声提示 GROUP_SIX_1: JB T0_ORVE,GROUP_SIX_END ;倒计时结速 JNB P3.0,GROUP_SIX_END ;手动清零 LJMP GROUP_SIX_1 GROUP_SIX_END: CLR T0_ORVE CLR SPRING MOV DISPLAY1,#00H MOV DISPLAY2,PLAY_TMPE1 MOV DISPLAY3,PLAY_TMPE2 LJMP LOOP6 ;*********************************************************************************** ;**********************************第七组 ****************************************** ;*函数名称:GROUP_SEVEN ;*功能: 第五组按下处理程序 ;*入口函数: ;*输出数据: ;*********************************************************************************** GROUP_SEVEN: SETB SPRING ;有组数响应 MOV DISPLAY1,#07H ;显示第一组抢到控制权 LCALL BUZZER ;响声提示 GROUP_SEVEN_1: JB T0_ORVE,GROUP_SEVEN_END ;倒计时结速 JNB P3.0,GROUP_SEVEN_END ;手动清零 LJMP GROUP_SEVEN_1 GROUP_SEVEN_END: CLR T0_ORVE CLR SPRING MOV DISPLAY1,#00H MOV DISPLAY2,PLAY_TMPE1 MOV DISPLAY3,PLAY_TMPE2 LJMP LOOP7 ;*********************************************************************************** ;**********************************第八组 ****************************************** ;*函数名称:GROUP_EIGHT ;*功能: 第五组按下处理程序 ;*入口函数: ;*输出数据: ;*********************************************************************************** GROUP_EIGHT: SETB SPRING ;有组数响应 MOV DISPLAY1,#08H ;显示第一组抢到控制权 LCALL BUZZER ;响声提示 GROUP_EIGHT_1: JB T0_ORVE,GROUP_EIGHT_END ;倒计时结速 JNB P3.0,GROUP_EIGHT_END ;手动清零 LJMP GROUP_EIGHT_1 GROUP_EIGHT_END:
CLR T0_ORVE CLR SPRING MOV DISPLAY1,#00H MOV DISPLAY2,PLAY_TMPE1 MOV DISPLAY3,PLAY_TMPE2 LJMP LOOP8 ;*********************************************************************************** ;**********************************T0中断入口 ************************************** ;*函数名称:T0_INT ;*功能: 定时、扫描和计数 ;*入口函数: ;*输出数据: ;*********************************************************************************** T1_INT: PUSH ACC PUSH PSW MOV TH1,#0ecH MOV TL1,#078H JNB SPRING,T1_INT_1 DJNZ TS1_TMP,T1_INT_1 MOV TS1_TMP,#200 MOV A,DISPLAY2 CJNE A,#00,COUNT1 MOV A,DISPLAY3 CJNE A,#00,COUNT0 MOV DISPLAY2,PLAY_TMPE1 MOV DISPLAY3,PLAY_TMPE2 MOV DISPLAY1,#00 CLR SPRING SETB T0_ORVE LJMP T1_INT_1 COUNT0:   |