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 音调频率对照表
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 码位对应关系 LED显示断码如表2-1所示: 表2-2 LED显示段码 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)主函数模块。在这个模块中进行对以上所有模块的统筹调用。
|