找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6077|回复: 0
收起左侧

单片机电子音调发生器设计

[复制链接]
ID:373830 发表于 2018-7-18 10:33 | 显示全部楼层 |阅读模式
1          课程设计总体目标
1.1 功能目标
(1)利用JD51开发板上的按键S1~S4进行音调选择,即按下不同的开关产生不同的音调,依次按动S1~S4 及组合按键,蜂鸣器发出1234567i八个音调;并在数码管上显示。
(2)编写2支歌曲,并可进行选择播放。
(3)拓展题:播放音乐前亮灯10秒,并可以通过按下按键来中断播放。
1.2 总体结构
图1-1  总体结构
1.3 工作原理
音节由不同频率的方波产生,音节与频率的关系通过查表可得。要产生音频方波,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用计时器计时此半周期时间,每当计时到后就将输出方波的 I/0 反相,然后重复计时此半周期时间再对I/O 反相,就可在 I/O 脚得到此频率的方波。在 ZKS-03 实验仪上,产生方波的 I/O 脚选用P1.7,通过跳线选择器 JP1 将单片机的 P1.7 与蜂鸣器的驱动电路相连。这样 P1.7 输出不同频率的方波,蜂鸣器便会发出不同的声音。另外, 音乐的节拍是由延时实现的,如果 1 拍为0.4 秒, 1/4 拍是 0.1 秒。只要设定延时时间,就可求得节拍的时间。延时作为基本延时时间,节拍值只能是它的整数倍,每个音节相应的定时器初值 X 可按下法计算:
              (式1-1)
                  (式1-2)
其中,f是音调频率。当晶振f_osc=11.0592MHz时,音节“1”相应的定时器初值为x,则可得x=63777D=F921H其他的可同样求得。
另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。只要设定延时时间,就可求得节拍的时间。延时作为基本延时时间,节拍值只能是它的整数倍。
表1-1 音调频率对照表
  
音调
  
频率(Hz)
X(HEX)
1
262
F921
2
294
F9E1
3
330
FA8C
4
349
FAD8
5
392
FB68
6
440
FBE9
7
494
FC5B
i
523
FC8F

2 硬件设计
运用到相关硬件为:51单片机、数码管、蜂鸣器等。
2.1数码管
LED数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个,如图2-1所示,这些段分别由字母a,b,c,d,e,f,g,dp来表示,DP表示小数点。当数码管特定的段加上电压后,这些特定的段就会发亮,这样就可以看到不同的字样。发光二极管的阴极连接到一起连接到低电平的称为共阴极数码管,如图2-2所示,发光二极管的阳极连接到一起连接到电源正极的称为共阳极数码管,如图2-3所示。

图2-1 数码管             图2-2 共阴极数码管          图2-4 共阳极数码管
各段码位的对应关系,如表2-1所示:
表2.1 码位对应关系
段码位
D7
D6
D5
D4
D3
D2
D1
D0
显示段
Dp
g
f
e
d
c
b
a
       LED显示断码如表2-1所示:
表2-2 LED显示段码
字型
共阳极段码
共阴极段码
字型
共阳极断码
共阴极段码
0
C0 H
3F H
9
90 H
6F H
1
F9 H
06 H
A
88 H
77 H
2
A4 H
5B H
B
83 H
7C H
3
B0 H
4F H
C
C6 H
39 H
4
99 H
66 H
D
A1 H
5E H
5
92H
6D H
E
86 H
79 H
6
82 H
7D H
F
84 H
71 H
7
F8 H
07 H
空白
FF H
00 H
8
80 H
7F H
P
8C H
73 H
2.2蜂鸣器
图2-4 蜂鸣器电路图
这里的三极管主要是做驱动用的。因为单片机的IO口驱动能力不够让蜂鸣器发出声音,所以我们通过三极管放大驱动电流,从而可以让蜂鸣器发出声音,你要是输出高电平,三极管导通,集电极电流通过蜂鸣器让蜂鸣器发出声音,当输出低电平时,三极管截止,没有电流流过蜂鸣器,所以就不会发出声音。
2.3定时/计数器
单片机内有两个16位定时/计数器(增量式计数)
1.工作方式(方式0、方式1、方式2、方式3)
(1)方式0(13位定时/计数)

图2-5 工作方式0
(2)方式1(16位定时/计数)

图2-6 工作方式1
(3)方式2(8位自动重装时间常数定时/计数)

图2-7 工作方式2
(4)方式3(仅适用于定时/计数器0)
TL0 用于8位定时/计数,TH0 只用于8位定时。

图2-8 工作方式3
2.控制寄存器
(1)定时/计数器方式控制寄存器:TMOD
├──── T1 ────┼──── T0 ────┤
├──┬──┬──┬──┼──┬──┬──┬─—┤
│GATE│C/T │ M1 │ M0 │GATE│C/T │ M1 │ M0 │
└──┴──┴──┴──┴──┴──┴──┴──┘
GATE:门控位。1:打开,0:关闭
C/T:工作状态选择。1:计数状态,0:定时状态
M1,M0:工作方式选择
00 方式0
01 方式1
10 方式2
11 方式3
(2)定时/计数器控制寄存器:TCON
┌──┬──┬──┬──┬──┬──┬──┬──┐
│TF1 │TR1 │TF0 │TR0 │IE1 │IT1 │IE0 │IT0 │
└──┴──┴──┴──┴──┴──┴──┴──┘
TF1,TF0:定时/计数器中断请求标志,1:有请求;0:无请求
TR1,TR0:定时/计数器运行控制位,1:打开;0:关断
IE1,IE0:外部中断INT1,INT0 中断请求标志,1:有请求;0:无请求
IT1,IT0:外部中断INT1,INT0 触发方式,1:下降沿触发;0:低电平触发

