• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

蜂鸣器发音程序处理完整过程

唯爱小姑娘 2016-11-19 浏览量:967
蜂鸣器音乐程序处理完整过程过程各种参数的确立麻烦各位前辈啦
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 之前那篇提問我有列出囉,其實就是選擇方法2去決定頻率而已,我們回顧下定時器中斷初值的計算,定義單片機的晶振頻率為fosc(MHz),則單片機一個機器周期等於12/fosc(us),定時器中斷觸發需要定時的時間為t,則定時器寄存器的初值C等於【65536-(t*fosc)/12】,其中高8位寄存器TH0的初值為C/256,低8位寄存器TL0的初值為C%256。

    以中音區的「do」為例,此時該方波信號的頻率是523Hz,那麼高電平持續時間等於956us,也就是定時器0需要定時的時間,那麼初值C=65536-956*11.0592/12=64655,寄存器TH0的初值=64655/256=252,寄存器TL0的初值=64655%256=143,換算成十六進位後即可,再對應您上個提問的那張頻率表格


    所以事實上您只要決定TH和TL重裝的值而已,用來產生佔空比為50%的PWM波,方波頻率越高,蜂鳴器的音調也越高


    以上有問題再提問唷


    我們回顧下定時器中斷初值的計算,定義單片機的晶振頻率為fosc(MHz),則單片機一個機器周期等於12/fosc(us),定時器中斷觸發需要定時的時間為t,則定時器寄存器的初值C等於【65536-(t*fosc)/12】,其中高8位寄存器TH0的初值為C/256,低8位寄存器TL0的初值為C%256。

    以中音區的「do」為例,此時該方波信號的頻率是523Hz,那麼高電平持續時間等於956us,也就是定時器0需要定時的時間,那麼初值C=65536-956*11.0592/12=64655,寄存器TH0的初值=64655/256=252,寄存器TL0的初值=64655%256=143,換算成十六進位後即可。



    原文網址:https://kknews.cc/tech/8yg34e.html
    • 发布于 2016-11-19
    • 举报
    • 评论 5
    • 0
    • 0
唯爱小姑娘 回复了 MOP:好的前辈谢谢 回复
唯爱小姑娘 回复了 MOP:前辈定时器初值跟您给我的程序写的不一样啊。这个程序对于我这个初学者是不是有点难 回复
唯爱小姑娘 回复了 MOP:我是不是应该再积累积累 回复
MOP 回复了 MOP:嗨,兩隻老虎的音階各有不同,上面只是以中音Do(523 Hz)來舉例而已,我寫在下面 回复
MOP 回复了 MOP:您再看一下,只要能理解原理,就很容易看得懂 回复

其他答案 数量:5
  • unsigned int code NoteReload[] = { //中音1-7 和高音1-7 对应的定时器重载值
        65536 - (11059200/12) / (523*2), //中音1
        65536 - (11059200/12) / (587*2), //2
        65536 - (11059200/12) / (659*2), //3
        65536 - (11059200/12) / (698*2), //4
        65536 - (11059200/12) / (784*2), //5
        65536 - (11059200/12) / (880*2), //6
        65536 - (11059200/12) / (988*2), //7
        65536 - (11059200/12) / (1047*2), //高音1
        65536 - (11059200/12) / (1175*2), //2
        65536 - (11059200/12) / (1319*2), //3
        65536 - (11059200/12) / (1397*2), //4
        65536 - (11059200/12) / (1568*2), //5
        65536 - (11059200/12) / (1760*2), //6
        65536 - (11059200/12) / (1976*2), //7
    };
    1=Do,2=Re,...以此類推
    然後11059200代表fosc,即晶振頻率,12為1T定時模式,12T定時模式則不用除12,而523,587,...等等的,則為音頻頻率
    還要再多乘以2的原因是,因為我們一個周期是需要高低各佔比50%的,所以頻率倒數就是週期,相對來說我們頻率要多一倍去產生高低電位
    就是週期的一半就是高/低電位,這樣剛好50%佔空比

    再以剛剛的範例來講
    以中音區的「do」為例,此時該方波信號的頻率是523Hz,那麼高電平持續時間等於956us
    T/2=1/523/2=956us,驗證OK

    決定完音階以後,剩下就是該響多久,也就是節拍(Tempo)了,兩隻老虎是(1/4)拍代表以四分之一音符當作1拍,一小節有1拍,其實要有些樂理概念比較容易懂
    但四分之一音符要多久,這就依照使用者定義了,音符只是相對的時間長短,假設400ms為四分之一音符時間,二分之一音符就是800ms,
    又假設200ms為四分之一音符時間,二分之一音符時間就為400ms,所以原來給您的範例程式碼就是歌曲上的相對節拍了
        //两只老虎节拍表,4 表示一拍,1 就是 1/4 拍,8 就是 2 拍
        unsigned char code TwoTigerBeat[] = {
        4,   4,   4, 4,   4,   4,   4, 4,    4, 4, 8,   4, 4, 8,
        3,1, 3,1, 4, 4,   3,1, 3,1, 4, 4,    4, 4, 8,   4, 4, 8,
        };
    有了音調+節拍就完成一首歌曲了

    • 发布于2016-11-19
    • 举报
    • 评论 0
    • 1
    • 0

  • 有可能我发了别人写过的帖子但是我问的比较多哦
    • 发布于2016-11-19
    • 举报
    • 评论 0
    • 0
    • 0

唯爱小姑娘 回复了 Eagleson :好的 回复

  • 下面更正為
    12為12T定時模式,1T定時模式則不用除12
    • 发布于2016-11-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 下面更正為
    12為12T定時模式,1T定時模式則不用除12
    • 发布于2016-11-19
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

蜂鸣器发音程序处理完整过程