2.2.3蜂鸣器电路
当驱动蜂鸣器的P2.2口有一定频率的脉冲输出时,蜂鸣器就能发出声音。通过控制P2.2发出脉冲的频率能够控制蜂鸣器发出声音的音调,进而能发出美妙的音乐。蜂鸣器直接使用P2.2口驱动。 2.2.4键盘电路
键盘电路作为电子琴系统中最重要的输入设备,在系统中承担着把操
作人员想要输入的信号输入单片机的重要作用。键盘有独立键盘和矩阵键盘。由于设计要求简单和编程方便,本设计采用独立按键。根据设计要求,本设计使用11个独立按键,电路功能分配与下: P3.5———高音阶切换键 P3.4———中音阶切换键 P3.3———低音阶切换键 P1.0———do音输入键 P1.1————re音输入键 P1.2————mi音输入键 P1.3 ————fa音输入键 P1.4 ————so音输入键 P1.5 ————la音输入键 P1.6 ————ti音输入键 电路图与图??? 3 软件设计 3.1软件设计流程 软件的结构图如下 程序流程图如下: 软件
3.2软件设计模块化 3.2.1初始化程序
初始化程序的主要作用是定义一些变量的初值以及对中断、定时器的初始化。在初始化程序中对变量赋初值,并要对中断进行设置,也要对定时器进行设置。根据这个思路,初始化程序如下 *******初始化数据***** void init(void) {
speaker=0;关蜂鸣器 LED1=1; LED2=0; EA=1;开总中断
TCON=0x01;外部中断0设置为边沿触发 EX0=1;开外部中断0 ET0=1;开定时器0中断 ET1=1;开定时器1中断
TMOD=0x11;定时器0,1工作在定时状态,均为方式1 }
3.2.3键盘扫描
键盘是人与单片机通信的重要接口。合适的键盘扫描程序能使单片机准确的运行。 3.2.5显示程序
本设计采用的共阴极数码管作为数据显示。采用的数码管动态显示,可以节约单片机的IO口,为以后的扩展做准备。
3.2.6发声程序
在完成了键盘服务子程序后,我们就知道了具体是哪一个键被按下了,下一步就是要让喇叭发出这个按键所特有的音符。我们知道,每个音符之所以不同是因为它们都有各自不同的频率,而我们正好可以利用89S52中的定时器来产生不同的频率以达到这个目的。我们只要对定时器T1的初值进行合理的设置就可完成这个工作,我们根据电子琴的音符频率表来为定时器赋初值。主要是根据一张频率表,表如下所示:
表 3-1 电子琴音符频率表 音符
频率(HZ)
低1 DO
#1 DO# 277 低2 RE
#2 RE# 311 低 3 M 330 低 4 FA 349 # 4 FA# 370 低 5 SO 392 # 5 SO# 415 低 6 LA 440 # 6
466
63928 64021 64103 64185 64260 64331 64400 64463 64524 64580
中 6 LA 880 # 6
932
64968 64994 65030 65058 65085 65110 65134 65157 65178 65198
294
63731 63835
中 5 SO 784 # 5 SO# 831
64898 64934
262
简谱码(T值) 63628
音符
频率(HZ)
# 4 FA# 740
简谱码(T值) 64860
中 7 SI 988 高 1 DO 1046 # 1 DO# 1109 高 2 RE 1175 # 2 RE# 1245
高 3 M 1318 高 4 FA 1397 # 4 FA# 1480
低 7 SI 494 中 1 DO 523
# 1 DO# 554 中 2 RE 587 # 2 RE# 622 中 3 M 659
64633 64684 64732 64777
高 5 SO 1568 # 5 SO# 1661 高 6 LA 1760 # 6
1865
65217 65235 65252 65268 65283
中 4 FA 698 64820
高 7 SI 1967
有了这张表,我们就可以顺利地完成发声程序的编写了。根据以上的
思路以及频率表可以写出发声程序如下: code unsigned char FH[]={ xFE,中音
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,低音的高8位
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
}; 音阶频率表 低八位 code unsigned char FL[]={ 2D,中音
0x21,0xDB,0x87,0xD7,0x68,0xE8,0x5B,低音的低8位
0x8E,0xED,0x44,0x6B,0xB4,0xF4,0x 0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0