找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7123|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)蜂鳴器生日歌程序中的幾個(gè)疑問,65536是什么意思呢?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:688693 發(fā)表于 2020-3-30 21:39 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
初學(xué)單片機(jī)(c語言也比較菜),望大佬救救我,萬分感謝。以下是使用無源蜂鳴器播放的生日歌,
請(qǐng)問65536是什么意思呢?
請(qǐng)問T是計(jì)數(shù)值是機(jī)械周期的個(gè)數(shù)嗎?
請(qǐng)問程序中的延時(shí)程序的for語句中的120是什么意思,這個(gè)for語句是做什么呢?
請(qǐng)問程序的主函數(shù)中的for(k=0;k<SONG_TONE[ i]/3;k++); 是什么意思呢?
請(qǐng)問程序的主函數(shù)中的DelayMS(10); i++; 是做什么呢?


  1. T=65536-N=65536-Fi/2/Fr
  2. 計(jì)算舉例:
  3. 設(shè)K=65536,F=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)
  4. 的計(jì)數(shù)值。
  5. T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr
  6. 低音DO 的T=65536-500000/262=63627
  7. 中音DO 的T=65536-500000/523=64580
  8. 高音DO 的T=65536-500000/1047=65059
  9. 參考程序:
  10. #include<reg51.h>
  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. sbit BEEP=P3^7;
  14. // 生日快樂歌的音符頻率表,不同頻率由不同的延時(shí)來決定
  15. uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
  16. 212,212,106,126,159,169,190,119,119,126,159,142,159,0};
  17. // 生日快樂歌節(jié)拍表,節(jié)拍決定每個(gè)音符的演奏長短
  18. uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
  19. 9,3,12,12,12,12,12,9,3,12,12,12,24,0};
  20. // 延時(shí)
  21. void DelayMS(uint x)
  22. {
  23. uchar t;
  24. while(x--) for(t=0;t<120;t++);
  25. }
  26. // 播放函數(shù)
  27. void PlayMusic()
  28. {
  29. uint i=0,j,k;
  30. while(SONG_LONG[ i]!=0||SONG_TONE[ i]!=0)
  31. { //播放各個(gè)音符,SONG_LONG 為拍子長度
  32. for(j=0;j<SONG_LONG[ i]*20;j++)
  33. {
  34. BEEP=~BEEP;
  35. //SONG_TONE延時(shí)表決定了每個(gè)音符的頻率
  36. for(k=0;k<SONG_TONE[ i]/3;k++);
  37. }
  38. DelayMS(10);
  39. i++;
  40. }
  41. }
  42. void main()
  43. {
  44. BEEP=0;
  45. while(1)
  46. {
  47. PlayMusic(); //播放生日快樂
  48. DelayMS(500); //播放完后暫停一段時(shí)間
  49. }
  50. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:235200 發(fā)表于 2020-3-31 01:15 | 只看該作者
請(qǐng)問65536是什么意思呢?
是定時(shí)計(jì)數(shù)器TH0TL0計(jì)數(shù)溢出時(shí)的最大數(shù),學(xué)好象兩位十進(jìn)制溢出時(shí)是100
請(qǐng)問T是計(jì)數(shù)值是機(jī)械周期的個(gè)數(shù)嗎?
T是定時(shí)計(jì)數(shù)器從初始值至溢出時(shí)的計(jì)數(shù)值,如兩位十進(jìn)制 初始值是90,只需10次就溢出
請(qǐng)問程序中的延時(shí)程序的for語句中的120是什么意思,這個(gè)for語句是做什么呢?
120是用C語言寫程序時(shí)延時(shí)1ms的經(jīng)驗(yàn)值,用for循環(huán)計(jì)數(shù)120次就是1ms時(shí)間,有些地方用110 123 124等
請(qǐng)問程序的主函數(shù)中的for(k=0;k<SONG_TONE[ i]/3;k++); 是什么意思呢?
這一句是控制發(fā)出不同的音符
請(qǐng)問程序的主函數(shù)中的DelayMS(10); i++; 是做什么呢?
這一句是控制上面音符的播放時(shí)間,一般是一個(gè)節(jié)拍,i++是控制播放下一個(gè)音符
回復(fù)

使用道具 舉報(bào)

板凳
ID:475247 發(fā)表于 2020-3-31 10:06 | 只看該作者
將視頻多看必次,里面講的很清楚
回復(fù)

使用道具 舉報(bào)

地板
ID:584814 發(fā)表于 2020-3-31 10:12 | 只看該作者
1、65536=0xFF+1;
2、用for循環(huán)計(jì)數(shù)120次就是1ms時(shí)間不僅是經(jīng)驗(yàn)值還與主頻有關(guān)負(fù)責(zé)的寫法都備注;
3、DelayMS(10);的作用是讓兩個(gè)不同音符中間容易分辨增加節(jié)奏感。
湊數(shù)的40行代碼你已自問自答了不少,以上供參考沒明白多看書就可以了。
回復(fù)

使用道具 舉報(bào)

5#
ID:720276 發(fā)表于 2020-4-5 16:08 | 只看該作者
1、65536指的是計(jì)數(shù)器T0是一個(gè)可以對(duì)機(jī)器周期進(jìn)行65536次計(jì)數(shù)。2、T我感覺應(yīng)該寫成T=(65536-50000)/262。3、for是循環(huán)語句,循環(huán)120次,只要t不到120,就一直執(zhí)行他的語句。4、SONG_TONE[ i]生日歌有頻率表,i 是幾對(duì)應(yīng)表里第幾個(gè)數(shù),k初值為0,k小于SONG_TONE[ i]/3時(shí),k加1,繼續(xù)循環(huán),直到大于SONG_TONE[ i]/3時(shí)跳出循環(huán)。5、當(dāng)k小于SONG_TONE[ i]/3時(shí),執(zhí)行下面括號(hào)語句,延時(shí)10ms,i 自加1,再去if里判斷,實(shí)現(xiàn)頻率表里每個(gè)頻率逐個(gè)掃描
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表