基于单片机的简易电子琴设计
一、设计目的
本方案设计数码管显示音符的实验,使用基于AT89C51单片机,在数码管上显示按键所代表音符的数字,通过键盘可以调节低音,中音,高音的音符,按下数据蜂鸣器会发出相应音符发出的声音。
二、摘要:通过数码管显示音符的数字,按下键盘,蜂鸣器会发出声音进行提示
关键词:单片机,键盘,蜂鸣器,数码管
硬件电路设计
1、单片机模块设计
2、本次设计采用的是单片机AT89C51。
芯片共有40个引脚,引脚的排列顺序为从靠
芯片的缺口,如图3.1所示。
左边那列逆时针数起,依次为1,2,3.....40,其中芯片的1脚顶上有一个凹点。
在单片机的40个引脚中,电源引脚2根,外接晶体振荡器引脚2根,控制引脚4根以及4组8位可编程I/O引脚32根。
3、
4、图AT89C51管脚图
5、AT89C51单片机共有4组8位可编程I/O口,分别为P0、P1、P2、P3口,每个口
有8位,共32根。
每一根引脚都可以编程,比如用来控制电机、交通灯等,开发产品时就是利用这些可编程引脚来实现我们想要的功能。
6、P0口:8位双向I/O口线,名称为P0.0-P0.7;
7、P1口:8位准双向I/O口线,名称为P1.0-P1.7;
8、P2口:8位准双向I/O口线,名称为P2.0-P2.7;
9、P3口:8位准双向I/O口线,名称为P3.0-P3.7。
10、本文单片机模块如图所示,主要是由单片机芯片与晶振和复位电路组成的。
是
由单片机来控制整个系统,让我们的系统可以正常的运行。
2、数码管显示模块设计
LED(Light Emitting Diode)发光二极管缩写。
LED数码管是由发光二极管构成的。
常见的LED数码管为“8”字型的,共计8段。
它由七个条形发光二极管和一个小圆点发光二极管组成,每一段对应一个发光二极管。
一般来说分共阳极和共阴极两种接法,如图4所示为八段LED数码管结构及外形。
共阳极LED数码管的发光二极管的阳极连接在一起,公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。
反之,共阴极发光二极管的阴极连在一起,通常公共阴极接地。
当阳极为高电平时,发光二极管点亮。
LED数码管的a至g七个发光二极管因接得电压不同而导致不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,如表3所示为八段LED数码管的字形码表。
3、键盘与蜂鸣器系统
键盘接口
蜂鸣器接口
程序的软件设计
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned char
sbit beep=P2^0;
uchar code sch[3][7]={{0xf1,0xf2,0xf4,0xf4,0xf6,0xf7,0xf8},{0xf8,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc},{0xfc,0xfc,0xf d,0xfd,0xfd,0xfd,0xfe}};//低音,中音,高音的1,2,3,4,5,6,7
uchar code scl[3][7]={{0x17,0xb7,0x2a,0xcf,0x09,0x20,0x18},{0x88,0x59,0x13,0x68,0x04,0x90,0x0c},{0x44,0 xad,0x09,0x35,0x82,0xc8,0x04}};
uchar code smg[7]={0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8};
uchar line=0,note;
void delay(uchar i)
{
uchar j;
while(i--)
{
for(j=0;j<110;j++);
}
}
void keyscan()
{
if(P1!=0xff)
{
delay(10);
if(P1!=0xff)
{
switch(P1)
{
case 0xfe:note=0;break;
case 0xfd:note=1;break;
case 0xfb:note=2;break;
case 0xf7:note=3;break;
case 0xef:note=4;break;
case 0xdf:note=5;break;
case 0xbf:note=6;break;
}
TR0=1;
P0=smg[note];
while(P1!=0xff);
TR0=0;
beep=1;
}
}
}
void main()
{
EA=1;
EX0=1;
IT0=1;
TMOD=0X01;
ET0=1;
TH0=sch[line][note];
TL0=scl[line][note];
while(1)
{
keyscan();
}
}
void sd() interrupt 0
{
line++;
if(line==3)
line=0;
}
void tine() interrupt 1
{
TH0=sch[line][note];
TL0=scl[line][note];
beep=~beep;
}
模拟仿真图
参考文献
[1] 欧伟明,何静,凌云,刘剑.单片机原理与应用系统设计[M].北京:电子工业出版社,2009:268-298.
[2] 楼然苗,李光飞.单片机课程设计指导[M].北京:北京航空航天大学出版社,2007.7:15-36.
[3] 林伸茂.8051单片机彻底研究——实习篇[M].北京:中国电力出版社,2006:12-38.
[4] 张萌,和湘,姜斌.单片机应用系统开发综合实例[M].北京:清华大学出版社,2007.7:23-46.
[5] 鲍可.C8051F单片机原理及应用[M].北京:中国电力出版社,2006.1:56-65
[6] 谭浩强.C程序设计[M].北京:清华大学出版社,2005:18-62.
[7] 彭伟单片机C语言程序设计实训100例—基于8051+proteus仿真2012.10
[8]赵广元proteus辅助的单片机原理实践——基础设计、课程设计。
毕业设计。