当前位置:文档之家› 单片机系统中的按键处理

单片机系统中的按键处理

单片机系统中的按键处理
单片机系统中的按键处理

单片机系统中的按键处理

对于一个由单片机为核心构成的系统而言。输入通道是相当重要的。可以看到几乎每一样基于单片机的产品都有人机交互的部分。如各种仪器设备上的各种按钮和开关,以及我们手机上的键盘,MP3上的按键等等。最常见的输入部分,莫非就是按键了。对于大多数初学者而言,编写一个好的按键程序是一件颇为头疼的事情。于是乎在网上乱搜一气,程序倒是找到了不少,但是看了半天依然是不明白。或者在某某论坛上面发帖“跪求XX按键程序,大虾帮忙……”如果你偶然间进了这个论坛,又偶然看到了这个帖子,而且恰好你对按键程序的写法也不是很清楚,那么我希望你能够静静的看完这个帖子。如果你觉得对你很有帮助,那么我希望你能够在以后的日子中能够坚持到这个论坛来,一起交流学习,分享自己学习过程中的喜悦或者一起探讨棘手的问题,这是我写这个帖子的最大的初衷了。OK,不能再说了,再说就变成水帖了。那么我们开始吧。

按键的种类很多。不过原理基本相似。下面我们以一种轻触开关为例讲解按键程序的写法。

这种轻触开关大家不陌生吧^_^

一般情况下,按键与单片机的连接如下面这幅图所示。

(图中电阻值一般去4.7k~10k之间,对于内部端口有上拉电阻的单片机则可省略此电阻)

单片机对于按键的按下与否则是通过检测相应引脚上的电平来实现的。对于上图而言,当P17

引脚上面的电平为低时,则表示按键已经按下。反之,则表明按键没有按下。我们在程序中只要检测到了P17引脚上面的电平为低了,就可以判断按键按下。呵呵,简单吧。等会,您先别乐呵,话还没说完呢。下面我们来看看,当按键按下时,P17引脚上面的波形是怎么变化的。

上图是一个理想波形图,当按键按下时,P17口的电平马上被拉低到0V了。当然理想的东西都是不现实的。所以我们还是看看现实的波形图吧。

看出什么区别来了没。呵呵,只要你不是傻子我相信都能看出其中的区别。由于按键的机械特性。当按键闭合时,并不能马上保存良好的接触,而是来回弹跳。这个时间很短,我们的手根本感觉不出来。但是对于一秒钟执行百万条指令的单片机而言,这个时间是相当的长了。那么在这段抖动的时间内,单片机可能读到多次高低电平的变化。如果不加任何处理的话,就会认为已经按下,或者松开很多次了。而事实上,我们的手一直按在按键上,并没有重复按动很多次。要想能够正确的判断按键是否按下就要避开这段抖动的时间。根据一般按键的机械特点,以及按键的新旧程度等而言,这段抖动的时间一般在5MS~20MS之间。

看到这里你明白了该如何做了吧。

看看下面的这个流程图,你应该不陌生吧。

这个流程是好多教科书上的做法。可惜,误导了好多人。为什么呢。因为它根本就没有考虑实际情况。我们根据这幅流程图来写它的代码看看。

unsigned char v_ReadKey_f( void )

{

unsigned char KeyPress ;

if( P17 == 0)

{

Delay(20) ; //延时20MS

If( P17 == 0)

{

KeyPress = 1 ;

While( !P17) ; //等待释放

}

else

KeyPress = 0 ;

}

}

这样一个程序,相信对很多初学者而言都不陌生。因为好多书上基本都是这样的一个流程和写法。可是当有一天,我们想做一个数码管加按键调整的时钟,发现当我们按键按下去的时候,数码管就不亮了。为什么呢。原因就在这个键盘扫描函数。平常没有按键按下还好。一旦有键按下,它先是浪费了CPU的大部分时间(就是那个什么事情都没做的延时20MS函数)然后,又霸占CPU( 就是哪个死死等在那里的while(P17);语句)直到按键释放。对于这种情况我们是忍无可忍的,那么就让我们彻底的抛弃它吧。那么到底按键扫描函数改如何写呢……..所谓众里寻她千百度,蓦然回首,那人却在灯火阑珊处。如果我们把CPU延时的那20MS拿出来去做其它事情,那么不就充分利用CPU的时间了吗。而一般情况下我们只要前沿去抖动就可以了。也就是说了,我们只需在按键按下后去抖就可以了,对于按键的释放抖动可以不必要过于关注。当然这主要和应用的场合有关。一个能有效识别按键按下并支持连发功能的按键已经能够应用到大多数的场合了。

下面以四个独立按键的处理程序为例来讲解(支持单击和连发)

#include"regx52.h"

sbit KeyOne = P1^0 ;

sbit KeyTwo = P1^1 ;

sbit KeyThree = P1^2 ;

sbit KeyFour = P1^3 ;

#define uint16 unsigned int

#define uint8 unsigned char

#define NOKEY 0xff

#define KEY_WOBBLE_TIME 500 //去抖动时间(待定)

#define KEY_OVER_TIME 15000 //等待进入连击时间(待定),该常数要比正常//按键时间要长,防止非目的性进入连击模式

#define KEY_QUICK_TIME 1000 //等待按键抬起的连击时间(待定)

void v_KeyInit_f( void ) //按键初始化

{

KeyOne = 1 ; //按键初始化(相应端口写1)

KeyTwo = 1 ;

KeyThree = 1 ;

KeyFour = 1 ;

}

uint8 u8_ReadKey_f(void)

