实验一 矩阵键盘检测

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一矩阵键盘检测
一、实验目的:
1、学习非编码键盘的工作原理和键盘的扫描方式。

2、学习键盘的去抖方法和键盘应用程序的设计。

二、实验设备:
51/AVR实验板、USB连接线、电脑
三、实验原理:
键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。

我们可以通过键盘输入数据或命令来实现简单的人机通信。

1、按键的分类
一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。

前者造价低,后者寿命长。

目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。

按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。

编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。

全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。

非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。

由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。

2、按键的输入原理
在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。

也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。

此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。

当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。

因此,键信息输入是与软件结构密
切相关的过程。

对于一组键或一个键盘,通过接口电路与单片机相连。

单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。

3、按键的特点与去抖
机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。

其抖动过程如图1(a)所示,抖动时间的长短与开关的机械特性有关,一般为5 -10 ms。

从图中可以看出,在触点抖动期间检测按键的通与断状态,可能导致判断出错。

即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。

为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。

一般来说,在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。

(本学习板采用软件去抖方式)。

按键抖动状态图
硬件电容去抖
按键去抖流程图
从按键的去抖流程图我们可以知道,检测到有键按下时,应延时等待一段时间(可调用一个5ms~10ms的延迟子程序),然后再次判断按键是否被按下,若此时判断按键仍被按下,则认为按键有效,若此时判断按键没有被按下,说明为按键抖动或干扰,应返回重新判断。

键盘真正被按下才可进行相应的处理程序,此时基本就算实现了按键输入,进一步的话可以判断按键是否释放。

四、实验步骤
上面的图的意思是P3.1~P3.3 跟P3.4~P3.7不一样的,他们是相互连接(当按下键时),组成4*4=16个键的。

如果给P3一个扫描初值的话:如0x0F ,则没有键按下时为:P3.1~P3.3为1P3.4~P3.7为0如果有键按下,则情况发生变化:高电平接入低电平:如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。

则P3此时为:0000 0111,这时如果用P3&0x0F,则高四位为0低四位保留,可以得到低四位的内容了。

通过去抖操作,即一个delay,可以得到低四位内容。

这里设为:h=P3&0x0F; 如果再得到高四位内容,则可以组成一个数,来定位哪个键了。

