单片机按键程序与电路设计

单片机按键程序与电路设计
单片机按键程序与电路设计

单片机键盘接口全接触

作者:杜洋

2005-10-25

一般的具有人机对话的单片机系统少不了会有键盘。键盘接口的原理与应用许多的教材都有介绍,但通常各有各的方法,各有各的优劣。下面就我现有的对单片机键盘接口的了解和应用将众家的单片机直接驱动键盘的接口原理及应用作一个总结,并附加相应键盘的汇编子程序和C语言子函数。希望大家可以从中受益。

本文我们以键盘的数目来选择键盘最适合的接法和最佳的编程方法,对各键盘接口的方法的优缺点加以说明。本文旨在让大家掌握一种方法,而不要读死书,举一反三创造更新更好的接口方式才是学习的极致。我最喜欢爱因斯坦的一句话:“想象力比知识更重要,想象力可以创造知识,而知识却只是别人的想象”。

1~4按键的单片机键盘接口:

当键盘的数目最多为4个时,我们最佳的接口方案当然是独立式接法了,即每一个I/O口上只接一个按键,按键的另一端接电源或接地(一般接地)。占用的I/O口数最大为4条。(注意:1~4按键的键盘的接法许多,如果接成扫描式可以占用更少的I/O口,但从程序复杂性和系统稳定性的综合考虑的话,独立式键盘接法应该是首选)

独立式键盘的实现方法是利用单片机I/O口读取口的电平高低来判断是否有键按下。例如,我们将常开按键的一端接地,另一端接一个I/O口,程序开始时将此I/O口置于高电平,平时无键按下时I/O口保护高电平。当有键按下时,此I/O口与地短路迫使I/O口为低电平。按键释放后,单片机内部的上拉电阻使I/O 口仍然保持高电平。我们所要做的就是在程序中查寻此I/O口的电平状态就可以了解我们是否有按键动作了。

值得注意的事,我们在用单片机对键盘处理的时候涉及到了一个重要的过程,那就是键盘的去抖动。这里说的抖动是机械的抖动,是当键盘在未按到按下的临界区产生的电平不稳定正常现象,并不是我们在按键时通过注意可以避免的。这种抖动一般在10~200毫秒之间,这种不稳定电平的抖动时间对于人来说太快了,而对于时钟是微秒级的单片机而言则是慢长的。为了提高系统的稳定,我们必须去除或避开它。目前的技术有硬件去抖动和软件去抖动,硬件去抖动就是用部分电路对抖动部分加之处理,但是实现的难度较大又会提高了成本。软件去抖动不是去掉抖动,而是避开抖动部分的时间,等键盘稳定了再对其处理。这里我们只研究软件去抖动,实现方法是先查寻按键当有低电平出现时立即延时10~200毫秒以避开抖动(经典值为20毫秒),延时结束后再读一次I/O口的值,这一次的值如果为1表示低电平的时间不到10~200毫秒,视为干

扰信号。当读出的值是0时则表示有按键按下,调用相应的处理程序。

图1

4~16按键的单片机键盘接口:

当键盘数为4~16键时再用独立方法实现就得占用4~16的I/O口,显然是一种浪费。这时我们就用行列扫描式方案,行数加上列数就等于我们的按键总数,这样我们要16个按键时只要8个I/O口,也就是占用了一个字节I/O口,这种16键行列扫描是最常用的一种了。下面就16个按键的键盘为例,说一下行列键盘的扫描方法。

逐点扫描法:

设P1口的低4位置为0,高4位置为1,当无按键时P1口的数据始终保持F0H不变。当有按键时,高位中的高电平会和低位中的低电平短路。此时高位中的高电平就会被拉低(任何高电平遇到低电平都为低),即高4位中有0出现。当单片机读P1口的值不为F0H时则表示有键按下,经过去抖处理后就开始扫描这一个键的位置了。先把P1的高4位置0,低4位置1,下面置低第1列线并置高第1行,之后再读第1行的电平,为高说明不是第1行第1列的键被按下,跳到下一个点的扫描(第1列第2列)。当其为0时表示第1行第1列的键被按下,调用相应处理程序。

逐点扫描的优点是它的编程简单,易于理解,可以作同时按多个键的识别。缺点是它的速度慢,处理程序代码较长。

逐行扫描法:

和逐点扫描的方法相似,只是数据的处理是以一行的4位数据直接处理,也就是先使能第1行(置低电平),然后看哪一列的数据变成低电平了,如果高4位数据没有变为低电平则使能下一行。找到了按键所在的行并测出列数据就可以调用相应处理程序。

逐行扫描的照逐点扫描要好的多,程序相对简单,速度快,也支持同时多按键处理。一般的扫描键盘多用此法。

全局扫描法:

