### 51单片机抢答器程序解析 #### 一、程序背景及概述 本程序基于51系列单片机实现了一个简单的抢答器功能。抢答器是一种常见的电子设备,广泛应用于各类竞赛活动中,用于判断选手是否违规提前抢答。在本程序中,通过设定一定的倒计时时间来控制抢答的有效性,并通过LED显示器显示剩余时间以及蜂鸣器发出声音提示。 #### 二、程序结构与变量定义 程序首先包含了`reg51.h`头文件,这是51单片机C语言编程的基础头文件,提供了对51单片机寄存器的访问支持。 ##### 1. 数组定义 ```c unsigned char SData[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x8e,0xbf}; ``` 这个数组定义了数字0到9以及字母“f”的共阴极LED显示码。这些数据用于控制LED显示器显示数字。 ##### 2. 变量定义 - `unsigned char h`: 存储抢答者的编号。 - `unsigned char j, z=20`: `z`表示抢答预设时间初始值为20秒,`j`用于存储实际倒计时的时间。 - `unsigned char d, y=60`: `y`表示答题预设时间初始值为60秒,`d`用于存储实际答题的时间。 ##### 3. 引脚定义 程序通过`sbit`关键字定义了单片机各引脚的功能。例如: - `sbit beep = P3^6;`: 定义P3口第6位作为蜂鸣器的控制端口。 - `sbit P1_0 = P1^0;`: 定义P1口第0位作为输入端口之一。 #### 三、函数功能解析 ##### 1. `Delay`函数 ```c void Delay(unsigned int i) {unsigned char j; while(i--) { for(j=0;j<125;j++);//延迟1ms } } ``` 此函数用于产生延时效果,通过嵌套循环实现。延时时间的长短可通过传入参数`i`进行调整。 ##### 2. `ling`函数 ```c void ling() {beep=~beep; Delay(1);} ``` 该函数用于控制蜂鸣器的鸣响,通过取反`beep`的状态实现开关蜂鸣器。 ##### 3. `t`函数 ```c void t() {int N; beep=0; Delay(30); beep=1; while(1) {if(P3_4==0) break; while(d) for(d=y;d>0;d--) {for(N=25;N>0;N--) { P2=0x08; P0=SData[d%10];//个位 Delay(10); P2=0x04; P0=SData[d/10];//十位 Delay(10); P2=0x02; P0=SData[11]; Delay(10); P2=0x01; P0=SData[h];//选段 Delay(10);} } break; } } ``` 此函数实现答题倒计时功能。当`P3_4`被按下时,答题倒计时开始,倒计时结束后会跳出循环。 ##### 4. `c`函数 ```c void c() {while(1) {if(P3_4==0) break; P2=0x08; P0=SData[10];//个位 Delay(10); ling(); P2=0x04; P0=SData[10];//十位 Delay(10); ling(); P2=0x02; P0=SData[11]; Delay(10); ling(); P2=0x01; P0=SData[h];//选段 Delay(10); }} ``` 此函数用于显示当前状态,包括剩余时间和蜂鸣器的鸣响。 ##### 5. `jdshi`函数 ```c void jdshi()//预设抢答时间 {unsigned char i; while(1) {for(i=5;i>0;i--) {P2=0x08; P0=SData[j%10];//个位 Delay(15); P2=0x04; P0=SData[j/10];//十位 Delay(15); } if(P3_4==0)break; if(P3_2==0)j++; if(P3_3==0)j--; z=j; }} ``` 此函数允许用户通过按键调整抢答的预设时间。 ##### 6. `ddshi`函数 ```c void ddshi()//预设答题时间 {unsigned char i; while(1) {for(i=5;i>0;i--) {P2=0x08; P0=SData[d%10];//个位 Delay(15); P2=0x04; P0=SData[d/10];//十位 Delay(15); } if(P3_4==0)break; if(P3_2==0)d++; if(P3_3==0)d--; y=d; }} ``` 此函数允许用户通过按键调整答题的预设时间。 ##### 7. `daojishi`函数 ```c void daojishi() { int M;while(j) for(j=z;j>0;j--) {{for(M=25;M>0;M--) { if(P1_0==0){ling();h=1;t();} if(P1_1==0){ling();h=2;t();} if(P1_2==0){ling();h=3;t();} if(P1_3==0){ling();h=4;t();} if(P1_4==0){ling();h=5;t();} if(P1_5==0){ling();h=6;t();} if(P1_6==0){ling();h=7;t();} if(P1_7==0){ling();h=8;t();} P2=0x08; P0=SData[j%10];//个位 Delay(20); P2_3=0;P2=0x04; P0=SData[j/10];//十位 Delay(20); P2_2=0; } } } ``` 此函数实现抢答的倒计时功能。在倒计时期间,如果任意一个输入端口被按下,则认为该端口对应的选手抢答成功,并触发相应的动作(如显示抢答者编号、启动答题倒计时等)。 #### 四、主函数 ```c void main() {j=z;d=y; while(1) {P2=0x08; P0=SData[10]; Delay(10); P2=0x04; P0=SData[10]; Delay(10); ... } } ``` 主函数初始化抢答时间和答题时间,然后进入无限循环,不断刷新显示屏,显示当前状态。 ### 总结 本程序通过合理的函数划分实现了抢答器的基本功能,包括抢答时间的设定、答题时间的设定以及倒计时等功能。通过对单片机各引脚的合理利用,实现了对LED显示器和蜂鸣器的有效控制,使得整个抢答器系统既简单又实用。
unsigned char SData[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x8e,0xbf};//0~9,f -
unsigned char h;
unsigned char j,z=20;//抢答预调时初始值为 20
unsigned char d,y=60;//答题预调时初邕值为 60
sbit beep=P3^6;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
void Delay(unsigned int i)
{unsigned char j;
while(i--)
for(j=0;j<125;j++);//延时 1ms
}
}
void ling()
{beep=~beep;
Delay(1);}
void t()
{int N;
beep=0;
Delay(30);
beep=1;
while(1)
{if(P3_4==0)
break;
while(d)
for(d=y;d>0;d--)
{ for(N=25;N>0;N--)
{
P2=0x08;
P0=SData[d%10];//先送 个位
Delay(10);
P2=0x04;
P0=SData[d/10];//这是十位
Delay(10);
P2=0x02;
P0=SData[11];
Delay(10);
P2=0x01;
剩余6页未读,继续阅读
- 粉丝: 1
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助