天嵌 ARM开发社区

 找回密码
 注册
查看: 6501|回复: 23

Example 4.4 加强版PWM 唱歌

[复制链接]
wang1234sheng 发表于 2010-3-19 20:14:45 | 显示全部楼层 |阅读模式
例程 4.4 加强版PWM 唱歌
在我们写出了以上使用ARM9 实现蜂鸣器唱歌的程序之后,大家已经听到了一首动
听了歌曲了,是不是很有成就感呢?但是大家是否完全搞明白了这首歌的来龙去脉了
呢?还有些朋友(例如拍拖中的朋友或者过生日的朋友)可能会有比较多的想法,例如
我们可不可以使用ARM9 的蜂鸣器在恰当的时机唱出自己喜欢的任意的歌曲呢?下面
的实验就来帮大家解决这个问题。
(注意:此例程为笔者原创,转载请注明出处。)
一、 实验目的
1、频率分析:分析低、中、高音的do、re、mi、fa、sol、la、si 对应的声音的频率
2、编写自己的程序,使我们可以对照着乐谱(例如下面的《老鼠爱大米》那一个
乐谱),在数组中直接写入对应的低音、中音、高音的do、re、mi、fa、sol、la、si 以及
该音节的节拍数即可实现蜂鸣器将那一首歌唱出来。方便以后自己朝开发板里面写入任
意歌曲。
注意:此处我们的数组采用以下助记规则:
(1)对低音的do、re、mi、fa、sol、la、si,分别写入01、02、03、04、05、06、07
对中音的do、re、mi、fa、sol、la、si,分别写入11、12、13、14、15、16、17
对高音的do、re、mi、fa、sol、la、si,分别写入21、22、23、24、25、26、27
(2)对应的节拍数,1/4 拍写1,2/4 拍写2,3/4 拍写3,依次类推。
欢迎大家提出更好的助记规格。
二、 我们所需要做的工作摘要:
1、编写程序段,使用串口工具,将使用例程4.3 的方法实现蜂鸣器唱歌的时候对应的
频率打印出来。
笔者在这里分析这些数据并为大家总结这些数据间的关系如下:
SONG[]中的数值:
低音:0x60,0x55,0x4c,0x48,0x40,0x39,0x33,
中音:0x30,0x2b,0x26,0x24,0x20,0x1c,0x19,
高音:0x18,0x15,0x13,0x12,0x10,0x0e,0x0d,
对应蜂鸣器的频率(Hz):
低音:260,294,328,347,390,438,490,
中音:520,581,657,694,781,892,1000,
高音:1041,1190,1315,1388,1562,1785,1923,
2、对照例程 4.3 中的《祝你平安》的乐谱将数据写入数组如下:
unsigned char SONG[] ={ //祝你平安,2 表示2/4 拍
13,2, 15,2, 15,2, 13,1, 15,1, 15,8,
13,2, 11,2, 11,2, 6,1, 11,1, 11,8,
13,2, 15,2, 15,2, 16,2, 15,8,
21
广州天嵌计算机科技有限公司
地址:广东省广州市天河区五山路 141 号尚德大厦A2004 室邮编:510000
电话:18998495589(销售) QQ: 297125453(销售) 020-22106679 (技术支持)
官方特约网络代理点: http://shop60653802.taobao.com/
12,2, 13,2, 15,2, 12,1, 13,1, 12,8,
13,2, 11,2, 11,2, 6,1, 13,1, 13,6, 5,1, 6,1, 13,2, 11,2, 11,2, 6,1, 13,1, 13,8,
13,2, 12,1, 12,1, 12,2, 11,1, 6,1, 13,1, 12,1, 12,2, 12,4, 5,2, 15,1, 15,1, 12,1, 13,3,
11,8,
21,2, 21,2, 13,2, 15,2, 15,4, 13,2, 12,2, 11,2, 11,2, 16,2, 15,2, 15,8,
16,2, 16,2, 16,2, 11,2, 11,6, 6,1, 11,1, 15,2, 12,1, 13,1, 12,1, 13,1, 13,1, 12,1, 12,8,
21,2, 21,2, 13,2, 15,2, 15,6, 13,1, 12,2, 11,2, 11,2, 16,2, 15,2, 15,8,
13,2, 11,1, 11,1, 11,2, 6,2, 13,1, 12,1, 12,2, 12,4, 5,1, 5,1, 15,1, 15,1, 12,1, 13,3, 11,8,
};
3、将 main 函数当中对应的语句加以调整如下:
在这里对 main 函数中while(1)前面的语句稍作了一些化简,供大家参考。
void Main(void){
char *mode;
unsigned char Temp1,Temp2;
unsigned int Addr=0;
U8 key;
U32 mpll_val = 0 ;
U16 freq;// lci 1000
Port_Init();
Isr_Init();
key = 14;
mpll_val = (92<<12)|(1<<4)|(1); //init FCLK=400M, so change MPLL first
ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
ChangeClockDivider(key, 12);
cal_cpu_bus_clk();
consoleNum = 0; // Uart 1 select for debug.
Uart_Init( 0,115200 );
rMISCCR=rMISCCR&~(1<<3); // USBD is selected instead of USBH1
rMISCCR=rMISCCR&~(1<<13); // USB port 1 is enabled.
rDSC0 = 0x2aa;
rDSC1 = 0x2aaaaaaa;
rCLKCON = 0xfffff0;
MMU_Init(); //
pISR_SWI=(_ISR_STARTADDRESS+0xf0); //for pSOS
Led_Display(0x66);
mode="DMA";
Clk0_Disable();
Clk1_Disable();
mpll_val = rMPLLCON;
Lcd_TFT_Init() ; // LCD initial
22
广州天嵌计算机科技有限公司
地址:广东省广州市天河区五山路 141 号尚德大厦A2004 室邮编:510000
电话:18998495589(销售) QQ: 297125453(销售) 020-22106679 (技术支持)
官方特约网络代理点: http://shop60653802.taobao.com/
download_run=1; //The default menu is the Download & Run mode.
Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x1f) );
Uart_Printf("\n");
while(1){
Temp1=SONG[Addr++];
Temp2=SONG[Addr++];
switch ( Temp1) {
case 01: freq=260; break;
case 02: freq=294; break;
case 03: freq=328; break;
case 04: freq=347; break;
case 05: freq=390; break;
case 06: freq=438; break;
case 07: freq=490; break;
case 11: freq=520; break;
case 12: freq=581; break;
case 13: freq=657; break;
case 14: freq=694; break;
case 15: freq=781; break;
case 16: freq=892; break;
case 17: freq=1000; break;
case 21: freq=1041; break;
case 22: freq=1190; break;
case 23: freq=1315; break;
case 24: freq=1388; break;
case 25: freq=1562; break;
case 26: freq=1785; break;
case 27: freq=1923; break;
default: freq='e';break;
}
Buzzer_Freq_Set0( freq );
Delay(192*Temp2);
Uart_Printf("%d,%d, ",Temp1,Temp2);
if(Temp2==8||Temp2==6||Temp2==12||Temp2==4){
Uart_Printf("\n");
}
if(Addr>440){//440,此为数字数据个数
Addr=0;
Uart_Printf("\n\n");
23
广州天嵌计算机科技有限公司
地址:广东省广州市天河区五山路 141 号尚德大厦A2004 室邮编:510000
电话:18998495589(销售) QQ: 297125453(销售) 020-22106679 (技术支持)
官方特约网络代理点: http://shop60653802.taobao.com/
}
}
}
并将程序烧去开发板中,使用我们的听觉来验证:其试验效果和之前的例程
4.3 是一样的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 2 +10 收起 理由
moguanghe + 6
philmo + 4