全局扫描是只先设P1的高4位为1,低4位为0,即F0H,然后读取P1口的数据如果不为F0H说明有键按下,经过延时去抖处理后读出P1口的值,因为低4位是0无论按键如果都不会影响它,只有高4位被改变。将数据寄存起来后再把P1的状态反过来,将P1的高4位置0,低4位置1,即0FH,再读一次数据。这时高4位的值是0依然不变。这样两次读取我们就得到了2个字节的数据(XXXX0000和0000XXXX,X为读到的数据),最后我们将这两个数相或(将两个半字节数据溶合为一个字节),就得到了一个新的字节,用这个字节和我们的设定的数据比较来决定键值。

全局扫描只用两次扫描,速度快,易学易用,程序简单,可是它不支持同时多键处理,最佳适用4*4扫描键盘,可以用在一般的用途。

图2

大于16按键的单片机键盘接口:

当按键数目大于16时用行列扫描方式驱动是比较常用的,增加I/O口来达到行列扫描的键盘数,扫描方法多为逐行扫描,这里不多介绍。下面来了解一个用8个I/O口接36个按键的方法(参考《电子制作》杂志139期的“扩展单片机输入键的另一种方法”)。

它采用了独特的硬件接法和逐点扫描的方法完成对36个按键的扫描,是一种很好的节省硬件资源的方法。8个I/O口的任意两个都有一个按键的同时,其各I/O口对地也都有一个按键,可以说是一个非常有新意的方法。(详见原文)

图3

1-1、独立键盘接口程序:

ORG 0000H

JMP MAIN程序开始,从MAIN执行

ORG 0030H

MAIN:

JNB P1.0, KEY1查寻P1.0接的独立键盘是否有键接下,为低电平按下。

JNB P1.1, KEY2同上

JNB P1.2, KEY3同上

······

JMP MAIN查寻键盘的循环体

KEY1:

CALL DL20MS调用延时20毫秒,去除机械抖动

JB P1.0, MAIN重新查寻,亦去抖。

CALL PRO1确认有键按下,调用真正处理程序

JMP MAIN执行结束,返回查寻循环

KEY2:

CALL DL20MS同上

JB P1.1, MAIN

CALL PRO2

JMP MAIN

·······

DL20MS:20毫秒延时子程序,去抖用。

MOV R6,#100

DL20MS_1:

MOV R7,#100

DJNZ R7,$

DJNZ R6, DL20MS_1

RET

1-2、独立式键盘接口程序:

键盘接在P1口,P2口LED显示

ORG 0000H

AJMP MAIN真正的程序入口

ORG 030H

MAIN:MOV P2,#0FFH显示初始化

MOV A,#0FFH设定累加器值

MOV P1,A P1口全置“1”

MOV A,P1将P1口键盘值送入A

CJNE A,#0FFH,GO1查键值查看A中是否有键按下,有键则跳到GO1 AJMP MAIN P1口全为“1”表示无键,返回循环查寻程序GO1:ACALL DEL延时去抖动P1口中有“0”出现,则延时去抖动。CJNE A,#0FFH,GO2再次查寻

AJMP MAIN为干扰则返回循环程序

GO2:MOV DPTR,#TAB DPTR装入散转表的首址

MOV R0,#00H键值查寻R0初始化,以备累加

L1: RRC A累加器带C右移

JNC N1查每一个位,如果为0则跳出

INC R0键值寄存器

SJMP L1此位不为“0”继续查下一位

N1:MOV A,R0取得键值

RLC A乘3处理,用于散转

JMP @A+DPTR散转

TAB:AJMP PR0散转表

AJMP PR1

AJMP PR2

AJMP PR3

AJMP PR4

AJMP PR5

AJMP PR6

AJMP PR7

PR0:MOV P2,#0FEH真正处理程序

ACALL DEL

AJMP MAIN

PR1:MOV P2,#0FCH

ACALL DEL

AJMP MAIN

PR2:MOV P2,#0F8H

ACALL DEL

AJMP MAIN

PR3:MOV P2,#0F0H

ACALL DEL

AJMP MAIN

PR4:MOV P2,#0E0H

ACALL DEL

AJMP MAIN

PR5:MOV P2,#0C0H

ACALL DEL

AJMP MAIN

PR6:MOV P2,#80H

ACALL DEL

AJMP MAIN

PR7:MOVP2,#00H

ACALL DEL

AJMP MAIN

DEL:MOV R7,#0FFH延时程序DEL1:MOV R6,#0FFH

DEL2:DJNZ R6,DEL2

DJNZ R7,DEL1

RET

逐行扫描程序:

;===============;4*4行列键盘程序;=================;

;

; 键盘接P3口,高4位接5.1K上拉电阻

; 用2号实验板完成,在按各键时,从LED屏上显示0~F.

