找回密码
 立即注册

QQ登录

只需一步,快速开始

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

激光竖琴原理图和程序

[复制链接]
跳转到指定楼层
#
ID:212343 发表于 2017-7-21 11:03 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
  1. #include "reg52.h"
  2. #include "intrins.h"

  3. sbit SPK    = P3^4;
  4. sbit LED_L  = P3^7;
  5. sbit LED_M  = P3^6;
  6. sbit LED_H  = P3^5;
  7. sbit KEY    = P3^3;

  8. #define KEYDELAY 20
  9. #define KEY_PORT P2
  10. #define LED_PORT P1

  11. bit FT_1ms,FT_250ms;
  12. bit F_PlaySong,F_PlayTone,F_KeyDelay,F_Tone,F_KeyUp,F_Music_Ide;
  13. unsigned char Freq_H,Freq_L,SongLen,PlayIde,i;
  14. unsigned char KeyBuf,KeySure,KeyDelay_Cnt,Timer1_Cnt,KeyDelay_Cnt1;
  15. unsigned char k,Time,PortTemp;

  16.                          //世上只有妈妈好数据表
  17. 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,
  18.                             6,2,8,      3,2,4,      5,2,2,    6,2,2,    5,2,4,   3,2,4,    1,2,2,
  19.                             6,1,2,      5,2,2,      3,2,2,    2,2,8,    2,2,6,   3,2,2,    5,2,4,
  20.                             5,2,2,      6,2,2,      3,2,4,    2,2,4,    1,2,8,   5,2,6,    3,2,2,
  21.                             2,2,2,      1,2,2,      6,1,2,   1,2,2,    5,1,12,   0,0,0
  22.                             };
  23. /***********************生日快乐**********************/
  24. code unsigned char MUSIC1[]={
  25.                                  5,1,2, 5,1,2, 6,1,4, 5,1,4, 1,2,4, 7,1,8,
  26.                                  5,1,2, 5,1,2, 6,1,4, 5,1,4, 2,2,4, 1,2,8,
  27.                                  5,1,2, 5,1,2, 5,2,4, 3,2,4, 1,2,4, 7,1,4,
  28.                                  6,1,8, 4,2,2, 4,2,2, 3,2,4, 1,2,4, 2,2,4,
  29.                                  1,2,12, 0,0,0};

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

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

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

  244. void Timer1_IRQ(void) interrupt 1
  245. {   
  246.     TH0  = (65536 - 1000) / 256;
  247.     TL0  = (65536 - 1000) % 256;
  248.     FT_1ms = 1;
  249.     Timer1_Cnt ++;
  250.     if(Timer1_Cnt == 125)
  251.     {
  252.         FT_250ms = 1;
  253.         F_Tone = 1;
  254.         Timer1_Cnt = 0;
  255.     }
  256. }
  257. void Timer0_IRQ(void) interrupt 3
  258. {
  259.     TH1  = Freq_H;
  260.     TL1  = Freq_L;
  261.     if(F_PlayTone)
  262.     {   
  263.         SPK = !SPK;
  264.     }
  265. }
复制代码

激光竖琴原理图.pdf

52.39 KB, 下载次数: 32, 下载积分: 黑币 -5

评分

参与人数 1黑币 +5 收起 理由
wuli韬韬 + 5 回帖助人的奖励!

查看全部评分

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

使用道具 举报

板凳
ID:415234 发表于 2018-11-11 09:54 | 只看该作者
挺好的
回复

使用道具 举报

沙发
ID:318951 发表于 2018-4-29 21:06 | 只看该作者
怎么编译时显示“ WDT_CONTR”没定义
回复

使用道具 举报

楼主
ID:210627 发表于 2017-9-6 15:18 | 只看该作者
看着还可以
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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