精华内容
下载资源
问答
  • 基于proteus的51单片机仿真实例八十二、4X4矩阵键盘应用实例
    千次阅读
    2021-07-30 06:23:47

    1、矩阵键盘的工作原理:

    1)接口电路:在单片机系统中,当按键数量较多时,为了减少IO口的使用,通常将按键排列成矩阵型式,例如本例中的16个按键,被排列成了如下图所示的4X4矩阵方式。即由4根行线和4根列线组成,每个行线和列线的交叉点既是一个按键。这样共需8个IO口。

    2)工作原理

    使用矩阵键盘的关键是如何判断那个按键被按下。根据下面的电路图,如果已知P1.0端口被置为低电平“0”,那么当按键K0被按下时,可以肯定P1.4端口的电平也变为了低电平“0”。基于这个原理,总结矩阵键盘识别按键的步骤如下:

    a)首先判断是否有按键被按下。将全部行线置为低电平“0”,全部列线置为高电平“1”。然后检测列线的状态。只要有一根列线的电平为低,则表示有按键被按下。否则没有按键按下。

    b)按键消抖。当判断到有按键被按下后,还要进行消抖处理,以确认真正有按键被按下。

    c)按键识别:当确认有键被按下后,采用逐行扫描的方法来确定是哪一个按键被按下。先扫描第一行,即将第一行输出低电平“0”,然后读取列值,那一列出现低电平“0”,则说明该列与第一行交叉处的按键被按下。如果读入的列值全部为"1",说明与第一行连接的按键均没有被按下。那么接下来开始扫描第二行,以此类推。直到完成全部行线的扫描。

    本例中矩阵键盘中P1端口低4位连接的是列线,高4位连接的是行线。

    2、在keil c51中新建工程ex70,编写如下程序代码,编译并生成ex70.hex文件

    //数码管显示4X4矩阵键盘键值

    #include

    //数码管段码表,共阳极段码表,实际电路用的共阴极数码管

    unsigned char code disp_buff[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

    0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};

    //上次按键和当前按键序号,该矩阵中序号范围0-15,16表示无按键

    unsigned char pre_keyno = 16,keyno = 16;

    //延时函数

    void delayms(unsigned int x)

    {

    unsigned char i;

    while(x--)

    {

    for(i = 0;i < 120;i++);

    }

    }

    //按键扫描函数,首先判断按键发生在那一列,然后根据所发生的行附加不同的值,从而得到键盘按键序号

    void key_scan(void)

    {

    unsigned char i;

    //高4位置1,放入4行

    P1 = 0x0f;

    delayms(1);

    //有键按下后,其中一列将变为低电平

    i = P1^0x0f;

    //判断按键发生在哪一列

    switch(i)

    {

    case 1: keyno = 0;break;

    case 2: keyno = 1;break;

    case 4: keyno = 2;break;

    case 8: keyno = 3;break;

    default: keyno = 16;          //无键按下

    }

    //低四位置1,放入4列

    P1 = 0xf0;

    delayms(1);

    //

    i = P1 >> 4 ^ 0x0f;

    //对0-3行分别附件起始值

    switch(i)

    {

    case 1: keyno += 0;break;

    case 2: keyno += 4;break;

    case 4: keyno += 8;break;

    case 8: keyno += 12;break;

    }

    }

    // 主函数

    void main(void)

    {

    P0 = 0x00;

    while(1)

    {

    P1 = 0xf0;

    if(P1 != 0xf0)    //扫描键盘获得按键序号

    {

    key_scan();

    }

    if(pre_keyno != keyno)

    {

    P0 = ~disp_buff[keyno];  //显示,共阳极段码取反作为共阴极段码

    pre_keyno = keyno;

    }

    delayms(100);

    }

    }

    3、在proteus中新建仿真文件ex70.dsn,电路原理图如下所示

    9704d92bb0527cb102589e771814836c.png

    4、将ex70.hex文件载入at89c51中,注意将晶振频率改为11.0592MHz,启动仿真,按动按键,观察运行结果。下图是某一时刻程序运行结果

    0d995bf58643c1c2a41d1d6222c2eed4.png

    更多相关内容
  • 8乘8矩阵键盘PCB图,如果需要原理图和实物,请私聊博主。
  • 该按钮可以说是51单片机项目开发的重要组成部分,是51单片机IO端口输入的重要方式。我们可以通过按下按钮来控制微控制器执行相应的程序,以获得所需的效果。 51单片机的键输入主要有...矩阵键盘通过单片机扫描键盘的...

    该按钮可以说是51单片机项目开发的重要组成部分,是51单片机IO端口输入的重要方式。我们可以通过按下按钮来控制微控制器执行相应的程序,以获得所需的效果。 51单片机的键输入主要有两种。一种是独立密钥。每个键对应一个IO端口,该端口通过循环或中断检测。当键的数量很少时,通常使用此方法。如果按键数量很大,则会为每个按键分配一个IO端口,这将占用大量资源,因此有一个矩阵键盘。矩阵键盘通过单片机扫描键盘的每一行和每一列,并通过行和列唯一地确定键的数目。下面介绍这两种方法。

    1个独立按钮

    Proteus仿真电路图

    f8edebe7e2d76306653669aa599b0173.png

    b5e21c457e51a1766f757f0c047380e7.png

    图片中的按键通过P 1. 0〜P 1. 3输入,四个LED灯连接到P.0〜P 2. 3,按下不同的键,对应于不同的LED灯,步骤如下:

    #include unsigned char num;

    void main()

    {

    TMOD=0x01;

    TH0 = (65536-917)/256;//1000/1.09

    TL0 = (65536-917)%256;;

    EA=1;

    ET0=1;

    TR0=1;

    P1=0xff;

    P2=0x00;

    while(1){

    if(num==20){

    num=0;

    switch(P1){

    case ~0x01:

    P2=~0x01;

    break;

    case ~0x02:

    P2=~0x02;

    break;

    case ~0x04:

    P2=~0x04;

    break;

    case ~0x08:

    P2=~0x08;

    break;

    defult:

    break;

    }

    }

    }

    }

    void Timer0() interrupt 1

    {

    TH0 = (65536-917)/256;

    TL0 = (65536-917)%256;

    num++;

    }

    使用定时器0中断的形式,定时器0每1ms产生一次中断,num加1,并且在while循环中判断num = 20时,定时20ms,读取P1的状态,并判断P1判断的值是按下按钮并且相应的LED灯点亮。效果图如下:

    e878c5ca352ae64fc169fb1df1e6976d.png

    7e49faf158def9a215783f73032a8e2d.png

    独立键非常简单。我认为您有比我更好的例子(例如,具有防抖功能)。今天的重点是矩阵键盘。

    2个矩阵键盘检测

    110a9f97f5caf609047066d2bd002b76.png

    Proteus仿真电路图

    12c589e100fcd904c8b086ea47a715d3.png

    eddaf9ae56eebf56c4846ac0ec3443d9.png

    这里,16个键按4 * 4排列,矩阵键盘的每一行都连接到P 3. 0〜P 3. 3;矩阵键盘的每一列都连接到P 3. 4〜P 3. 7。扫描原理大致如下:首先将P30设置为零,其余设置为1(P3-0xfe),然后读取P3端口的状态。如果P3!= 0xfe(此处高四位将改变,第四位保持不变),则表明已按下某个键,并且该键必须是第一行中的键。然后去判断P3端口的状态,如果按下第一个按钮(左上角),它应该是P 3. 4 = 0,刚才P 3. 0 = 0,那么P3的状态port是P3 = 0xee,依此类推,按下第一行中的第二,第三和第四按钮,分别对应于P3 = 0xde,P3 = 0xbe,P3 = 0x7e。这样,您可以确定按下了哪个按钮。如果P3 = 0xfe,则表示第一行中没有按下按钮。然后采用相同的方法,将P3 = 0xfd设置为判断第二行是否有按钮按下,然后依次将每一行设置为零(P3 = 0xfb,P3 = 0xf 7),读取列的状态,确定按下了哪个按钮,如果没有按下,则表示没有按下按钮。

    C51代码:

    #include void Delay10ms()//@11.0592MHz

    {

    unsigned char i, j;

    i = 18;

    j = 235;

    do

    {

    while (--j);

    } while (--i);

    }

    void key_scan()

    {

    unsigned char temp;

    P3=0xfe;

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    delay10ms();

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    temp=P3;

    switch(temp)

    {

    case 0xee:

    P2=0x00;

    break;

    case 0xde:

    P2=0x01;

    break;

    case 0xbe:

    P2=0x02;

    break;

    case 0x7e:

    P2=0x03;

    break;

    }

    while(temp!=0xf0)

    {

    temp=P3;

    temp&=0xf0;

    }

    }

    }

    P3=0xfd;

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    delay10ms();

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    temp=P3;

    switch(temp)

    {

    case 0xed:

    P2=0x04;

    break;

    case 0xdd:

    P2=0x05;

    break;

    case 0xbd:

    P2=0x06;

    break;

    case 0x7d:

    P2=0x07;

    break;

    }

    while(temp!=0xf0)

    {

    temp=P3;

    temp&=0xf0;

    }

    }

    }

    P3=0xfb;

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    delay10ms();

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    temp=P3;

    switch(temp)

    {

    case 0xeb:

    P2=0x08;

    break;

    case 0xdb:

    P2=0x09;

    break;

    case 0xbb:

    P2=0x0a;

    break;

    case 0x7b:

    P2=0x0b;

    break;

    }

    while(temp!=0xf0)

    {

    temp=P3;

    temp&=0xf0;

    }

    }

    }

    P3=0xf7;

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    delay10ms();

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    temp=P3;

    switch(temp)

    {

    case 0xe7:

    P2=0x0c;

    break;

    case 0xd7:

    P2=0x0d;

    break;

    case 0xb7:

    P2=0x0e;

    break;

    case 0x77:

    P2=0x0f;

    break;

    }

    while(temp!=0xf0)

    {

    temp=P3;

    temp&=0xf0;

    }

    }

    }

    }

    void main()

    {

    P2=0x00;

    while(1)

    {

    key_scan();

    }

    }

    key_scan()是键盘扫描功能,分为四个部分,每个部分的核心都是相同的,以实现矩阵键盘扫描的原理。第一段介绍如下:

    fbee395cc260b921ea00f3b6c92380db.png

    P3=0xfe;

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    delay10ms();

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    temp=P3;

    switch(temp)

    {

    case 0xee:

    P2=0x00;

    break;

    case 0xde:

    P2=0x01;

    break;

    case 0xbe:

    P2=0x02;

    break;

    case 0x7e:

    P2=0x03;

    break;

    }

    while(temp!=0xf0)

    {

    temp=P3;

    temp&=0xf0;

    }

    }

    }

    首先,P3 = 0xfe,然后将P3分配给temp,然后将temp与0xf0进行“与”运算。如果P3的高四位为0,则temp不能等于0xf0,但不能直接判断是否有按下按钮。可能会有一些干扰,并且在按下按钮的初始阶段不稳定。它不是理想的下降沿,因此需要消除抖动。实际上,要重新读取P3端口状态要延迟10毫秒。如果tmep仍不等于0xf0,则可以判断按钮被按下,然后可以将p3幅度赋予temp,然后判断temp的状态。

    然后下面的程序将确定按钮是否被抬起,否则它将保留在此循环中并且无法执行其他程序:

    while(temp!=0xf0)

    {

    temp=P3;

    temp&=0xf0;

    }

    以上代码是通过while循环实现的,或者可以被中断:

    #include unsigned char num;

    void Delay10ms()//@11.0592MHz

    {

    unsigned char i, j;

    i = 18;

    j = 235;

    do

    {

    while (--j);

    } while (--i);

    }

    void key_scan()

    {

    unsigned char temp;

    P3=0xfe;

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    delay10ms();

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    temp=P3;

    switch(temp)

    {

    case 0xee:

    P2=0x00;

    break;

    case 0xde:

    P2=0x01;

    break;

    case 0xbe:

    P2=0x02;

    break;

    case 0x7e:

    P2=0x03;

    break;

    }

    while(temp!=0xf0)

    {

    temp=P3;

    temp&=0xf0;

    }

    }

    }

    P3=0xfd;

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    delay10ms();

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    temp=P3;

    switch(temp)

    {

    case 0xed:

    P2=0x04;

    break;

    case 0xdd:

    P2=0x05;

    break;

    case 0xbd:

    P2=0x06;

    break;

    case 0x7d:

    P2=0x07;

    break;

    }

    while(temp!=0xf0)

    {

    temp=P3;

    temp&=0xf0;

    }

    }

    }

    P3=0xfb;

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    delay10ms();

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    temp=P3;

    switch(temp)

    {

    case 0xeb:

    P2=0x08;

    break;

    case 0xdb:

    P2=0x09;

    break;

    case 0xbb:

    P2=0x0a;

    break;

    case 0x7b:

    P2=0x0b;

    break;

    }

    while(temp!=0xf0)

    {

    temp=P3;

    temp&=0xf0;

    }

    }

    }

    P3=0xf7;

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    delay10ms();

    temp=P3;

    temp&=0xf0;

    if(temp!=0xf0)

    {

    temp=P3;

    switch(temp)

    {

    case 0xe7:

    P2=0x0c;

    break;

    case 0xd7:

    P2=0x0d;

    break;

    case 0xb7:

    P2=0x0e;

    break;

    case 0x77:

    P2=0x0f;

    break;

    }

    while(temp!=0xf0)

    {

    temp=P3;

    temp&=0xf0;

    }

    }

    }

    }

    void main()

    {

    TMOD=0x01;

    TH0 = (65536-917)/256;//1000/1.09

    TL0 = (65536-917)%256;;

    EA=1;

    ET0=1;

    TR0=1;

    P2=0x00;

    while(1)

    {

    if(num==2)

    {

    num=0;

    key_scan();

    }

    }

    }

    void Timer0() interrupt 1

    {

    TH0 = (65536-917)/256;

    TL0 = (65536-917)%256;

    num++;

    }

    核心内容相同,因此不再赘述。

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/bofangqi/article-357440-1.html

    展开全文
  • 8255的8LED显示,矩阵键盘,Proteus,8086 主要仿真元件清单:7SEG-COM-CATHODE,74LS138,74LS373,4078,7427,8086,8255A,74154,74273,BUTTON,LED-GREEN,LED-RED,NAND,NOT,PULLUP,SWITCH。 基于8255的8LED显示电子码表...
  • AD常用元件库(全中文标注)
  • WoX-15开发板上的矩阵键盘、旋转编码器、总电源开关,都算是这一类。按键分常开、常闭两种导电模式。本文单独讲解4脚常开按键的原理和特性。   如有所示,这是常开按键的电路符号,按键按下去的时候,...
  • 描述键盘是单片机应用系统中重要的输入设备,是...键盘都是由一个一个小按键构成的,按键实际上就是一个开关元件,单片机系统中常用的按键主要有自锁按键和非自锁按键,分别如1、2所示。非编码键盘通常又分为...

    描述

    键盘是单片机应用系统中重要的输入设备,是实现人机对话的纽带。键盘主要分编码键盘和非编码键盘两大类,其中键的开闭的识别由硬件编码器来实现的称为编码键盘,如计算机键盘。而靠软件编程来识别键的开闭的称为非编码键盘,单片机系统中常用的键盘为非编码键盘。

    键盘都是由一个一个小按键构成的,按键实际上就是一个开关元件,单片机系统中常用的按键主要有自锁按键和非自锁按键,分别如图1、图2所示。

    d0ba1dfe437fa6e8a88686f0fbe39fc9.png

    非编码键盘通常又分为独立键盘和矩阵键盘两大类。所谓独立键盘是指按键在与单片机相连时,每一个按键都与一个单片机单片机的I/O口相连,如图3所示;而对于一些应用系统中若需要较多按键时,采用独立键盘的连接方法,则比较耗费单片机的I/O口,此时我们一般会用到矩阵键盘,如图4所示,16个按键排成4行4列,称为4X4矩阵键盘,如按独立按键法,需要16个I/O口,而按图4的接法只需要8个I/O.

    bfffe953ddce4aaeda333b56a02b44b1.png

    ad191872e9559f93143bc3be8c4a8eb7.png

    由于在单片机在应用系统中,更多的会用到独立键盘,加之两者的检测原理基本相似,所以这一节里我主要讲解独立键盘的检测原理及程序实现的方法。

    1、 按键的检测原理

    按键与单片机的连接如图5所示,按键的一端与地相连,另一端直接与单片机的I/O口相连。此时我们在程序中先给I/O口赋值高电平,然后不断的检测I/O口电平的变化。当按键没有被按下时,此I/O口的电平一直为高;当按键被按下时,由于按键的另一端直接与地相连,相当于低电平,此时我们从I/O口读出的即为高电平,程序一旦检测到I/O口由高电平变为低电平时,说明按键被按下,此时马上执行相应的动作,这就是按键检测的原理。

    6937f2571db6989d95e7301b2ada0cbe.png

    图5 按键与单片机连接图

    2、 按键的抖动与消除

    由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,与单片机I/O口相接的一端的电压会出现相应的变化,如图6所示。

    dc4a8b9a6dabee15f397ce4b95b78c6c.png

    从图6中我们可以看出,实际的电压波形在按下松手的时候都会出现一定的抖动,经过实验知道,这个一时间大概在5-10ms。所在在做单片机与按键相关的系统时必须考虑消抖的环节。按键消抖的方法有两种,一个是硬件方法 一个是软件的方法,而从节约成本和尽量简化硬件电路的角度出发,一般是采用在程序中加上消抖的方法实现,通常是采用延时的方法。具体的作法是:

    检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。后面会结合到程序进行讲解。

    下面我写一个简单的程序,功能为:当一个键按下时,让一个发光二极管发光,我们先看下按键模块在实验板上的原理图,如图7和图8所示。

    6fd5dd6e8da2950afd196af4c98d9501.png

    e712165aad9e1a6f84aeafd7b220c5b9.png

    例1 按键检测程序

    //功能:当按下S8键时,L1灯发光,松手后,L1灯熄灭。相应程序如例1.

    #include 《reg52.h》

    #define uint unsigned int

    #define uchar unsigned char

    sbit D1=P1^0;

    sbit S1=P3^4;

    void main()

    {

    P3=0xff;

    while(1)

    {

    if(S1==0)

    delay(20);//消除按下时的抖动

    if(S1==0)

    {

    D1=0;

    while(!S1);//松手检测

    delay(20);//消除松手时的抖动

    }

    else

    D1=1;

    }

    }

    例2 按键检测程序

    //功能:当每按下S8键时,数码管自动加1,当加到F时又从零开始。

    #include《reg52.h》

    #define uint unsigned int

    #define uchar unsigned char

    sbit duan=P2^6;

    sbit wei=P2^7;

    sbit S1=P3^4;

    uchar temp;

    uchar code table[]=

    {0x3f,0x06,0x5b,0x4f,

    0x66,0x6d,0x7d,0x07,

    0x7f,0x6f,0x77,0x7c,

    0x39,0x5e,0x79,0x71};

    void delay(uint z )

    {

    uint x ,y;

    for(x=z;x》0;x--)

    for(y=110;y》0;y--);

    }

    void main()

    {

    P3=0xff;

    wei=1;

    P0=0xfe;

    wei=0;

    temp=0;

    while(1)

    {

    if(S1==0)

    {

    delay(20);//消除按下时的抖动

    if(S1==0)//

    {

    temp++;

    if(temp==16)temp=0;

    }

    while(!S1);//松手检测,防止temp一次多加

    delay(20);//消除松手时的抖动

    while(!S1);

    }

    duan=1;

    P0=table[temp];

    duan=0;

    }

    }

    打开APP阅读更多精彩内容

    点击阅读全文

    展开全文
  • 电子琴电源电路电路工作原理:集成块ICCA6722是该电源电路的核心元件。它能输出精确而稳定的+5V直流电压。从IC第1脚输人+9V直流电压,经IC内电路稳压后,由其第6脚和第8脚输出+5V电压。电压VDD为ROM、RAM以及CPU...

    描述

    简易电子琴设计电路图(一)

    电子琴稳定的+5V电源的电路如图所示。

    2c34b5740d34a8eb63cf6c4a19eee8a9.png

    电子琴电源电路

    电路工作原理:集成块ICCA6722是该电源电路的核心元件。它能输出精确而稳定的+5V直流电压。从IC第1脚输人+9V直流电压,经IC内电路稳压后,由其第6脚和第8脚输出+5V电压。电压VDD为ROM、RAM以及CPU中的部分电路供电(CPU中其他电路的工作电压也由VDD供给)。电压V(A)DD用于电子琴中模拟电路的小信号部分。电压V(D)DD供电子琴中其他数字电路使用。开关晶体管V受控于IC第3脚。V导通时,输出VCC(+9V)电压,为两路功率放大器供电。C点接受来自CPU的自动电源控制信号。VDD电压不受C点电平控制,电子琴接通电源时,IC输出VDD电压,CPU中的部分电路工作,使C点为高电平(+5V)。该高电平送入IC第10脚,不仅控制IC第6脚输出V(A)DD电压和V(D)DD电压,并且使IC第3脚输出控制信号,开关管V导通,输出VCC电压。若在17min内未弹奏电子琴,CPU会发生指令,使C点自动变为低电平,切断V(A)DD、V(DDD和Vcc三路电压的输出。

    二极管VD1、VD2可防止因外接电源正、负极接反而损坏电路元件。二极管VD3能保证当外接电源断电时,自动切换为机内电池供电。

    简易电子琴设计电路图(二)

    b6e5c416c08835dc50a8782e7b1aabee.png

    简易电子琴设计电路图(三)

    SPCE061A做的小型电子琴

    我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制 单片机 某个端口的“高”电平或低电平,则在该端口上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。乐曲中,每一音符对应着确定的频率,这个小制做是采用凌阳SPCE061A的DAC输出来实现,具体做法是,先建立一个有两百个数据的音频数据表,当按不同的按键即以不同的频率往DAC上送数据,从而达到输出不同音符的目的,为了达到电子琴的效果,当然还得在程序方面稍作修饰了,下面将就具体硬件电路进行说明。

    键盘控制电路:

    在这里采用矩阵式排列键盘,如图所示,这样可以合理应用硬件资源,把16只按键排列成4*4矩阵形式,用一个8位I/O口控制如图所示。把键盘上的行和列分别接在IOA0~IOA3和IOA4~IOA7上。

    d6998913a22c9cc476547b884d9c7ae1.png

    图 按键控制电路

    先置IOA0~IOA3为带数据缓存器的高电平输出,置IOA4~IOA7为带下拉电阻的输管脚,此时若有键按下,取IOA4~IOA7的数据将得到一个值,把此值保存下来,再置IOA4~IOA7为带数据反相器的高电平输出,置IOA0~IOA3为带下拉电阻的输入管脚,此时若键仍没弹起,取IOA0~IOA3的数据将得到另一个值,把这两个值组合就可得知是哪个键按下了,再通过匹配得到键值,实际上在这个小设计中只用到了8个按键,但考虑到为广大电子爱好者自由发挥预留了八个按键,您可以自己设计加入别的音符或是别的好玩的啊。

    音频放大电路:

    凌阳SPCE061A 单片机 自带双通道DAC音频输出, DAC1、DAC2转换输出的模拟量电流信号分别通过AUD1和AUD2管脚输出, DAC输出为电流型输出,经LM396音频放大,即可驱动喇叭放音,放大电路如图三(只列出了DAC1,DAC2类似)。在DAC1、DAC2后面接一个简单的音频放大电路和喇叭就能实现语音播报功能,这为单片机的音频设计提供了极大方便,音频的具体功能主要通过程序来实现。

    eacc8980ccc0eac13453b0d8bc493af6.png

    简易电子琴设计电路图(四)

    f9da8e5c92b7718a1cbcb3c554698811.png

    简易电子琴设计电路图(五)

    25键多功能电子琴电路图

    71e475c3d65b8d405367d6ebe319e955.png

    简易电子琴设计电路图(六)

    通过单片机实现电子琴演奏,实质就是将不同按键和特定频率的方波信号对应起来,以方波信号驱动蜂鸣器发出乐音。下面简单介绍一下乐音的特性。乐音实际上是有固定频率的信号。在音乐理论中,把一组音按音调高低的次序排列起来就成为音节,也就是1、2、3、4、5、6、7和高音1。高音1的频率正好是中音1频率的2倍,而且音节中各音的频率跟1的频率之比都是整数之比。

    为了发出某一特定频率的乐音,可以控制单片机的一个I/O口产生该频率的方波信号,经过电流放大后驱动蜂鸣器发出该乐音。对于方波的产生,可以启用单片机的一个定时器进行计时,产生溢出中断。中断发生时,将输出引脚的电平取反,然后重新载入计数器初始值。

    因此,正确的设置定时器的工作模式和初始计数值是发出乐音的基础。例如中音1,其频率是523Hz,则周期为T=l/523=1912μs,半个周期为956μs。根据单片机计数器计数的机器周期,就可以算出计数器的预置初始值应为多少。例如,假设采用的单片机的一个计数周期需要12个时钟周期,当采用12MHz晶振时,一个计数周期即lμs。要定时956μs,只需设置其计数初值为计数最大计数值减去956。对应不同的按键,调节Tl的溢出时间,即可输出不同频率的乐音,这样就实现了简易电子琴的设计。

    形成每个乐音音高的频率是固定的,下表列出了一个8度以及其上下共16个音的音名、频率及定时器Tl初值对照(设晶体频率为12MHz)。

    6b9560d4b23361e37503b976bc393db3.png

    该简易电子琴的硬件电路设计较简单,通过Pl口进行按键扫描,从P0.1口输出方波信号,经三极管放大后驱动蜂鸣器发出声响。系统硬件电路如下图所示。

    b79dd75002a823c2ebe2640a3419ca73.png

    简易电子琴设计电路图(七)

    时钟电路

    本系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。

    MCS-51内部有一个用于构成振荡器的高增益反相放大器。引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容CX1和CX2构成并联谐振电路,接在放大器的反馈回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为16PF。

    复位电路

    在复位电路方案挑选的时候有两种选择的,上电复位和按扭复位,上电复位是利用电容充电来实现的,而按扭复位是电源对外节电容的充电使RST为高电平,复位松开后,电容通过下拉电阻放电,使RST恢复低电平。为了制作软件的方便我们还是选择用按扭复位,因为它比较直观。

    键盘弹奏

    本系统利用P1为按键接入口,琴键输入是通过独立式键盘来完成的。由于89C51单片机的八位I/O口足以能实现控制各音阶的输出,并且独立式键盘的编程容易易懂,结构简单,实现起来方便,而且每个按键单独占有一根I/O接口线,每个I/O口的工作状态互不影响,所以采用独立式键盘。利用静态扫描的方法,在P0口输出,当每次按下一个琴键,在共阳极数码管显示相对应的键码号,这样可以使弹奏者清楚知道自己弹奏的音谱。

    扬声器电路

    扬声器发生原理:只要让扬声器(speaker)通过会产生大小变化的电流,就能使扬声器发出声音。因此,若以程序不断地输出1-》0-》1-》0-》。就可令扬声器发出声音。对检测到得按键值进行判断后,是琴键则跳转至琴键处理程序,根据检测到得按键值,查询音律表,给计时器赋值,使发出相应频率的声音。检测到按键按下的是自动播放歌曲功能键后执行该程序,扬声器会自动播放事先已经存放好的歌曲,直到歌曲播放完毕。

    总电路图

    596418dffe9c0b18673d2e95f9b1bfa7.png

    简易电子琴设计电路图(八)

    基本乐理知识

    音调主要由声音的频率决定,乐音(复音)的音调更复杂些,一般可认为主要由基音的频率来决定。也即一定频率的声音对应特定的乐音。在以C调为基准音的八度音阶中,所对应的频率如表1所示。如果能够通过某种电路结构产生特定频率的波形信号,再通过扬声器转换为声音信号,就能制作出简易的乐音发生器,再结合电子琴的一般结构,就可实现电子琴的制作了。

    fddd7fe67bffbfaafefca1950d18da91.png

    设计电路图如图所示。

    02354f0014b60f9c0fdad4886e8c3d2c.png

    图即是八音阶微型电子琴的原理电路图,8个开关对应着电子琴8个音阶琴键,使用时只能同时闭合一个开关。

    在实际电路中,为达到起振条件AF》1,常用两个二极管与电阻并联,可实现类似于热敏电阻的功效。另外需要说明的是,理论上电路的初始信号是由环境噪声及电路本身的电压提供的。实际操作时,为使现象更明显,也可通过对电路中的电容充电来实现。

    另外,电路中的运算放大器芯片LM324工作电压要求是±5V,所以还需要用7809稳压管、整流桥等元器件制作带负电源的电源电路,同电子琴电路一块整合到电路板上,制作成可直接使用的完整成品。

    打开APP阅读更多精彩内容

    点击阅读全文

    展开全文
  • 功能介绍: ... 2.采用矩阵按键输入、1602液晶显示、继电器模拟开锁,有开锁指示灯。继电器有常开常闭触点可外接电磁锁等负载;...矩阵键盘按键说明: 1 2 3 确认键 4 5 6 手动关闭锁 7 8 9 修改密码 还原 0 删除键 X
  • 我使用的是Keil5,文末有网盘链接,也可以去官网下载:Keil5软件 二、开始操作 1.LCD1602的程序调试 调试前先找到单片机开发板的原理图,查看显示屏的引脚。 由于调试的代码过长,所以放入网盘里了,有需要的可参考...
  • Sugar 从深圳优信电子买到的矩阵键盘长成这样的(Sugar 买过不少散电子元件,优信从未出过错,所以在这里提个名)。 这一堆开关的连接情况是这样的: 矩阵键盘怎么用 矩阵键盘需要接到单片机上用。 一、.
  • STM32--固件库-矩阵键盘

    千次阅读 2020-03-29 16:40:16
    STM32 矩阵键盘 简介 1.硬件部分 2.软件部分 硬件部分 矩阵键盘的工作方式 对键盘的响应取决于键盘的工作方式,键盘的工作方式应根据实际应用系统中的CPU的工作状况而定,其选取的原则是既要保证CPU能及时响应按键...
  • 基于51单片机计算器&简易计算器&带计时&远程控制...4)基于51单片机的计算器设计仿真&原理图&源码&元件清单&开题报告&流程图&论文&实物图 5)基于51单片机简易计算器设计lcd1602显示proteus仿真&源程序&原理图&PCB图
  • 矩阵键盘的逐行扫描法做一个简单的计算器(C语言)一、环境二、硬件部分1. Proteus新建工程2. 添加元件3.连接线路4、硬件效果三、软件部分1、Keil5新建工程2、代码:(1 思路分析(2 添加头文件(3 延时程序(4 ...
  • 萌新的51之旅——蜂鸣器和矩阵键盘

    千次阅读 2020-07-17 09:15:07
    随着我们学习的深入,我们会接触到更多的开发板上的实用元件,本次我学习和分享的是蜂鸣器和矩阵键盘的简单原理和操作,并且我们可以使用这些元件进一步的做一些更加有趣的开发,以便于满足我们对于单片机的兴趣和...
  • 原理图 PCB 单个 多个串联
  • fritzing官方版是款功能非常...fritzing传感器元件库介绍Fritzing是一款电路图设计软件,持面包板、电路原理图、PCB电路模板等多种设计功能,完全可以满足用户在电路设计上的各种需求。相比于同类型软件,这款软件拥...
  • 电子琴电源电路电路工作原理:集成块ICCA6722是该电源电路的核心元件。它能输出精确而稳定的+5V直流电压。从IC第1脚输人+9V直流电压,经IC内电路稳压后,由其第6脚和第8脚输出+5V电压。电压VDD为ROM、RAM以及CPU...
  • 工作时,该系统通过矩阵键盘输入抢答信号,经单片机的处理后,输出控制信号,利用一个4位数码管来完成显示功能并伴随蜂鸣器报警,用按键来让选手进行抢答,在数码管上显示哪一组先答题,从而实现整个抢答过程。...
  • 系统硬件设计 (末尾附文件) 整个系统以STC89C52单片机为核心器件,配合电阻电容晶振等器件,构成单片机的最小系统。其它个模块围绕着单片机最小系统展开。其中包括,温湿度传感器输采用DHT11温湿度...原理图: 仿
  • 1、89C52单片机,支持USB口或者是串口两种下载程序方式; 2、6位数码管(做动态扫描及静态显示实验)。 3、8位LED发光二极管(做流水灯实验)。 ...4、MAX232芯片RS232通讯接口...11、4*4矩阵键盘另加四个独立键盘(
  • 总体设计 设计的总体思路是:运用雨滴传感器感应雨量的大小,把感应信号输给单片机系统,然后通过软件控制雨刷电机根据相应的环境做出不同的转动。例如,当检测为小雨量的...2.1.2 总体设计框架 自动雨刷控制系统总体
  • 原理图: 仿真图 主控模块 主控模块模块在整个系统中起着统筹的作用,需要检测键盘,温度传感器等各种参数,同时驱动液晶显示相关参数,在这里我们选用了51系列单片机中的STC89C52单片机作为系统的主控芯片。 51...
  • 工作时,该系统通过矩阵键盘输入抢答信号,经单片机的处理后,输出控制信号,利用一个4位数码管来完成显示功能并伴随蜂鸣器报警,用按键来让选手进行抢答,在数码管上显示哪一组先答题,从而实现整个抢答过程。...
  • 键盘内部结构是怎样的?第三步:字母A到达主控芯片键盘的内部结构主要包括控制电路...由于键盘排列成矩阵格式,因此按键的识别和行列位置扫描码的产生是由键盘内部的单片机通过译码器来实现的。单片机在周期性扫描...
  • 所谓键位冲突和无冲突的各种原理

    千次阅读 2019-10-14 13:33:03
    之前你已经意识到了,普通的矩阵键盘,都会存在成百上千的三键冲突组合。但是市面上却有那么几款键盘,号称全键无冲突,实际测试也是威武异常,整个手掌拍下去都能毫不犹豫地识别出来,这是为什么呢? 这里要介绍一...
  • 独立式按键及其工作原理 一、实验目的 二、实验内容 三、实验步骤 四、C代码如下 五、实验结果 六、实验体会 一、实验目的 通常的按键分为独立式按键和矩阵式按键两种,独立式按键比较简单,并且与独立的...
  • 之前使用的AD10,在原理图中翻转一个元器件,只需要用鼠标长按着元器件,同时按键盘空格键就可以旋转。  今天新安装的AD16,发现这个方法不好用了,很是纳闷。后来查找解决办法,才知道16版本做了修改,只要用鼠标...
  • Arduino驱动4X4矩阵薄膜按键

    千次阅读 2020-02-02 14:46:46
    文章目录Arduino驱动4X4矩阵薄膜按键原理图我的薄膜按键按键上拉上拉电阻介绍上拉电阻作用例程我的想法我的代码(老)后续4 * 4按键矩阵一些全局变量及宏定义扫描矩阵函数封装最后改进的代码(完整版)最终效果 ...
  • 4x4薄膜矩阵键盘 焊接: 洗版: 焊接完如: 测试视频: 外 卖 自 提 柜 项目实战-外卖自提柜 1.项目介绍、协议制定 项目实战-外卖自提柜 2. CubeMX + FreeRTOS入门 项目实战-外卖自提柜 3. FreeRTOS主要API的应用 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 624
精华内容 249
关键字:

矩阵键盘原理图需要哪些原件