找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2285|回复: 0
收起左侧

利用定时器产生乐曲 唱祝你平安 带proteus仿真及源码

[复制链接]
ID:137190 发表于 2016-10-10 13:08 | 显示全部楼层 |阅读模式
利用51单片机定时器产生乐曲的proteus仿真,下面是原理图
0.png 0.png

单片机利用定时器唱祝你平安仿真工程文件及所有完整程序等资料下载地址:
http://www.51hei.com/bbs/dpj-56298-1.html

源程序:
  1. /********************************************************************
  2.                             天马电子  
  3. *********************************************************************/
  4. #include<reg52.h>                 //库文件
  5. #define uchar unsigned char//宏定义无符号字符型
  6. #define uint unsigned int  //宏定义无符号整型
  7. /********************************************************************
  8.                             初始定义
  9. *********************************************************************/
  10. uchar Count;
  11. sbit _Speak =P3^7 ; //讯响器控制脚
  12. /********************************************************************
  13.                             歌曲字根码
  14. *********************************************************************/
  15. unsigned char code SONG[] ={ //祝你平安
  16. 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
  17. 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
  18. 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
  19. 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
  20. 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
  21. 0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
  22. 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
  23. 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
  24. 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
  25. 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
  26. 0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
  27. 0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
  28. 0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
  29. 0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,
  30. //路边的野华不要采
  31. 0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C,
  32. 0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20,
  33. 0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,
  34. 0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
  35. 0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
  36. 0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,
  37. 0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20,
  38. 0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F,
  39. 0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,
  40. 0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,
  41. 0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,
  42. 0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,};
  43. /********************************************************************
  44.                             定时中断服务函数
  45. *********************************************************************/
  46. void Time0_Init()
  47. {
  48.         TMOD = 0x01;
  49.         IE = 0x82;
  50.         TH0 = 0xD8;
  51.         TL0 = 0xEF; //12MZ晶振,10ms
  52. }
  53. /*********************************************************************/
  54. void Time0_Int() interrupt 1
  55. {
  56.         TH0 = 0xD8;
  57.         TL0 = 0xEF;                     
  58.         Count++; //长度加1
  59. }
  60. /*********************************************************************/
  61. void Delay_xMs(unsigned int x) //1MS 延时子程序
  62. {
  63.         unsigned int i,j;
  64.         for( i =0;i < x;i++ )
  65.         {
  66.                 for( j =0;j<3;j++ );
  67.         }
  68. }
  69. /*********************************************************************/
  70. void Play_Song(unsigned char i) //:歌曲播放子程序i 为播放哪一段曲目
  71. {
  72.         unsigned char Temp1,Temp2;
  73.         unsigned int Addr;
  74.         Count = 0; //中断计数器清0
  75.         Addr = i * 217;
  76. while(1)
  77.         {
  78.                 Temp1 = SONG[Addr++];
  79.                 if ( Temp1 == 0xFF ) //休止符
  80.                         {
  81.                                 TR0 = 0; Delay_xMs(100);
  82.                         }
  83.         else if ( Temp1 == 0x00 ) //歌曲结束符
  84.                 {
  85.                         return;
  86.                 }
  87. else
  88. {
  89.         Temp2 = SONG[Addr++];
  90.         TR0 = 1;
  91.         while(1)
  92.         {
  93.         _Speak = ~_Speak;
  94.         Delay_xMs(Temp1);
  95.         if ( Temp2 == Count )
  96.                 {
  97.                         Count = 0;
  98.                         break;
  99.                 }
  100.         }
  101. }
  102. }
  103. }
  104. /********************************************************************
  105.                             主函数
  106. *********************************************************************/
  107. void main() //主程序
  108. {
  109.         Time0_Init(); //定时器0 中断初始化
  110.         while(1)
  111.         {
  112.                 Play_Song(0);
  113.         } //播放
  114. }

  115. /********************************************************************
  116.                               结束
  117. *********************************************************************/


复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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