找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5637|回复: 6
收起左侧

单片机lcd1602音乐播放器 仿真 源码

[复制链接]
ID:160871 发表于 2017-1-10 23:30 | 显示全部楼层 |阅读模式
51单片机做的lcd1602音乐播放器原理图:
0.png
单片机源程序:

  1. #include<reg51.h>

  2. #define        uint unsigned int
  3. #define uchar unsigned char      
  4. /*------------------------------------------------
  5.                  硬件端口定义
  6. ------------------------------------------------*/
  7. sbit SPK=P2^0;  //定义音乐输出端口
  8. sbit key1=P3^2; //定义按键 用于 暂停
  9. sbit key2=P3^3; //定义按键 用于 切换

  10. sbit rs=P2^1;            
  11. sbit rw=P2^2;            
  12. sbit ep=P2^3;

  13. void delay1(uint z)
  14. {
  15.   uint x,y;
  16.   for(x=z;x>0;x--)
  17.   for(y=110;y>0;y--);
  18. }


  19. void write_com(uchar com)
  20. {
  21. rs=0;
  22. rw=0;
  23. ep=0;
  24. P0=com;
  25. delay1(2);
  26. ep=1;
  27. delay1(2);
  28. ep=0;
  29. delay1(2);
  30. }

  31. void write_dat(uchar dat)
  32. {
  33. rs=1;
  34. rw=0;
  35. ep=0;
  36. P0=dat;
  37. delay1(2);
  38. ep=1;
  39. delay1(2);
  40. ep=0;
  41. delay1(2);
  42. }

  43. void write_zfc(uchar *p)
  44. {
  45.   while(*p!=0)
  46.   write_dat(*p++);
  47. }

  48. void init_1602()
  49. {
  50. write_com(0x38);
  51. write_com(0x01);
  52. write_com(0x06);
  53. write_com(0x0c);
  54. }










  55. unsigned char W=0,T;        //用于选择音乐

  56. unsigned char Timer0_H,Timer0_L,Time;


  57. void delay5ms(void)   //误差 0us
  58. {
  59.     unsigned char a,b;
  60.     for(b=185;b>0;b--)
  61.         for(a=12;a>0;a--);
  62. }


  63. void delay500ms(void)   //误差 0us
  64. {
  65.     unsigned char a,b,c;
  66.     for(c=205;c>0;c--)
  67.         for(b=116;b>0;b--)
  68.             for(a=9;a>0;a--);
  69. }


  70.                          //世上只有妈妈好 数据表        音谱,高中低音,音长
  71. code unsigned char MUSIC[102]={       6,2,3,      5,2,1,      3,2,2,    5,2,2,    1,3,2,    6,2,1,    5,2,1,
  72.                                       6,2,4,      3,2,2,      5,2,1,    6,2,1,           5,2,2,         3,2,2,           1,2,1,
  73.                                       6,1,1,      5,2,1,      3,2,1,         2,2,4,           2,2,3,         3,2,1,    5,2,2,
  74.                                       5,2,1,      6,2,1,      3,2,2,         2,2,2,    1,2,4,         5,2,3,           3,2,1,
  75.                                       2,2,1,      1,2,1,      6,1,1,         1,2,1,           5,1,6,         0,0,0
  76.                                       };


  77.                                                 //送别 数据表        音谱,高中低音,音长
  78. code unsigned char MUSIC1[174]={        5,2,2,                3,2,1,                5,2,1,                1,3,4,       
  79.                                                                         6,2,2,                1,3,2,                5,2,4,
  80.                                                                         5,2,2,                1,2,1,                2,2,1,                3,2,2,                2,2,1,                1,2,1,
  81.                                                                         2,2,8,
  82.                                                                         5,2,2,                3,2,1,                5,2,1,                1,3,3,                7,2,1,
  83.                                                                         6,2,2,                1,3,2,                5,2,4,
  84.                                                                         5,2,2,                2,2,1,                3,2,1,                4,2,3,                7,1,1,
  85.                                                                         1,2,8,
  86.                                                                         6,2,2,                1,3,2,                1,3,4,
  87.                                                                         7,2,2,                6,2,1,                7,2,1,                1,3,4,
  88.                                                                         6,2,1,                7,2,1,                1,3,1,                6,2,1,                6,2,1,                5,2,1,                3,2,1,                1,2,1,
  89.                                                                         2,2,8,
  90.                                                                         5,2,2,                3,2,1,                5,2,1,                1,3,3,                7,2,1,
  91.                                                                         6,2,2,                1,3,2,                5,2,4,
  92.                                                                         5,2,2,                2,2,1,                3,2,1,                4,2,3,                7,1,1,
  93.                                                                         1,2,8
  94.                                                                 };


  95.                                                 //新年好 数据表        音谱,高中低音,音长
  96. code unsigned char MUSIC2[90]={                1,2,1,                1,2,1,                1,2,2,                5,1,2,
  97.                                                                         3,2,1,                3,2,1,                3,2,2,                1,2,2,
  98.                                                                         1,2,1,                3,2,1,                5,2,2,                5,2,2,
  99.                                                                         4,2,1,                3,2,1,                2,2,4,
  100.                                                                         2,2,1,                3,2,1,                4,2,2,                4,2,2,
  101.                                                                         3,2,1,                2,2,1,                3,2,2,                1,2,2,
  102.                                                                         1,2,1,                3,2,1,                2,2,2,                5,1,2,
  103.                                                                         7,1,1,                2,2,1,                1,2,4
  104.                                                                 };


  105.                                                 //童年 数据表        音谱,高中低音,音长
  106. code unsigned char MUSIC3[423]={        5,1,1,                5,1,1,                3,1,1,                5,1,2,                3,1,1,                5,1,2,
  107.                                                                         6,1,1,                6,1,1,                1,2,1,                6,1,2,                6,1,1,                1,2,2,
  108.                                                                         2,2,1,                2,2,1,                3,2,1,                2,2,2,                5,1,1,                6,1,1,                5,1,1,
  109.                                                                         1,2,1,                1,2,1,                5,1,1,                1,2,1,                1,2,1,                1,2,2,                1,2,1,
  110.                                                                         1,2,1,                5,1,2,                1,2,1,                6,1,1,                5,1,1,                3,1,1,                2,1,1,
  111.                                                                         1,1,2,                3,1,1,                5,1,1,                5,1,2,                5,1,1,                3,1,1,
  112.                                                                         6,1,1,                6,1,1,                1,2,1,                6,1,1,                6,1,1,                6,1,1,                6,1,1,                5,1,1,
  113.                                                                         1,2,2,                1,2,1,                1,2,1,                1,2,1,                6,1,1,                1,2,1,                6,1,1,
  114.                                                                         5,1,2,                0,2,1,                3,1,1,                6,1,1,                1,2,1,                6,1,1,                5,1,1,
  115.                                                                         3,1,1,                2,1,1,                3,1,1,                5,1,1,                5,1,2,                5,1,1,                3,1,1,
  116.                                                                         6,1,1,                6,1,1,                1,2,1,                6,1,1,                6,1,1,                6,1,1,                6,1,1,                5,1,1,
  117.                                                                         1,2,2,                1,2,1,                1,2,1,                1,2,1,                6,1,1,                6,1,1,                1,2,1,
  118.                                                                         2,2,2,                0,2,1,                5,1,1,                2,2,1,                5,2,1,                2,2,2,
  119.                                                                         5,2,1,                5,2,2,                5,2,1,                5,2,1,                5,2,1,                3,2,1,                2,2,1,
  120.                                                                         1,2,1,                1,2,2,                6,1,1,                6,1,1,                1,2,1,                6,1,1,                1,2,1,
  121.                                                                         2,2,1,                2,2,1,                2,2,1,                2,2,1,                2,2,1,                1,2,1,                3,2,1,                2,2,1,
  122.                                                                         2,2,8,
  123.                                                                         3,2,1,                3,2,2,                3,2,1,                3,2,2,                2,2,2,
  124.                                                                         1,2,1,                1,2,2,                1,2,1,                2,2,1,                1,2,1,                6,1,1,                5,1,1,
  125.                                                                         5,1,1,                5,1,2,                5,1,1,                6,1,1,                5,1,1,                2,2,1,                3,2,1,
  126.                                                                         1,2,8,
  127.                                                                         1,2,1,                5,1,2,                1,2,1,                6,1,1,                5,1,1,                3,1,1,                2,1,1,
  128.                                                                         1,2,6,                0,2,2
  129.                                                           };


  130.                          // 音阶频率表 高八位
  131. code unsigned char FREQH[]={
  132.                                 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
  133.                                 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
  134.                                 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
  135.                                 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
  136.                                } ;
  137.                          // 音阶频率表 低八位
  138. code unsigned char FREQL[]={
  139.                                  0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
  140.                                  0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
  141.                                  0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
  142.                                  0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
  143.                                 };
  144. /*------------------------------------------------
  145. uS延时函数,含有输入参数 unsigned char t,无返回值
  146. unsigned char 是定义无符号字符变量,其值的范围是
  147. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  148. 长度如下 T=tx2+5 uS
  149. ------------------------------------------------*/
  150. void DelayUs2x(unsigned char t)
  151. {   
  152.         while(--t);
  153. }
  154. /*------------------------------------------------
  155. mS延时函数,含有输入参数 unsigned char t,无返回值
  156. unsigned char 是定义无符号字符变量,其值的范围是
  157. 0~255 这里使用晶振12M,精确延时请使用汇编
  158. ------------------------------------------------*/
  159. void DelayMs(unsigned char t)
  160. {   
  161.         while(t--)
  162.     {
  163.              //大致延时1mS
  164.                 DelayUs2x(245);
  165.                 DelayUs2x(245);
  166.     }
  167. }
  168. /*------------------------------------------------
  169.                 节拍延时函数
  170. 各调1/4节拍时间:
  171. 调4/4  125ms
  172. 调2/4  250ms
  173. 调3/4  187ms
  174. ------------------------------------------------*/
  175. void delay(uchar t)
  176. {
  177.     uchar i;
  178.         for(i=0;i<t;i++)
  179.             DelayMs(250);
  180.     TR0=0;
  181. }
  182. /*------------------------------------------------
  183.                定时器0中断
  184. ------------------------------------------------*/
  185. void TIM0_ISR() interrupt 1
  186. {
  187.         TR0=0;      
  188.         SPK=!SPK;
  189.         TH0=Timer0_H;
  190.         TL0=Timer0_L;
  191.         TR0=1;
  192. }
  193. /*------------------------------------------------
  194.                 歌曲处理函数
  195. ------------------------------------------------*/
  196. void Song()
  197. {
  198.         TH0=Timer0_H;//赋值定时器时间,决定频率
  199.         TL0=Timer0_L;
  200.         TR0=1;       //打开定时器
  201.         delay(Time); //延时所需要的节拍                     
  202. }
  203. /*------------------------------------------------
  204.                 主函数
  205. ------------------------------------------------*/
  206. void led(unsigned char a);

  207. void main(void)
  208. {
  209.         unsigned int i;
  210.         unsigned char k;
  211.         TMOD|=0x01; //置定时器0工作方式1
  212.         EA=1;       //打开全局中断
  213.         ET0=1;      //打开 定时器0 中断

  214.         EX0=1;                //打开 外部中断0 中断
  215.         IT0=1;                //设置为下降沿中断

  216.         EX1=1;                //打开 外部中断1 中断
  217.         IT1=1;                //设置为下降沿中断
  218.         PX1=1;                //设置 外部中断1 为高优先级
  219.         init_1602();
  220.        
  221.         while(1)
  222.     {  
  223.                 //i=0;
  224.                
  225.                 if(W==0)
  226.                 {  
  227.                         T=W;
  228.                         write_com(0x81);
  229.                         write_zfc("shishangziyou");
  230.                         write_com(0xc4);
  231.                         write_zfc("mamahao");
  232.                 for(i=0;i<100;i=i+3)
  233.                     {         //音乐数组长度 ,唱完从头再来
  234.                                 led(MUSIC[i]);
  235.                 
  236.                     k=MUSIC[i]+7*MUSIC[i+1]-1;//去音符振荡频率所需数据
  237.                     Timer0_H=FREQH[k];
  238.                     Timer0_L=FREQL[k];
  239.                     Time=MUSIC[i+2];          //节拍时长
  240.                    // i=i+3;
  241.                     Song();
  242.                                 if(T!=W)
  243.                                         break;
  244.                 }
  245.                 }
  246.                

  247.                 if(W==1)
  248.                 {  
  249.                         T=W;
  250.                         write_com(0x01);
  251.                         write_com(0x80);
  252.                         write_zfc("   songbie   ");
  253.                 for(i=0;i<174;i=i+3)
  254.                     {         //音乐数组长度 ,唱完从头再来
  255.                                 led(MUSIC1[i]);
  256.                 
  257.                     k=MUSIC1[i]+7*MUSIC1[i+1]-1;//去音符振荡频率所需数据
  258.                     Timer0_H=FREQH[k];
  259.                     Timer0_L=FREQL[k];
  260.                     Time=MUSIC1[i+2];          //节拍时长
  261.                    // i=i+3;
  262.                     Song();
  263.                                 if(T!=W)
  264.                                         break;
  265.                 }
  266.                 }


  267.                 if(W==2)
  268.                 {  
  269.                         T=W;
  270.                         write_com(0x80);
  271.                         write_zfc("   xinnianhao ");
  272.                 for(i=0;i<90;i=i+3)
  273.                     {         //音乐数组长度 ,唱完从头再来
  274.                                 led(MUSIC2[i]);
  275.                 
  276.                     k=MUSIC2[i]+7*MUSIC2[i+1]-1;//去音符振荡频率所需数据
  277.                     Timer0_H=FREQH[k];
  278.                     Timer0_L=FREQL[k];
  279.                     Time=MUSIC2[i+2];          //节拍时长
  280.                    // i=i+3;
  281.                     Song();
  282.                                 if(T!=W)
  283.                                         break;
  284.                 }
  285.                 }

  286.                
  287.                 if(W==3)
  288.                 {  
  289.                         T=W;
  290.                         write_com(0x80);
  291.                         write_zfc("   tongnian  ");
  292.                 for(i=0;i<423;i=i+3)
  293.                     {         //音乐数组长度 ,唱完从头再来
  294.                                 led(MUSIC3[i]);
  295.                 
  296.                     k=MUSIC3[i]+7*MUSIC3[i+1]-1;//去音符振荡频率所需数据
  297.                     Timer0_H=FREQH[k];
  298.                     Timer0_L=FREQL[k];
  299.                     Time=MUSIC3[i+2];          //节拍时长
  300.                    // i=i+3;
  301.                     Song();
  302.                                 if(T!=W)
  303.                                         break;
  304.                 }
  305.                 }

  306.      }
  307. }


  308. // 频谱函数
  309. void led(unsigned char a)       
  310. {
  311.         switch(a)
  312.         {
  313.                 case 0:P1=0xff;break;
  314.                 case 1:P1=0x7f;break;
  315.                 case 2:P1=0x7e;break;
  316.                 case 3:P1=0x7c;break;
  317.                 case 4:P1=0x78;break;
  318.                 case 5:P1=0x70;break;
  319.                 case 6:P1=0x60;break;
  320.                 case 7:P1=0x40;break;
  321.                 case 8:P1=0x00;break;
  322.         }

  323. }


  324. //        外部中断0 中断服务程序        用于暂停
  325. void zhongduan0() interrupt 0
  326. {   
  327.     delay5ms();        //按键去抖
  328.         if(!key1)
  329.         {
  330.                 while(!key1);        //松手检测
  331.                 while(key1&&T==W);        //检测按键是否按下
  332.                 delay5ms();        //按键去抖
  333.                 while(key1&&T==W);        //检测按键是否按下
  334.                 while(!key1&&T==W);        //松手检测
  335.         }
  336. }


  337. //        外部中断1 中断服务程序
  338. void zhongduan1() interrupt 2
  339. {   
  340.     delay5ms();        //按键去抖
  341.         if(!key2)
  342.         {
  343.                 if(W==3)
  344.                         W=0;
  345.                 else
  346.                         W++;
  347.                 while(!key2);        //松手检测
  348.                 delay500ms();
  349.                
  350.         }
  351. }
复制代码


0.png


所有资料下载:
1602音乐播放器.rar (62.63 KB, 下载次数: 59)
回复

使用道具 举报

ID:160895 发表于 2017-1-11 10:24 | 显示全部楼层
哈哈哈,很有意思,多来几首吧!
回复

使用道具 举报

ID:99130 发表于 2017-1-26 21:02 | 显示全部楼层
我还以为是插卡的,,,
回复

使用道具 举报

ID:244993 发表于 2017-11-24 17:12 | 显示全部楼层
这个程序的话怎么连lcd1602到开发板上呢
回复

使用道具 举报

ID:230826 发表于 2017-11-24 18:03 | 显示全部楼层
多来几首!
回复

使用道具 举报

ID:250411 发表于 2017-12-5 16:36 | 显示全部楼层
楼主有PCB的原理图吗
回复

使用道具 举报

ID:258732 发表于 2017-12-7 19:41 | 显示全部楼层
在哪修改音乐呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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