{

static uint8 LastKey = NOKEY ; //保存上一次的键值

static uint16 KeyCount = 0 ; //按键延时计数器

static uint16 KeyOverTime = KEY_OVER_TIME ; //按键抬起时间

uint8 KeyTemp = NOKEY ; //临时保存读到的键值

KeyTemp = P1 & 0x0f ; //读键值

if( KeyTemp == 0x0f )

{

KeyCount = 0 ;

KeyOverTime = KEY_OVER_TIME ;

return NOKEY ; //无键按下返回NOKEY

}

else

{

if( KeyTemp == LastKey ) //是否第一次按下

{

if( ++KeyCount == KEY_WOBBLE_TIME ) //不是第一次按下,则判断//抖动是否结束

{

return KeyTemp ; //去抖动结束,返回键值

}

else

{

if( KeyCount > KeyOverTime )

{

KeyCount = 0 ;

KeyOverTime = KEY_QUICK_TIME ;

}

return NOKEY ;

}

}

else //是第一次按下则保存键值,以便下次执行此函数时与读到的键值作比较

{

LastKey = KeyTemp ; //保存第一次读到的键值

KeyCount = 0 ; //延时计数器清零

KeyOverTime = KEY_OVER_TIME ;

return NOKEY ;

}

}

}

下面是我测试用的主程序(相关头文件未列出,仅仅作测试演示用)

void main(void)

{

uint8 KeyValue ;

int16 Count ;

v_LcdInit_f() ;

v_KeyInit_f() ;

CLS

LOCATE(3, 1)

PRINT("Key Test")

LOCATE(6, 2)

SHOW_ICON

while(1)

{

KeyValue = u8_ReadKey_f() ;

if( KeyValue != NOKEY )

{ LOCATE(1, 2)

if( KeyValue == 0x0e )Count++ ;

if( KeyValue == 0x0d )Count-- ;

if( KeyValue == 0x0b )Count = 0 ;

if( KeyValue == 0x07 )Count = 0 ;

HIDE_ICON

PRINTD(Count, 5)

LOCATE(6, 2)

}

else

{

//SHOW_ICON

}

}

}

每次执行读键盘函数时,只是对一些标志进行判断,然后退出。因此能够充分的利用CPU的资源。同时可以处理连发按键。此按键扫描按键函数可以直接放在主函数中。如果感觉按键太过灵敏或者迟钝则改一下相关消抖动的宏定义即可。此函数也可以通过中断标志位进行定时的扫描。此时,需要添加一个定时标志位,并将相关消抖动的和连击时间的宏定义改小即可。然后在主程序类似下面这样写即可

if( KeyTime ) //定时扫描时间到

{

KeyValue = u8_ReadKey_f() ;

}

具体的工作就交给您去完成啦。

看看效果:

按键单击

连发时候的截图

至此,关于单个按键的学习就告一段落了,您是否已经明白了。如果您还不明白,那么把这个程序好好的看看,并画下流程图,分析分析。估计您就会恍然大悟。关键是思路要转换过来。

下面我们来看看多个按键的情况吧

一般情况下,如果多个按键每个都直接接在单片机的I/O上的话会占用很多的I/O资源。比较合理的一种做法是,按照行列接成矩阵的形式。按键接在每一个的行列的相交处。这样对于m行n 列的矩阵,可以接的按键总数是m*n。这里我们以常见的4*4矩阵键盘来讲解矩阵键盘的编程。

上图就是矩阵键盘的一般接法。

这里我们要介绍一种快速的键盘扫描法:线反转法(或者称为行列翻转法)。具体流程如下。首先,让单片机的行全部输出0,列全部输出1,读取列的值(假设行接P3口的高四位,列接低四位)。即P3= 0x0f ; 此时读列的值,如果有键按下,则相应的列读回来的值应该为低。譬如此时读回来的值为 0x0e ; 即按键列的位置已经确定。这时反过来,把行作为输入,列作为输出,即P0 = 0xf0 ;此时再读行的值,如果按键仍然被按下,则相应的行的值应该为低,如果此时读回来的值为0xe0,则确定了行的位置。说到这里,您应该笑了,知道了一个按键被按下的行和列的位置,那么就可以肯定确定它的位置了。我们把读回来的行值和列值进行或运算。即 0xe0 | 0x 0e 即0xee。那么0xee就是我们按下的按键的键值了。怎么样。只需几步就可以判断所有的键值,简单吧。下面再结合一个例子具体看看。

/******************************************

* 此模块所需相关支持库 *

******************************************/

#include"regx52.h"

#define uint8 unsigned char

#define uint16 unsigned int

/****************************************

* 与硬件连接相关的定义及宏定义和操作宏*

*****************************************/

#define KEYBOARD P3 //键盘连接到单片机上的端口位置

#define READ_ROW_ENLABLE KEYBOARD = 0x0f ; //读端口之前先把相应口置位(由基本51单片机特性决定的)

#define READ_COL_ENLABLE KEYBOARD = 0xf0 ; // 根据实际硬件连接情况修改

/*****************************************

* 模块内相关的宏定义及常数宏 *

******************************************/

#define NOKEY 0xff //定义无键按下时的返回值

#define DELAY_COUNT 2 //消抖时间常数

/*****************************************

* 此模块所需的全局或者外部变量*

*****************************************/

bit bdata StartScan = 0 ;//此变量需放在定时中断中置位

/*****************************************

* 按键扫描函数,按下去后经去抖,确定按下 *

* 则返回键值0~15;无键按下则返回0xff ; *

* 此函数需要定时器的支持(去抖....) *

*****************************************/

