单片机一键多功能控制识别技术解析

嵌入式操作系统

56人已加入

描述

  在一些单片机系统中,有时候需要采用一些一键多功能的技术,今天在这里小编就给大家介绍一下。

  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.电路原理图

  3.系统板上硬件连线

  (1).把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”区域中的SP1端口上;

  (2).把“单片机系统”区域中的P1.0-P1.4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,P1.0连接到L1,P1.1连接到L2,P1.2连接到L3,P1.3连接到L4上。

  4.程序设计方法

  (1)设计思想由来

  在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的,所以单片机就很容易识别不同功能的身份了。

  (2)设计方法

  从上面的要求我们可以看出,L1到L4发光二极管在每个时刻的闪烁的时间是受开关SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID=0;当L2在闪烁时,ID=1;当L3在闪烁时,ID=2;当L4在闪烁时,ID=3;很显然,只要每次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。下面给出有关程序设计的框图。

  5.程序框图

  6.汇编源程序

  ID EQU 30H

  SP1 BIT P3.7

  L1 BIT P1.0

  L2 BIT P1.1

  L3 BIT P1.2

  L4 BIT P1.3

  ORG 0

  MOV ID,#00H

  START: JB K1,REL

  LCALL DELAY10MS

  JB K1,REL

  INC ID MOV A,ID

  CJNE A,#04,REL

  MOV ID,#00H

  REL: JNB K1,$

  MOV A,ID

  CJNE A,#00H,IS0

  CPL L1

  LCALL DELAY

  SJMP START

  IS0: CJNE A,#01H,IS1

  CPL L2

  LCALL DELAY

  SJMP START

  IS1: CJNE A,

  #02H,IS2 CPL L3

  LCALL DELAY

  SJMP START

  IS2: CJNE A,#03H,IS3

  CPL L4

  LCALL DELAY

  SJMP START

  IS3: LJMP START

  DELAY10MS:

  MOV R6,#20

  LOOP1: MOV R7,#248

  DJNZ R7,$

  DJNZ R6,LOOP1

  RET

  DELAY: MOV R5,#20

  LOOP2: LCALL DELAY10MS

  DJNZ R5,LOOP2

  RET

  END

  7.C语言源程序

  #include

  unsigned char ID;

  void delay10ms(void)

  {

  unsigned char i,j;

  for(i=20;i》0;i--)

  for(j=248;j》0;j--);

  }

  void delay02s(void) {

  unsigned char i;

  for(i=20;i》0;i--)

  {delay10ms();

  }

  }

  void main(void)

  { while(1)

  { if(P3_7==0)

  {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;

  }

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分