找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15302|回复: 13
打印 上一主题 下一主题
收起左侧

激光电子竖琴的制作过程 含单片机程序,原理图,教程

  [复制链接]
跳转到指定楼层
楼主
一个非常漂亮的可弹奏激光电子竖琴,用手弹的时候遮挡住激光柱,就会发出相应的声音.包括制作过程,程序,原理,实物图,有需要的话可以参考一下


电路原理图:

激光竖琴制作教程:

单片机源程序如下:
  1. /*-----------------------------------------------
  2. 名称:电子琴
  3. 编写:Cgr
  4. 修改:无
  5. 内容:7个激光束控制7个音符7个LED显示,1个控制播放音乐,1个高中低音切换
  6.      
  7. ------------------------------------------------*/
  8. #include "reg52.h"
  9. #include "intrins.h"

  10. sbit SPK    = P3^4;
  11. sbit LED_L  = P3^7;
  12. sbit LED_M  = P3^6;
  13. sbit LED_H  = P3^5;
  14. sbit KEY    = P3^3;

  15. #define KEYDELAY 20
  16. #define KEY_PORT P2
  17. #define LED_PORT P1

  18. bit FT_1ms,FT_250ms;
  19. bit F_PlaySong,F_PlayTone,F_KeyDelay,F_Tone,F_KeyUp,F_Music_Ide;
  20. unsigned char Freq_H,Freq_L,SongLen,PlayIde,i;
  21. unsigned char KeyBuf,KeySure,KeyDelay_Cnt,Timer1_Cnt,KeyDelay_Cnt1;
  22. unsigned char k,Time,PortTemp;

  23.                          //世上只有妈妈好数据表
  24. code unsigned char MUSIC[]={6,2,6,     5,2,2,      3,2,4,    5,2,4,    1,3,4,    6,2,2,    5,2,2,
  25.                             6,2,8,      3,2,4,      5,2,2,    6,2,2,    5,2,4,   3,2,4,    1,2,2,
  26.                             6,1,2,      5,2,2,      3,2,2,    2,2,8,    2,2,6,   3,2,2,    5,2,4,
  27.                             5,2,2,      6,2,2,      3,2,4,    2,2,4,    1,2,8,   5,2,6,    3,2,2,
  28.                             2,2,2,      1,2,2,      6,1,2,   1,2,2,    5,1,12,   0,0,0
  29.                             };
  30. /***********************生日快乐**********************/
  31. code unsigned char MUSIC1[]={
  32.                                  5,1,2, 5,1,2, 6,1,4, 5,1,4, 1,2,4, 7,1,8,
  33.                                  5,1,2, 5,1,2, 6,1,4, 5,1,4, 2,2,4, 1,2,8,
  34.                                  5,1,2, 5,1,2, 5,2,4, 3,2,4, 1,2,4, 7,1,4,
  35.                                  6,1,8, 4,2,2, 4,2,2, 3,2,4, 1,2,4, 2,2,4,
  36.                                  1,2,12, 0,0,0};

  37.                          // 音阶频率表 高八位
  38. code unsigned char FREQH[]={
  39.                                 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
  40.                                 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
  41.                                 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
  42.                                 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
  43.                                } ;
  44.                          // 音阶频率表 低八位
  45. code unsigned char FREQL[]={
  46.                                  0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
  47.                                  0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
  48.                                  0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
  49.                                  0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
  50.                                 };

  51. void TimerInit(void)
  52. {   
  53.     TMOD = 0x11;
  54.     TH1  = (65536 - 1000) / 256;
  55.     TL1  = (65536 - 1000) % 256;
  56.     ET0  = 1;
  57.     ET1  = 1;
  58.     TR0 = 1;
  59.     TR1  = 1;
  60.     EA   = 1;
  61. }
  62. void ScanKey(void)
  63. {
  64.     if(F_KeyDelay)
  65.     {
  66.         KeyDelay_Cnt --;
  67.         if(KeyDelay_Cnt == 0)
  68.         {
  69.             F_KeyDelay = 0;
  70.             KeySure = KeyBuf;
  71.             F_KeyUp = 1;
  72.         }        
  73.     }
  74.     if(KeyBuf != KEY_PORT)
  75.     {
  76.         KeyBuf = KEY_PORT;
  77.         KeyDelay_Cnt = KEYDELAY;
  78.         F_KeyDelay = 1;
  79.     }

  80.     if(!KEY)
  81.     {
  82.         KeyDelay_Cnt1 --;
  83.         if(KeyDelay_Cnt1 == 0)
  84.         {
  85.             if(F_PlaySong == 0)
  86.                 {
  87.                 F_Music_Ide = !F_Music_Ide;
  88.                 F_PlaySong = 1;
  89.                 i = 0;
  90.                 }
  91.         }
  92.     }
  93.     else
  94.     {
  95.          KeyDelay_Cnt1 = KEYDELAY;
  96.     }
  97.     if(PlayIde == 1)
  98.     {
  99.         LED_L = 1;
  100.         LED_M = 0;
  101.         LED_H = 1;
  102.     }
  103.     if(PlayIde == 2)
  104.     {
  105.         LED_L = 1;
  106.         LED_M = 1;
  107.         LED_H = 0;
  108.     }
  109.     if(PlayIde == 0)
  110.     {
  111.         LED_L = 0;
  112.         LED_M = 1;
  113.         LED_H = 1;
  114.     }
  115. }
  116. void main(void)
  117. {
  118.     TimerInit();
  119.     F_PlayTone = 0;
  120.     PortTemp = 0x7f;
  121.     for(i = 0;i < 7;)
  122.     {
  123.         if(FT_250ms)
  124.         {
  125.             FT_250ms = 0;
  126.             i++;
  127.             PortTemp = _crol_(PortTemp,1);
  128.             LED_PORT= PortTemp;
  129.         }
  130.     }
  131.     for(i = 0;i < 7;)
  132.     {
  133.         if(FT_250ms)
  134.         {
  135.             FT_250ms = 0;
  136.             i++;
  137.             PortTemp = _cror_(PortTemp,1);
  138.             LED_PORT= PortTemp;
  139.         }
  140.     }
  141.     LED_PORT = 0xff;
  142.     i = 0;
  143.     while(1)
  144.     {
  145.         if(FT_1ms)
  146.         {
  147.             FT_1ms = 0;
  148.             WDT_CONTR = 0x38;
  149.             ScanKey();
  150.             if(F_PlaySong)
  151.                 {
  152.                 if(FT_250ms)
  153.                     {
  154.                     FT_250ms = 0;
  155.                     if(Time > 0)
  156.                             {
  157.                         Time --;
  158.                             }
  159.                     else
  160.                             {
  161.                         PortTemp = 0x01;
  162.                         F_PlayTone = 1;
  163.                         if(F_Music_Ide)
  164.                                 {
  165.                             k = MUSIC[i] + 7 * MUSIC[i + 1] - 1;//去音符振荡频率所需数据
  166.                             PlayIde = MUSIC[i + 1] - 1;
  167.                             PortTemp <<= (MUSIC[i]-1);
  168.                             Time = MUSIC[i+2] - 1;          //节拍时长           
  169.                             if(! MUSIC[i])
  170.                                         {
  171.                                     i = 0;
  172.                                 F_PlaySong = 0;
  173.                                 LED_PORT = 0xff;
  174.                                 F_PlayTone = 0;
  175.                                     SPK = 1;
  176.                                 PlayIde = 1;
  177.                                 Time = 4;
  178.                                         }
  179.                                 }
  180.                             else
  181.                                 {
  182.                             k = MUSIC1[i] + 7 * MUSIC1[i + 1] - 1;//去音符振荡频率所需数据
  183.                             PlayIde = MUSIC1[i + 1] - 1;
  184.                             PortTemp <<= (MUSIC1[i]-1);
  185.                             Time = MUSIC1[i+2] - 1;          //节拍时长     
  186.                             if(! MUSIC1[i])
  187.                                         {
  188.                                     i = 0;
  189.                                 F_PlaySong = 0;
  190.                                 LED_PORT = 0xff;
  191.                                 F_PlayTone = 0;
  192.                                     SPK = 1;
  193.                                 PlayIde = 1;
  194.                                 Time = 4;
  195.                                         }
  196.                                 }
  197.                         PortTemp = ~PortTemp;
  198.                         LED_PORT = PortTemp;
  199.                         Freq_H = FREQH[k];
  200.                         Freq_L = FREQL[k];
  201.                         i = i + 3;
  202.                     }                              
  203.                     }
  204.                 }
  205.             else
  206.             {               
  207.                 switch(KeySure)
  208.                     {
  209.                            
  210.                     case 0x81:  F_Tone = 0;F_PlayTone = 1;  Timer1_Cnt = 0;k=0; LED_PORT = 0xfe;
  211.                         break;
  212.                     case 0x41:  F_Tone = 0;F_PlayTone = 1;  Timer1_Cnt = 0;k=1; LED_PORT = 0xfd;
  213.                         break;
  214.                     case 0x21:  F_Tone = 0;F_PlayTone = 1;  Timer1_Cnt = 0;k=2; LED_PORT = 0xfb;
  215.                         break;
  216.                     case 0x11:  F_Tone = 0;F_PlayTone = 1;  Timer1_Cnt = 0;k=3; LED_PORT = 0xf7;
  217.                         break;
  218.                     case 0x09:  F_Tone = 0;F_PlayTone = 1;  Timer1_Cnt = 0;k=4; LED_PORT = 0xef;
  219.                         break;
  220.                     case 0x05:  F_Tone = 0;F_PlayTone = 1;  Timer1_Cnt = 0;k=5; LED_PORT = 0xdf;
  221.                         break;
  222.                     case 0x03:  F_Tone = 0;F_PlayTone = 1;  Timer1_Cnt = 0;k=6; LED_PORT = 0xbf;
  223.                         break;
  224.                     case 0x00:        
  225.                                 if(F_KeyUp)
  226.                                             {
  227.                                     F_KeyUp = 0;        
  228.                                     PlayIde++;        
  229.                                     if(PlayIde == 3)
  230.                                                 {               
  231.                                         PlayIde = 0;
  232.                                                     }
  233.                                             }
  234.                         break;
  235.                     default:         
  236.                         break;
  237.                 }         
  238.                 Freq_H = FREQH[(PlayIde * 7) + k];
  239.                 Freq_L = FREQL[(PlayIde * 7) + k];
  240.                 if(F_Tone)
  241.                     {
  242.                     F_Tone = 0;
  243.                     F_PlayTone = 0;
  244. ……………………

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


所有资料51hei提供下载(包含详细的制作教程和完整代码):
激光琴资料V2.0(以上资料打包下载).rar (19.6 MB, 下载次数: 246)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩1
回复

使用道具 举报

沙发
ID:203436 发表于 2017-6-28 15:59 | 只看该作者
那个原型的是喇叭么?
回复

使用道具 举报

板凳
ID:96711 发表于 2017-6-28 16:44 | 只看该作者
很有创意哦,学习一下
回复

使用道具 举报

地板
ID:215892 发表于 2017-6-29 17:41 | 只看该作者
很有创意哦,学习一下
回复

使用道具 举报

5#
ID:215892 发表于 2017-6-29 17:42 | 只看该作者
很有创意哦,学习一下
回复

使用道具 举报

6#
ID:210627 发表于 2017-9-6 16:51 | 只看该作者
WDT_CONTR = 0x38;这句语句什么意思,该怎么定义,编译有错。
回复

使用道具 举报

7#
ID:249545 发表于 2017-11-27 10:36 | 只看该作者
作品漂亮,老师软件,硬件都能做,木工技术学得真好!
回复

使用道具 举报

8#
ID:318951 发表于 2018-4-29 17:24 | 只看该作者
很有创意哦,学习一下
回复

使用道具 举报

9#
ID:318951 发表于 2018-4-29 17:24 | 只看该作者

很有创意哦,学习一下
回复

使用道具 举报

10#
ID:304350 发表于 2018-9-22 21:04 | 只看该作者
很有创意哦,值得学习
回复

使用道具 举报

11#
ID:213599 发表于 2018-10-12 17:38 | 只看该作者
xydedanpianji 发表于 2017-6-28 15:59
**** 作者被禁止或删除 内容自动屏蔽 ****

耳麦上拆的,声音会比较大
回复

使用道具 举报

12#
ID:612620 发表于 2019-9-17 15:43 | 只看该作者
还可以哦
回复

使用道具 举报

13#
ID:613217 发表于 2019-12-30 15:50 | 只看该作者
感觉还不错比较详细,请问这个能在isis7上模拟吗
回复

使用道具 举报

14#
ID:979932 发表于 2021-11-10 22:19 | 只看该作者
很有创意哦,学习一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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