找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6089|回复: 4
收起左侧

51单片机蜂鸣器生日歌程序中的几个疑问,65536是什么意思呢?

[复制链接]
ID:688693 发表于 2020-3-30 21:39 | 显示全部楼层 |阅读模式
初学单片机(c语言也比较菜),望大佬救救我,万分感谢。以下是使用无源蜂鸣器播放的生日歌,
请问65536是什么意思呢?
请问T是计数值是机械周期的个数吗?
请问程序中的延时程序的for语句中的120是什么意思,这个for语句是做什么呢?
请问程序的主函数中的for(k=0;k<SONG_TONE[ i]/3;k++); 是什么意思呢?
请问程序的主函数中的DelayMS(10); i++; 是做什么呢?


  1. T=65536-N=65536-Fi/2/Fr
  2. 计算举例:
  3. 设K=65536,F=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)
  4. 的计数值。
  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. // 生日快乐歌的音符频率表,不同频率由不同的延时来决定
  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. // 生日快乐歌节拍表,节拍决定每个音符的演奏长短
  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. // 延时
  21. void DelayMS(uint x)
  22. {
  23. uchar t;
  24. while(x--) for(t=0;t<120;t++);
  25. }
  26. // 播放函数
  27. void PlayMusic()
  28. {
  29. uint i=0,j,k;
  30. while(SONG_LONG[ i]!=0||SONG_TONE[ i]!=0)
  31. { //播放各个音符,SONG_LONG 为拍子长度
  32. for(j=0;j<SONG_LONG[ i]*20;j++)
  33. {
  34. BEEP=~BEEP;
  35. //SONG_TONE延时表决定了每个音符的频率
  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); //播放完后暂停一段时间
  49. }
  50. }
复制代码


回复

使用道具 举报

ID:235200 发表于 2020-3-31 01:15 | 显示全部楼层
请问65536是什么意思呢?
是定时计数器TH0TL0计数溢出时的最大数,学好象两位十进制溢出时是100
请问T是计数值是机械周期的个数吗?
T是定时计数器从初始值至溢出时的计数值,如两位十进制 初始值是90,只需10次就溢出
请问程序中的延时程序的for语句中的120是什么意思,这个for语句是做什么呢?
120是用C语言写程序时延时1ms的经验值,用for循环计数120次就是1ms时间,有些地方用110 123 124等
请问程序的主函数中的for(k=0;k<SONG_TONE[ i]/3;k++); 是什么意思呢?
这一句是控制发出不同的音符
请问程序的主函数中的DelayMS(10); i++; 是做什么呢?
这一句是控制上面音符的播放时间,一般是一个节拍,i++是控制播放下一个音符
回复

使用道具 举报

ID:475247 发表于 2020-3-31 10:06 | 显示全部楼层
将视频多看必次,里面讲的很清楚
回复

使用道具 举报

ID:584814 发表于 2020-3-31 10:12 | 显示全部楼层
1、65536=0xFF+1;
2、用for循环计数120次就是1ms时间不仅是经验值还与主频有关负责的写法都备注;
3、DelayMS(10);的作用是让两个不同音符中间容易分辨增加节奏感。
凑数的40行代码你已自问自答了不少,以上供参考没明白多看书就可以了。
回复

使用道具 举报

ID:720276 发表于 2020-4-5 16:08 | 显示全部楼层
1、65536指的是计数器T0是一个可以对机器周期进行65536次计数。2、T我感觉应该写成T=(65536-50000)/262。3、for是循环语句,循环120次,只要t不到120,就一直执行他的语句。4、SONG_TONE[ i]生日歌有频率表,i 是几对应表里第几个数,k初值为0,k小于SONG_TONE[ i]/3时,k加1,继续循环,直到大于SONG_TONE[ i]/3时跳出循环。5、当k小于SONG_TONE[ i]/3时,执行下面括号语句,延时10ms,i 自加1,再去if里判断,实现频率表里每个频率逐个扫描
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表