资源描述
单片机C语言入门
图书导读 【阚平收集】联系QQ277152571
当前章节:目录
·13.1 简单的跑马灯设计
·13.2 矩形波发生器
·13.3 基于MCS-51单片机的四路抢答器
·13.4 I2C总线数据存储器在单片机系统中的用法
·13.5 双端口RAM在单片机系统中的使用
·13.6 小结
·【阚平制作】[特别推荐]联系QQ:277152571
·【空间地址】
·copyright ? 1998 - 2009 Tencent. All Rights Reserved 腾讯公司 版权所有
第1章 MCS-51单片机概述...... 1
1.1 MCS-51单片机结构...... 1
1.1.1 中央处理器(CPU)...... 2
1.1.2 存储器结构...... 6
1.1.3 定时器/计数器...... 9
1.1.4 并行端口...... 9
1.1.5 串行端口...... 11
1.1.6 中断系统...... 11
1.1.7 总线...... 12
1.1.8 8051的芯片引脚...... 12
1.2 MCS-51单片机的指令系统...... 14
1.2.1 8051的指令格式...... 14
1.2.2 8051的寻址方式...... 14
1.2.3 8051的指令说明...... 18
1.3 MCS-51单片机的伪指令...... 32
1.3.1 ORG伪指令...... 32
1.3.2 END伪指令...... 32
1.3.3 EQU(或=)伪指令...... 32
1.3.4 DATA伪指令...... 33
1.3.5 DB伪指令...... 33
1.3.6 DW伪指令...... 33
1.3.7 DS伪指令...... 34
1.3.8 BIT伪指令...... 34
1.4 MCS-51汇编语言编程实例...... 34
1.5 MCS-51单片机C语言简介...... 36
1.5.1 用C语言开发单片机的优势...... 36
1.5.2 C51程序的例子...... 37
1.5.3 C51程序在Keil C51下的编译、仿真...... 38
1.6 小结...... 42
第2章 C51语言基本语法...... 43
2.1 C51的标识符和关键字...... 43
2.2 C51的运算量...... 45
2.2.1 常量...... 45
2.2.2 变量...... 46
2.3 C51的数据类型...... 46
2.3.1 字符型(char)...... 47
2.3.2 整型(char)...... 50
2.3.3 浮点型(float)...... 52
2.3.4 指针型...... 53
2.3.5 位变量(bit)...... 53
2.3.6 特殊功能寄存器(sfr)...... 53
2.3.7 16位特殊功能寄存器(sfr16)...... 54
2.3.8 可寻址位(sbit)...... 54
2.4 C51的存储种类和存储器类型...... 55
2.4.1 存储种类...... 55
2.4.2 存储器类型...... 59
2.4.3 存储模式...... 60
2.5 C51运算符和表达式...... 61
2.5.1 算术运算符和算术表达式...... 61
2.5.2 赋值运算符和赋值表达式...... 62
2.5.3 增量、减量运算符与增量、减量表达式...... 63
2.5.4 关系运算符与关系表达式...... 64
2.5.5 逻辑运算符与逻辑表达式...... 65
2.5.6 位运算符与位运算表达式...... 67
2.5.7 复合赋值运算符与复合赋值表达式...... 69
2.5.8 逗号运算符与逗号表达式...... 69
2.5.9 条件运算符与条件表达式...... 70
2.5.10 指针与地址运算符...... 70
2.5.11 C51运算符的优先级...... 71
2.6 小结...... 72
第3章 C51语句...... 73
3.1 C51控制结构概述...... 73
3.2 C51语句概述...... 74
3.3 说明语句...... 75
3.4 表达式语句...... 76
3.5 空语句...... 76
3.6 控制语句...... 77
3.6.1 条件分支语句...... 77
3.6.2 循环语句...... 84
3.6.3 转移语句...... 91
3.7 小结...... 94
第4章 C51函数...... 95
4.1 函数的定义...... 96
4.1.1 无参数函数的定义方法...... 96
4.1.2 有参数函数的定义方法...... 97
4.1.3 空函数的定义方法...... 97
4.2 函数参数和返回值...... 98
4.2.1 形式参数和实际参数...... 98
4.2.2 函数的返回值...... 99
4.3 函数的原型声明...... 99
4.4 函数的调用...... 101
4.4.1 函数调用的一般形式...... 101
4.4.2 函数调用的方式...... 101
4.5 函数的递归调用...... 102
4.6 局部变量与全局变量...... 104
4.6.1 局部变量...... 104
4.6.2 局部静态变量...... 105
4.6.3 全局变量...... 106
4.6.4 全局静态变量...... 107
4.7 内部函数与外部函数...... 108
4.7.1 内部函数...... 108
4.7.2 外部函数...... 109
4.8 中断服务函数...... 110
4.9 库函数...... 112
4.9.1 标准输入输出函数...... 113
4.9.2 其他常用库函数...... 116
4.10 小结...... 116
第5章 数组...... 117
5.1 一维数组...... 117
5.1.1 一维数组的定义和初始化...... 117
5.1.2 一维数组元素的引用...... 119
5.1.3 一维数组应用实例...... 120
5.2 二维数组...... 122
5.2.1 二维数组的定义和初始化...... 122
5.2.2 二维数组的引用...... 124
5.2.3 二维数组应用实例...... 125
5.3 字符数组...... 129
5.3.1 字符数组的定义和初始化...... 129
5.3.2 字符数组元素的引用...... 130
5.4 小结...... 130
第6章 指针...... 131
6.1 指针变量的定义及其运算...... 131
6.1.1 地址和指针的定义...... 131
6.1.2 变量的指针和指针变量...... 132
6.1.3 指针变量的定义和初始化...... 133
6.1.4 指针变量的引用...... 133
6.1.5 指针变量的运算...... 136
6.1.6 指针变量作为函数的参数...... 137
6.2 数组与指针...... 140
6.2.1 指向数组元素的指针变量...... 140
6.2.2 通过指针变量引用数组元素...... 141
6.2.3 数组名作为函数参数...... 143
6.3 指向函数的指针变量...... 144
6.3.1 指向函数的指针变量的定义...... 144
6.3.2 用函数指针变量调用函数...... 145
6.3.3 用指向函数的指针作函数参数...... 146
6.4 指针数组...... 147
6.5 C51的指针类型...... 149
6.5.1 通用指针变量...... 149
6.5.2 指定存储区的指针变量...... 150
6.6 函数指针实例...... 150
6.7 小结...... 152
第7章 结构体与联合体...... 153
7.1 结构体...... 153
7.1.1 结构体类型的定义...... 153
7.1.2 结构体变量的定义...... 154
7.1.3 结构体变量的引用和初始化...... 155
7.2 结构体数组与指向结构体的指针变量...... 157
7.2.1 结构体数组的定义...... 157
7.2.2 结构体数组的初始化...... 157
7.2.3 结构体数组的应用实例...... 158
7.2.4 结构体指针变量...... 159
7.3 联合体...... 160
7.3.1 联合体变量的定义...... 160
7.3.2 联合体变量的引用方式...... 161
7.3.3 联合体变量的特点...... 162
7.3.4 联合体变量的应用实例...... 162
7.4 枚举类型...... 163
7.5 typedef语句...... 166
7.6 小结...... 168
第8章 预处理...... 169
8.1 宏定义...... 169
8.1.1 不带参数的宏定义...... 169
8.1.2 带参数的宏定义...... 171
8.2 文件包含...... 173
8.3 条件编译...... 174
8.4 小结...... 177
第9章 Keil mVision集成开发环境...... 178
9.1 Keil μVision概述...... 178
9.1.1 Keil μVision简介...... 178
9.1.2 Keil μVision的安装...... 180
9.2 Keil μVision的使用...... 181
9.2.1 Keil μVision的菜单条、工具条和快捷键...... 181
9.2.2 开发工具选项...... 186
9.3 Keil μVision调试技巧...... 192
9.3.1 程序复位...... 193
9.3.2 设置和删除断点的方法...... 194
9.3.3 查看和修改寄存器的内容...... 194
9.3.4 观察和修改变量...... 195
9.3.5 观察和修改存储器区域...... 196
9.3.6 并行口和串行口的使用方法...... 197
9.3.7 定时器/计数器的使用方法...... 197
9.3.8 外部中断的使用方法...... 198
9.4 小结...... 198
第10章 单片机内部资源及其C51编程..... 199
10.1 MCS-51的中断系统及其编程...... 199
10.1.1 中断源...... 199
10.1.2 中断相关寄存器...... 200
10.1.3 中断响应...... 203
10.1.4 中断的C51编程实例...... 204
10.2 MCS-51的定时/计数器及其编程...... 206
10.2.1 定时/计数器的硬件基础知识...... 206
10.2.2 定时/计数器的相关寄存器...... 207
10.2.3 定时/计数器的工作方式...... 208
10.2.4 定时/计数器的C51编程实例...... 210
10.3 MCS-51的串行口及其编程...... 214
10.3.1 串行异步通信的字符帧格式和波特率...... 215
10.3.2 MCS-51单片机串行口的硬件基础知识...... 216
10.3.3 MCS-51单片机串行口的相关寄存器...... 216
10.3.4 MCS-51单片机串行口的工作方式...... 217
10.3.5 串行口的C51编程实例...... 219
10.4 小结...... 223
第11章 MCS-51单片机系统扩展...... 224
11.1 单片机最小系统...... 224
11.1.1 片内无程序存储器的MCS-51单片机的最小系统...... 224
11.1.2 片内有程序存储器的MCS-51单片机的最小系统...... 225
11.2 MCS-51单片机程序存储器的扩展及应用实例...... 226
11.2.1 片外总线结构...... 226
11.2.2 地址锁存器...... 227
11.2.3 程序存储器...... 228
11.2.4 程序存储器的扩展实例...... 231
11.3 MCS-51单片机数据存储器的扩展及应用实例...... 233
11.4 MCS-51单片机I/O端口的扩展及应用实例...... 236
11.4.1 并行扩展I/O端口...... 236
11.4.2 串行扩展I/O端口...... 239
11.5 小结...... 244
第12章 单片机外围接口技术...... 245
12.1 MCS-51单片机键盘接口技术...... 245
12.1.1 独立式键盘的接口设计和编程...... 246
12.1.2 矩阵式键盘的接口设计和编程...... 248
12.2 MCS-51单片机显示器接口技术...... 251
12.2.1 七段发光二极管基础知识...... 251
12.2.2 发光二极管显示常用芯片及编程实例...... 252
12.2.3 液晶显示模块基础知识...... 258
12.2.4 液晶显示模块的C51编程实例...... 262
12.3 MCS-51单片机与模数转换器接口技术...... 264
12.3.1 单片机与并行模数转换器ADC0809的接口及编程...... 265
12.3.2 单片机与串行模数转换器MAX187的接口及编程...... 267
12.4 MCS-51单片机与数模转换器接口技术...... 269
12.4.1 MCS-51单片机与并行数模转换器DAC0832的接口及编程...... 269
12.4.2 MCS-51单片机与串行数模转换器TLC5615的接口及编程...... 272
12.5 MCS-51单片机与微型打印机接口技术...... 275
12.5.1 TPmP-TF系列打印机的接口信号...... 275
12.5.2 TPmP-TF打印机的字符编码和汉字...... 276
12.5.3 TPmP-TF打印机的打印命令...... 277
12.5.4 MCS-51单片机与TPmP-TF打印机的接口及编程...... 279
12.6 小结...... 280
第13章 简单C51应用实例...... 281
13.1 简单的跑马灯设计...... 281
13.1.1 硬件设计...... 282
13.1.2 程序设计...... 282
13.2 矩形波发生器...... 285
13.2.1 用两个定时器/计数器产生矩形波...... 285
13.2.2 用一个定时器/计数器产生矩形波...... 287
13.3 基于MCS-51单片机的四路抢答器...... 289
13.3.1 硬件设计...... 289
13.3.2 程序设计...... 291
13.4 I2C总线数据存储器在单片机系统中的用法...... 296
13.4.1 I2C总线简介...... 296
13.4.2 AT24C02简介...... 297
13.4.3 硬件设计...... 297
13.4.4 程序设计...... 298
13.5 双端口RAM在单片机系统中的使用...... 302
13.5.1 硬件设计...... 302
13.5.2 程序设计...... 305
13.6 小结...... 306
当前章节:13.1 简单的跑马灯设计
在前面的章节中详细介绍了C51语言的知识和MCS-51单片机的基本功能接口及应用,本章主要侧重于单片机应用系统设计,通过5个比较典型的设计实例,介绍单片机应用系统设计的步骤、思路、方法以及应用系统的硬件电路与软件设计等,使读者了解并掌握单片机系统的设计。本章主要包括以下内容:
· 简单的跑马灯设计;
· 矩形波发生器;
· 4路抢答器;
· AT24C02读写驱动程序;
· 双端口RAM IDT7132的使用。
13.1 简单的跑马灯设计
跑马灯可以用MCS-51单片机控制一个LED点阵来实现,参见5.2.3小节。一个简单的跑马灯的显示情况如图13.1所示,图中的每一个小方格代表一个发光二极管,黑色代表相应位置的发光二极管被点亮,白色的空格表示未被点亮。图13.1所示为从时刻1到时刻4这段时间LED点阵变化的情况,也就是每过一个时间片,“+”向左移动一个位置,因此如果有11个类似的时刻,看上去就是“+”从右边移入从左边移出,有从而产生跑马灯的效果。
图13.1 跑马灯的移动显示
13.1.1 硬件设计
由于图13.1中发光管的数量较多(8×3=24),直接使用MCS-51单片机的I/O端口是很不经济的,因此需要扩展外部I/O通道。对于这种简单的显示电路,通常采用常用的串入并出移位寄存器扩展I/O通道。由于LED点阵只有3组,每组8位,因此通常将这3组全部接在一片移位寄存器的输出端。
这种设计方法利用了人眼的视觉暂留效应,节约了硬件成本。人眼的视觉暂留时间是0.05s,当连续的图像变化超过每秒24帧画面的时候,人眼便无法分辨每幅单独的静态画面,因而看上去是平滑连续的视觉效果。在显示时,3组LED分时轮流显示,即某一组显示时其他两组全灭,只要循环显示一次的时间不超过40ms,人眼看到的效果就和3组同时显示的效果一样。
为保证足够的驱动电流,每组发光管的公共端电流由一只8550晶体管提供,由单片机的I/O端口控制晶体管的导通或截至。完整的电路如图13.2所示。
图13.2 8051单片机控制的跑马灯电路图
13.1.2 程序设计
在程序中产生一组发光二极管显示的时间片有两种方法。一种是在程序中采用延时,在这段延时时间中恒显示一组发光二极管,时间片用完后再显示另外一组并延时同样的时间,如此循环往复。这是一种堵塞型的写法,在延时的这段时间内单片机不能处理其他事务,效率低下。
另一种方法是采取定时器中断的方式。每产生一次定时器中断,就切换到下一组的显示,直到下一次定时器中断产生。这种方法占用CPU时间很少,在显示的同时还可以处理其他事务,效率较高,是通常采用的方法。
在本例中,每5ms产生一次定时器中断,切换一次显示,因此3组轮流一次要用15ms,刷新频率约为67Hz,完全满足刷新频率大于24Hz的要求。由于采用串行扩展I/O通道的方法,因此单片机向74LS164发送数据需要一定的时间。根据中断服务程序尽可能耗时短的原则,显示函数(包括对于74LS164的驱动)不应在中断服务程序中实现,而是应该仅在中断设置某个标志,通知显示函数当前应切换到哪一组显示即可。
需要注意的是,在切换显示的时候要将3个晶体管全部截至,也就是所有的发光二极管全灭,以防止由于74LS164输出端的数据变化而带来“串亮”现象。
程序流程如图13.3所示,其中LED_selection表示当前要显示哪一组发光二极管,当LED_selection为0时显示第一组,为1时显示第二组,为2时显示第三组。
程序如例13-1所示。
【例13-1】图13.2中使用12.0MHz的晶振,根据晶振频率设置定时器初值,每5ms产生一次中断,随后执行切换显示的动作,每500ms显示的图形向左移动一次。
#include <reg51.h>
typedef unsigned char uchar;
sbit CLK=P2^6;
sbit SEND_DATA=P2^7;
sbit en1=P2^2; //P2.2控制第一组发光二极管
sbit en2=P2^1; //P2.1控制第一组发光二极管
sbit en3=P2^0; //P2.0控制第一组发光二极管
bit switch_en; //允许切换标志
uchar LED_selection; //组选变量,指代要显示那一组
uchar index; //字型索引,指代要显示什么数据
uchar counter; //时间片计数,控制图形移动速度
uchar code led_code[3][11]= //每一组的字型
{{0x0,0x0,0x01,0x02,0x04,0x08,
0x10,0x20,0x40,0x80,0x0},
{0x0,0x01,0x03,0x07,0x0e,0x1c,
0x38,0x70,0xe0,0xc0,0x80},
{0x0,0x0,0x01,0x02,0x04,0x08,
0x10,0x20,0x40,0x80,0x0}};
void send_164(uchar); //74LS164驱动函数声明
void display(void); //显示函数声明
void main(void)
{
switch_en=0;
LED_selection=0;
index=0;counter=0; //对程序中的全局变量初始化
TR0=0; //禁止T0
TMOD=0x01; //T0选择工作方式1,16位定时器
TH0=0xEC; //定时时间为5ms时,TH0=0xEC
TL0=0x78; //TL0=0x78
EA=1; //使能CPU中断
ET0=1; //使能T0溢出中断
TR0=1; //T0开始运行
while(1) //无限循环
{display();} //调用显示函数
}
void display(void) //显示函数定义
{
if(switch_en==0) //若切换时机未到
return; //则返回
switch_en=0; //否则切换显示,切换一次后即清零以免误切换
en1=1;en2=1;en3=1; //关闭所有显示,防止“串亮”
if(counter==100) //如果过了500ms
{
counter=0; //counter归零
index++; //显示向左移动一次
index%=11; //若移动完,归零,重新开始
}
send_164(led_code[LED_selection][index]); //发送要显示的数据
if(LED_selection==1) //开相应的显示
en1=0;
else if(LED_selection==2)
en2=0;
else
en3=0;
}
void send_164(uchar d) //74LS164驱动函数声明
{
uchar i;
CLK=0;
for(i=0;i<=7;i++) //发送8位数据,高位在前
{
CLK=0; //将时钟信号置为低电平,为产生上升沿做准备
if((0x80>>i)&d==0) //如果当前要发送的位为0
SEND_DATA=0; //相应地将74LS164的数据信号置为低电平
else //否则
SEND_DATA=1; //将74LS164的数据信号置为高电平
CLK=1; //将时钟信号置为高电平,产生上升沿
CLK=1; //延时,以保证满足74LS164的时序
}
}
void isr_t0(void) interrupt 1
{
TH0=0xEC; //对TH0和TL0重新赋值
TL0=0x78;
counter++; //5ms计数加1,在display()函数中使用
switch_en=1; //允许切换
LED_selection++; //将组选计数值加1
LED_selection%=3; //如果是3,说明已经轮流一遍,归零,重新开始
}
当前章节:13.2 矩形波发生器
13.2 矩形波发生器
在科学研究、工程教育和生产实践中常常需要用到低频信号发生器,如工业过程控制、机械振动、生物医学等领域。这些现场使用的设备,其要求与实验室设备并不相同,如果直接使用实验室中所用的标准信号发生器,往往会觉得其体积过大、价格太高、使用较麻烦等。若对于信号的绝对精度要求不高,可以考虑使用单片机作为低频信号发生器。在本节中主要介绍矩形波的产生方法。
用MCS-51单片机输出矩形波一般有两种方式:第一种方式利用定时器/计数器0控制矩形波频率输出,结合定时器/计数器1控制占空比;第二种方式仅使用一个定时器,工作于116位定时器/计数器方式,同时控制输出频率和占空比。
13.2.1 用两个定时器/计数器产生矩形波
这种方法的基本原理就是用T0作为矩形波的周期的定时器,每一周期产生一次中断,用T1作为矩形波的高电平的计时器,每到T0的定时中断,输出矩形波的引脚输出高电平,而到T1中断产生时,将该引脚置为低电平,这样就得到了所需要的矩形波。通过改变T0的计数值可以改变周期,而改变T1的计数值可以改变占空比。
下面通过一个例子说明这种方法。在例子中,矩形波频率为10Hz(即周期为100ms),占空比为25%(即高电平周期为25ms),通过单片机引脚P2.0输出矩形波。程序流程如图13.4所示。
图13.4 MCS-51单片机产生矩形波的程序流程图
程序如例13-2所示,所用晶振频率为12.0MHz。
【例13-2】用MCS-51单片机的T0和T1产生矩形波。
#include <reg51.h>
typedef unsigned char uchar;
sbit signal=P2^0;
uchar counter;
void main(void)
{
TR0=0; //禁止T0
TMOD=0x11; //T0和T1均选择工作方式1,16位定时器
TH0=-1000/256; //定时时间为50ms
TL0=-1000%256;
signal=0; //开始时输出为低电平
counter=0; //初始化T1的中断次数为0
EA=1; //使能CPU中断
ET0=1; //使能T0溢出中断
ET1=1; //使能T1溢出中断
TR0=1; //T0开始运行,注意,T1不能现在运行
while(1) //无限循环
{}
}
void isr_t0(void) interrupt 1 //T0中断服务函数
{
TH0=-50000/256; //定时时间为50ms
TL0=-50000%256;
counter++; //中断次数
if(counter==2) //若已中断两次,说明已经过去100ms
{
counter=0; //中断次数归零
signal=1; //产生矩形波中的高电平
TR1=1; //唤醒T1,T1开始计数
}
}
void isr_t1(void) interrupt 3 //T1中断服务函数
{
signal=0; //矩形波中的低电平
TR0=0; //禁止T1计数,等待T0将其唤醒
TH1=-25000/256; //25ms中断初值
TL1=-25000%256;
}
13.2.2 用一个定时器/计数器产生矩形波
在使用定时器、计数器完成其他功能的场合,用两个定时器/计数器产生矩形波的方法是不合适的,因为某些MCS-51单片机内部只有两个定时器/计数器。这时候通常使用第二种方法,即只使用一个定时器/计数器产生矩形波。
这种方法的基本原理是使引脚产生一个低电平,对T1或T0设置计数初始值并运行,使之经过时间t1后产生定时中断;在中断服务函数中将引脚设置为高电平,对定时器/计数器设置另一个计数初始值,经过时间t2后产生中断,在中断服务函数中将引脚设置为低电平,对定时器/计数器设置低电平维持所需的计数初始值,如此循环往复,就产生一个高电平时间为t2、周期为(t1+t2)的矩形波。
仍以产生一个从单片机引脚P2.0输出的、输出频率为10Hz、占空比为25%的矩形波为例。程序流程如图13.5所示。
图13.5 用一个定时器/计数器产生矩形波的程序流程图
程序的关键是从高电平转变到低电平以及从低电平转变到高电平,因此在程序中使用一个位变量来标志中断产生前输出的是低电平还是高电平。程序如例13-3所示:
【例13-3】用一个定时器/计数器产生输出频率为10Hz、占空比为25%矩形波。
#include <reg51.h>
typedef unsigned char uchar;
sbit signal=P2^0;
bit level; //用来存储产生T0中断之前输出何种电平
uchar counter;
void main(void)
{
TMOD=0x01; //T0选择工作方式1,16位定时器
TH0=-25000/256; //定时时间为25ms
TL0=-25000%256;
counter=0;signal=1;level=1; //初始化全局变量
EA=1; //使能CPU中断
ET0=1; //使能T0溢出中断
TR0=1; //T0开始运行
while(1) //无限循环
{}
}
void isr_t0(void) interrupt 1 //T0中断服务函数
{
if(level==1) //如果中断产生之前输出的是高电平
{
signal=0; //输出低电平
TH0=-25000/256; //定时时间为25ms时的初值
TL0=-25000%256;
level=0; //保存当前输出的电平(低电平)
}
else //如果中断产生之前输出的是低电平
{
counter++; //中断次数计数加1
if(counter==3) //如果已经输出低电平75ms
{
counter=0; //中断次数计数归零
signal=1; //输出高电平
TH0=-25000/256;
TL0=-25000%256;
level=1; //保存当前输出的电平(高电平)
}
}
}
13.3 基于MCS-51单片机的四路抢答器
抢答器是为智力竞赛参赛者答题时进行抢答而设计的一种优先判决器电路,广泛应用于各种知识竞赛、文娱活动等场合。能够实现抢答器功能的方式有多种,可以采用前期的模拟电路、数字电路或模拟与数字电路相结合的方式,但这种方式制作过程复杂,而且准确性与可靠性不高,成品面积大,安装、维护困难。本节介绍一种利用8051单片机作为核心部件进行逻辑控制及信号产生的四路抢答器。
13.3.1 硬件设计
硬件电路应能完成以下功能:参加竞赛者对主持人提出的问题要在最短的时间内作出判断,并按下抢答按键回答问题。当第一个人按下按键后,则在显示器上显示此竞赛者的号码并进
展开阅读全文