单片机矩阵键盘

核心提示方法一;按照图在板子的一面按图连线飞线即可(麻烦可靠性低)2,一部分焊板子上一部分焊板子下不就行了不过要安排好可能占用其他空间3梯式焊法像很多个L平行嵌套一样但要占用背面大量的空间要安排好4自己动脑子》。。这都搞不赢还学毛啊键盘输入电路有哪

方法一;按照图在板子的一面按图连线飞线即可(麻烦可靠性低)

2,一部分焊板子上一部分焊板子下不就行了不过要安排好可能占用其他空间

3梯式焊法像很多个L平行嵌套一样但要占用背面大量的空间要安排好

4自己动脑子》。。这都搞不赢还学毛啊

键盘输入电路有哪些

基于DDS芯片AD9850的全数控函数信号发生器的设计与实现

信号源是电子产品测量与调试、部队设备技术保障等领域的基本电子设备。随着科学技术的发展和测量技术的进步,普通的信号发生器已无法满足目前日益发展的电子技术领域的生产调试需要。而DDS技术是一种新兴的直接数字频率合成技术,具有频率分辨率高、频率切换速度快、切换相位连续、输出信号相位噪声低、可编程、全数字化易于集成、体积小、重量轻等优点,因而在雷达及通信等领域具有广泛的应用前景。

1系统设计方案

本文提出的采用DDS作为信号发生核心器件的全数控函数信号发生器设计方案,根据输出信号波形类型可设置、输出信号幅度和频率可数控、输出频率宽等要求,选用了美国A/D公司的AD9850芯片,并通过单片机程序控制和处理AD9850的32位频率控制字,再经放大后加至以数字电位器为核心的数字衰减网络,从而实现了信号幅度、频率、类型以及输出等选项的全数字控制。该函数信号发生器的结构如图1所示。

本系统主要由单片机、DDS直接频率信号合成器、数字衰减电路、真有效值转换模块、A/D转换模块、数字积分选择电路等部分组成。

2 DDS的基本原理

直接数字频率合成器(Derect Digital Synthesizer)是从相位概念出发直接合成所需波形的一种频率合成技术。一个直接数字频率合成器通常由相位累加器、加法器、波形存储ROM、D/A转换器和低通滤波器(LPF)组成。DDS的组成结构如图2所示。其中,K为频率控制字(也叫相位增量),P为相位控制字,W为波形控制字,fc为参考时钟频率,N为相位累加器的字长,D为ROM数据位及D/A转换器的字长。相位累加器在时钟fc的控制下以步长K累加,输出的N位二进制码与相位控制字P、波形控制字W相加后作为波形ROM的地址来对波形ROM进行寻址,波形ROM输出的D位幅度码S(n)经D/A转换变成阶梯波S(t)后,再经过低通滤波器平滑,就可以得到合成的信号波形。由于合成的信号波形取决于波形ROM中存放的幅度码,因此,用DDS可以合成任意波形。

3硬件电路设计

31 DDS信号产生电路

考虑到DDS具有频率分辨率较高、频率切换速度快、切换相位连续、输出信号相位噪声低、可编程、全数字化、易于集成、体积小、重量轻等优点,该方案选用美国A/D公司的AD9850芯片,并采用单片机为核心控制器件来对DDS输送频率控制字,从而使DDS输出相应频率和类型的信号,其DDS信号产生电路如图3所示。

3硬件电路设计

31 DDS信号产生电路

考虑到DDS具有频率分辨率较高、频率切换速度快、切换相位连续、输出信号相位噪声低、可编程、全数字化、易于集成、体积小、重量轻等优点,该方案选用美国A/D公司的AD9850芯片,并采用单片机为核心控制器件来对DDS输送频率控制字,从而使DDS输出相应频率和类型的信号,其DDS信号产生电路如图3所示。

单片机与AD9850的接口既可采用并行方式,也可采用串行方式。为了充分发挥芯片的高速性能和节约单片机资源,本设计选择并行方式将AT89S52的P0口经74HC373锁存器扩展后接至DDS的并行输入控制端(D0~D7)。AD9850外接120 MHz的有源晶振,产生的正弦信号经低通滤波器(LPF)去掉高频谐波后即可得到波形良好的模拟信号。这样,将D/A转换器的输出信号经低通滤波后,接到AD9850内部的高速比较器上,即可直接输出一个抖动很小的方波。再将方波信号加至积分电路,即可得到三角波信号。另外,也可通过键盘编辑任意波形的输出信号。

32键盘输入接口及LCD接口电路

本系统中的数字输入设置电路采用2×8矩阵键盘。由于LCD具有显示内容多,电路结构简单,占用单片机资源少等优点,本系统采用RT1602C型LCD液晶显示屏来显示信号的类型、频率大小和正弦波的峰一峰值,图4所示是键盘输入及LCD接口电路图。

同样,考虑到AT89S52单片机的IO引脚资源有限,本系统的键盘输入及LCD输出均通过74HC245连接到AT89S52单片机的P0端口,从而实现端口扩展和复用。

33信号幅度数控预置电路

为了实现对输出的正弦模拟信号幅度的数字控制和预置,本系统采用了AD811高速运放、数字电位器衰减、真有效值转换、以及A/D转换等电路,具体电路图如图5所示。

数字电位器X9C102是实现信号幅度数字可调的关键器件。真有效值转换模块AD637主要负责信号的TRMS/DC转换,然后经TLC2453模数转换向单片机输送正比于正弦波信号幅度的数字量,以便单片机输出合适的幅值控制指令。

34积分电容自动切换控制电路

