首页 接线图文章正文

利用AT89C51单片机制作的按键次数计数器

接线图 2024年02月20日 21:21 200 admin

  该计数器用于对按键次数的计算,比如鼠标中的微按钮或其它按钮做QC测试用.该程序为汇编延时程序,用了取两次定时中断的键值做比较以达到简单防抖动和取健值的目的.本计数器的计数范围为0-999999,的频率为50Hz.
  该电路的主要电路是用AT89C51组成的按键取值电路,S3S4分别控制计数值的加减.3906控制数码管使用的是共阳极.
  原理图:

利用AT89C51单片机制作的按键次数计数器  第1张


  实物图:

利用AT89C51单片机制作的按键次数计数器  第2张


  程序如下:
  #include
  #define Key_UP P3_6 //上调
  #define Key_DOWN P3_7 //下调
  #define LED P0
  #define LED1 P2_2 //LED控制
  #define LED2 P2_3 //LED控制
  #define LED3 P2_4 //LED控制
  #define LED4 P2_5 //LED控制
  #define LED5 P2_6 //LED控制
  #define LED6 P2_7 //LED控制
  unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  //共阳0-9的LED笔划
  static unsigned char bdata Key; //可位寻址的状态寄存器
  sbit NewKeyUP = Key ^ 0;
  sbit NewKeyDOWN = Key ^ 1;
  sbit OldKeyUP = Key ^ 2;
  sbit OldKeyDOWN = Key ^ 3;
  static unsigned long data Count;
  static unsigned char LEDN[6];
  void main(void)
  {
  void Delay_510(void);
  Count = 0; //初始化变量
  Key = 0;
  EA = 1; //允许CPU中断
  ET0 = 1; //定时器0中断打开
  TMOD = 0x1; //设定时器0为模式1,16位模式
  TH0=0xB1;
  TL0=0xDF; //设定时值为20000us(20ms)
  TR0 = 1; //开始定时
  while(1);
  }
  //定时器0中断外理中键扫描和显示
  void KeyAndDis_Time0(void) interrupt 1 using 2
  {
  TH0=0xB1;
  TL0=0xDF; //设定时值为20000us(20ms)
  NewKeyUP = Key_UP; //取新的键值
  NewKeyDOWN = Key_DOWN;
  if (!OldKeyUP && NewKeyUP) //键放开时,这里的中断为20ms左右(定时值非自动装载所以多于20ms)
  Count++;
  if (!OldKeyDOWN && NewKeyDOWN)
  Count--; //这里Conut为int 没有做负数等处理,有需要自行加上
  if (Count>999999)
  Count = 999999;
  LEDN[5]=Count/100000;
  LEDN[4] = (Count-100000*(long)LEDN[5])/10000;
  LEDN[3] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4])/1000;
  LEDN[2] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4]-1000*(long)LEDN[3])/100;
  LEDN[1] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4]-1000*(long)LEDN[3]-100*(long)LEDN[2])/10;
  LEDN[0] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4]-1000*(long)LEDN[3]-100*(long)LEDN[2]-10*(long)LEDN[1]);
  LED=LEDDis[LEDN[5]];
  LED6 = 0;
  Delay_510();
  LED6 = 1;
  LED=LEDDis[LEDN[4]];
  LED5 = 0;
  Delay_510();
  LED5 = 1;
  LED=LEDDis[LEDN[3]];
  LED4 = 0;
  Delay_510();
  LED4 = 1;
  LED=LEDDis[LEDN[2]];
  LED3 = 0;
  Delay_510();
  LED3 = 1;
  LED=LEDDis[LEDN[1]];
  LED2 = 0;
  Delay_510();
  LED2 = 1;
  LED=LEDDis[LEDN[0]];
  LED1 = 0;
  Delay_510();
  LED1 = 1;
  OldKeyUP = NewKeyUP;
  OldKeyDOWN = NewKeyDOWN;
  }
  void Delay_510(void) //延时510微秒
  {
  #pragma asm
  MOV R0,#7DH
  MOV R1,#02H
  TSR1:
  DJNZ R0,TSR1
  MOV R0,#7DH
  DJNZ R1,TSR1
  #pragma endasm
  }
  (可以自行修改调整程序以适合自己的电路.)



  
版权与免责声明

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

标签: 计数器 数码管 led cpu 定时器

发表评论

接线图网Copyright Your WebSite.Some Rights Reserved. 备案号:桂ICP备2022002688号-2 接线图网版权所有 联系作者QQ:360888349