uint8 u8_KeyBoardScan_f()

{

static uint8 DelayCount = 0 ;

uint8 KeyValueRow = 0 ;

uint8 KeyValueCol = 0 ;

uint8 KeyValue = 0 ;

if( StartScan ) //开始扫描,StartScan在定时中断中置位

{

StartScan = 0 ; //清除开始扫描标志位,避免多次重复执行扫描程序

//读入按键状态前先向相应端口写1(由基本51单片机硬件结构决定)

READ_ROW_ENLABLE

if( ( KEYBOARD & 0x0f ) != 0x0f ) //判断是否有键按下

{

DelayCount++;

if( DelayCount <= DELAY_COUNT ) //有键按下则判断延时去抖的时间是否达到

{

return NOKEY ;

}

else //消除了抖动

{

if( ( KEYBOARD & 0x0f ) != 0x0f ) //再次判断是否按键真的按下

{

DelayCount = 0 ; //确定按下后,延时去抖计时器清0

KeyValueRow = KEYBOARD & 0x0f ; //取得行码

//准备读列,先向相应端口写1(由基本51单片机硬件结构决定)

READ_COL_ENLABLE

if ( (KEYBOARD & 0xf0) != 0xf0 ) //反转,读列码

{

KeyValueCol = KEYBOARD & 0xf0 ; //取得列码

//合并取得的行码和列码,即是相应按键的键值

switch( KeyValueCol | KeyValueRow)

{

case 0x77 : KeyValue = 0 ; break ;

case 0xb7 : KeyValue = 1 ; break ;

case 0xd7 : KeyValue = 2 ; break ;

case 0xe7 : KeyValue = 3 ; break ;

case 0x7b : KeyValue = 4 ; break ;

case 0xbb : KeyValue = 5 ; break ;

case 0xdb : KeyValue = 6 ; break ;

case 0xeb : KeyValue = 7 ; break ;

case 0x7d : KeyValue = 8 ; break ;

case 0xbd : KeyValue = 9 ; break ;

case 0xdd : KeyValue = 10 ;break ;

case 0xed : KeyValue = 11 ;break ;

case 0x7e : KeyValue = 12 ;break ;

case 0xbe : KeyValue = 13 ;break ;

case 0xde : KeyValue = 14 ;break ;

case 0xee : KeyValue = 15 ;break ;

default : return NOKEY ;

}

return KeyValue ;

}

else

{

DelayCount = 0 ;

return NOKEY ;

}

}

else

{

DelayCount = 0 ;

return NOKEY ;

}

}

}

else

{

DelayCount = 0 ;

return NOKEY ;

}

}

}

void v_T0_Isr_f( void ) interrupt INTERRUPT_TIMER2_OVERFLOW

{

StartScan = 1 ;

}

/***************************************************

*模块调试 * ***************************************************/

//主函数仅作演示用,主函数除按键扫描外的函数并没在这里给出

void v_Init_T2_f( void )

{

T2CON = 0x04 ;

T2MOD = 0x00 ;

TH2 = 0xd8 ;

RCAP2H = 0xd8 ;

TL2 = 0xf0 ;

RCAP2L = 0xf0 ;

ET2 = 1 ;

TR2 = 1 ;

}

void main( void )

{

uint8 readkey = 0 ;

v_Init_T2_f( ) ;

v_LcdInit_f( );

LOCATE( 1, 1)

PRINT("4*4KeyBoard Test")

EA = 1 ;

LOCATE( 3, 2)

while( 1 )

{

SHOW_ICON

readkey = u8_KeyBoardScan_f() ;

if( readkey != NOKEY)

{

PRINTN( readkey , 2)

LOCATE( 3, 2)

continue ;

}

else

{

continue ;

}

}

}

呵呵,按键扫描程序已经注释的很详细了。我就不多费嘴舌了。如果有不清楚的地方,欢迎跟帖讨论。

下面是按键测试的截图

自己写的按键单片机程序

自己写的按键单片机程序 用4个按键来控制数码管显示的内容#include#define duan P0//段选#define wei P2//位选unsigned char code wei1[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制查表的方法控制unsigned char code duan1[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0 x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char ge,shi,bai,a,b;sbit key1=P1;sbit key2=P1 ;sbit key3=P1 ;sbit key4=P1 ;void keys();//按键函数void s(unsigned char xms);//延时函数void DigDisplay(); //动态显示函数void init(); //初始化函数void main(void){init(); while(1){DigDisplay();keys();} }void DigDisplay(){unsigned char i;unsigned int j;bai=a/100;shi=a%100/10;ge=a%10;i=0;wei = wei1[i];//发送位选duan = duan1[bai]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐i++;wei = wei1[i];//发送位选duan = duan1[shi]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐i++;wei = wei1[i];//发送位选duan = duan1[ge]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐}void init() {key1=1;key2=1;key3=1;key4=1;TMOD=0X01;TH0=(65536- 45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;}void s(unsigned char xms){unsigned char x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}void times() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;b++;if(b==20){b=0;a++;if(a==256){a=0;}}}void keys(){if(key1==0){s(10);if(key1==0){a++;TR0=0;if(a==256)a=0;while(!key1)Dig Display();}}if(key2==0){s(10);if(key2==0){TR0=0;if(a==0)a=256;a--

信号处理与系统课程设计指导书.

《信号处理与系统分析》课程设计指导书 南通大学电子信息学院 信息工程系 2013年5月

