单片机做的电子琴音乐程序中,如何将三个音同时发出

来源:百度知道 编辑:UC知道 时间:2024/06/22 14:18:03
如题,例如如下三个音
0x0F,0x01
0x15,0x02
0x16,0x02
要怎么编程实现三个音同时在一个输出口输出
求高手指教,最好能给出程序或者可参考的例子
先给30,回答出问题再追加100分!
看到可能有帮助的答案了,还请各位继续指导一下,我现在先追加20分先,
继续追加30

1.问"音乐飘渺迷人"和"mokama":
这样的话三个音就可以叠加了是吗?那么会不会变音呢,就是说跟想要发的音完全不一样,我希望听的时候还是能分辨出来哪一个音是哪一个音的. and,请原谅我是个新手,请问要如何用C语言定义多个输出口并选择不同的音用不同的输出口输出?我刚刚百度了一下没有找到可以学习的例子.

2.问"TINY_24":
单片机是不是只有两个定时器的呢?怎么弄成三个,我不大明白您的回答是怎么操作的,请问有没有相近的例子可以参考一下呢?

3.回复"QQ136207557":
先谢谢你的回答,但是这个答案好像跟我的问题不符合吧?

4.回复"音乐飘渺迷人":
再次谢谢你的回复,我一下还不能看明白你的回复,可能需要在琢磨琢磨,现在由于你的答案再追加30分
............晕了,提高悬赏是不是有次数限制的,,,,?

5回复"43438rty":
两次?

第三次回复:

12MHZ晶振时,三个八度的单音中有些音符就误差就比较大>1%,除非晶振取高些(24MHZ),音符就准些,要求不严,需三个音混合,可从3个输出口输出,再经电阻混合后送去放大,能分出是复音的.
方法是在定时中断子程序里有三个字节的周期寄存器,每次中断就要判断周期是否到了,到了就将输出取反.产生声音.
因为定时中断里要判断3个音周期要花时间, 就算不干其它事也要10个机器周期以上.所以中断周期不能取得太少.

<假设晶振为12MHZ>

为了能让单片机能多干些事,设定时器T0设为20us,自重装.
设每个音符频率周期用一个字节值,可发出100HZ的低音至25KHZ高音.可复盖三个八度.
中断编程:
20us定时器加1
判第一个音是否开,否则跳下一个音,是则周期字节值减1是否为0,否则下一个音,是则输出取反,并装新值.
判第二个音
判第三个音
中断返回

音长,节拍在主程序写.

:=====================

org 000Bh
ajmp music
.....
music1 data 40h ;音乐1周期
mu1 data 41h
music2 data 42h;音乐2周期
mu2 data 43h
music3 data 44h;音乐3周期
mu3 data 45h
out1 bit p1.0;音乐1出
out2 bit p1.1;音乐2出
out3 bit p1.2;音乐3出
......
org 0100h
mov tmod,#12;设定8位自重装
........
music:
djnz mu1,next1;判第一个音周期字节值减1是否为0,否则下一个音,
cpl out1;是则输出取反,
mov mu1,music1;并装新值.
next1:;下一个音
djnz