1、AT89S51 单片机实验及实践教程- 53 -9 一键多功能按键识别技术1 实验任务如图 4.9.1 所示,开关 SP1 接在 P3.7/RD 管脚上,在 AT89S51 单片机的 P1 端口接有四个发光二极管,上电的时候,L1 接在 P1.0 管脚上的发光二极管在闪烁,当每一次按下开关 SP1 的时候,L2 接在 P1.1 管脚上的发光二极管在闪烁,再按下开关 SP1的时候,L3 接在 P1.2 管脚上的发光二极管在闪烁,再按下开关 SP1 的时候,L4 接在 P1.3 管脚上的发光二极管在闪烁,再按下开关 SP1 的时候,又轮到 L1 在闪烁了,如此轮流下去。2 电路原理图图 4.9.1
2、3 系统板上硬件连线(1 把“单片机系统”区域中的 P3.7/RD 端口连接到 “独立式键盘”区域中的 SP1 端口上;(2 把“单片机系统”区域中的 P1.0P1.4 端口用 8 芯排线连接到“八路发光二极管指示模块”区域中的“L1L8”端口上;要求,P1.0 连接到L1,P1.1 连接到 L2,P1.2 连接到 L3,P1.3 连接到 L4 上。AT89S51 单片机实验及实践教程- 54 -4 程序设计方法(1 设计思想由来在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每
3、个不同的功能模块用不同的 ID 号标识,这样,每按下一次按键,ID 的值是不相同的,所以单片机就很容易识别不同功能的身份了。(2 设计方法从上面的要求我们可以看出,L1 到 L4 发光二极管在每个时刻的闪烁的时间是受开关 SP1 来控制,我们给 L1 到 L4 闪烁的时段定义出不同的 ID 号,当 L1 在闪烁时,ID0;当 L2 在闪烁时,ID 1;当 L3 在闪烁时,ID 2;当 L4 在闪烁时,ID3;很显然,只要每次按下开关 K1 时,分别给出不同的 ID 号我们就能够完成上面的任务了。下面给出有关程序设计的框图。5 程序框图AT89S51 单片机实验及实践教程- 55 -图 4.9.
4、26 汇编源程序ID EQU 30HSP1 BIT P3.7L1 BIT P1.0L2 BIT P1.1L3 BIT P1.2L4 BIT P1.3ORG 0MOV ID,#00HSTART: JB K1,RELLCALL DELAY10MSJB K1,RELINC IDMOV A,IDCJNE A,#04,RELMOV ID,#00HREL: JNB K1,$AT89S51 单片机实验及实践教程- 56 -MOV A,IDCJNE A,#00H,IS0CPL L1LCALL DELAYSJMP STARTIS0: CJNE A,#01H,IS1CPL L2LCALL DELAYSJMP ST
5、ARTIS1: CJNE A,#02H,IS2CPL L3LCALL DELAYSJMP STARTIS2: CJNE A,#03H,IS3CPL L4LCALL DELAYSJMP STARTIS3: LJMP STARTDELAY10MS: MOV R6,#20LOOP1: MOV R7,#248DJNZ R7,$DJNZ R6,LOOP1RETDELAY: MOV R5,#20LOOP2: LCALL DELAY10MSDJNZ R5,LOOP2RETEND7 C 语言源程序#include unsigned char ID;void delay10ms(void)unsigned ch
6、ar i,j;for(i=20;i0;i-)for(j=248;j0;j-);void delay02s(void)unsigned char i;for(i=20;i0;i-)delay10ms();void main(void) while(1) if(P3_7=0)AT89S51 单片机实验及实践教程- 57 -delay10ms();if(P3_7=0)ID+;if(ID=4)ID=0;while(P3_7=0);switch(ID) case 0:P1_0=P1_0;delay02s();break;case 1:P1_1=P1_1;delay02s();break;case 2:P1_2=P1_2;delay02s();break;case 3:P1_3=P1_3;delay02s();break;