前言 《信号处理与系统》是南通大学杏林学院通信信息类专业的一门专业基础课程,其理论性强,是其它后续专业课程的基础。 开设该课程设计的重要意义在于:首先,从帮助学习《信号处理与系统》课程的角度讲,学生借助于计算机,通过系统仿真,可以对信号以及线性系统的分析方法有一个更深入、更直接的认识,巩固理解一些抽象的知识,从而掌握《信号处理与系统》课程中的主要理论与基本原理;其次,从长远意义讲,学生掌握了数值分析软件Matlab的应用方法,为后续专业课的学习打下了坚实的基础;另外实践环节使学生在综合使用现代电子信息技术和手段进行设计、制作和创新方面的能力有所提高,为以后走上工作岗位从事信号分析和系统分析创造了必备的条件。 本课程设计时间为两周,学生根据课程设计指导书进行练习,考核成绩将根据学生出席情况及学习态度、课程设计报告完成情况、最后检查情况综合给出。 编者:李蕴华 2013年5月

课程设计的要求 一、熟练掌握Matlab语言的编程方法; 二、熟悉用于《信号处理与系统分析》的Matlab主要函数的应用; 三、记录实验结果(包括波形和数据),撰写课程设计报告。 主要内容及步骤 一、连续系统的时域分析 1、信号的产生 (1)编写生成连续阶跃信号u(t-t0)及冲激信号δ(t-t0)的函数:function [x,y]=jieyue(t1,t2,t0) 和 function [x,y] =chongji(t1,t2,t0),信号的时间变量取值区间为t1~t2,t0为阶跃点或冲激点处的时间,x为信号的时间向量,y为相应的信号值向量。(提示:冲激信号可以用时间宽度为dt、高度为1/dt的矩形脉冲来近似表示。当dt很小时,矩形脉冲信号可近似认为是冲激信号。在对该矩形脉冲信号采点取样后(设取样间隔为dt),信号值y的第1+(t0- t1)/dt个元素的值为1/dt,其余元素的值为0。) 参考程序: function [t,y1]=jieyue(t1,t2,t0) dt=0.01; ttt=t1:dt:t0-dt; tt=t0:dt:t2; t=t1:dt:t2; n=length(ttt); nn=length(tt); u=zeros(1,n); uu=ones(1,nn); y1=[u,uu]; return

基于51单片机的USB键盘设计与实现

三江学院 本科生毕业设计(论文)题目基于51单片机的USB键盘设计与实现高职院院(系)电气工程及其自动化专业 学生姓名梁邱一学号 G105071013 指导教师孙传峰职称讲师 指导教师工作单位三江学院 起讫日期 2013年12月10日至2014年4月12日

摘要 随着计算机技术的不断更新和多媒体技术的快速发展,传统的计算机外设接口因为存在许多缺点已经不能适应计算机的发展需要。比起传统的AT,PS/2,串口,通用串行总线USB,具有速度快,使用方便灵活,易于扩展,支持即插即用,成本低廉等一系列优点,得到了广泛的应用。 本论文阐述了51系列单片机和USB的相关内容,详细介绍了系统的一些功能设计,包括硬件设计和软件设计。在程序调试期间用简单的串口通信电路,通过串口调试助手掌握了USB指令的传输过程,这对整个方案的设计起到了很大的指导作用。论文以单片机最小系统配合模拟键盘组成的USB键盘硬件系统,通过对D12芯片的学习与探索,在其基本命令接口的支持下,结合硬件进行相应的固件程序设计,使其在USB协议下,实现USB模块与PC的数据通信,完成USB键盘的功能模拟。 总结论文研究工作有阐述USB总线的原理、对本设计的系统要求作出了分析、根据要求选定元件和具体编程方案、针对系统所要实现的功能对相关芯片作了详细介绍以及在硬件部分设计了原理图。 关键词:USB;D12;PC

Abstract With the rapid development of computer technology and multimedia technology constantly updated, traditional computer peripheral interface because there are many shortcomings have been unable to meet the development needs of the https://www.doczj.com/doc/2f7764825.html,pared to traditional AT, PS / 2, serial, Universal Serial Bus USB, with fast, flexible and easy to use, easy to expand, support Plug and Play, a series of advantages, such as low cost, has been widely used. This paper describes the 51 series and USB related content, detailing some of the features of the system design, including hardware and software design.During debugging a simple serial communication circuit, through the serial port debugging assistant master USB transfer instructions, which designed the entire program has played a significant role in guiding.Thesis smallest single-chip system consisting of analog keyboard with a USB keyboard hardware system, by learning and exploration D12 chips, with the support of its basic command interface, in conjunction with the corresponding hardware firmware design, making it in the USB protocol, USB module data communication with the PC, the USB keyboard to complete the functional simulation. This paper summarizes research work has elaborated the principle of the USB bus, the system is designed to require the analysis, components and solutions based on the specific requirements of the selected programming for the system to achieve the function of the relevant chips are described in detail in the hardware part of the design as well as the principle of Figure. Keywords:USB;D12;PC

基于单片机的键盘控制设计

摘要 单片机即单片微型计算机(Single-Chip Microcomputer),是集CPU,RAM,ROM, 定时,计数和多种接口于一体的微控制器,广泛应用于各个领域[1]。 本论文设计的单片机键盘主要由AT89C51单片机控制。该键盘控制系统是由单片机最小系统及LED显示电路组成。使用单片机C语言进行编程,实现可设定本论文主要介绍了键盘设计的软、硬件部分的设计,以及在设计、调试过程中遇到的问题及解决方案。 本设计包括硬件设计和软件设计,其中的硬件设计包括时钟电路,复位电路,4*4矩阵式键盘电路和LED数字显示电路。其中需要选择使用的扫描方式;为防键盘判断失误,导致实现多次按键按键的显示问题,需要去抖动的处理,其显示需要七段数码管显示。 本设计的与众不同之处在于其既能实现常规数字的显示,同时还能实现作为简单的电子琴,不同的键表示不同的音符;还能够实现简单计算功能。 本课题设计的键盘控制系统结构简单,造价成本低,功能齐全,具有很强的实用性。关键词:AT89C51单片机矩阵式键盘按键扫描

