作业帮 > 综合 > 作业

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

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/12 15:19:29
(单片机问题)让蜂鸣器发出do,ri,mi,fa,so,la,si,按这个顺序发声,每个音符各发声1秒.
蜂鸣器接在单片机的P2.4口,用C语言来编写,求具体的单片机程序,不要框架型的程序哦!
我不会介意,但是不要评论我,说我怎么怎么不行,垃圾,傻子等类似的侮辱性的语言,因为我刚自学,也自认为不聪明.如果您给我程序或提出解决办法,
这些音符对应频率好像是:10,50,100,200,400,800,1k(hz)的方波.
呵呵~初学者没事,好好学就能学好.留个邮箱地址,我给你发一个资料,资料很有用,你看了就知道.好了,现在回过头来说下这个问题.首先你要明白一个问题,那就是不同的频率对应不同的声音,你不要想太细了,想为什么同是方波会不同的声音,这个我们不管,你以后会理解的.比如说第一个吧,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循环,添加其他的频率。 } 我已经写了一个给你当参考了,要学到东西还是要靠自己做。不懂的可以交流。