51单片机按键电路

51单片机键盘接口电路(含源程序)

键盘是由若干按钮组成的开关矩阵,它是单片机系统中最常用的输入设备,用户能通过键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。

按钮开关的抖动问题

组成键盘的按钮有触点式和非触点式两种,单片机中应用的一般是由机械触点组成的。在下图中,当开

<键盘结构图>

图1

图2

关S未被按下时,P1。0输入为高电平,S闭合后,P1。0输入为低电平。由于按钮是机械触点,当机械触点断开、闭合时,会有抖动动,P1。0输入端的波形如图2所示。这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全能感应到的,因为计算机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了。前面我们讲到中断时曾有个问题,就是说按钮有时灵,有时不灵,其实就是这个原因,你只按了一次按钮,可是计算机却已执行了多次中断的过程,如果执行的次数正好是奇数次,那么结果正如你所料,如果执行的次数是偶数次,那就不对了。

为使CPU能正确地读出P1口的状态,对每一次按钮只作一次响应,就必须考虑如何去除抖动,常用的去抖动的办法有两种:硬件办法和软件办法。单片机中常用软件法,因此,对于硬件办法我们不介绍。软件法其实很简单,就是在单片机获得P1。0口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P1。0口,如果仍为低,说明S1的确按下了,这实际上是避开了按钮按下时的抖动时间。而在检测到按钮释放后(P1。0为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。不过一般情况下,我们常常不对按钮释放的后沿进行处理,实践证明,也能满足一定的要求。当然,实际应用中,对按钮的要求也是千差万别,要根据不一样的需要来编制处理程序,但以上是消除键抖动的原则。

键盘与单片机的连接

键盘连接>

图3

图4

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

该计数器用于对按键次数的计算,比如鼠标中的微按钮或其它按钮做QC测试用.该程序为汇编延时程序,用了取两次定时中断的键值做比较以达到简单防抖动和取健值的目的.本计数器的计数范围为0-999999,最大的频率为50Hz.

该电路的主要核心电路是用AT89C51组成的按键取值电路,S3S4分别控制计数值的加减.3906控制数码管使用的是共阳极.

程序如下:

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

51单片机键盘接口电路(含源程序)

键盘是由若干按钮组成的开关矩阵,它是单片机系统中最常用的输入设备,用户能通过键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。

按钮开关的抖动问题

组成键盘的按钮有触点式和非触点式两种,单片机中应用的一般是由机械触点组成的。在下图中,当开

<键盘结构图>

图1

图2

关S未被按下时,P1。0输入为高电平,S闭合后,P1。0输入为低电平。由于按钮是机械触点,当机械触点断开、闭合时,会有抖动动,P1。0输入端的波形如图2所示。这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全能感应到的,因为计算机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了。前面我们讲到中断时曾有个问题,就是说按钮有时灵,有时不灵,其实就是这个原因,你只按了一次按钮,可是计算机却已执行了多次中断的过程,如果执行的次数正好是奇数次,那么结果正如你所料,如果执行的次数是偶数次,那就不对了。

为使CPU能正确地读出P1口的状态,对每一次按钮只作一次响应,就必须考虑如何去除抖动,常用的去抖动的办法有两种:硬件办法和软件办法。单片机中常用软件法,因此,对于硬件办法我们不介绍。软件法其实很简单,就是在单片机获得P1。0口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P1。0口,如果仍为低,说明S1的确按下了,这实际上是避开了按钮按下时的抖动时间。而在检测到按钮释放后(P1。0为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。不过一般情况下,我们常常不对按钮释放的后沿进行处理,实践证明,也能满足一定的要求。当然,实际应用中,对按钮的要求也是千差万别,要根据不一样的需要来编制处理程序,但以上是消除键抖动的原则。

键盘与单片机的连接

键盘连接>

图3

图4

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

该计数器用于对按键次数的计算,比如鼠标中的微按钮或其它按钮做QC测试用.该程序为汇编延时程序,用了取两次定时中断的键值做比较以达到简单防抖动和取健值的目的.本计数器的计数范围为0-999999,最大的频率为50Hz.

该电路的主要核心电路是用AT89C51组成的按键取值电路,S3S4分别控制计数值的加减.3906控制数码管使用的是共阳极.

程序如下:

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


相关文章

  • AT89C51基于单片机智能浇花系统设计
  • 目 录 1. 绪论............................................................................................................... ...查看


  • 多路抢答器毕业论文
  • 毕业设计(论文) 课题: 学生: 系部: 班级: 学号: 指导教师: 装订交卷日期: 装订顺序: (1)封面(2)毕业设计(论文)成绩评定记录(3)标题.中文摘要及 关键词(4)正文(5)附录(6)参考文献 毕业设计(论文)成绩评定记录表 ...查看


  • 单片机常用按键电路
  • 单片机常用按键电路 单片机组成的小系统中,有的需要人机交互功能,按键是最常见的输入方式.最常见的按键电路大致有,一对一的直接连接和动态扫描的矩阵式连接两种. 左右两个电路作用一样,区别是左边CPU的输入端常态为高电位,按下按键时为低电位:右 ...查看


  • 基于单片机的五层电梯课程设计
  • 课程设计报告 课程名称 微机课程设计 设计题目 电梯模拟运行设计 专业班级 自动化1041 姓 名 学 号 指导教师 刘文洲 蔡长青 起止时间 2013.12.23---2013.12.31 成 绩 评 定 电气与信息学院 课程设计考核和成 ...查看


  • 基于单片机的直流电机速度控制系统毕业论文
  • 学校代码 学 号 分类号 密 级 公 开 本科毕业论文(设计) 题目:基于单片机的直流电动机的控制 (中.英文) 作 者 姓 名: 专 业 名 学 科 门 类: 指 导 教 成 绩 评 定: 摘 要 随着微电子和计算机技术的发展,直流电机的 ...查看


  • 单片机课程设计报告(五人表决器)
  • 目录 一.方案设计 ................................................ 2 二.硬件电路设计 ........................................ 2 三.软件设计说 ...查看


  • 基于单片机的简易波形发生器的设计
  • ·市场纵横 基于单片机的简易波形发生器的设计 甘肃 兰州 730070)石 蕊 赵海阔 赵宇杰 刘 昊(兰州城市学院, 摘 要:波形发生器是随着不断进步的计算机技术和微电子技术在测量仪器中的应用而形成和发展起来的一类新型信号源.产生任意波形 ...查看


  • 基于51单片机的电子琴课程设计
  • 摘要 本设计主要研究基于AT89C52单片机的简易电子琴设计. 它是以单片机作为主控核心,设置键盘.蜂鸣器等外围器件:另外还用到一 些简单器件如:NPN型三极管及电阻等.利用按键实现音符和音调的输入:用NPN 型三极管8550实现低音频功率 ...查看


  • 电子钟的设计
  • 济南职业学院 毕业设计(论文) 题 目: 系 部:专 业: 电气自动化 学 号: [1**********]8 学生姓名: 王嘉玮 指导教师: 滕丽丽 职 称: 二O一五年五月二日 济南职业学院 毕业论文(设计)任务书 课题名称:系 部: ...查看


  • 学习型红外遥控开关的设计与实现
  • 学习型红外遥控开关的设计与实现 学习型红外遥控开关的设计与实现 摘 要 针对开关的控制问题,本文介绍了一种可以由普通遥控器作为信号输入并基于单片机控制的学习型红外遥控开关.它以STC11F02E 单片机为设计核心,能够识别和记忆常用遥控器任 ...查看


热门内容