Abstract The monolithic integrated circuit namely monolithic microcomputer (Single-Chip Microcomputer), is collection CPU, RAM, ROM, fixed time, counting and many kinds of connections in a body micro controller.Widely applies in each domain. The present paper design monolithic integrated circuit keyboard mainly controls by at89C51 monolithic integrated circuit.This keyboard control system is composed by the monolithic integrated circuit smallest system and the LED display circuit. The use monolithic integrated circuit C language carried on the programming, the realization may establish the present paper mainly to introduce the keyboard designed the software and hardware part design, as well as the question and the solution which in the design, the debugging process met[13]. This design including the hardware design and the software design, hardware design including the clock electric circuit, repositions the electric circuit, the 4*4 matrix form keyboard electric circuit and the LED digita display circuit. Need choice use scanning way; In order to guard against the keyboard judgment fault, causes the realization many times the pressed key demonstration question, needs to vibrate processing, its demonstration needs seven section of nixietube demonstrations. This design out of the ordinary place lies in it already to be able to realize the conventional numeral demonstration, meanwhile can realize takes the electric piano, the different key expresses the different note; Also can realize the simple computation function[14]. This topic design keyboard control system structure is simple, the construction cost cost is low, the function is complete, has the very strong usability. Key words: AT89C51list slice machine Matrix form keyboard Pressed key scanning

单片机键盘输入程序

这是读取键盘的子程序 主要内容为:如何定义位,如何得到按键状态,防止键盘干扰的方法 以及如何处理读入的键值 思路:首先在某一引脚输出一个电平,然后读入引脚的电平,如果刚好相反 那么可能有按键发生,但是不排除干扰,为了防止干扰,需要软件延时20ms 应该说键盘输入是单片机外部指令输入的重要途径,因此如何设计键盘以及键盘的工作原理、读键盘的方法、键盘的抗干扰设计等在单电能机系统设计中占有重要地位。这个例子在系统硬件的基础上设计了软件查询程序、软件延时程序(防止干扰),大致讲述了一种查询式键盘的工作原理与读取方式。 下面是汇编语言写的单片机键盘输入程序 ************************************************** led1 bit p1.0;LED 显示位定义 led2 bit p1.1 led3 bit p1.2 led4 bit p1.3 led5 bit p1.4 led6 bit p1.5 led7 bit p1.6 led8 bit p1.7 s1 bit p0.0 ;数码管位定义 s2 bit p0.1 s3 bit p0.2 s4 bit p0.3 s5 bit p0.4 s6 bit p0.5 s7 bit p0.6 s8 bit p0.7 led_data equ p2;数码管显示数据定义 key1 bit p3.5 ;按键引脚定义

key2 bit p3.6; key3 bit p3.7; key equ 46h;按键寄存单元 org 00h jmp main org 030h main:mov sp,#30h;首先定义 lcall REST;初始化子程序 lp:lcall pro_key;调用键盘查询子程序 lcall KEYPR ;用来显示所查询到的键值jmp lp;反复调用,不断查询 REST: mov a,#00h mov b,#00h mov p0,#0 mov p1,0ffh ; mov p2,#0 mov key,#00h mov p2,#255 clr beep RET KEYPR: mov a,key;键值在累加器KEY中 jz PROEND ;如果A= 0,表示没有按键,返回cjne a,#1,k1;A= 1 ,用户按了第一个键mov a,#1 ;处理 A = 1的情况 mov dptr,#tab_nu ;查表 movc a,@a+dptr mov led_data,a ;显示"1" setb s1 ;在第一位

单片机按键的解决方法

单片机按键的解决解决方案 1、单片机上的按键控制一般采用两种控制方法:中断和查询。中断必须借助中断引脚,而 查询按键可用任何IO端口。按键较少时,一个按键占用一个端口,而按键较多时,多采用矩阵形式(如:经常用4个端口作为输出,4个端口作为输入的4X4矩阵来获得16个按键);还可以用单片机的AD转换功能一个引脚接多个按键,根据电阻分压原理判断是哪个按键按下。 2、中断形式 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器. 4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。按照这种分组,4bit一共可以分成5组 第0组:所有4bit用于指定响应优先级; 第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级; 第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级; 第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级; 第4组:所有4位用于指定抢占式优先级。 所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。每一个中断源都必须定义2个优先级。 有几点需要注意的是: 1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果; 2)抢占式优先级别相同的中断源之间没有嵌套关系; 3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。 GPIO外部中断: STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间智能使用一个,如:PA0,PB0,PC0,PD0,PE0,PF0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能使用了,在此情况下我们使用类似于PB1,PC2这种末端序号不同的外部中断源,每一组使用一个中断标志EXTI x.EXTI0~EXTI4这5个外部中断有着自己单独的中断响应函数。EXTI5~EXTI9共用一个中断响应函数,EXTI10~EXTI15共使用一个中断响应函数。 对于中断的控制,STM32有一个专用的管理机构NVIC.中断的使能,挂起,优先级,活动等等都是由NVIC在管理的。 编写IO口外部中断步骤及其注意事项:

基于单片机的模拟手机键盘

