找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2319|回复: 1
收起左侧

51单片机按键电子琴Proteus仿真代码分享 带DS1302万年历LCD1602数码管显示

[复制链接]
ID:777557 发表于 2022-3-25 16:36 | 显示全部楼层 |阅读模式
源代码+仿真音乐:两只老虎,生日快乐
stc15f20k60s2+按键+数码管+蜂鸣器
按k4开始播放  按k1选择功能

制作出来的实物图如下:
51hei图片20220325163358.jpg

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "ds1302.h"
  4. #include "lcd1602.h"
  5. #include "music.h"
  6. #include "shumaguan.h"

  7. //74HC595-数码管
  8. sbit SDA1=P3^6;//串行数据输入,对应595的14脚SER
  9. sbit SCL1=P3^5;//移位寄存器时钟输入,对应595的11脚SCK
  10. sbit SCL2=P3^4;//存储寄存器时钟输入,对应595的12脚RCK
  11. sbit W1=P3^7;


  12. //发音按键
  13. sbit k1=P1^0;  //哆1 啦2 咪3 发4 嗦5 啦6 西7 哆
  14. sbit k2=P1^1;  //哆1 啦2 咪3 发4 嗦5 啦6 西7 哆
  15. sbit k3=P1^2;  //哆1 啦2 咪3 发4 嗦5 啦6 西7 哆
  16. sbit k4=P1^3;  //哆1 啦2 咪3 发4 嗦5 啦6 西7 哆
  17. sbit k5=P1^4;  //哆1 啦2 咪3 发4 嗦5 啦6 西7 哆
  18. sbit k6=P1^5;  //哆1 啦2 咪3 发4 嗦5 啦6 西7 哆
  19. sbit k7=P1^6;  //哆1 啦2 咪3 发4 嗦5 啦6 西7 哆

  20. //LED模块
  21. sbit D1=P2^3;  //播放音乐模式
  22. sbit D2=P2^4;  //弹奏模式

  23. //模式切换与音调选择按键
  24. sbit k8=P3^2;  //功能切换键
  25. sbit k9=P3^1;  //低音
  26. sbit k10=P3^0; //中音
  27. sbit k11=P3^3; //高音

  28. sbit beep=P1^7;//蜂鸣器接口

  29. uchar code table1[]={   //共阴极数码管
  30.                                                 0x3F,/*0*/
  31.                                                 0x06,/*1*/
  32.                                                 0x5B,/*2*/
  33.                                                 0x4F,/*3*/
  34.                                                 0x66,/*4*/
  35.                                                 0x6D,/*5*/
  36.                                                 0x7D,/*6*/
  37.                                                 0x07,/*7*/
  38.                                                 0x7F,/*8*/
  39.                                                 0x6F,/*9*/
  40.                                                 0x37,/*N*///中音       
  41.                                                 0x38,/*L*///低音
  42.                                                 0x76,/*H*///高音
  43.                                                 0x79 /*E*/
  44.                                         };
  45. /////////////////////////////格式为: 频率常数, 节拍常数, 频率常数, 节拍常数///////////////////
  46. uchar code table2[]={        //音阶频率表 低八位         
  47.                                                 0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,//中音
  48.                                                 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,//低音的高8位
  49.                                                 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
  50.                         };
  51. uchar code table3[]={               
  52.                                                 0x8E,0xED,0x44,0x6B,0xB4,0xF4,0x2D,//中音
  53.                                                 0x21,0xDB,0x87,0xD7,0x68,0xE8,0x5B,//低音的低8位
  54.                                                 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
  55.                                         };

  56. //祝你生日快乐
  57. uchar code music_tab1[]=
  58. {
  59. 1, 1, 2, 1, 4, 3,                        //第一节
  60. 1, 1, 2, 1, 5, 4,                        //第二节
  61. 1, 1, 8, 6, 4, 3, 2,            //第三节
  62. 7, 7, 6, 4, 5, 4,                        //第四节
  63. };
  64. uchar code music_tab1a[]=
  65. {
  66. 2, 2, 4, 4, 4, 8,                        //第一节
  67. 2, 2, 4, 4, 4, 8,                        //第二节
  68. 2, 2, 4, 4, 4, 4, 4,        //第三节
  69. 2, 2, 4, 4, 4, 8,                        //第四节
  70. 0XFF
  71. };

  72. //两只老虎
  73. uchar code music_tab2[]=
  74. {
  75. 1, 2, 3, 1,                                //第一节
  76. 3, 2, 3, 1,                                //第二节
  77. 3, 4, 5,                                        //第三节
  78. 3, 4, 5,                                        //第四节
  79. 5, 6, 5, 4, 3, 1,        //第五节
  80. 5, 6, 5, 4, 3, 1,        //第六节
  81. 1, 8, 1,                                        //第七节
  82. 1, 8, 1                                         //第八节               
  83. };

  84. uchar code music_tab2a[]=
  85. {
  86. 4, 4, 4, 4,                                //第一节
  87. 4, 4, 4, 4,                                //第二节
  88. 4, 4, 8,                                        //第三节
  89. 4, 4, 8,                                        //第四节
  90. 3, 1, 3, 1, 4, 4,        //第五节
  91. 3, 1, 3, 1, 4, 4,        //第六节
  92. 4, 4, 8,                                        //第七节
  93. 4, 4, 8,                                        //第八节
  94. 0Xff                                                  //结束
  95. };                       

  96. //世上只有妈妈好
  97. uchar code music_tab3[]=
  98. {
  99. 6, 5, 6, 5, 1, 6, 5,
  100. 6, 3, 5, 6, 5, 3, 1,
  101. 6, 5, 3, 2, 2, 3, 5,
  102. 5, 6, 3, 2, 1, 5, 3,
  103. 2, 1, 6, 1, 5, 0
  104. };
  105. uchar code music_tab3a[]=
  106. {
  107. 6, 2, 4, 4, 4, 2, 2,
  108. 8, 4, 2, 2, 4, 4, 2,
  109. 2, 2, 2, 8, 6, 2, 4,
  110. 2, 2, 4, 4, 8, 6, 2,
  111. 2, 2, 2, 2, 12,0,0XFF
  112. };               

  113. //Fly bird
  114. uchar code music_tab4[]={  //音调
  115.                                                 1,2,3,1,      
  116.                                                 1,2,3,1,      
  117.                                                 3,4,5,   
  118.                                                 3,4,5,     
  119.                                                 5,6,5,4,3,1,   
  120.                                                 5,6,5,4,3,1,   
  121.                                                 1,12,1,     
  122.                                                 1,12,1
  123. };
  124. uchar code music_tab4a[]={        //节拍
  125.                                                 4,4,4,4,   
  126.                                                 4,4,4,4,     
  127.                                                 4,4,8,   
  128.                                                 4,4,8,     
  129.                                                 2,1,2,1,4,4,   
  130.                                                 2,1,2,1,4,4,   
  131.                                                 4,4,6,      
  132.                                                 4,4,6,0xff
  133.                                         };


  134. //铃儿响叮当
  135. uchar code music_tab5[]=
  136. {
  137. 3, 3, 3, 3,        3, 3,                                    //第一节
  138. 3, 4, 2, 3, 3,                                      //第二节
  139. 4, 4, 4, 4, 4, 3, 3, 3, 3,        //第三节
  140. 3, 2, 3, 2, 3, 4,                                          //第四节
  141.        
  142. 3, 3, 3, 3, 3, 3,                  //第五节
  143. 3, 4, 2, 3, 3,              //第六节
  144. 4, 4, 4, 4, 4, 3, 3, 3, 3,        //第七节
  145. 3, 2, 3, 2, 3, 4,        0xff                        //第八节
  146. };
  147. uchar code music_tab5a[]=
  148. {
  149. 2, 2, 4, 2,        2, 4,                                    //第一节
  150. 2, 2, 3, 1, 8,                                      //第二节
  151. 2, 2, 3, 1, 2, 2, 2, 1, 1,        //第三节
  152. 2, 2, 2, 2, 4, 4,                                          //第四节
  153. 2, 2, 4, 2, 2, 4,                  //第五节
  154. 2, 2, 3, 1, 8,              //第六节
  155. 2, 2, 3, 1, 2, 2, 2, 1, 1,        //第七节
  156. 2, 2, 2, 2, 6,                                            //第八节
  157. 0XFF                                                            //结束
  158. };
  159. //DS1302相关
  160. uchar  times[9];
  161. uchar  date[11];
  162.                                        
  163. uchar i=0;
  164. uchar key,aa=0;
  165. uchar bb,cc;
  166. bit flag=0;

  167. uchar music=0;//第几首音乐

  168. //初始化子函数
  169. void init()
  170. {
  171.         beep=0;           //蜂鸣器关闭
  172.         D1=0;           //开始演奏音乐
  173.         D2=1;           //关闭弹奏功能
  174.         EA=1;      //开总中断
  175.         TCON=0x05; //外部中断0,1设置为边沿触发
  176.         EX0=1;     //开外部中断0
  177.         EX1=1;                 //开外部中断1
  178.         ET0=1;           //定时器0的中断打开
  179.         ET1=1;           //定时器1的中断打开
  180.         TMOD=0x11; //定时器0,1工作在定时状态,均为方式1
  181. }


  182. //播放音乐子函数
  183. void display_music()
  184. {       
  185.         if(music==1){
  186.                 TH0=table2[music_tab1[i]-1];        //取频率常数 和 节拍常数  
  187.                 TL0=table3[music_tab1[i]-1];
  188.                 while(flag==0)
  189.                 {       
  190.                         gotoxy(2,1);
  191.                         LCD_display("Happy birthday");
  192.                         if(music_tab1a[i]!=0xff)
  193.                         {
  194.                                 TR0=1;
  195.                                 delay(57*music_tab1a[i]);
  196.                                 i++;
  197.                                 if(music!=1){
  198.                                         TR0=0;
  199.                                         break;
  200.                                 }
  201.                         }
  202.         //                if(i==32) i=0;
  203.                         else{
  204.                                 i=0;
  205.                                 TR0=0;
  206. //                                flag=1;
  207.                                 music++;
  208.                                 break;
  209.                         }       
  210.                        
  211.                        
  212.                 }
  213.         }
  214.         else if(music==2){
  215.                 TH0=table2[music_tab2[i]-1];        //取频率常数 和 节拍常数  
  216.                 TL0=table3[music_tab2[i]-1];
  217.                 while(flag==0)
  218.                 {       
  219.                         gotoxy(2,1);
  220.                         LCD_display("Two tiggers");
  221.                         if(music_tab2a[i]!=0xff)
  222.                         {
  223.                                 TR0=1;
  224.                                 delay(57*music_tab2a[i]);
  225.                                 i++;
  226.                                 if(music!=2){
  227.                                         TR0=0;
  228.                                         break;
  229.                                 }
  230.                         }
  231.         //                if(i==32) i=0;
  232.                         else{
  233.                                 i=0;
  234.                                 TR0=0;
  235.                                 music++;
  236.                                 break;
  237.                         }       
  238.                 }
  239.         }
  240.        
  241.         else if(music==3){
  242.                 TH0=table2[music_tab3[i]-1];
  243.                 TL0=table3[music_tab3[i]-1];
  244.                 while(flag==0)
  245.                 {       
  246.                         gotoxy(2,1);
  247.                         LCD_display("Only mom good");
  248.                         if(music_tab3a[i]!=0xff)
  249.                         {
  250.                                 TR0=1;
  251.                                 delay(57*music_tab3a[i]);
  252.                                 i++;
  253.                                 if(music!=3){
  254.                                         TR0=0;
  255.                                         break;
  256.                                 }
  257.                         }
  258.                         else{
  259.                                 i=0;
  260.                                 TR0=0;
  261.                                 music++;
  262.                                 break;
  263.                         }       
  264.                 }
  265.         }
  266.        
  267.         else if(music==4){
  268.                 TH0=table2[music_tab4[i]-1];
  269.                 TL0=table3[music_tab4[i]-1];
  270.                 while(flag==0)
  271.                 {       
  272.                         gotoxy(2,1);
  273.                         LCD_display("Fly bird");
  274.                         if(music_tab4a[i]!=0xff)
  275.                         {
  276.                                 TR0=1;
  277.                                 delay(57*music_tab4a[i]);
  278.                                 i++;
  279.                                 if(music!=4){
  280.                                         TR0=0;
  281.                                         break;
  282.                                 }
  283.                         }
  284.                         else{
  285.                                 i=0;
  286.                                 TR0=0;
  287.                                 music++;
  288.                                 break;
  289.                         }       
  290.                 }
  291.         }
  292.        
  293.         else if(music==5){
  294.                 TH0=table2[music_tab5[i]-1];
  295.                 TL0=table3[music_tab5[i]-1];
  296.                 while(flag==0)
  297.                 {       
  298.                         gotoxy(2,1);
  299.                         LCD_display("Jingle bells");
  300.                         if(music_tab5a[i]!=0xff)
  301.                         {
  302.                                 TR0=1;
  303.                                 delay(57*music_tab5a[i]);
  304.                                 i++;
  305.                                 if(music!=5){
  306.                                         TR0=0;
  307.                                         break;
  308.                                 }
  309.                         }
  310.                         else{
  311.                                 i=0;
  312.                                 TR0=0;
  313.                                 music++;
  314.                                 break;
  315.                         }       
  316.                 }
  317.         }
  318. }
  319. //演奏模式子函数
  320. void display_play()
  321. {
  322.         TR0=0;
  323.         TR1=0;
  324.         yinjie();
  325.         in(table1[aa]);  //再传段码
  326.         out();
  327.         W1=0;;
  328.         delay(1);             //延迟时间2ms以内
  329.         W1=1;
  330.         if(aa!=13&&flag==1)
  331.         {       
  332.                 if(k1==0)
  333.                 {       
  334.                         TH1=table2[7*bb+cc];           //取频率常数 和 节拍常数  
  335.                         TL1=table3[7*bb+cc];
  336.                         TR1=1;       
  337.                         while(k1==0)
  338.                         {       
  339.                                 cc=0;
  340.                                 display1();
  341.                         }
  342.                 }
  343.                 if(k2==0)
  344.                 {       
  345.                         TH1=table2[7*bb+cc];          //取频率常数 和 节拍常数  
  346.                         TL1=table3[7*bb+cc];
  347.                         TR1=1;
  348.                         while(k2==0)
  349.                         {       
  350.                                 cc=1;
  351.                                 display1();
  352.                         }
  353.                 }       
  354.                 if(k3==0)
  355.                 {               
  356.                         TH1=table2[7*bb+cc];         //取频率常数 和 节拍常数  
  357.                         TL1=table3[7*bb+cc];
  358.                         TR1=1;
  359.                         while(k3==0)
  360.                         {       
  361.                                 cc=2;
  362.                                 display1();
  363.                         }
  364.                 }
  365.                 if(k4==0)
  366.                 {                                                          //取频率常数 和 节拍常数  
  367.                         TH1=table2[7*bb+cc];
  368.                         TL1=table3[7*bb+cc];
  369.                         TR1=1;
  370.                         while(k4==0)
  371.                         {       
  372.                                 cc=3;
  373.                                 display1();               
  374.                         }
  375.                 }
  376.                 if(k5==0)
  377.                 {       
  378.                         TH1=table2[7*bb+cc];        //取频率常数 和 节拍常数  
  379.                         TL1=table3[7*bb+cc];
  380.                         TR1=1;
  381.                         while(k5==0)
  382.                         {
  383.                                 cc=4;
  384.                                 display1();
  385.                         }
  386.                 }
  387.                 if(k6==0)
  388.                 {       
  389.                         TH1=table2[7*bb+cc];         //取频率常数 和 节拍常数  
  390.                         TL1=table3[7*bb+cc];
  391.                         TR1=1;
  392.                         while(k6==0)
  393.                         {
  394.                                 cc=5;
  395.                                 display1();                                                       
  396.                         }
  397.                 }
  398.                 if(k7==0)
  399.                 {               
  400.                         TH1=table2[7*bb+cc];          //取频率常数 和 节拍常数  
  401.                         TL1=table3[7*bb+cc];
  402.                         TR1=1;       
  403.                         while(k7==0)
  404.                         {
  405.                                 cc=6;
  406.                                 display1();       
  407.                         }
  408.                 }               
  409.         }
  410. }
  411. //主函数
  412. void main()
  413. {
  414.         init();          //初始化子函数
  415.         //init_1302(time_1302);
  416.         LCD_init();//LCD初始化
  417.        
  418.         times[8]='\0';//
  419.         date[10]='\0';
  420.         while(1)
  421.         {                       
  422.                 if(flag==0){
  423.                         if(music!=0){
  424.                                 LCD_write_command(0x01);//清屏显示
  425.                                 delay(50);
  426.                         }
  427.                         else{
  428.                                 gotoxy(1,1);
  429.                                 LCD_display("Plese push K4");
  430.                                 gotoxy(1,2);
  431.                                 LCD_display("to play music!");       
  432.                         }
  433.                         if(music!=0){
  434.                                         LCD_write_command(0x01);//清屏显示
  435.                                         delay(50);
  436.                         }
  437.                         display_music();        //演奏音乐
  438.                        
  439.                 }
  440.                        
  441.                 else{

  442.                         gotoxy(1,1);
  443.                         LCD_display("Date ");
  444.                         gotoxy(1,2);
  445.                         LCD_display("Time ");
  446.                        
  447.                         get_1302(time_1302);
  448.                         change();
  449.                         gotoxy(6,1);
  450.                         LCD_display(date);
  451.                         gotoxy(6,2);
  452.                         LCD_display(times);
  453.                        
  454.                         display_play();                        //弹奏音乐
  455.                 }
  456.         }
  457. }
  458. //外部0中断子函数
  459. void int0() interrupt 0
  460. {
  461.         if(k8==0)
  462.         {
  463.                 delay(5);
  464.                 while(k8==0);
  465.                 flag=~flag;
  466.                 D1=~D1;
  467.                 D2=~D2;
  468.         }               
  469. }

  470. //外部1中断子函数
  471. void int1() interrupt 2
  472. {
  473.         if(k11==0&&flag==0)
  474.         {
  475.                 delay(5);
  476.                 while(k11==0);
  477.                 TR0=0;
  478.                 i=0;
  479.                 music++;
  480.                 if(music>5)
  481.                 {
  482.                         music=0;
  483.                 }
  484.         }               
  485. }

  486. //定时器0中断子函数
  487. void t0() interrupt 1
  488. {       
  489.         TR0=0;
  490.         if(music==1){
  491.                 TH0=table2[music_tab1[i]-1];  //取频率常数 和 节拍常数  
  492.                 TL0=table3[music_tab1[i]-1];
  493.         }
  494.         else if(music==2){
  495.                 TH0=table2[music_tab2[i]-1];  //取频率常数 和 节拍常数  
  496.                 TL0=table3[music_tab2[i]-1];
  497.         }
  498.         else if(music==3){
  499.                 TH0=table2[music_tab3[i]-1];  //取频率常数 和 节拍常数  
  500.                 TL0=table3[music_tab3[i]-1];
  501.         }
  502.         else if(music==4){
  503.                 TH0=table2[music_tab4[i]-1];  //取频率常数 和 节拍常数  
  504.                 TL0=table3[music_tab4[i]-1];
  505.         }
  506.         else if(music==5){
  507.                 TH0=table2[music_tab5[i]-1];  //取频率常数 和 节拍常数  
  508.                 TL0=table3[music_tab5[i]-1];
  509.         }
  510.         beep=~beep;
  511.         TR0=1;
  512. }

  513. //定时器1中断子函数
  514. void t1() interrupt 3
  515. {       
  516.         TR1=0;
  517.         TH1=table2[7*bb+cc];        //取频率常数 和 节拍常数  
  518.        
  519. ……………………

  520. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

1.png

Keil代码与Proteus仿真下载:
电子琴最终版.7z (88.39 KB, 下载次数: 75)

评分

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

查看全部评分

回复

使用道具 举报

ID:1013351 发表于 2022-4-13 16:18 | 显示全部楼层
这个需要Proteus8.8才能打开
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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