单片机七阶音符_(单片机问题)让蜂鸣器发出do,ri,mi,fa,so,la,si,按这个顺序发声,每个音符各发声1秒....

问题描述:

(单片机问题)让蜂鸣器发出do,ri,mi,fa,so,la,si,按这个顺序发声,每个音符各发声1秒.

蜂鸣器接在单片机的P2.4口,用C语言来编写,求具体的单片机程序,不要框架型的程序哦!

我不会介意,但是不要评论我,说我怎么怎么不行,垃圾,傻子等类似的侮辱性的语言,因为我刚自学,也自认为不聪明.如果您给我程序或提出解决办法,

这些音符对应频率好像是:10,50,100,200,400,800,1k(hz)的方波.

1个回答

分类:

综合

2014-12-03

问题解答:

我来补答

呵呵~初学者没事,好好学就能学好.留个邮箱地址,我给你发一个资料,资料很有用,你看了就知道.好了,现在回过头来说下这个问题.首先你要明白一个问题,那就是不同的频率对应不同的声音,你不要想太细了,想为什么同是方波会不同的声音,这个我们不管,你以后会理解的.比如说第一个吧,10Hz的,那么它对应的时间应该是1/10=0.1s.其中高电平0.05s,低电平0.05s.其他的都是相同的原理.这里的延时函数要稍稍精确些.但是学单片机明白原理就行哈.

现在我就写下10hz的这个,其他的自己来吧~

sbit P2.4=P2^4;

void main(void)

{

P2.4=1;

delay(50);//这个是延时函数,要自己写哈.延时50us.

P2.4=0;

delay(50);

}

这个就是10hz的音频的程序.

再问: 感谢您的提供,我仔细分析了一下您的程序,这是程序的一部分中的一部分,是吗?您写的是10HZ如何产生,还没有写这个频率如何才能持续1秒,过了一秒又怎么样才能进入下一个频率。 为了频率的准确,您可以使用定时器来做吗?T0控制频率,T1控制1秒,行吗?麻烦您了!!!

再答: 哦,我没看到持续1s哈。这只是10hz的部分哈。持续1s可以用for循环来做啊。 当然可以用定时器来做,但是你要明白这道题的主要内涵在于知道怎么控制蜂鸣器发声,而不在于准确的定时。 可以用定时器控制1s,但是那也不是精确的,用C语音只能测试然后精确到微秒级,而汇编才能真正算出时间。比如说工作方式1:16位定时器,它最大的计时为131.072ms,我们可以用100ms一次,再用一个变量记录次数,比如10次就是1s。这样看起来很对,很多初学者都这么做,但是他们忘记了语句的跳转,每条语句执行的时间,其实执行10次可以能已经超过了几十毫秒或是更多时间。 个人建议这么做: #include #include bit flag; unsigned char count; void dely50(void) { unsigned char i; for(i=25;i>0;i--) _nop_(); //nop为空语句,如果外部晶振为12M,那么它就是准确的1US。 } void main(void) { while(1) { for(count=20;count>0;count--) //稍稍准确的持续1s。 { P2_4=~P2_4; dely50(); //延时50us } //.......可以在后面继续添加for循环,添加其他的频率。 } 我已经写了一个给你当参考了,要学到东西还是要靠自己做。不懂的可以交流。

展开全文阅读

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值