信息工程学院课程设计报告书题目 :基于单片机的模拟手机键盘 专业:电子信息科学与技术 班级:_ 学号: 学生姓名:_ 指导教师: 2013年10月18日

信息工程学院课程设计任务书 学号学生姓名专业(班级)电子信息 设计题目基于单片机的模拟手机键盘 单片机晶振频率:12MHz; 电源电压: +5v 设 计 技 术 参 数 编程控制单片机端口实现按键输出0~9 十个数字并在液晶上显示出来。 设 计 要 求 两天 工 作 量 注:可填写课程设计报告的字数要求或要完成的图纸数量。 工 作 计 划 [1]康华光,陈大钦 . 电子技术基础—模拟部分(第五版)[M]. 北京:高等教育出版社, 2005 参 考[2] 郭天祥 .51 单片机 C 语言教程[ M]. 北京:电子工业出版, 2012 资 料 指导教师签字教研室主任签字

信息工程学院课程设计成绩评定表 学生姓名:学号:专业(班级):电子信息 课程设计题目:基于单片机的模拟手机键盘 指导教师评语: 成绩: 指导教师: 年月日

摘要 本文是做基于89C52 单片机的手机键盘的设计;利用P0 端 3*4 的键值来模拟手机键盘 中的数字,将采用编程的方法来实现使用12 个键来做到0 到 9 的数字输出和退位清零,并 在液晶屏上显示。手机作为现代移动通信的载体,其技术也得到了很大的发展,手机的键盘布局已经成了各大厂商门竞争的主要方面,本次设计提高了我们对单片机的操作能力,让我们更加认识到单片机的广阔前景,对于我们更加深入学习和了解单片机提供了极大的帮助。 关键词:矩阵键盘,LCD液晶屏, 89C52 单片机。

单片机按键连接方法

单片机按键连接方法总结(五种按键扩展方案详细介绍) 单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。不同的设计方法,有着不同的优缺点。而又由于单片机I/O资源有限,如何用最少的I/O口扩展更多的按键是我所研究的问题。接下来我给大家展示几种自己觉得比较好的按键扩展方案,大家可以在以后的单片机电路设计中灵活运用。 1)、第一种是最为常见的,也就是一个I/O口对应一个按钮开关。 这种方案是一对一的,一个I/O口对应一个按键。这里P00到P04,都外接了一个上拉电阻,在没有开关按下的时候,是高电平,一旦有按键按下,就被拉成低电平。这种方案优点是电路简单可靠,程序设计也很简单。缺点是占用I/O资源多。如果单片机资源够多,不紧缺,推荐使用这种方案。 2)、第二种方案也比较常见,但是比第一种的资源利用率要高,硬件电路也不复杂。 这是一种矩阵式键盘,用8个I/O控制了16个按钮开关,优点显而易见。当然这种电路的程序设计相对也还是很简单的。由P00到P03循环输出低电平,然后检测P04到P07的状态。比方说这里P00到P03口输出1000,然后检测P04到P07,如果P04为1则说明按下的键为s1,如果P05为1则说明按下的是s2等等。为了电路的可靠,也可以和第一种方案一样加上上拉电阻。 3)、第三种是我自己搞的一种方案,可以使用4个I/O控制8个按键,电路多了一些二极管,稍微复杂了一点。 这个电路的原理很简单,就是利用二极管的单向导电性。也是和上面的方案一样,程序需要采用轮训的方法。比方说,先置P00到P03都为低电平,然后把P00置为高电平,接着查询P02和P03的状态,如果P02为高则说明按下的是s5,若P03为高则说明按下的是s6,然后再让P00为低,P01为高,同样检测P02和P03的状态。接下来分别让P02和P03为高,其他为低,分别检测P00和P01的状态,然后再做判断。这种方案的程序其实也不难。 4)这是我在一本书上看到的,感觉设计的非常巧妙,同样它也用到了二极管,不过比我的上一种方案的I/O利用率更高,他用4个I/O口控制了12个按键。我相信你了解了之后也会惊奇的。 首先好好品味一下这个方案吧,想想怎么来识别按键呢!

基于Matlab的信号处理系统与分析

基于Matlab的信号处理系统与分析 Matlab是一种简洁智能、特别适用于工程领域和科学研究的高级程序语言,将Matlab应用于信号处理系统中,能够帮助我们解决信号处理的很多难题。将Matlab运用于信号处理系统中,不仅提高了信号处理的效率性和可靠性,也在很大程度上促进了信号处理系统的研究和发展。通过对Matlab的特性分析及比较经典方法和Matlab对信号的处理和分析,进一步说明Matlab对信号的处理分析发挥着重要作用和绝对优势。 标签:Matlab;信号处理;分析;经典 1 Matlab的特性分析 Matlab是以矩阵运算为基础的程序设计语言,又被称为矩阵实验室,其语法规则简单易懂,功能强大,编程效率高,可以用于科学计算、图像处理、信号处理、神经元网络、小波分析、信号消噪等等领域。主要功能可分为四类:符号计算、数值的计算、分析与可视化、文字处理、SIMULINK动态仿真。所以应用Matlab处理与分析信号时是非常必要且高效的。 2 信号的处理与分析 信号的分析处理是指从将一大堆杂乱无章的信号或者一个复杂的信号按照我们的要求进行处理,使用相应的设备与技术,提取出关键部分,以方便我们分析和运用。 2.1 经典方法对信号的处理与分析 经典方法主要有两种:时域分析法、频域分析法;在分析过程中,不经过任何变换,函数的变量都是时间t,这种分析方法就是时域分析法。采用傅里叶正变换将时间变量t转换为频率变量w对信号进行分析,即频域分析法。连接二者的桥梁即傅里叶正反变换: F(jw)=∫∞-∞f(t)e-jwtdt(傅里叶正变换) f(t)=12π ∫∞-∞F(jw)ejwt dw(傅里叶反变换) 通过时域分析法可以得到任意时刻信号的瞬时值、最大值、最小值及均方根值,也可以分析得到直流分量与谐波分量,从而对信号进行分析处理。频域分析法是通过对信号的幅值、相位、能量变换与角频率的关系进行分析,研究其频率特性,如:相位谱,能量谱密度。通常经典方法局限性较大,运算量大,运算结果不易分析。 2.2 Matlab对信号的处理与分析

