实验一矩阵键盘检测_第1页
实验一矩阵键盘检测_第2页
实验一矩阵键盘检测_第3页
实验一矩阵键盘检测_第4页
实验一矩阵键盘检测_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验一 矩阵键盘检测一、 实验目的:1、 学习非编码键盘的工作原理和键盘的扫描方式。2、 学习键盘的去抖方法和键盘应用程序的设计。二、 实验设备: 51/AVR实验板、USB连接线、电脑三、 实验原理: 键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。我们可以通过键盘输入数据或命令来实现简单的人机通信。1、 按键的分类一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。 2、 按键的输入原理在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。因此,键信息输入是与软件结构密切相关的过程。对于一组键或一个键盘,通过接口电路与单片机相连。单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。 3、按键的特点与去抖机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图1(a)所示,抖动时间的长短与开关的机械特性有关,一般为5 -10 ms。从图中可以看出,在触点抖动期间检测按键的通与断状态,可能导致判断出错。即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。一般来说,在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。(本学习板采用软件去抖方式)。按键抖动状态图 硬件电容去抖按键去抖流程图从按键的去抖流程图我们可以知道,检测到有键按下时,应延时等待一段时间(可调用一个5ms10ms的延迟子程序),然后再次判断按键是否被按下,若此时判断按键仍被按下,则认为按键有效,若此时判断按键没有被按下,说明为按键抖动或干扰,应返回重新判断。键盘真正被按下才可进行相应的处理程序,此时基本就算实现了按键输入,进一步的话可以判断按键是否释放。四、 实验步骤上面的图的意思是P3.1P3.3 跟P3.4P3.7不一样的,他们是相互连接(当按下键时),组成4*4=16个键的。如果给P3一个扫描初值的话:如0x0F ,则没有键按下时为:P3.1P3.3为1P3.4P3.7为0如果有键按下,则情况发生变化:高电平接入低电平:如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。则P3此时为:0000 0111,这时如果用P3&0x0F,则高四位为0低四位保留,可以得到低四位的内容了。通过去抖操作,即一个delay,可以得到低四位内容。这里设为:h=P3&0x0F; 如果再得到高四位内容,则可以组成一个数,来定位哪个键了。程序框图:P3=FFH,P3.0=0有键按下吗?延时10ms真得有键按下吗?根据当前状态识别按键P3=FFH,P3.1=0有键按下吗?延时10ms真得有键按下吗?根据当前状态识别按键P3=FFH,P3.2=0有键按下吗?延时10ms真得有键按下吗?根据当前状态识别按键P3=FFH,P3.3=0有键按下吗?延时10ms真得有键按下吗?根据当前状态识别按键C语言源程序:#includesbit beep=P23;sbit dula=P26;sbit wela=P27; unsigned char i=100;unsigned char j,k,temp,key;void delay(unsigned char i) for(j=i;j0;j-) for(k=125;k0;k-);Unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;display(unsigned char num) P0=tablenum; dula=1; dula=0; P0=0xc0; wela=1; wela=0;void main() dula=0; wela=0; while(1) P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xee: key=0; break; case 0xde: key=1; break; case 0xbe: key=2; break; case 0x7e: key=3; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; beep=0; beep=1; display(key); P1=0xfe; P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xed: key=4; break; case 0xdd: key=5; break; case 0xbd: key=6; break; case 0x7d: key=7; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; beep=0; beep=1; display(key); P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xeb: key=8; break; case 0xdb: key=9; break; case 0xbb: key=10; break; case 0x7b: key=11; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; beep=0; beep=1; display(key); P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xe7: key=12; break; case 0xd7: key=13; break; case 0xb7: key=14; break; case 0x77: key=15; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; beep=0; beep=1; display(key); 汇编程序: dula bit P2.0; wela bit P2.1;KEYBUF EQU 30H ORG 00HSTART: MOV KEYBUF,#2WAIT: MOV P3,#0FFH CLR P3.4 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK1 MOV KEYBUF,#0 mov p1,#11111110b LJMP DK1NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#4 mov p1,#11111100b LJMP DK1NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#8 mov p1,#11111000b LJMP DK1NK3: CJNE A,#07H,NK4 MOV KEYBUF,#12 mov p1,#11110000b LJMP DK1NK4: NOPDK1: call display DK1A: MOV A,P3 ;等待释放 ANL A,#0FH XRL A,#0FH JNZ DK1ANOKEY1: MOV P3,#0FFH CLR P3.5 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK5 MOV KEYBUF,#1 mov p1,#11111110b LJMP DK2NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 mov p1,#11111100b LJMP DK2NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#9 mov p1,#11111000b LJMP DK2NK7: CJNE A,#07H,NK8 MOV KEYBUF,#13 mov p1,#11110000b LJMP DK2NK8: NOPDK2: call displayDK2A: MOV A,P3 ;释放 ANL A,#0FH XRL A,#0FH JNZ DK2ANOKEY2: MOV P3,#0FFH CLR P3.6 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK9 MOV KEYBUF,#2 mov p1,#11111110b LJMP DK3NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#6 mov p1,#11111100b LJMP DK3NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10 mov p1,#11111000b LJMP DK3NK11: CJNE A,#07H,NK12 MOV KEYBUF,#14 mov p1,#11110000b LJMP DK3NK12: NOPDK3: call displayDK3A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK3ANOKEY3: MOV P3,#0FFH CLR P3.7 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK13 MOV KEYBUF,#3 mov p1,#11111110b LJMP DK4NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#7 mov p1,#11111100b LJMP DK4NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#11 mov p1,#11111000b LJMP DK4NK15: CJNE A,#07H,NK16 mov p1,#11110000b MOV KEYBUF,#15 LJMP DK4NK16: NOPDK4: call displayDK4A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK4ANOKEY4: LJMP WAITDELY10MS: MOV R6,#10D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET display: MOV A,KEYBUF ;查表 MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A setb dula clr dula mov P0,#0c0h setb wela clr wela clr p2.3 acall ds1ms ;延时,以便人眼可以观察到 setb p2.3 ;acall ds1ms ret ds10ms: mov r1,#1ds1lo: mov r2,#200ds2lo: mov r3,#200 djnz r3,$ djnz r2,ds2lo djnz r1,ds1lo ret ;延时返回TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H END五、 实验现象:当你按下矩阵键盘中的任何一个键,蜂鸣器响一声,并在数码管上显示相应的键值。图为实际演示图片。六、 实验小结:本实验介绍了单片机键盘的工作原理并给出了实例,从中我们可以知道一个完善的键盘控制程序应具备以下功能:(1)检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。(2)有可靠的逻辑处理办法。每次只处理一个按键,其间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。(3)准确输出按键值,以满足按键功能要求。对于矩阵键盘而言,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。实验二 交通灯一、 实验目的:1、 了解单片机中断与定时器工作原理,掌握中断与定时器程序结构。2、 理解七段数码管的工作原理,并在此基础上能可以进行简单的数码管驱动操作。3、 可以灵活的用I/O口原理控制LED小灯的亮和灭。二、 实验设备: 51/AVR实验板、USB连接线、电脑。三、 实验原理:本实验以P1口作为输出。程序初始化是绿灯先亮,具体顺序为绿-黄-红-黄-绿-黄-红,重复循环。其中,红灯与绿灯显示时间均为50s,中间的黄灯显示时间为15s。绿灯用八位发光二极管流动闪烁作代表;红灯用八位发光二极管全亮作代表;黄灯用八位发光二极管全亮全灭闪烁作代表。此外,还用到定时器T0作为倒计时使用,P0口作为LED灯的显示。在实验中利用软件延时的方法来控制红黄绿灯的亮的时间。考虑到延时时间较长,所以先用T0产生终端然后计数的方法来实现延时,利用P1口作为红黄绿灯控制端口。 实验模块图1 实验模块图2四、 实验步骤:1、 熟悉单片机内部原理图,掌握各实验模块的使用方法。2、 设计实验方案,画出流程图。3、 根据流程图编写程序。程序如下:#include#define uchar unsigned char#define uint unsigned intsbit dula=P26;sbit wela=P27;sbit beep=P23;unsigned int pp;unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;uchar j,k,l=255;uchar a1,a0;uchar shijian,deng=2;void delay(unsigned int i) for(j=i;j0;j-) for(k=125;k0;k-);void display(unsigned char sh_c,unsigned char g_c) dula=0; P0=tablesh_c; dula=1; dula=0; wela=0; P0=0xfe; wela=1; wela=0; delay(5); P0=tableg_c; dula=1; dula=0; P0=0xfd; wela=1; wela=0; delay(5);void main()TMOD=0x01;TR0=1;TH0=(65536-46080)/256;/ 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。TL0=(65536-46080)%256;/46080的来历,为50000*11.0592/12ET0=1;EA=1;while(1)if(shijian=0)switch(deng)case 0: shijian=50; /红灯deng=1;break;case 1: shijian=15; /黄灯deng=2;break;case 2: shijian=50; /绿灯deng=3;break;case 3: shijian=15; /黄灯deng=0;break;if(pp=20)pp=0;shijian-;a0=shijian%10;a1=shijian/10;display(a1,a0);switch(deng)case 1: P1=0X00; /红灯break;case 2: /黄灯if(shijian%2=0)P1=0x00;if(shijian%2=1)P1=0xff;break;case 3: /绿灯if(shijian%2=0)P1=0x55;if(shijian%2=1)P1=0xaa;break;case 0:if(shijian%2=0) /黄灯P1=0x00;if(shijian%2=1)P1=0xff;break;void time0() interrupt 1TH0=(65536-46080)/256;TL0=(65536-46080)%256;pp+; 4、下载程序到单片机,观察实验现象。五、 实验现象: 上电后,绿灯(八位发光二极管流动闪烁)先亮,数码管50秒倒计时;黄灯(八位发光二极管全亮全灭闪烁)亮,数码管15秒倒计时;接着红灯亮(八位发光二极管全亮),数码管50秒倒计时;接着,再黄灯(八位发光二极管全亮全灭闪烁)亮,数码管15秒倒计时,如此循环。 六、 实验总结:通过此次实验,使我更加扎实的掌握了中断、LED驱动、数码管显示的知识,过程中遇到了一些问题,如中断初值的设定,如何让小灯发光,通过向老师及同学请教,慢慢了解了其中的奥妙。学习单片机一定要注重实践,边学边练,发现问题及时解决。不可拖延怠慢,你怎样对它,它就怎样对你。实验三 串口调试 直接返回数据一、 实验目的:1、 了解单片机串行口的结构、使用方法,学习串行口应用程序的编写方法。2、 熟悉单片机串行口接收和发送数据的实现方法。3、 熟悉单片机串行通信的格式规定。4、 掌握Vision环境中调试串行口应用程序的方法。二、 实验设备: 51/AVR实验板、USB连接线、电脑软件:Keil Vision、串口调试助手v2.2、STC-ISP-V480三、 实验原理:通信是人们传递信息的方式。计算机通信是将计算机技术和通信技术相结合,完成计算机与外部设备或计算机与计算机之间的信息交换。这种信息交换可以分为两大类:并行通信与串行通信。并行通信通常是将数据字节的各位用多条数据线同时进行传送,如图所示: 由图可见,并行通信除了数据线外还有通信联络控制线。数据发送方在发送数据前,要询问数据接收方是否“准备就绪”。数据接收方收到数据后,要向数据发送方回送数据已经接收到的“应答”信号。并行通信的特点是:控制简单,传输速度快。由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,串行通信时,数据发送设备先将数据代码由并行形式转换成串行形式,然后一位一位地放在传输线上进行传送。数据接收设备将接收到的串行形式数据转换成并行形式进行存储或处理。 串行通信的特点是:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备。但数据的传送控制比并行通信复杂。异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。为了实现异步传输字符的同步,采用的办法是使传送的每一个字符都以起始位“0”开始,以停止位“1”结束。这样,传送的每一个字符都用起始位来进行收发双方的同步。停止位和间隙作为时钟频率偏差的缓冲,即使双方时钟频率略有偏差,总的数据流也不会因偏差的积累而导致数据错位。传送开始后,接收设备不断检测传输线,看是否有起始位到来。当收到一系列的“1”(空闲位或停止位)之后,检测到一个“0”,说明起始位出现,就开始接收所规定的数据位和奇偶校验位以及停止位。经过处理将停止位去掉,把数据位拼成一个并行字节,并且经校验无误才算正确地接收到一个字符。一个字符接收完毕后,接收设备又继续测试传输线,监视“0”电平的到来(下一个字符开始),直到全部数据接收完毕。异步通信的特点是不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加23 位用于起止位,各帧之间还有间隔,因此传输效率不高。 计算机的通信要求传送的是数字信号。在远程数据通信时,通常要借用现存的公用电话网。但是电话网是为3003 400Hz

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论