查看全部评分

wenshan231 发表于 2010-4-21 21:33:17 | 显示全部楼层
感谢你的无私奉献   向你学习 以后也多做贡献
zajiju 发表于 2010-5-20 13:34:25 | 显示全部楼层
好东西,我也要下。!
sx050 发表于 2010-5-20 22:32:12 | 显示全部楼层
非常感谢,谢谢分享
pTemp 发表于 2010-5-21 15:05:05 | 显示全部楼层
90秒 设置太长了ba ?
feiniaolql01 发表于 2010-6-17 21:00:49 | 显示全部楼层
谢谢分享!!!!
dw2835 发表于 2010-6-23 22:53:21 | 显示全部楼层
Very cool!
yzh03106 发表于 2010-7-4 18:50:33 | 显示全部楼层
好东西,谢谢!
ihc001 发表于 2010-7-9 13:24:30 | 显示全部楼层
未入门新手学习中。。。。。
open_gg 发表于 2010-7-13 10:29:24 | 显示全部楼层
looking……
eegood 发表于 2010-7-14 12:19:19 | 显示全部楼层
非常感谢,谢谢分享
droiing 发表于 2010-7-27 09:05:01 | 显示全部楼层
cool!
谢谢楼主,希望继续努力写后面的程序。
qihang 发表于 2010-7-27 11:22:04 | 显示全部楼层
不错!谢谢楼主!
danyuan127 发表于 2010-8-1 11:34:02 | 显示全部楼层
谢了,下来参考一下。
桂海科技 发表于 2010-8-3 15:50:40 | 显示全部楼层
谢谢!您的无私奉献
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-5 22:39 , Processed in 1.062500 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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