3.中断系统
五个中断源:
INT0:外部中断0
INT1:外部中断1
T0:定时/计数器0中断
T1:定时/计数器1中断
TI/RI:串行I/O中断
中断允许寄存器:IE(1:允许;0:不允许)
┌──┬──┬──┬──┬──┬──┬──┬──┐
│EA  │× │× │ES │ET1 │EX1 │ET0 │EX0 │
└──┴──┴──┴──┴──┴──┴──┴──┘
EA: 全局中断允许位
ES: 串行口中断允许位
ET1:T1 中断允许位
EX1:INT1 中断允许位
ET0:T0 中断允许位
EX0:INT0 中断允许位

3 软件设计3.1流程图
根据要实现的功能,流程图如下:
功能选择
音乐
开始
系统初始化
判断按键
判断按键
电子琴
液晶显示
播放音调
播放音乐

3.2软件组成
键盘扫描、中断计时、数码显示、音乐播放、主程序
①键盘扫描
键盘键值读取程序包括键盘扫描、消除抖动、键译码等内容。按键的识别主要有两种方法:行反转法和行扫描法。因为键盘为机械开关,容易引入抖动。为了消除抖动干扰,在程序中要加入消除抖动的部分。
②中断计时
中断部分,中断定时器1主要负责输出不同频率的方波,产生声音,中断定时器1主要是计时按键时间及按键间隔时间的功能,在播放音乐的时候,还担任着播放音乐的节拍的任务。
③音乐播放
音乐播放部分主要是实现播放程序里面的音乐的功能。
④主程序
主程序主要是随时发出按键的声音功能,并且通过不同P口的扫描,判断是否是播放按键声音还是播放音乐,还是继续发出按键声音。
3.3详细思路
1.题目一:利用JD51开发板上的按键S1~S4进行音调选择,即按下不同的开关产生不同的音调,依次按动S1~S4 及组合按键,蜂鸣器发出1234567i八个音调;并在数码管上显示。
方案:我们计划设计以C语言为主体的程序代码,用按键控制音符的输出,4个按键单个按下时会输出4个音符,另外4个按键进行两两组合表示另外4个音符,效果就像电子琴的按键一样。由于平时不能发声,只有按键后才发声,我们用定时器的启动TR0作为声音输出开关。在发现按键后,送入对应频率值,打开定时器,就发出了声音,延时一阵再关闭定时器,声音就停止了。整体C代码应该分为以下模块:
(1)变量的定义。在这个模块里,我们要定义喇叭的输出脚,四个按键等。
(2)频率对照模块。在这个模块中,按照频率对照表定义一个矩阵,按照工作原理,每个频率值用两个八位二进制数来表示。这两个八位二进制数分为低八位和高八位,并可合并看做四位十六进制数。四位十六进制数可以表示0~65535范围内的数。对于12MHz的晶振,每一个电平保持时间为【65535-(四位十六进制数表示的十进制数)】微秒,用t来表示。因此该音调的一个周期为T=2*t,音调的频率f=1/T。在本项目中,由于要使用1234567i八个音调,因此建立的矩阵大小应为2*8,矩阵内的每个元素为一个八位二进制数,分别表示八个不同的频率。
(3)定时中断模块。产生定时中断以及音乐输出。4.主函数模块。在这个模块中,我们将使用while循环以及if判断等函数,对每个按键是否按下进行判定以及数码管的显示。
2.题目二:编写2支歌曲,并可进行选择播放。
方案:我们计划用三个按键来控制播放音乐。K1、K2每个键播放一首音乐,K4键停止音乐的播放。 程序分为以下几个模块。
(1)变量定义模块。在这个模块中,我们定义一些必要的引脚以及按键。
(2)频率对照模块。不同于任务一的频率对照模块,在这里我们要定义尽可能全的音调的频率。我们使用36*2的矩阵定义36个由低到高不同的频率,用于之后播放音乐。
(3)定时中断模块。调入预定时值,产生对应频率的音调。
(4)音乐符号串解释模块。使用此模块的原因在于,在之后的模块中我们会用123等数字、“’”、“.”、“_”、“|”等单引号、英文句号、下划线、分隔线等,来对一首歌进行编写。在这个模块中,我们使用switch函数,将以上不同符号分成多个case分别进行处理。
(5)奏乐模块。该模块是自定义的函数,入口是要演奏的音乐符号串,对音乐符号进行逐一解释,按照音长进行延时或中断,进而完成一首完整的曲子。在这个模块中,同时也要使用一个if函数进行判定,当在演奏过程中,使用者按下了K4按键,则退出音乐的演奏。
(6)音乐符号编写模块。在这个模块中,由两个自定义函数构成。每个自定义函数表示一首曲子。函数内容为该曲子对应的数字曲谱。
(7)主函数模块。在这个模块中进行对以上所有模块的统筹调用。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表