; dy 20050511pm

;=================================================;

ORG 0000H

JMP MAIN

ORG 30H

MAIN:;----------------------------------------------------初始化定义

MOV P2,#0H

MOV P0,#00H

MOV R0,#00H

MOV R1,#00H

START:;---------------------------------------------------扫描程序开始

MOV P3,#0FH

MOV A,P3

CJNE A,#0FH,GO1 ;是否有键接下

JMP START ;无键时返回

GO1:

CALL DL20MS ;延时去抖

CJNE A,#0FH,GO2 ;再次查寻

JMP START ;为干扰则返回

GO2:

MOV R2,#0EFH ;行列扫描初始化

MOV R0,#00H

ST:

MOV P3,R2 ;送入首列使能信号

MOV A,P3 ;得到数据送入A

JB ACC.0,ONE ;行读键值,为“0”表示有键

MOV A,#01H

JMP LKP

JB ACC.1,TWO ;同上

MOV A,#05H

JMP LKP

TWO:

JB ACC.2,THR

MOV A,#09H

JMP LKP

THR:

JB ACC.3,NEXT ; 如行无键时,则使能下一列MOV A,#0DH

LKP:

ADD A,R0 ; 得到键值处理

CJNE A,#0FH,LKP1

MOV A,#00H

LKP1:

MOV R1,A ;将键值送入R1并退出

JMP START

NEXT: ;列使能控制

INC R0

CJNE R0,#04H,L1

MOV R0,#00H

JMP ST

L1: ;列初值键码

CJNE R2,#0EFH,L2

MOV R2,#0DFH

JMP ST

L2:

CJNE R2,#0DFH,L3

MOV R2,#0BFH

JMP ST

L3:

CJNE R2,#0BFH,L4

MOV R2,#7FH

JMP ST

CJNE R2,#7FH,RE

MOV R2,#0EFH

RE: ;未扫描到键值则返回JMP START

TAB_TT:;----------------------------------------------------散转表处理JMP PPY9

JMP PPY00

JMP PPY15

JMP PPY14

JMP PPY13

JMP PPY1

JMP PPY4

JMP PPY7

JMP PPY10

JMP PPY2

JMP PPY5

JMP PPY8

JMP PPY0

JMP PPY3

JMP PPY6

JMP PPY9

JMP PPY11

RET

PPY: ;真正处理程序

PPY0:MOV P0,#0C0H

LJMP START

PPY1:MOV P0,#0F9H

LJMP START

PPY2:MOV P0,#0A4H

LJMP START

PPY3:MOV P0,#0B0H

LJMP START

·······

PPY15:MOV P0,#8EH

LJMP START

PPY00:MOV P0,#0FFH

LJMP START

DL20MS: MOV R6,#100;-----------------------延时子程序

DL1: MOV R7,#100

DL2: DJNZ R7,DL2

DJNZ R6,DL1

RET

END

==END==

最新单片机硬件系统设计原则

单片机硬件系统设计 原则

●单片机硬件系统设计原则 ●一个单片机应用系统的硬件电路设计包含两部分内容:一是系统扩展,即单片机内部的功能单 元,如ROM、RAM、I/O、定时器/计数器、中断系统等不能满足应用系统的要求时,必须在片外进行扩展,选择适当的芯片,设计相应的电路。二是系统的配置,即按照系统功能要求配置外围设备,如键盘、显示器、打印机、A/D、D/A转换器等,要设计合适的接口电路。 ●系统的扩展和配置应遵循以下原则: ● 1、尽可能选择典型电路,并符合单片机常规用法。为硬件系统的标准化、模块化打下良好的基 础。 ● 2、系统扩展与外围设备的配置水平应充分满足应用系统的功能要求,并留有适当余地,以便进行 二次开发。 ● 3、硬件结构应结合应用软件方案一并考虑。硬件结构与软件方案会产生相互影响,考虑的原则 是:软件能实现的功能尽可能由软件实现,以简化硬件结构。但必须注意,由软件实现的硬件功能,一般响应时间比硬件实现长,且占用CPU时间。 ● 4、系统中的相关器件要尽可能做到性能匹配。如选用CMOS芯片单片机构成低功耗系统时,系统 中所有芯片都应尽可能选择低功耗产品。 ● 5、可靠性及抗干扰设计是硬件设计必不可少的一部分,它包括芯片、器件选择、去耦滤波、印刷 电路板布线、通道隔离等。 ● 6、单片机外围电路较多时,必须考虑其驱动能力。驱动能力不足时,系统工作不可靠,可通过增 设线驱动器增强驱动能力或减少芯片功耗来降低总线负载。 ● 7、尽量朝“单片”方向设计硬件系统。系统器件越多,器件之间相互干扰也越强,功耗也增大, 也不可避免地降低了系统的稳定性。随着单片机片内集成的功能越来越强,真正的片上系统SoC已经可以实现,如ST公司新近推出的μPSD32××系列产品在一块芯片上集成了80C32核、大容量FLASH 存储器、SRAM、A/D、I/O、两个串口、看门狗、上电复位电路等等。 ●单片机系统硬件抗干扰常用方法实践 ●影响单片机系统可靠安全运行的主要因素主要来自系统内部和外部的各种电气干扰,并受系统结 构设计、元器件选择、安装、制造工艺影响。这些都构成单片机系统的干扰因素,常会导致单片机系统运行失常,轻则影响产品质量和产量,重则会导致事故,造成重大经济损失。 ●形成干扰的基本要素有三个: ●(1)干扰源。指产生干扰的元件、设备或信号,用数学语言描述如下:du/dt, di/dt大的地 方就是干扰源。如:雷电、继电器、可控硅、电机、高频时钟等都可能成为干扰源。 ●(2)传播路径。指干扰从干扰源传播到敏感器件的通路或媒介。典型的干扰传播路径是通过导线 的传导和空间的辐射。 ●(3)敏感器件。指容易被干扰的对象。如:A/D、 D/A变换器,单片机,数字IC,弱信号放大器 等。 ● 1 干扰的分类 ● 1.1 干扰的分类 ●干扰的分类有好多种,通常可以按照噪声产生的原因、传导方式、波形特性等等进行不同的分 类。按产生的原因分: ●可分为放电噪声音、高频振荡噪声、浪涌噪声。 ●按传导方式分:可分为共模噪声和串模噪声。 ●按波形分:可分为持续正弦波、脉冲电压、脉冲序列等等。 ● 1.2 干扰的耦合方式

