虽然是败笔,但是文中基本上介绍了一个小应用实现及问题分析的全过程,希望能够对你有帮助,大胆贴出!毕竟这篇文章写了好久。。。额,写文章的人伤不起啊伤不起。。。
学生时代总会有这么一句笑话:“XXX!去,给我蹲政教处门口唱国歌!”
一直在思索第一个例子用什么,才能引起学生的兴趣,点亮板子的LED?貌似很无聊啊,你也不能拿着给同学炫耀,毫无吸引力,那么就索性用这个例子吧,顺便也抒发一下我对祖国的热爱。让我们的板子唱起国歌来!
前记:在这篇文章之前,我并没有做过类似的实验,所以我们站在同一个起跑线上,千万不要抱怨别人比你厉害是因为他比你聪明。如果试验成功,板子真的这么唱歌了,像我这么笨的人都做到了,你没有理由做不到,这篇文章让你找回自信。
首先要贴出来一篇参考文章,是基于C51的唱国歌的例子,做人要实在,我不想把它说成是我原创的,因为我也没学过C51,呵呵,但是我会举一反三。因为ARM板裸奔跟写C51的程序差不多,虽然扼杀了它的处理能力(本该是跑系统的),但是要练习对硬件的操控能力和做接口实验,这些是必须的。下边是文章内容:
蜂鸣器使用在很多的场合,他一般用来发出报警或者提示的声音,是一种常用的电子器件,这里我给大家 简单的介绍一下用单片机驱动蜂鸣器的方法, 蜂鸣器有二种 1.本身带有驱动电路, 5v,9v,12v 超电压使用, 分 声音沙哑失真。2.象 call 机,喇叭一样,用软件驱动。频率控制音调,时间控制音量大小,第一种蜂鸣器 一般都有一个固定的频率参数也就是他他发出的声音是不能变化的,就象食堂用的打卡器一样,卡一贴近 就发出都的一声。第 2 种就不同了用单片机驱动第 2 种蜂鸣器后还可以使他演 奏出美妙的音乐,我们只需 要用简单的程序就可以控制单蜂鸣器所奏的频率,也就控制了音调。
c51程序实例: 单片机驱动蜂鸣器演奏中华人民共和国国歌的前 4 节的 c51 程序:
#include <REG52.h>
sbit BUZ=P2^6; //蜂鸣器接单片机的p2.6 电路很简单。
unsigned int hzs[]={131,147,165,175,196,220,247,262,294,330,349,392,440,494,523,587,659,698,784,880,988,1047,1175,131 9,1397,1568,1760,1976};//标准音调频率
char dots[]={8,28,10,12,12,13,28,28,12,28,10,28,8,12,12,12,10,28,28,8,28,5,5,5,5,5,5,8,'#'};//频率控制数组
void delay(unsigned int u) //延时
{
while(u--);
}
void play_hz(unsigned int u) {
unsigned int i=u;
while(i--){
BUZ=0;
BUZ=1;
delay(18432/u-24);
}
}
void play_sound(int i) {
if(i<28)
play_hz(hzs[i-1]);
else
delay(500); }
void main(void) //主程序开始
{
while(1){
int i=0;
while(dots[i]!='#')
play_sound(dots[i++]);
delay(20000);
}
} //播放音乐
音调与频率的关系:
C:261.6256
D:293.6648
E:329.6276
F:349.2282
G:391.9954
A:440
B:493.8833
每个 8 度频率加倍,如 A 的高 8 度是 880HZ,再高 8 度是 1760HZ。 反之,A 的低 8 度是 220HZ,再低 8 度是 110HZ。
完文章,我们来做ARM下的实现:
我想当你看完文章,应该有些思路了吧,不知道我们的思路一样不一样,也不知道这个实验可否成功,让我们一起去探索一下》》》》》》
我的思路是这样的:蜂鸣器的控制应该和LED的控制是一样的,根据电路设计,在对应的控制寄存器中的对应控制位写1(或者0)他就唱,相反,他就不唱。而不同的音调就是通过频率来控制的,而频率就是一个动作周期性变化的次数,上边的程序已经写得非常到位,简洁有力,通过while循环和时延控制频率。理论上我们只用作少量改动就可以使用。而这些改动就要看我们自己的板子的设计了,我的是TQ2440,虽不知你的是不是,但是只要你可以在你的板子上迁移成功,证明你已经提升了,OK,here we go。
先看一下TQ2440 的 buzzer相关的电路(在TQ2440底板原理图里):