(单片机问题)让蜂鸣器发出do,ri,mi,fa,so,la,si,按这个顺序发声,每个音符各发声1秒.
来源:学生作业帮 编辑:大师作文网作业帮 分类:综合作业 时间:2024/09/30 01:37:50
(单片机问题)让蜂鸣器发出do,ri,mi,fa,so,la,si,按这个顺序发声,每个音符各发声1秒.
蜂鸣器接在单片机的P2.4口,用C语言来编写,求具体的单片机程序,不要框架型的程序哦!
我不会介意,但是不要评论我,说我怎么怎么不行,垃圾,傻子等类似的侮辱性的语言,因为我刚自学,也自认为不聪明.如果您给我程序或提出解决办法,
这些音符对应频率好像是:10,50,100,200,400,800,1k(hz)的方波.
蜂鸣器接在单片机的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循环,添加其他的频率。 } 我已经写了一个给你当参考了,要学到东西还是要靠自己做。不懂的可以交流。
现在我就写下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循环,添加其他的频率。 } 我已经写了一个给你当参考了,要学到东西还是要靠自己做。不懂的可以交流。
(单片机问题)让蜂鸣器发出do,ri,mi,fa,so,la,si,按这个顺序发声,每个音符各发声1秒.
七音符为什么叫 Do re mi fa so la si do
弹吉他 do re mi fa so la si
do re mi fa so la si do 用汉字音译 的写法
do re mi fa so la si do 怎么推回去
吉他do re mi fa so la si do 怎么发
do re mi fa so la si do有没有完整的英文或希腊文名字?
七个音符怎样读法?七个音符的正确写法到底是:do re mi fa so la xi 还是do re me fa so
我想要钢琴音阶的声音,do re mi fa so la si do 这样的.每个音分开,最好是MP3格式
吉他do re mi fa sol la si怎么弹
小提琴do re mi fa so la si do之后接着重复的音又是do还是re
关于音乐上的 do re mi fa so la si怎么和数字1234567对应记忆