自己写的按键单片机程序

自己写的按键单片机程序 用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--

51单片机04矩阵按键逐行扫描,行列扫描代码

矩阵键盘扫描原理 方法一: 逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。 方法二: 行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。

//行列扫描 #include #define GPIO_KEY P0 #define GPIO_LCD P2 unsigned char code a[17]= {~0xfc,~0x60,~0xda,~0xf2,~0x66,~0xb6,~0xbe,~0xe0, ~0xfe,~0xf6,~0xee,~0x3e,~0x9c,~0x7a,~0xde,~0x8e,~0x00}; //按位取反的用法 void delay10ms(); void keydown();//要与下面的定义一致 void main() { GPIO_LCD=a[16];//初始化数码管 while(1) { keydown(); } }

void delay10ms() { unsigned char a,b; for(a=38;a>0;a--) for(b=130;b>0;b--); } void keydown() //检测按下,按下时需要消抖,检测松开,返回按键值//没有按键时保持 { unsigned char n=0,key; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f)//读取按键是否按下 { delay10ms(); //延时10ms消抖 if(GPIO_KEY!=0x0f)//再次检测按键是否按下 { GPIO_KEY=0x0f;//测试列 switch(GPIO_KEY) { case 0x07: key=0;break;

单片机红绿灯电路设计

四川现代职业学院《单片机原理及应用》课程设计红绿灯实训报告 题目:红绿灯项目设计报告 系别:电子信息技术系 专业:电子信息工程技术 组员:贺淼、纪鹏、邵文稳 指导老师:陶薇薇 2014年7月12日

摘要 交通在人们的日常生活中占有重要的地位,随着人们社会活动的日益频繁,这点更是体现的淋漓尽致。交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。本系统采用STC89C52点单片机以及数码管为中心器件来设计交通灯控制器,实现了南北方向为主要干道,要求南北方向每次通行时间为30秒,东西方向每次通行时间为25秒。启动开关后,南北方向红灯亮25秒钟,而东西方向绿灯先亮20秒钟,然后闪烁3秒钟,转为黄灯亮2秒钟。接着,东西方向红灯亮30秒钟,而南北方向绿灯先亮25秒,然后闪烁3秒钟,转为黄灯亮2秒钟,如此周而复始。 软件上采用C语言编程,主要编写了主程序,中断程序延时程序等。经过整机调试,实现了对十字路口交通灯的模拟。

目录 (一)硬件部分--------------------------- 3 1.1 STC89C52芯片简介-----------------------3 1.2 主要功能特性---------------------------4 1.3 STC89C52芯片封装与引脚功能-------------5 1.4 基于STC89C52交通灯控制系统的硬件电路分析及设计-------------------------------------------10 (二)软件部分----------------------------14 2.1 交通灯的软件设计流程图-----------------14 2.2 控制器的软件设计-----------------------15 (三)电路原理图与PCB图的绘制-------------16 3.1 电路原理图的绘制(见附录二)----------16 3.2 PCB图的绘制(见附录三)---------------16 3.3 印刷电路板的注意事项------------------16 (四)调试及仿真---------------------------------------19 4.1 调试----------------------------------19 4.2 仿真结果------------------------------20 (五)实验总结及心得体会---------------------------21 5.1 实验总结-----------------------------------------------21 5.2 实验总结-----------------------------------------------22 附录程序清单---------------------------22