单片机按键控制蜂鸣器发声程序

#include typedef unsigned char uint8; typedef unsigned int uint16; uint8 Count,i; sbit Speak =P1A2; //蜂鸣器器控制脚 sbit keyl =卩3人2;〃按键控制引脚 sbit key2 =P3A3; sbit key3 =P3A4; /* 以下数组是音符编码 */ uint8 code SONG[] ={ 0xff,0x39,0x30,0x33,0x30,0xff,0x30,0x30,0x00,}; void Time0_Init()// 定时器 T0 方式 1 ,定时 10ms { TMOD = 0x01; IE = 0x82; TH0 = 0xDC; TL0 = 0x00; void Time0_Int() interrupt 1 { TH0 = 0xDC; TL0 = 0x00; Count++; } void delay (uint8 k)// 按键防抖延时 { uint8 j; while((k--)!=0) { for(j=0;j<125;j++) {;} } } void Delay_xMs(uint8 x)// 发声延时 { uint8 i,j; for(i=0; i

Count = 0; // 中断计数器清 0 Addr = i *3; while(1) { Temp1 = SONG[Addr++]; if (Temp1 == 0xFF) //休止符 { TR0 = 0; Delay_xMs(100); } else if (Temp1 == 0x00) //歌曲结束符 { return; } else { Temp2 = SONG[Addr++]; TR0 = 1; while(1) { Speak = ~Speak; Delay_xMs(Temp1); if(Temp2 == Count) { Count = 0; break; } } } } }void keyscan (void)// 按键切换声音函数{ if(key1==0) { delay(10); if(key1==0) {

用51单片机中断编写的4x4键盘程序

用51单片机中断编写的4x4键盘程序 应用查询扫描编写键盘程序,由于要给按键去抖动,程序变得比较复杂和冗长(详见2013年9月29日博文《MSP430和 AT89C51单片机4x4键盘C程序》),如果用中断编写,设置中断响应在下降沿时执行中断,则程序编写不用去抖动判断,所以相比较要简单很多!下面用汇编和C语言两种方式编写4X4键盘程序! 一、汇编程序 ORG 0000H LJMP MAIN ORG 0003h Ljmp ZD0

ORG 000Bh LJMP TZD0 ORG 0013h Ljmp ZD1 ORG 001Bh LJMP TZD1 ORG 0040H MAIN: Mov TMOD,#66h MOV TH0,#0ffh MOV TL0,#0ffh MOV TH1,#0ffh MOV TL1,#0ffh SETB EA SETB ET0 SETB TR0 SETB ET1 SETB TR1 SETB IT0 SETB IT1 SETB EX0 SETB EX1 xh: mov P1,#0feh

Lcall Delay mov P1,#0fdh Lcall Delay mov P1,#0fbh Lcall Delay mov P1,#0f7h Lcall Delay SJMP xh ZD0: JNB P1.0,dat1 JNB P1.1,dat2 JNB P1.2,dat3 JNB P1.3,dat4 dat1: mov P2,#06h ;1 sjmp ZD0R dat2: mov P2,#5bh ;2 sjmp ZD0R dat3: mov P2,#4fh ;3 sjmp ZD0R dat4: mov P2,#66h ;4 ZD0R: reti ZD1: JNB P1.0,dat5

基于单片机的模拟手机键盘

信息工程学院课程设计报告书题目: 基于单片机的模拟手机键盘 专业:电子信息科学与技术 班级: _ 学号: 学生姓名: _ 指导教师: 2013年 10月 18日

信息工程学院课程设计任务书

信息工程学院课程设计成绩评定表

摘要 本文是做基于89C52单片机的手机键盘的设计;利用P0端3*4的键值来模拟手机键盘中的数字,将采用编程的方法来实现使用12个键来做到0到9的数字输出和退位清零,并在液晶屏上显示。手机作为现代移动通信的载体,其技术也得到了很大的发展,手机的键盘布局已经成了各大厂商门竞争的主要方面,本次设计提高了我们对单片机的操作能力,让我们更加认识到单片机的广阔前景,对于我们更加深入学习和了解单片机提供了极大的帮助。关键词:矩阵键盘,LCD液晶屏,89C52单片机。

目录 1 任务提出与方案论证.............................................................................................................. - 2 - 1.1方案一...................................................................................................................... - 2 - 1.2 方案二.......................................................................................................................... - 2 - 1.3方案对比与选择............................................................................................................ - 2 - 2. 系统硬件电路的设计............................................................................................................. - 4 - 2.1 微处理器的选择........................................................................................................... - 4 - 2.2单片机的基本机构........................................................................................................ - 4 - 2.3键盘接口电路................................................................................................................ - 5 - 2.4消除抖动........................................................................................................................ - 6 - 3 详细设计.................................................................................................................................. - 7 - 3.1程序流程设计............................................................................................................... - 7 - 3.2硬件电路设计............................................................................................................... - 8 - 4 总结 ......................................................................................................................................... - 9 -参考文献.................................................................................................................................... - 10 -附录 ........................................................................................................................................... - 11 -

