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

出处:feng993032 发布于:2011-09-03 11:14:54 | 6578 次阅读

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

利用51单片机制作的按键次数计数器原理图


  实物图:

利用51单片机制作的按键次数计数器实物图


  程序如下:
  #include <AT89X51.H>
  #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
  }
  (可以自行修改调整程序以适合自己的电路.)



  
3次

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

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

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

上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!