一、整体功能概述本程序基于 STC8 系列单片机搭建单路优先抢答锁存系统配备 7 路抢答按键、1 路复位解锁按键、1 位共阳极数码管、有源 / 无源蜂鸣器。系统分为等待抢答未上锁、** 抢答锁定已上锁** 两种工作状态实现抢答优先锁定、抢答编号显示、声光提示、一键复位重置全套抢答逻辑适用于小型课堂、竞赛简易抢答场景。二、硬件资源分配抢答按键P2 口输入低电平触发KEY1~KEY77 路选手抢答按键分别对应 1~7 号参赛选手 KEY_RST (P2^0)系统复位解锁按键显示模块P0 口直驱 1 位共阳极数码管仅显示 0~7 数字声光提示P3^6 控制蜂鸣器通过高频方波发声做抢答、解锁提示IO 配置P2 全端口高阻输入按键P0、P3 准双向输出。三、两种工作模式详细功能模式 1未上锁等待抢答状态flag_lock0默认上电状态数码管默认显示数字0代表暂无选手抢答程序循环扫描 KEY1~KEY7 全部抢答按键任意选手按下对应抢答键后执行锁定逻辑 1立即置位上锁标志flag_lock1系统进入抢答锁定 2数码管切换为当前抢答选手编号按 KEY1 显示 1、KEY2 显示 2……KEY7 显示 7 3蜂鸣器持续发声提示抢答成功1 号键提示音时长更长2~7 号提示音较短 4按键松手前持续阻塞扫描避免重复触发锁定后立刻屏蔽所有抢答按键其余后按下按键无任何响应保证先按优先。模式 2已上锁抢答锁定状态flag_lock1系统不再检测 KEY1~KEY7 所有抢答按键后续选手抢答操作无效数码管保持显示最先抢答选手的编号仅响应复位解锁按键 KEY_RST 1按下复位键消抖确认后清除上锁标志flag_lock0 2数码管清零回到显示 0 3蜂鸣器短音提示解锁完成 4等待复位键松手系统自动回到等待抢答模式开启下一轮抢答。四、配套辅助功能按键消抖所有按键按下均加入 10ms 延时消抖避免机械按键抖动误触发数码管边界保护仅 0~7 号数字输出有效段码超出范围数码管全熄灭防止数组越界蜂鸣器控制发声结束自动拉低电平关闭避免持续异响上电初始化开机自动关闭蜂鸣器、清零显示、解锁待命#include STC8.H typedef unsigned char uchar; typedef unsigned int uint; // IO引脚定义 sbit KEY1 P2^7; sbit KEY2 P2^6; sbit KEY3 P2^5; sbit KEY4 P2^4; sbit KEY5 P2^3; sbit KEY6 P2^2; sbit KEY7 P2^1; sbit KEY_RST P2^0; // 复位解锁按键 sbit BEEP P3^6; // 蜂鸣器输出 // 共阳极数码管段码 0~7 uchar code seg_table[] {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8}; bit flag_lock 0; // 上锁标志 0未锁 1已锁 uchar num 0; // 当前显示数字 0~7 // 10us延时函数 void delay_10us(uchar ten_us) { while(ten_us--); } // ms级延时 void delay_ms(uint ms) { uint i,j; for(i ms; i 0; i--) for(j 1100; j 0; j--); } // 数码管显示函数无锁存P0直出段码 void display(uchar dat) { if(dat 7) // 边界保护防止数组越界 P0 seg_table[dat]; else P0 0xFF; // 超出0~7全灭 } // 蜂鸣器短促报警函数n为发声时长 void alarmBeep(uchar nums) { while(nums 0) { BEEP !BEEP; delay_10us(500); nums--; } BEEP 0; // 关闭蜂鸣 } // 按键扫描函数 void key_scan(void) { // 上锁状态只检测复位解锁键 if(flag_lock 1) { if(KEY_RST 0) { delay_ms(10); // 消抖 if(KEY_RST 0) { flag_lock 0; num 0; BEEP 0; alarmBeep(100); // 解锁提示音 while(KEY_RST 0); // 等待松手 } } return; // 上锁后不再扫描数字按键 } // 未上锁状态扫描1~7数字按键 if(KEY1 0) { delay_ms(10); if(KEY1 0) { flag_lock 1; num 1; alarmBeep(800); // 上锁长报警提示 while(KEY1 0); } } else if(KEY2 0) { delay_ms(10); if(KEY2 0) { flag_lock 1; num 2; alarmBeep(300); while(KEY2 0); } } else if(KEY3 0) { delay_ms(10); if(KEY3 0) { flag_lock 1; num 3; alarmBeep(300); while(KEY3 0); } } else if(KEY4 0) { delay_ms(10); if(KEY4 0) { flag_lock 1; num 4; alarmBeep(300); while(KEY4 0); } } else if(KEY5 0) { delay_ms(10); if(KEY5 0) { flag_lock 1; num 5; alarmBeep(300); while(KEY5 0); } } else if(KEY6 0) { delay_ms(10); if(KEY6 0) { flag_lock 1; num 6; alarmBeep(300); while(KEY6 0); } } else if(KEY7 0) { delay_ms(10); if(KEY7 0) { flag_lock 1; num 7; alarmBeep(300); while(KEY7 0); } } } void main(void) { // IO口模式配置 STC8寄存器 P0M0 0x00; P0M1 0x00; // P0准双向输出 数码管段码 //P1M0 0x00; P1M1 0x00; // P1闲置准双向 P2M0 0xFF; P2M1 0x00; // P2全部高阻输入 按键 P3M0 0x00; P3M1 0x00; // P3准双向 蜂鸣器 BEEP 0; // 开机关闭蜂鸣 flag_lock 0; num 0; // 主循环持续扫键刷新显示 while(1) { key_scan(); display(num); } }无需手动复位。五、工作流程总结上电初始化 → 数码管显示 0等待抢答 → 任意选手按键抢答 → 锁定系统、显示选手编号、蜂鸣提示、屏蔽其他按键 → 主持人按下复位键解锁 → 数码管清零重新进入抢答等待循环。
普中 ATC8A 抢答器功能
发布时间:2026/7/11 2:01:55
一、整体功能概述本程序基于 STC8 系列单片机搭建单路优先抢答锁存系统配备 7 路抢答按键、1 路复位解锁按键、1 位共阳极数码管、有源 / 无源蜂鸣器。系统分为等待抢答未上锁、** 抢答锁定已上锁** 两种工作状态实现抢答优先锁定、抢答编号显示、声光提示、一键复位重置全套抢答逻辑适用于小型课堂、竞赛简易抢答场景。二、硬件资源分配抢答按键P2 口输入低电平触发KEY1~KEY77 路选手抢答按键分别对应 1~7 号参赛选手 KEY_RST (P2^0)系统复位解锁按键显示模块P0 口直驱 1 位共阳极数码管仅显示 0~7 数字声光提示P3^6 控制蜂鸣器通过高频方波发声做抢答、解锁提示IO 配置P2 全端口高阻输入按键P0、P3 准双向输出。三、两种工作模式详细功能模式 1未上锁等待抢答状态flag_lock0默认上电状态数码管默认显示数字0代表暂无选手抢答程序循环扫描 KEY1~KEY7 全部抢答按键任意选手按下对应抢答键后执行锁定逻辑 1立即置位上锁标志flag_lock1系统进入抢答锁定 2数码管切换为当前抢答选手编号按 KEY1 显示 1、KEY2 显示 2……KEY7 显示 7 3蜂鸣器持续发声提示抢答成功1 号键提示音时长更长2~7 号提示音较短 4按键松手前持续阻塞扫描避免重复触发锁定后立刻屏蔽所有抢答按键其余后按下按键无任何响应保证先按优先。模式 2已上锁抢答锁定状态flag_lock1系统不再检测 KEY1~KEY7 所有抢答按键后续选手抢答操作无效数码管保持显示最先抢答选手的编号仅响应复位解锁按键 KEY_RST 1按下复位键消抖确认后清除上锁标志flag_lock0 2数码管清零回到显示 0 3蜂鸣器短音提示解锁完成 4等待复位键松手系统自动回到等待抢答模式开启下一轮抢答。四、配套辅助功能按键消抖所有按键按下均加入 10ms 延时消抖避免机械按键抖动误触发数码管边界保护仅 0~7 号数字输出有效段码超出范围数码管全熄灭防止数组越界蜂鸣器控制发声结束自动拉低电平关闭避免持续异响上电初始化开机自动关闭蜂鸣器、清零显示、解锁待命#include STC8.H typedef unsigned char uchar; typedef unsigned int uint; // IO引脚定义 sbit KEY1 P2^7; sbit KEY2 P2^6; sbit KEY3 P2^5; sbit KEY4 P2^4; sbit KEY5 P2^3; sbit KEY6 P2^2; sbit KEY7 P2^1; sbit KEY_RST P2^0; // 复位解锁按键 sbit BEEP P3^6; // 蜂鸣器输出 // 共阳极数码管段码 0~7 uchar code seg_table[] {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8}; bit flag_lock 0; // 上锁标志 0未锁 1已锁 uchar num 0; // 当前显示数字 0~7 // 10us延时函数 void delay_10us(uchar ten_us) { while(ten_us--); } // ms级延时 void delay_ms(uint ms) { uint i,j; for(i ms; i 0; i--) for(j 1100; j 0; j--); } // 数码管显示函数无锁存P0直出段码 void display(uchar dat) { if(dat 7) // 边界保护防止数组越界 P0 seg_table[dat]; else P0 0xFF; // 超出0~7全灭 } // 蜂鸣器短促报警函数n为发声时长 void alarmBeep(uchar nums) { while(nums 0) { BEEP !BEEP; delay_10us(500); nums--; } BEEP 0; // 关闭蜂鸣 } // 按键扫描函数 void key_scan(void) { // 上锁状态只检测复位解锁键 if(flag_lock 1) { if(KEY_RST 0) { delay_ms(10); // 消抖 if(KEY_RST 0) { flag_lock 0; num 0; BEEP 0; alarmBeep(100); // 解锁提示音 while(KEY_RST 0); // 等待松手 } } return; // 上锁后不再扫描数字按键 } // 未上锁状态扫描1~7数字按键 if(KEY1 0) { delay_ms(10); if(KEY1 0) { flag_lock 1; num 1; alarmBeep(800); // 上锁长报警提示 while(KEY1 0); } } else if(KEY2 0) { delay_ms(10); if(KEY2 0) { flag_lock 1; num 2; alarmBeep(300); while(KEY2 0); } } else if(KEY3 0) { delay_ms(10); if(KEY3 0) { flag_lock 1; num 3; alarmBeep(300); while(KEY3 0); } } else if(KEY4 0) { delay_ms(10); if(KEY4 0) { flag_lock 1; num 4; alarmBeep(300); while(KEY4 0); } } else if(KEY5 0) { delay_ms(10); if(KEY5 0) { flag_lock 1; num 5; alarmBeep(300); while(KEY5 0); } } else if(KEY6 0) { delay_ms(10); if(KEY6 0) { flag_lock 1; num 6; alarmBeep(300); while(KEY6 0); } } else if(KEY7 0) { delay_ms(10); if(KEY7 0) { flag_lock 1; num 7; alarmBeep(300); while(KEY7 0); } } } void main(void) { // IO口模式配置 STC8寄存器 P0M0 0x00; P0M1 0x00; // P0准双向输出 数码管段码 //P1M0 0x00; P1M1 0x00; // P1闲置准双向 P2M0 0xFF; P2M1 0x00; // P2全部高阻输入 按键 P3M0 0x00; P3M1 0x00; // P3准双向 蜂鸣器 BEEP 0; // 开机关闭蜂鸣 flag_lock 0; num 0; // 主循环持续扫键刷新显示 while(1) { key_scan(); display(num); } }无需手动复位。五、工作流程总结上电初始化 → 数码管显示 0等待抢答 → 任意选手按键抢答 → 锁定系统、显示选手编号、蜂鸣提示、屏蔽其他按键 → 主持人按下复位键解锁 → 数码管清零重新进入抢答等待循环。