单片机键盘输入程序

这是读取键盘的子程序 主要内容为:如何定义位,如何得到按键状态,防止键盘干扰的方法 以及如何处理读入的键值 思路:首先在某一引脚输出一个电平,然后读入引脚的电平,如果刚好相反 那么可能有按键发生,但是不排除干扰,为了防止干扰,需要软件延时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 ;在第一位

课程设计-制作单片机的4X4矩阵键盘

课程设计-制作单片机的4X4矩阵键盘

目录 摘要.............................................. 错误!未定义书签。第一章硬件部分 (5) 第一节AT89C51 (5) 第二节4*4矩阵式键盘 (8) 第三节LED数码管 (11) 第四节硬件电路连接 (13) 第二章软件部分 (15) 第一节所用软件简介 (15) 第二节程序流程图 (18) 第三节程序 (20) 第三章仿真结果 (23) 心得体会 (26) 参考文献 (27)

第一章硬件部分 第一节AT89C51 AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。引脚如图所示 AT89C5 图1 AT89C51管脚 图 AT89C51其具有以下特性: 与MCS-51 兼容 4K字节可编程FLASH存储器 寿命:1000写/擦循环 数据保留时间:10年

全静态工作:0Hz-24MHz 三级程序存储器锁定 128×8位内部RAM 32可编程I/O线 两个16位定时器/计数器 5个中断源 可编程串行通道 低功耗的闲置和掉电模式 片内振荡器和时钟电路 特性概述: AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 接口,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。 管脚说明: VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。

单片机矩阵键盘扫描程序

#include #include #define uint unsigned int #define uchar unsigned char sbit E=P2^7; //1602使能引脚 sbit RW=P2^6; //1602读写引脚 sbit RS=P2^5; //1602数据/命令选择引脚 uint keyflag ; //键盘正在读取标志位,如果Keyflag为1 ,表示正在读取键盘,停止其他功能; char x,y,m,n,c; //Keyflag为0,读取键盘结束,恢复其他功能 char flag1=0; //频率范围10~1000Hz uchar Hrate = 0; //一个周期内高点平占据时间 uchar Lrate = 0; //一个周期内低电平占据时间 uint FREQ0; //定时器T0的计数变量// uint FREQ1; //定时器T1的计数变量// sbit P2_1=P2^0; //设置P2.1,作为信号输出口// uint disbuf[3]; uint figure=0; int sum2=0; int sum1=0; int flag=0; uint count=0; uint max=0; uint disbuf_temp=0; /******************************************************************** * 名称: 1602显示延时函数delay() * 功能: 延时,延时时间大概为5US。

