您现在所在的是:

单片机论坛

回帖:1个,阅读:852 [上一页] [1] [下一页]
* 帖子主题:

单片机发声音入门

912
sfmcu
文章数:44
年度积分:50
历史总积分:912
注册时间:2006/8/22
发站内信
08年优秀博客奖
发表于:2010/2/2 20:28:23
#0楼
 
做个实际的项目,总有某些时候需要出点声音的,例如键盘按下后就要来个‘d’的声音,其实单片机发个声音是很简单的,io,电阻,三极管,蜂鸣器,就可以了。这里以dx板上的发声系统为硬件基础:
这个设计和普通的蜂鸣器有点不同,其实就是为了让p17可以免除干扰地复用作isp口。平时p17为低电平,可以省电。
这里需要说明一下的,这些小小的两个脚的蜂鸣器,表面上个个一样,但实际上是分两种的,一种是通电就会响,另外一种是只能通过脉冲发声。通电响的那种用做普通发声设备,发出单纯的声音,简单方便。脉冲式的使用上没那么方便,但发出的各频率的声音都比较悦耳的。dx51学习板上用的就是脉冲式的了,所以平时p17是高是低,它都不会响。
以下是dx学习板上的普通发声程序:
sbit bb=p1^7;
void beep(uchar t)
{
uchar i;
uint j;
for(j=0;j0;i--);//给i赋的初值决定输出的频率
bb=~bb;
}
}
由于是脉冲形式的,所以发声就是通过一个取反bb=~bb;完成。上面的程序很简单,t决定了发声时间,i的初值决定了发声频率。频率是多少可以通过指令周期的计算得到,但个人觉得这类单声的东东,还是用耳朵听,多试几个频率值,方能找到我们最满意的频率:)
如果要产生几个音调,可以写多几组不同时间长短和不同频率的代码,简单的我们从上面的代码修改:
sbit bb=p1^7;
void beep(uchar t)
{
uchar i;
uint j;
//第一声
for(j=0;j0;i--);
bb=~bb;
}
for(j=0;j0;i--);
bb=~bb;
}
}
程序很简单,就是发了一声后,延迟一定时间再发第二声.大家可以试着写段自己的代码,听听声音效果.
但上面的程序是用延时发声的,当你要发出很长的声音的时候,延时部分就会占用了所有cpu资源,也就是在发声过程中我们什么都做不了,当然对于一般的响应声音,例如按键后发出声音,程序应付有余,但对于其它用途,这种方法就显得效率很低了。这里介绍一中用定时器的方法实现的声#include reg51.h
#define uchar unsigned char
sbit bb=p1^7; //蜂鸣器控制脚
uchar beep_flag=0; //发声标志
uchar count_time=0; //中断计数
void inittimer(void)
{
tmod=0x1;
th0=0xe0;
tl0=0xc6;
}
void timer0(void) interrupt 1
{
th0=0xe0;
tl0=0xc6;
if(!beep_flag)
{
count_time=0;
}
else
{
count_time++;
bb=~bb;
if(count_time>70)
{
count_time=0;
beep_flag=0;
}
}
}

void main(void)
{
inittimer();
tr0=1;
et0=1;
ea=1;
beep_flag=1;
while(1);
}

上面程序有着大家已经熟悉的count_time变量,其实它就是用来控制发声时间长短的,而定时时间(取决于th,tl)就是用来产生频率的。可能初学者第一次看这样的程序有一点点迷惑也说不定,但只要用心去想想,几分钟后大家就能明白。说透了,定时器中断函数是会不断地执行的,但对于函数中的bb=~bb;这一句,就只会在 beep_flag=1;之后运行一段时间——这段时间取决于count_time 要计时多长,count_time>70后就计算完,此时清除beep_flag=0;那么count_time++; bb=~bb;就不会再运行了。
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=110014&Name=sfmcu
17528
ahljj
文章数:3387
年度积分:240
历史总积分:17528
注册时间:2002/3/23
发站内信
发表于:2010/5/24 9:36:11
#1楼
学习了

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

46.8003