程序框图:
C 语言源程序:
#include<reg51.h>
sbit beep=P2^3;
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char i=100;
unsigned char j,k,temp,key;
void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
Unsigned char
code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; P3=FFH,P3.0=0 有键按下吗? 延时10ms 真得有键按下吗? 根据当前状态识别按键 P3=FFH,P3.1=0 有键按下吗? 延时10ms 真得有键按下吗? 根据当前状态识别按键 P3=FFH,P3.2=0
有键按下吗?
延时10ms
真得有键按下吗? 根据当前状态识别按键 P3=FFH,P3.3=0 有键按下吗? 延时10ms
真得有键按下吗? 根据当前状态识别按键
display(unsigned char num) {
P0=table[num];
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 00H
START: MOV KEYBUF,#2 WAIT:
MOV P3,#0FFH
CLR P3.4
MOV A,P3
ANL A,#0FH
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 DK1
NK1: CJNE A,#0DH,NK2
MOV KEYBUF,#4
mov p1,#11111100b
LJMP DK1
NK2: CJNE A,#0BH,NK3
MOV KEYBUF,#8
mov p1,#11111000b
LJMP DK1
NK3: CJNE A,#07H,NK4
MOV KEYBUF,#12
mov p1,#11110000b
LJMP DK1
NK4: NOP
DK1:
call display
DK1A: MOV A,P3 ;等待释放
NOKEY1:
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 DK2
NK5: CJNE A,#0DH,NK6
MOV KEYBUF,#5
mov p1,#11111100b
LJMP DK2
NK6: CJNE A,#0BH,NK7
MOV KEYBUF,#9
mov p1,#11111000b
LJMP DK2
NK7: CJNE A,#07H,NK8
NK8: NOP
DK2:
call display
DK2A: MOV A,P3 ;释放
ANL A,#0FH
XRL A,#0FH
JNZ DK2A
NOKEY2:
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 DK3
NK9: CJNE A,#0DH,NK10
MOV KEYBUF,#6
NK10: CJNE A,#0BH,NK11
MOV KEYBUF,#10
mov p1,#11111000b
LJMP DK3
NK11: CJNE A,#07H,NK12
MOV KEYBUF,#14
mov p1,#11110000b
LJMP DK3
NK12: NOP
DK3:
call display
DK3A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK3A NOKEY3:
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
MOV KEYBUF,#3
mov p1,#11111110b
LJMP DK4
NK13: CJNE A,#0DH,NK14
MOV KEYBUF,#7
mov p1,#11111100b
LJMP DK4
NK14: CJNE A,#0BH,NK15
MOV KEYBUF,#11
mov p1,#11111000b
LJMP DK4
NK15: CJNE A,#07H,NK16
mov p1,#11110000b
MOV KEYBUF,#15
LJMP DK4
NK16: NOP
DK4:
call display
DK4A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK4A
NOKEY4:
LJMP WAIT
DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
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,#1
ds1lo: mov r2,#200
ds2lo: 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<reg51.h>
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
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;j>0;j--)
for(k=125;k>0;k--);
}
void display(unsigned char sh_c,unsigned char g_c)
{
dula=0;
P0=table[sh_c];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[g_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/12 ET0=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 1
{ TH0=(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”电平的到来(下一个字符开始),直到全部数据接收完毕。

异步通信的特点是不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3 位用于起止位,各帧之间还有间隔,因此传输效率不高。

计算机的通信要求传送的是数字信号。

在远程数据通信时,通常要借用现存的公用电话网。

但是电话网是为300~3 400Hz 的音频模拟信号
设计的,对二进制数据的传输是不合适的。

为此,在发送时需要对二进制数据进行调制,使之适合在电话网上传输。

在接收时,需要进行解调,以将模拟信号还原成数字信号。

利用调制器(Modulator)把数字信号转换成模拟信号,然后送到通信线路上去,再由解调器(Demodulator)把从通信线路上收到的模拟信号转换成数字。

51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。

但电脑的串口是RS232电平的,而单片机的串口是TTL电平的,所以进行串行通讯时要满足一定的条件,就是两者之间必须有一个电平转换电路。

我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是用专用芯片更简单可靠。

RS-232通信电平
RS-232C 接口规定使用25 针连接器,连接器的尺寸及每个插针的排列位置都有明确的定义。

一般的应用中并不一定用到RS-232C 标准的全部信号线,所以在实际应用中常常使用9 针连接器替代25 针连接器。

连接器引脚定义如图所示。

图中所示为阳头定义,通常用于计算机侧,对应的阴头用于连接线侧。

DB-25(阳头)和DB-9(阳头)连接器定义
RS-232C 标准接口主要引脚定义
四、实验步骤:
1、系统由AT89S52单片机作为中央控制器控制各功能模块的正常工作
及数据的接收和处理。

程序框图:
2、程序代码:
ORG 0000H
LJMP MAIN
;主程序的开始
ORG 0200H
MAIN: MOV TMOD,#20H ;
MOV TL1,#0F4H ; 初值=256-11059200/32/12/2400
MOV TH1,#0F4H ;
SETB TR1 ;启动波特率发生
MOV SCON,#50H ;串口工作方式,设置为方式2
M1: JNB RI,M1 ;查询是否有数据接收
MOV A,SBUF ;数据暂存于A
CLR RI ;允许接收
MOV SBUF,A ;将接收到的数据发送出去
M2: JNB TI,M2 ;等待发送完成
CLR TI
SJMP M1 ;循环扫描串行通讯接口数据
END
3、汇编、连接该程序,生成可执行文件。

4、下载到单片机
5、在UART#0窗口输入字符,观察窗口变化。

五、实验现象:
六、实验总结:
1、对于Keil软件已经可熟练掌握,但对于定时器的初值计算仍需巩
固和加强。

2、对于串行口的工作原理有了一定的了解。

3、能够读懂程序,并作出适当修改。

相关文档
最新文档