找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5588|回复: 5
收起左侧

AT89C52单片机Proteus仿真音乐播放器操作步骤[原创]

[复制链接]
ID:846386 发表于 2020-12-2 14:32 | 显示全部楼层 |阅读模式
很多新手不知道怎么使用Proteus仿真器做一个音乐播放器,功能虽然简单,对于新入门的人来说是无从下手,我在这里把简单的过程及源文件发上来,供入门的朋友学习。

操作步骤:
1.创建一个新的工程
2.看图操作添加元件
仿真器操作.png

3.操作完,点连线,把接线两端连接起来,注意,自己设定的输入P脚,我这里采用的是P2^5
连线.png

4.右键选择接地
右键选择.png

5.完成的效果
仿真音乐播放器.png 6.使用方法,双击芯片元件,在弹出窗体中把编译hex文件选择进去,点确定
选择hex.png
7.最后可以带上耳机,点击左下角的播放试听了。
播放停止.png

仿真图下载:
音乐仿真播放器.zip (12.96 KB, 下载次数: 47)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2020-12-2 17:13 | 显示全部楼层
下载后没有源代码,楼主能分享一下吗?
回复

使用道具 举报

ID:846386 发表于 2020-12-2 22:11 | 显示全部楼层
51单片机蜂鸣器演奏《学猫叫》
  1. #include <REGX52.H>
  2. #define RldTmr(fr) 65536 - (11059200 /12) / (fr << 1)
  3. #define FuDian(n) (n << 1) / 3    //附点n分音符的换算

  4. typedef unsigned char UCHAR;
  5. typedef unsigned int UINT;
  6. typedef unsigned long ULONG;

  7. sbit BUZZ = P2^5;

  8. UINT code noteFreq[] = {    //中音 1-7 和高音 1-7对应的频率列表
  9.     523, 587, 659, 698, 784, 880, 988,
  10.     1047, 1175, 1319, 1397, 1568, 1760, 1976 ,2,494,
  11. };
  12. UINT code tmrRld[] = {      //中音 1-7 和高音 1-7对应的定时器重载值
  13.     RldTmr(523), RldTmr(587), RldTmr(659), RldTmr(698), RldTmr(784), RldTmr(880), RldTmr(988),
  14.     RldTmr(1047), RldTmr(1175), RldTmr(1319), RldTmr(1397), RldTmr(1568), RldTmr(1760), RldTmr(1976),
  15. };
  16. UCHAR code musicNote[] = {      //音名
  17.     15,15,15,8,9,
  18.         10,5,8,10,10,15,9,8,
  19.         9,12,12,12,12,15,8,7,
  20.         8,8,8,8,8,15,7,8,
  21.         7,8,7,6,5,15,5,5,
  22.         6,6,6,6,6,15,5,3,
  23.         5,3,5,9,8,15,5,
  24.         10,10,10,11,12,8,8,9,10,
  25. //         10,15,
  26. //         0,5,5,5,5,5,
  27. //         6,5,3,5,15,16,1,1,
  28. //         3,3,3,4,3,1,1,2,
  29. //         3,0,3,2,1,
  30. //         1,1,1,0,1,1,1,
  31. };
  32. UCHAR code noteDuration[] = {       //音名对应的时值,4表示4分音符,8表示8分音符,16表示16分音符
  33.         4,4,4,8,8,
  34.         8,8,8,8,8,8,8,8,
  35.         8,8,8,8,8,8,8,8,
  36.         8,8,8,8,8,8,8,8,
  37.         8,8,8,8,8,8,8,8,
  38.         8,8,8,8,8,8,8,8,
  39.         8,8,8,8,4,8,8,
  40.         8,8,8,8,8,8,16,32,32,
  41. //         FuDian(4),4,
  42. //         4,8,8,4,8,8,
  43. //         8,8,8,8,8,8,8,8,
  44. //         4,16,32,32,8,8,8,8,
  45. //         2,8,8,8,8,
  46. //         8,4,8,8,8,8,8,
  47.        
  48.        
  49. };
  50. bit enable = 1, tmrFlg = 0;
  51. UCHAR T0RH = 0XFF, T0RL = 0X00;

  52. void Delay(UINT n);
  53. void PlayMusic(UCHAR speed);    //固定标准为4分音符的速度:例如speed = 108 表示一分钟扫过108个4分音符

  54. void main() {
  55.     EA = 1;
  56.     TMOD = 0X01;
  57.     TH0 = T0RH;
  58.     TL0 = T0RL;
  59.     ET0 = 1;
  60.     TR0 = 1;
  61.     while (1) {
  62.         PlayMusic(55);
  63.       Delay(40000u);
  64.     }
  65. }

  66. void Delay(UINT n) {
  67.     UINT i;
  68.     for (i = 0; i < n; i++) ;
  69. }

  70. void PlayMusic(UCHAR speed) {
  71.     UCHAR i;
  72.     UCHAR idx;
  73.     UINT cnt = 0;
  74.     UINT durationCnt = 0;        //当前音符的时值对应的定时器计数
  75.     UINT soundCnt = 0;                //当前音符的发声时值对应的计数值
  76.     for (i = 0; i < sizeof (musicNote); ) {
  77.         while (!tmrFlg) ;
  78.         tmrFlg = 0;
  79.         if (cnt == 0) {
  80.             idx = musicNote[i] - 1;
  81.             T0RH = tmrRld[idx] >> 8;
  82.             T0RL = tmrRld[idx];
  83.             durationCnt = (ULONG)240 * (ULONG)noteFreq[idx] / ((ULONG)noteDuration[i] * (ULONG)speed);
  84.             soundCnt = durationCnt - (durationCnt >> 2);        //当前音符时值的前3/4发声,后1/4静音
  85.             enable = 1;
  86.             cnt++;
  87.         }
  88.         else {
  89.             if (cnt == durationCnt) {
  90.                 cnt = 0;
  91.                 i++;
  92.             }
  93.             else {
  94.                 cnt++;
  95.                 if (cnt == soundCnt) {
  96.                     enable = 0;
  97.                 }
  98.             }
  99.         }
  100.     }
  101. }

  102. void InterruptTmr0() interrupt 1 {
  103.     TH0 = T0RH;
  104.     TL0 = T0RL;
  105.     tmrFlg = 1;
  106.     if (enable)
  107.         BUZZ = ~BUZZ;
  108.     else
  109.         BUZZ = 1;
  110. }
复制代码
回复

使用道具 举报

ID:846386 发表于 2020-12-2 22:11 | 显示全部楼层
51hei团团 发表于 2020-12-2 17:13
下载后没有源代码,楼主能分享一下吗?

已经发布
回复

使用道具 举报

ID:846334 发表于 2020-12-24 16:57 | 显示全部楼层
要做实物的话需要些什么元件呢
回复

使用道具 举报

ID:846386 发表于 2020-12-29 23:16 | 显示全部楼层
如鲸向海 发表于 2020-12-24 16:57
要做实物的话需要些什么元件呢

方案一:51开发板一套,就可以直接用了
方案二:最小51系统一个+蜂鸣器一只+写程序USB一个(有的最小系统自带USB烧写模块)
方案三:自己有元件可以自己足个焊接,然后进行烧写(比较专业,小白不建议)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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