单片机按键识别方法之一

单片机按键识别方法之一 1.实验任务 每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0到P1.3显示出其的二进制计数值。 2.电路原理图 图4.8.1 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.其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说, 当我们按下一个按键 时,总希望某个命令只 执行一次,而在按键按 下的过程中,不要有干 扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。 因此在按键按下的时候,图4.8.2 要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况 下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及 硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可 以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候, 总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状 态。具体的一个按键从按下到释放的全过程的信号图如上图所示: 从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU 就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。 由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。

基于单片机按键报警器制作

郑州科技学院 《单片机》课程设计 题目基于按键控制的声光报警器学生姓名王阳 专业班级电动五班 学号xxx 院(系)电气工程学院 指导教师叶冬 完成时间 2015年 11 月 6 日

目录 1 课程设计的目的 (1) 2课程设计的任务与要求 (2) 3设计方案与论证 (3) 3.1方案选择与论证 (3) 3. 2 声光报警器的流程图 (4) 4设计原理及功能说明 (5) 4.1 元器件选用原理 (5) 4.2 总体电路图 (5) 5单元电路的设计(计算与说明) (5) 5.1 声光报警电路设计 (6) 5.2 单片机最小系统设计 (7) 6硬件的制作与调试 (5) 6.1 制作工具的操作 (8) 6.2 声光报警器的调试 (9) 7总结 (10) 参考文献 (15) 附录1:总体电路原理图 (18) 附录2:实物图 (19)

附录3:元器件清单 (20) 附录4:程序 (19)

1课程设计的目的 声光报警器在实际的生活中可以见到许多,运用于生活的许多方面,既有硬件实现的,也有硬件和软件同时控制执行。本课题基于微机原理与接口技术的学习,运用汇编语言实现一个声光报警器的功能。报警和发光同步进行。因此用它进行报警探测监控,具有良好的隐蔽性,白天和黑夜都可以使用,而且其抗干扰能力强。报警系统利用单片机控制技术,自动探测发生在布防区内的侵入行为,产生报警信号,一旦发生突发事件,就会向人们发出报警提示,从而让人即使采取应对措施。 同时,通过课程任务设计,可以很好的对课本知识运用于实践,同时也可以激发学习于专业相关的一些知识,从而扩大自己知识面的广度。其次,通过课题任务设计,在让我们思考使用学习工具的同时也学会去发现问题解决问题这一过程。 2.课程设计的任务与要求 (1)设计一种基于按键控制的声光报警器。 (2)基于单片机最小系统上按照电路设计焊接好各元器件,运用汇编语言实现一个声光报警器的功能。 (3)当报警按钮按下时扬声器报警,在报警期间报警指示灯亮,当报警解除按钮按下则解除报警。 (4) 在设计电路的过程中熟练地掌握各个元器件的用途。 (5)了解电路板的制作流程。 (6)掌握电路板的焊接方法与技巧。 3.设计方案与论证 3.1 方案选择与论证

信号与系统和数字信号处理

833-信号与系统和数字信号处理 一、考试目的 1. 信号与系统 考查学生是否掌握信号与线性系统的基本概念、基本理论和线性时不变连续(离散)系统的时域、变换域分析方法,以及相关的分析问题、解决问题的能力。 2. 数字信号处理 考察学生是否掌握数字信号处理的基本知识以及运用理论解决实际问题的能力。 二、考试要求 1. 信号与系统 掌握信号与系统的概念、表征、分类与判断;熟悉信号的分解与基本运算,特别是卷积积分(和)的定义、性质与运算;时域法会求LTI连续(离散)系统的各种响应;掌握连续(离散)信号各种变换域(FS、FT、LT,ZT、DTFT)分析法的定义、性质、反变换;并熟练应用于LTI连续(离散)系统分析;熟悉无失真传输、理想滤波器、系统的物理可实现条件、抽样定理、调制与解调的概念,掌握它们在系统分析中的应用;熟悉系统函数的概念、零极图表示,结合收敛域会判断系统的因果性、稳定性;掌握连续(离散)系统的频率响应,能大致画出系统的幅频特性,并说明其滤波性能;掌握状态方程与输出方程的概念、建立与求解;并能判断系统的稳定性、可控性与可观性。 2. 数字信号处理 掌握离散时间信号和系统分析的基本原理和基本分析方法;理解离散傅里叶变换的基本原理,运用离散傅里叶变换快速算法解决实际问题的能力;掌握数字滤波器的基本概念及结构。 三、考试内容与比例 1. 信号与系统(占70%) 1)连续(离散)信号的描述与分类;典型信号的定义、表征与性质;信号的分解、基本运算,特别是卷积积分(和)的定义、性质与运算;系统的概念、连接与分类。 2)线性连续(离散)系统的数学模型与算子表示;时域分析法求解LTI连续(离散)系统的自由响应、受迫响应,冲激响应、阶跃响应,零输入响应、零状态响应以及全响应,了解瞬态响应与稳态响应;连续(离散)LTI系统的模拟框图、特征函数与系统特性。 3)周期信号的傅立叶级数与频谱;周期信号、非周期信号以及抽样信号的傅立叶变换与频谱;能量谱与功率谱;线性连续系统的频域分析法,频率响应;无失真传输,理想滤波器,系统的物理可实现条件,抽样定理,调制与解调。

相关主题
文本预览
相关文档 最新文档