三角波是常用信号之一,本系统采用RC积分电路将方波信号转换成三角波。由于信号频率很宽(低频达1 Hz以下,高频达60 MHz以上),为了完成不同频段的线性积分,需要不同的积分电容(10pF、100pF、1 nF、10nF、100nF、1 μF、10 μF、100μF)。基于数控和自动切换的需要,本系统采用如图6所示的CD4051八选一电路。

CD4051的八选一控制信号来源于AT89S52的P0~P3接口,74HC373P也是考虑复用P0端口而设置的。AD9850输出的方波经积分电路转换为三角波后,经AD811高速运放可提高其负载能力。

4系统软件设计

41 主程序

主程序可控制整个系统,包括控制系统的初始化、显示、运算、键盘扫描、频率控制、幅度控制等子程序,其主程序流程如图7所示。

初始化可将系统设定为默认工作状态,然后通过扫描键盘来判断是否有按键按下以确定用户要执行的任务,同时通过判断23H4、20H1、20H0各功能标志位来确定应完成的功能。当23H4=1时,计算频率值系统工作在频率计方式下;当20H1=1时,检测峰峰值系统将检测输出信号的峰峰值:而当20H0=1时.则更新LCD显示内容,当执行完后返回键盘扫描程序并以此循环。各功能标志位均由键盘、峰峰值检测和定时程序等控制,从而实现各种功能。

42键盘扫描子程序

键盘扫描子程序如图8所示。因按键较多。本系统采用2×8行列式键盘来节约I/O口,并用程序把8根列线全部拉低,再判断2根行线是否有低电平,如果没有,说明没有按键被按下,系统则退出键盘扫描程序,否则,依次拉低列线,然后依次判断行线是否有低电平并判断键号,键号确定后再转到键号相对应的功能程序去执行。键盘主要方便用户设置频率、幅度、选择工作方式等功能。

43 信号频率数字预置子程序

信号频率的数字控制程序流程如图9所示。该部分程序主要用于将键盘输入值转换成十六进制数据,然后产生相应的频率控制字并送至DDS芯片,以改变DDS的相位增量,最终输出相应频率信号。

5 结束语

通过严格的实验测试证明,本系统采用DDS完全可以实现输出信号类型的选择设置、信号频率数字预置、信号幅度数字步进可调等功能,是一种输出信号频率覆盖宽(0023 Hz~40 MHz)、信号源分辨率高、波形失真小、全数控型函数信号发生器。具有一定的实用开发价值。

单片机菜鸟求高人指点 矩阵键盘 数码管,怎么实现:按1显示1,再按2显示12,这样子。。

独立键盘直接是一个脚接地一个脚接单片机IO口,44矩阵键盘如下图:

电脑键盘一般时通过门电路控制8个引脚可以控制128个键,一般笔记本代工厂测试键盘就是那样扫描的。。

#include<reg52h>

unsigned char key_num,count=0,k;

unsigned long sum=0;

unsigned char code str[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};

void scan();

void disp_led(unsigned long int dat);

void delay(unsigned int dly);

void main()

{for(k=0;k<=7;k++)

 {SBUF=str[10];

  while(TI==0);

  TI=0;

 }

 while(1)

  {scan();

   count=key_num;

   sum=sum10+count;

   scan();

   while(key_num!=16)

   scan();

   disp_led(sum);

   delay(1);

   scan();

   while(key_num==16)

   scan();

  }

}

void disp_led(unsigned long int dat)

{

 unsigned char num[8];

 if((dat>=0)&&(dat<=9))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=10;

  num[4]=10;

  num[5]=10;

  num[6]=10;

  num[7]=dat;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=10)&&(dat<=99))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=10;

  num[4]=10;

  num[5]=10;

  num[6]=dat/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=100)&&(dat<=999))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=10;

  num[4]=10;

  num[5]=dat/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=1000)&&(dat<=9999))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=10;

  num[4]=dat/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=10000)&&(dat<=99999))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=dat/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=100000)&&(dat<=999999))

 {

  num[0]=10;

  num[1]=10;

  num[2]=dat/100000;

  num[3]=dat%100000/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=1000000)&&(dat<=9999999))

 {

  num[0]=10;

  num[1]=dat/1000000;

  num[2]=dat%1000000/100000;

  num[3]=dat%100000/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=10000000)&&(dat<=99999999))

 {

  num[0]=dat/10000000;

  num[1]=dat%10000000/1000000;

  num[2]=dat%1000000/100000;

  num[3]=dat%100000/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if(dat>=100000000)

 {

  dat=dat%100000000;

  num[0]=dat/10000000;

  num[1]=dat%10000000/1000000;

  num[2]=dat%1000000/100000;

  num[3]=dat%100000/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

}

void delay(unsigned int dly)

{int i,j;

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

 for(j=0;j<dly;j++);

}

void scan()

{unsigned char readkey,x_temp,y_temp;

 P2=0x0f;

 x_temp=P2&0x0f;

 P2=0xf0;

 y_temp=P2&0xf0;

 readkey=x_temp|y_temp;

 switch(readkey)

   {case 0x7e:key_num=0; break;

   case 0x7d:key_num=1; break;

 case 0x7b:key_num=2; break;

 case 0x77:key_num=3; break;

 case 0xbe:key_num=4; break;

 case 0xbd:key_num=5; break;

 case 0xbb:key_num=6; break;

 case 0xb7:key_num=7; break;

 case 0xde:key_num=8; break;

 case 0xdd:key_num=9; break;

 case 0xff:key_num=16;

   }

}

图中是led连接的电路,矩阵按键接的是P2口。

 
友情链接
鄂ICP备19019357号-22