1、实验一 矩阵键盘检测一、 实验目的:1、 学习非编码键盘的工作原理和键盘的扫描方式。2、 学习键盘的去抖方法和键盘应用程序的设计。二、 实验设备:51/AVR 实验板、USB 连接线、电脑三、 实验原理:键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。我们可以通过键盘输入数据或命令来实现简单的人机通信。1、 按键的分类一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键) 。按键按照
2、接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘) 。2、 按键的输入原理在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说,它
3、能提供标准的 TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。因此,键信息输入是与软件结构密切相关的过程。对于一组键或一个键盘,通过接口电路与单片机相连。单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。3、按键的特点与去抖机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。
4、其抖动过程如图1(a )所示,抖动时间的长短与开关的机械特性有关,一般为 5 -10 ms。从图中可以看出,在触点抖动期间检测按键的通与断状态,可能导致判断出错。即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。一般来说,在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。 (本学习板采用软件去抖方式) 。按键抖动状态图硬件电容去抖有 按 键 信 号 ?延 时 等 待 十 秒仍 有 按 键 信号 ?键 盘 处 理按 键 释 放 ?YNYNYN按键去抖流程图从按键的去抖流程图我们可
5、以知道,检测到有键按下时,应延时等待一段时间(可调用一个 5ms10ms 的延迟子程序) ,然后再次判断按键是否被按下,若此时判断按键仍被按下,则认为按键有效,若此时判断按键没有被按下,说明为按键抖动或干扰,应返回重新判断。键盘真正被按下才可进行相应的处理程序,此时基本就算实现了按键输入,进一步的话可以判断按键是否释放。四、 实验步骤上面的图的意思是 P3.1P3.3 跟 P3.4P3.7 不一样的,他们是相互连接(当按下键时) ,组成 4*4=16 个键的。如果给 P3 一个扫描初值的话:如 0x0F ,则没有键按下时为:P3.1P3.3 为 1P3.4P3.7 为 0如果有键按下,则情况发
6、生变化:高电平接入低电平:如 P3.3 与 P3.7连接的键按下,则 P3.3 与 P3.7 为 0,即接地了。则 P3 此时为:0000 0111,这时如果用 P3 如果再得到高四位内容,则可以组成一个数,来定位哪个键了。程序框图: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 语言源程序
7、:#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;d
8、ula=1;dula=0;P0=0xc0;wela=1;wela=0;void main()dula=0;wela=0;while(1)P3=0xfe;temp=P3;temp=tempif(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=tempbeep=0;beep=1;display(key);
9、P1=0xfe;P3=0xfd;temp=P3;temp=tempif(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=tempbeep=0;beep=1;display(key);P3=0xfb;temp=P3;temp=tempif(temp!=0xf0)delay(10);if(temp!=0x
10、f0)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=tempbeep=0;beep=1;display(key);P3=0xf7;temp=P3;temp=tempif(temp!=0xf0)delay(10);if(temp!=0xf0)temp=P3;switch(temp)case 0xe7:key=12;break;case 0xd7:key=13;bre
11、ak;case 0xb7:key=14;break;case 0x77:key=15;break;while(temp!=0xf0)temp=P3;temp=tempbeep=0;beep=1;display(key);汇编程序:dula bit P2.0; wela bit P2.1;KEYBUF EQU 30HORG 00HSTART: MOV KEYBUF,#2WAIT:MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1MO
12、V A,P3ANL A,#0FHCJNE A,#0EH,NK1MOV KEYBUF,#0mov p1,#11111110bLJMP DK1NK1: CJNE A,#0DH,NK2MOV KEYBUF,#4mov p1,#11111100bLJMP DK1NK2: CJNE A,#0BH,NK3MOV KEYBUF,#8mov p1,#11111000bLJMP DK1NK3: CJNE A,#07H,NK4MOV KEYBUF,#12mov p1,#11110000bLJMP DK1NK4: NOPDK1:call displayDK1A: MOV A,P3 ;等待释放ANL A,#0FHXR
13、L A,#0FHJNZ DK1ANOKEY1:MOV P3,#0FFHCLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2MOV A,P3ANL A,#0FHCJNE A,#0EH,NK5MOV KEYBUF,#1mov p1,#11111110bLJMP DK2NK5: CJNE A,#0DH,NK6MOV KEYBUF,#5mov p1,#11111100bLJMP DK2NK6: CJNE A,#0BH,NK7MOV KEYBUF,#9mov p1,
14、#11111000bLJMP DK2NK7: CJNE A,#07H,NK8MOV KEYBUF,#13mov p1,#11110000bLJMP DK2NK8: NOPDK2:call displayDK2A: MOV A,P3 ;释放ANL A,#0FHXRL A,#0FHJNZ DK2ANOKEY2:MOV P3,#0FFHCLR P3.6MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3MOV A,P3ANL A,#0FHCJNE A,#0EH,NK9MOV K
15、EYBUF,#2mov p1,#11111110bLJMP DK3NK9: CJNE A,#0DH,NK10MOV KEYBUF,#6mov p1,#11111100bLJMP DK3NK10: CJNE A,#0BH,NK11MOV KEYBUF,#10mov p1,#11111000bLJMP DK3NK11: CJNE A,#07H,NK12MOV KEYBUF,#14mov p1,#11110000bLJMP DK3NK12: NOPDK3:call displayDK3A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK3ANOKEY3:MOV P3,#0FFH
16、CLR P3.7MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4MOV A,P3ANL A,#0FHCJNE A,#0EH,NK13MOV KEYBUF,#3mov p1,#11111110bLJMP DK4NK13: CJNE A,#0DH,NK14MOV KEYBUF,#7mov p1,#11111100bLJMP DK4NK14: CJNE A,#0BH,NK15MOV KEYBUF,#11mov p1,#11111000bLJMP DK4NK15: CJNE
17、A,#07H,NK16mov p1,#11110000bMOV KEYBUF,#15LJMP DK4NK16: NOPDK4:call displayDK4A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK4ANOKEY4:LJMP WAITDELY10MS:MOV R6,#10D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETdisplay: MOV A,KEYBUF ;查表MOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,Asetb dulaclr dulamov P0,#0c0hsetb welaclr welaclr
18、p2.3acall ds1ms ;延时,以便人眼可以观察到setb p2.3;acall ds1msretds10ms: mov r1,#1ds1lo: mov r2,#200ds2lo: mov r3,#200djnz r3,$djnz r2,ds2lodjnz r1,ds1loret ;延时返回TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71HEND五、 实验现象:当你按下矩阵键盘中的任何一个键,蜂鸣器响一声,并在数码管上显示相应的键值。图为实际演示图片。六、 实验小结:本实验介绍了单片机键
19、盘的工作原理并给出了实例,从中我们可以知道一个完善的键盘控制程序应具备以下功能:(1)检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。(2)有可靠的逻辑处理办法。每次只处理一个按键,其间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。(3)准确输出按键值,以满足按键功能要求。对于矩阵键盘而言,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。实验二 交通灯一、 实验目的:1、 了解单片机中断与定时器工作原理,掌握中断与定时器程序结构。2、 理解七段数码管的工作原理,并在此基础上能可以进行简单的数码管驱动操作。3、 可以
20、灵活的用 I/O 口原理控制 LED 小灯的亮和灭。二、 实验设备:51/AVR 实验板、USB 连接线、电脑。三、 实验原理:本实验以 P1 口作为输出。程序初始化是绿灯先亮,具体顺序为绿-黄-红-黄- 绿- 黄- 红,重复循环。其中,红灯与绿灯显示时间均为 50s,中间的黄灯显示时间为 15s。绿灯用八位发光二极管流动闪烁作代表;红灯用八位发光二极管全亮作代表;黄灯用八位发光二极管全亮全灭闪烁作代表。此外,还用到定时器 T0 作为倒计时使用,P0 口作为 LED 灯的显示。在实验中利用软件延时的方法来控制红黄绿灯的亮的时间。考虑到延时时间较长,所以先用 T0 产生终端然后计数的方法来实现延
21、时,利用 P1 口作为红黄绿灯控制端口。实验模块图 1实验模块图 2四、 实验步骤:1、 熟悉单片机内部原理图,掌握各实验模块的使用方法。2、 设计实验方案,画出流程图。开 始绿 灯 先 亮50秒 倒 计 时 显 示黄 灯 亮15秒 倒 计 时 显 示红 灯 亮50秒 倒 计 时 显 示黄 灯 亮15秒 倒 计 时 显 示3、 根据流程图编写程序。程序如下:#include#define uchar unsigned char#define uint unsigned intsbit dula=P26;sbit wela=P27;sbit beep=P23;unsigned int pp;un
22、signed 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;
23、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;
24、 /红灯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:
25、 /绿灯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 秒倒计时;接着红灯亮(八位发光二极管全亮)
26、 ,数码管 50 秒倒计时;接着,再黄灯(八位发光二极管全亮全灭闪烁)亮,数码管 15 秒倒计时,如此循环。 六、 实验总结:通过此次实验,使我更加扎实的掌握了中断、LED 驱动、数码管显示的知识,过程中遇到了一些问题,如中断初值的设定,如何让小灯发光,通过向老师及同学请教,慢慢了解了其中的奥妙。学习单片机一定要注重实践,边学边练,发现问题及时解决。不可拖延怠慢,你怎样对它,它就怎样对你。实验三 串口调试 直接返回数据一、 实验目的:1、 了解单片机串行口的结构、使用方法,学习串行口应用程序的编写方法。2、 熟悉单片机串行口接收和发送数据的实现方法。3、 熟悉单片机串行通信的格式规定。4、 掌
27、握 Vision环境中调试串行口应用程序的方法。二、 实验设备:51/AVR 实验板、USB 连接线、电脑软件:Keil Vision、串口调试助手 v2.2、STC-ISP-V480三、 实验原理:通信是人们传递信息的方式。计算机通信是将计算机技术和通信技术相结合,完成计算机与外部设备或计算机与计算机之间的信息交换。这种信息交换可以分为两大类:并行通信与串行通信。并行通信通常是将数据字节的各位用多条数据线同时进行传送,如图所示:由图可见,并行通信除了数据线外还有通信联络控制线。数据发送方在发送数据前,要询问数据接收方是否“准备就绪” 。数据接收方收到数据后,要向数据发送方回送数据已经接收到的
28、“应答”信号。并行通信的特点是:控制简单,传输速度快。由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,串行通信时,数据发送设备先将数据代码由并行形式转换成串行形式,然后一位一位地放在传输线上进行传送。数据接收设备将接收到的串行形式数据转换成并行形式进行存储或处理。串行通信的特点是:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备。但数据的传送控制比并行通信复杂。异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。为了实现异步传输
29、字符的同步,采用的办法是使传送的每一个字符都以起始位“0”开始,以停止位“1”结束。这样,传送的每一个字符都用起始位来进行收发双方的同步。停止位和间隙作为时钟频率偏差的缓冲,即使双方时钟频率略有偏差,总的数据流也不会因偏差的积累而导致数据错位。传送开始后,接收设备不断检测传输线,看是否有起始位到来。当收到一系列的“1” (空闲位或停止位)之后,检测到一个“0” ,说明起始位出现,就开始接收所规定的数据位和奇偶校验位以及停止位。经过处理将停止位去掉,把数据位拼成一个并行字节,并且经校验无误才算正确地接收到一个字符。一个字符接收完毕后,接收设备又继续测试传输线,监视“0”电平的到来(下一个字符开始
30、) ,直到全部数据接收完毕。异步通信的特点是不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加 23 位用于起止位,各帧之间还有间隔,因此传输效率不高。计算机的通信要求传送的是数字信号。在远程数据通信时,通常要借用现存的公用电话网。但是电话网是为 3003 400Hz 的音频模拟信号设计的,对二进制数据的传输是不合适的。为此,在发送时需要对二进制数据进行调制,使之适合在电话网上传输。在接收时,需要进行解调,以将模拟信号还原成数字信号。利用调制器(Modulator)把数字信号转换成模拟信号,然后送到通信线路上去,再由解调器(Demodulator)把从通信线路上收到的模拟信
31、号转换成数字。51 单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。但电脑的串口是 RS232 电平的,而单片机的串口是 TTL 电平的,所以进行串行通讯时要满足一定的条件,就是两者之间必须有一个电平转换电路。我们采用了专用芯片 MAX232 进行转换,虽然也可以用几个三极管进行模拟转换,但是用专用芯片更简单可靠。RS-232 通信电平RS-232C 接口规定使用 25 针连接器,连接器的尺寸及每个插针的排列位置都有明确的定义。一般的应用中并不一定用到 RS-232C 标准的全部信号线,所以在实际应用中常常使用 9 针连接器替代 25 针连接器。连接器引脚定义如图所
32、示。图中所示为阳头定义,通常用于计算机侧,对应的阴头用于连接线侧。DB-25(阳头)和 DB-9(阳头)连接器定义RS-232C 标准接口主要引脚定义四、 实验步骤:1、系统由 AT89S52 单片机作为中央控制器控制各功能模块的正常工作及数据的接收和处理。 程序框图: 开 始启 动 定 时 器 T1为 模式 2, 并 计 算 初 值启 动 波 特 率 发生查 询 是 否 有 数 据接 受 ?设 置 串 口 工 作 方 式为 方 式 2将 接 收 的 发 送 出 去发 送 完 成 ?结 束YY N2、程序代码:ORG 0000HLJMP MAIN;主程序的开始ORG 0200HMAIN: MO
33、V TMOD,#20H ; MOV TL1,#0F4H ; 初值=256-11059200/32/12/2400MOV TH1,#0F4H ;SETB TR1 ;启动波特率发生MOV SCON,#50H ;串口工作方式,设置为方式 2M1: JNB RI,M1 ;查询是否有数据接收MOV A,SBUF;数据暂存于 ACLR RI ;允许接收MOV SBUF,A;将接收到的数据发送出去M2: JNB TI,M2 ;等待发送完成CLR TISJMP M1 ;循环扫描串行通讯接口数据END3、 汇编、连接该程序,生成可执行文件。4、下载到单片机5、在 UART#0 窗口输入字符,观察窗口变化。五、 实验现象:六、 实验总结:1、 对于 Keil 软件已经可熟练掌握,但对于定时器的初值计算仍需巩固和加强。