* 输出: 无 ***********************************************************************/ void delay() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } /******************************************************************** * 名称: bit Busy(void) * 功能: 这个是一个读状态函数,读出函数是否处在忙状态 * 输入: 输入的命令值 * 输出: 无 ***********************************************************************/ bit Busy(void) { bit busy_flag = 0; RS = 0; RW = 1; E = 1; delay(); busy_flag = (bit)(P0 & 0x80); E = 0; return busy_flag; } /******************************************************************** * 名称: wcmd(uchar del) * 功能: 1602命令函数 * 输入: 输入的命令值 * 输出: 无 ***********************************************************************/ void wcmd(uchar del) { while(Busy()); RS = 0; RW = 0; E = 0; delay(); P0 = del; delay(); E = 1;

单片机按键连接方法

单片机按键连接方法总结(五种按键扩展方案详细介绍) 单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。不同的设计方法,有着不同的优缺点。而又由于单片机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个按键。我相信你了解了之后也会惊奇的。 首先好好品味一下这个方案吧,想想怎么来识别按键呢!

单片机实验报告——矩阵键盘数码管显示

单片机实验报告 信息处理实验 实验二矩阵键盘 专业:电气工程及其自动化 指导老师:高哲 组员:明洪开张鸿伟张谦赵智奇 学号:152703117 \152703115\152703118\152703114室温:18 ℃日期:2017 年10 月25日

矩阵键盘 一、实验内容 1、编写程序,做到在键盘上每按一个键(0-F)用数码管将该建对应的名字显示出来。按其它键没有结果。 二、实验目的 1、学习独立式按键的查询识别方法。 2、非编码矩阵键盘的行反转法识别方法。 3、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。 4、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。 5、掌握利用Keil51软件对程序进行编译。 6、会根据实际功能,正确选择单片机功能接线,编制正确程序。对实验结果 能做出分析和解释,能写出符合规格的实验报告。 三、实验原理 1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。 2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。 3、识别键的闭合,通常采用行扫描法和行反转法。行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然

后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。 行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。 由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。 行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。

单片机4X4键盘扫描和显示课程设计

二、设计内容 1、本设计利用各种器件设计,并利用原理图将8255单元与键盘及数码管显示单元连接,扫描键盘输入,最后将扫描结果送入数码管显示。键盘采用4*4键盘,每个数码管可以显示0-F共16个数。将键盘编号,记作0-F,当没按下其中一个键时,将该按键对应的编号在一个数码管上显示出来,当在按下一个 键时,便将这个按键的编号在下一个数码管上显示,数码管上 可以显示最近6次按下的按键编号。 设计并实现一4×4键盘的接口,并在两个数码管上显示键盘所在的行与列。 三、问题分析及方案的提出 4×4键盘的每个按键均和单片机的P1口的两条相连。若没有按键按下时,单片机P1口读得的引脚电平为“1”;若某一按键被按下,则该键所对应的端口线变为地电平。单片机定时对P1口进行程序查询,即可发现键盘上是否有按键按下以及哪个按键被按下。 实现4×4键盘的接口需要用到单片机并编写相应的程序来识别键盘的十六个按键中哪个按键被按下。因为此题目还要求将被按下的按键显示出来,因此可以用两个数码管来分别显示被按下的按键的行与列

表示任意一个十六进制数)分别表示键盘的第二行、第三行、第四行;0xXE、0xXD、0xXB、0xX7(X表示任意一个十六进制数)则分别表示键盘的第一列、第二列、第三列和第四列。例如0xD7是键盘的第二行第四列的按键 对于数码管的连接,采用了共阳极的接法,其下拉电阻应保证芯片不会因为电流过大而烧坏。 五、电路设计及功能说明 4×4键盘的十六个按键分成四行四列分别于P1端口的八条I/O 数据线相连;两个七段数码管分别与单片机的P0口和P2口的低七 位I/O数据线相连。数码管采用共阳极的接法,所以需要下拉电阻 来分流。结合软件程序,即可实现4×4键盘的接口及显示的设计。 当按下键盘其中的一个按键时,数码管上会显示出该按键在4×4键 盘上的行值和列值。所以实现了数码管显示按键位置的功能 四、设计思路及原因 对于4×4键盘,共有十六个按键。如果每个按键与单片机的一个引脚相连,就会占用16个引脚,这样会使的单片机的接口不够用(即使够用,也是对单片机端口的极大浪费)。因此我们应该行列式的接法。行列式非编码键盘是一种把所有按键排列成行列矩阵的键盘。在这种键若没有按键按下时,单片机从P1口读得的引脚电平为“1”;若某一按键被按下,则该键所对应的端口线变为地电平。因此0xEX(X表示任意4×4键盘的第一行中的某个按键被按下,相应的0xDX、0xBX、0x7X(X 二、实验内容

51单片机矩阵键盘扫描程序

/*----------------------------------------------- 名称:矩阵键盘依次输入控制使用行列逐级扫描 论坛:https://www.360docs.net/doc/7311625166.html, 编写:shifang 日期:2009.5 修改:无 内容:如计算器输入数据形式相同从右至左使用行列扫描方法 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换 #define KeyPort P1 sbit LATCH1=P2^2;//定义锁存使能端口段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char TempData[8]; //存储显示值的全局变量 void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t); //ms级延时 void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数 unsigned char KeyScan(void);//键盘扫描 unsigned char KeyPro(void); void Init_Timer0(void);//定时器初始化 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { unsigned char num,i,j; unsigned char temp[8]; Init_Timer0(); while (1) //主循环 { num=KeyPro();

89C51单片机44键盘应用实例程序设计(含硬件仿真电路图)

89c51单片机4*4键盘应用实例硬件仿真电路图如下: 程序如下(编译成功): #include"reg51.h" #include"LCD1602.h" #include"hardware.h" char code tab[4][4]={ {'1','4','7','#'}, {'2','5','8','0'}, {'3','6','9','*'}, {'A','B','C','D'}}; //0到F的16个键植 void delay(unsigned char a) { unsigned char i; while(a--)

for(i=100;i>0;i--) ; } char kbscan() //键盘扫描 { unsigned char hang,lie,key; if(P3!=0x0f) delay(5); if(P3!=0x0f) { switch(P3&0x0f) { case 0x0e:lie=0;break; case 0x0d:lie=1;break; case 0x0b:lie=2;break; case 7:lie=3;break; } P3=0xf0; P3=0xf0; switch(P3&0xf0) { case 0xe0:hang=0;break; case 0xd0:hang=1;break; case 0xb0:hang=2;break; case 0x70:hang=3;break; } P3=0x0f; while(P3!=0x0f); key=tab[hang][lie]; } else key=0; return (key); } void main() { unsigned char temp; LCD_initial(); LCD_prints("piaoling"); P3=0x0f; P0=0xff; while(1)

矩阵键盘程序c程序,51单片机.

/*编译环境:Keil 7.50A c51 */ /*******************************************************/ /*********************************包含头文件********************************/ #include /*********************************数码管表格********************************/ unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x 8E}; /**************************************************************************** 函数功能:延时子程序 入口参数: 出口参数: ****************************************************************************/ void delay(void) { unsigned char i,j; for(i=0;i<20;i++) for(j=0;j<250;j++); } /**************************************************************************** 函数功能:LED显示子程序 入口参数:i 出口参数: ****************************************************************************/ void display(unsigned char i) { P2=0xfe; P0=table[i]; } /**************************************************************************** 函数功能:键盘扫描子程序 入口参数: 出口参数: ****************************************************************************/ void keyscan(void) { unsigned char n; //扫描第一行 P1=0xfe;

ATmega128 单片机硬件电路设计

ATmega128 单片机硬件电路设计 在本系统中,本小节主要讲ATmega128 单片机的内部资源、工作原理和硬件电路设计等。2.5.1 ATmega128 芯片介绍ATmega128 为基于AVR RISC 结构的8 位低功耗CMOS 微处理器。片内ISP Flash 可以通过SPI 接口、通用编程器,或引导程序多次编程。引导程序可以使用任何接口来下载应用程序到应用Flash 存储器。通过将8 位RISC CPU 与系统内可编程的Flash 集成在一个芯片内,ATmega128 为许多嵌入式控制应用提供了灵活而低成本的方案。ATmega128 单片机的功能特点如下:(1)高性能、低功耗的AVR 8 位微处理器(2)先进的RISC 结构①133 条指令大多数可以在一个时钟周期内完成② 32x8 个通用工作寄存器+外设控制寄存器③全静态工作④工作于16 MHz 时性能高达16 MIPS ⑤只需两个时钟周期的硬件乘法器(3)非易失性的程序和数据存储器① 128K 字节的系统内可编程Flash ②寿命: 10,000 次写/ 擦除周期③具有独立锁定位、可选择的启动代码区(4)通过片内的启动程序实现系统内编程① 4K 字节的EEPROM ② 4K 字节的内部SRAM ③多达64K 字节的优化的外部存储器空间④可以对锁定位进行编程以实现软件加密⑤可以通 过SPI 实现系统内编程(5)JTAG 接口(与IEEE 1149.1 标准兼容)①遵循JTAG 标准的边界扫描功能②支持扩

展的片内调试③通过JTAG 接口实现对Flash,EEPROM,熔丝位和锁定位的编程(6)外设特点①两个具有独立的预分频器和比较器功能的8 位定时器/ 计数器②两个具 有预分频器、比较功能和捕捉功能的16 位定时器/ 计数器③具有独立预分频器的实时时钟计数器④两路8 位PWM ⑤ 6 路分辨率可编程(2 到16 位)的PWM ⑥输出比较调制器⑦ 8 路10 位ADC ⑧面向字节的两线接口⑨两个可编程的串行USART ⑩可工作于主机/ 从机模式的SPI 串行接口(7)特殊的处理器特点①上电复位以及可编程的掉电检测②片内经过标定的RC 振荡器③片内/ 片外中断源④ 6 种睡眠模式: 空闲模式、ADC 噪声抑制模式、省电模式、掉电模式、Standby 模式以及扩展的Standby 模式⑤可以通过软件进行选择的时钟频率⑥通过熔丝 位可以选择ATmega103 兼容模式⑦全局上拉禁止功能ATmega128 芯片有64 个引脚,其中60 个引脚具有I/O 口功能,资源比较丰富,下面对ATmega128 的各个引脚做简单介绍:VCC:数字电路的电源。GND:接地。端口(PA7..PA0)、(PB7..PB0)、(PC7..PC0)、(PD7..PD0)、(PE7..PE0)、(PF7..PF0)、(PG4..PA0):为8 位双向I/O 口,并具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,则端口被外部电路拉低时将

实验七 单片机键盘LED显示实验

实验七单片机键盘LED显示实验 一、实验目的 1、掌握键盘和LED显示器的接口方法和编程方法。 2、掌握键盘扫描和LED八段码显示器的工作原理。 3、学习并口扩展的程序编写方法。 二、实验说明 利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。 实验程序可分成三个模块。 ①键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。 ②显示模块:将显示单元的内容在显示器上动态显示。 ③主程序:调用键输入模块和显示模块。 三、实验仪器 计算机 伟福实验箱(lab2000P ) 四、实验内容 1、本实验仪提供了一个6×4的小键盘,向列扫描码地址(0X002H)逐列输出低电平,然后从行码地址(0X001H)读回。如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。这样就可以通过输出的列码和读取的行码来判断按下的是什么键。在判断有键按下后,要有一定的延时,防止键盘抖动。地址中的X是由KEY/LED CS 决定,参见地址译码。做键盘和LED实验时,需将KEY/LED CS 接到相应的地址译码上。以便用相应的地址来访问。例如将KEY/LED CS信号接CS0上,则列扫描地址为08002H,行码地址为08001H。列扫描码还可以分时用作LED的位选通信号。 2、本实验仪提供了6 位8段码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。显示共有6位,用动态方式显示。8位段码、6位位码是由两片74LS374输出。位码经MC1413或ULN2003倒相驱动后,选择相应显示位。 3、本实验仪中8位段码输出地址为0X004H,位码输出地址为0X002H。此处X是由KEY/LED CS 决定,参见地址译码。做键盘和LED实验时,需将KEY/LED CS 接到相应的地址译码上。以便用相应的地址来访问。例如,将KEY/LED CS 接到CS0上,则段码地址为08004H,位码地址为08002H。 五、思考题 1、按键接收到的数据加1显示出来; 2、实现第2功能键,即按下A后,再按下0-9键为加1显示; 3、保存前一个接收到的数据,数据向前推动显示。 六、源程序修改原理及其仿真结果 原程序: OUTBIT equ 08002h ; 位控制口 OUTSEG equ 08004h ; 段控制口 IN equ 08001h ; 键盘读入口 LEDBuf equ 60h ; 显示缓冲 ljmp Start

单片机硬件设计经验总结

单片机硬件设计经验总结 下面是总结的一些设计中应注意的问题,和单片机硬件设计原则,希望大家能看完 (1)在元器件的布局方面,应该把相互有关的元件尽量放得靠近一些,例如,时钟发生器、晶振、CPU的时钟输入端都易产生噪声,在放置的时候应把它们靠近些。对于那些易产生噪声的器件、小电流电路、大电流电路开关电路等,应尽量使其远离单片机的逻辑控制电路和存储电路(ROM、RAM),如果可能的话,可以将这些电路另外制成电路板,这样有利于抗干扰,提高电路工作的可靠性。 (2)尽量在关键元件,如ROM、RAM等芯片旁边安装去耦电容。实际上,印制电路板走线、引脚连线和接线等都可能含有较大的电感效应。大的电感可能会在Vcc走线上引起严重的开关噪声尖峰。防止Vcc走线上开关噪声尖峰的唯一方法,是在VCC与电源地之间安放一个0.1uF的电子去耦电容。如果电路板上使用的是表面贴装元件,可以用片状电容直接紧靠着元件,在Vcc引脚上固定。最好是使用瓷片电容,这是因为这种电容具有较低的静电损耗(ESL)和高频阻抗,另外这种电容温度和时间上的介质稳定性也很不错。尽量不要使用钽电容,因为在高频下它的阻抗较高。 在安放去耦电容时需要注意以下几点:

在印制电路板的电源输入端跨接100uF左右的电解电容,如果体积允许的话,电容量大一些则更好。 原则上每个集成电路芯片的旁边都需要放置一个0.01uF的瓷片电容,如果电路板的空隙太小而放置不下时,可以每10个芯片左右放置一个1~10的钽电容。 对于抗干扰能力弱、关断时电流变化大的元件和RAM、ROM等存储元件,应该在电源线(Vcc)和地线之间接入去耦电容。 电容的引线不要太长,特别是高频旁路电容不能带引线。 (3)在单片机控制系统中,地线的种类有很多,有系统地、屏蔽地、逻辑地、模拟地等,地线是否布局合理,将决定电路板的抗干扰能力。在设计地线和接地点的时候,应该考虑以下问题:逻辑地和模拟地要分开布线,不能合用,将它们各自的地线分别与相应的电源地线相连。在设计时,模拟地线应尽量加粗,而且尽量加大引出端的接地面积。一般来讲,对于输入输出的模拟信号,与单片机电路之间最好通过光耦进行隔离。 在设计逻辑电路的印制电路版时,其地线应构成闭环形式,提高电路的抗干扰能力。 地线应尽量的粗。如果地线很细的话,则地线电阻将会较大,造成接地电位随电流的变化而变化,致使信号电平不稳,导致电路的抗干扰能力下降。在布线空间允许的情况下,要保证主要地线的宽度至少在2~3mm以上,元件引脚上的接地线应该在1.5mm左右。 要注意接地点的选择。当电路板上信号频率低于1MHz时,由于

相关文档
最新文档