找回密码
 立即注册

QQ登录

只需一步,快速开始

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

心形LED闪光灯单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:317127 发表于 2018-4-26 16:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define  FREQ 12000000

  4. unsigned int i;
  5. unsigned int j;
  6. sbit LED1=P1^0;
  7. sbit LED2=P1^1;
  8. sbit K=P3^6;
  9. sbit SPK=P3^7;

  10. //数据定义:
  11. //音乐编码,存储器定义
  12. //音符码格式:| D7 |D6  D5  D4| D3 |D2  D1  D0|
  13. //           |变调|      节拍|升降|     音符 |
  14. //         |高4位=0时是功能码|根据低4位转换  |
  15. unsigned char code music1[]={   //梁祝
  16.     0xcb,                       //示例:0xcb=11001011B,升半调/1/4拍,3Mi低音
  17.     0x35,0x16,0xb9,0x12,0x96,0x99,0xa5,
  18.     0xbd,0x99,0x96,0x15,0x13,0x15,0x62,
  19.     0x32,0x13,0xa7,0x26,0x25,0x16,0xa9,0x22,
  20.     0xa3,0xa9,0x96,0x15,0x16,0x99,0xe5,
  21.     0xbb,0x15,0xa7,0xaa,0x96,0x99,0xd5,
  22.     0x13,0x15,0x23,0x15,0x16,0x17,0x9a,0xd6,0x15,0x16,
  23.     0xb9,0x12,0x25,0x23,0x23,0x22,0x13,0x12,0x21,0x96,0x15,
  24.     0x43,0xc9,0x96,0x99,0x96,0x15,0x13,0x15,0x16,0x99,
  25.     0xd5,                           
  26.     0x00,                        //最后字节为功能码必须==0x00退出
  27. };

  28. unsigned char code music_l_tab[8]={0,1,2,3,4,6,8,16};//音乐节拍

  29. unsigned char code music_freq_tab[64]={             //音符定时器值表
  30.     0xff,0xea,                                      //0 休止符
  31.     255-FREQ/24/131/256,     //256-FREQ/24/x/256    //1 do 高字节
  32.     256-FREQ/24/131%256,     //256-FREQ/24/x%256    //1 do 低字节
  33.     255-FREQ/24/147/256,256-FREQ/24/147%256,        //2 re
  34.     255-FREQ/24/165/256,256-FREQ/24/165%256,        //3 mi
  35.     255-FREQ/24/175/256,256-FREQ/24/175%256,        //4 fa
  36.     255-FREQ/24/196/256,256-FREQ/24/196%256,        //5 suo
  37.     255-FREQ/24/221/256,256-FREQ/24/221%256,        //6 la
  38.     255-FREQ/24/248/256,256-FREQ/24/248%256,        //7 xi

  39.     0xff,0xea,                                      //0 休止符
  40.     255-FREQ/24/262/256,256-FREQ/24/262%256,        //1 do
  41.     255-FREQ/24/294/256,256-FREQ/24/294%256,        //2 re
  42.     255-FREQ/24/330/256,256-FREQ/24/330%256,        //3 mi
  43.     255-FREQ/24/350/256,256-FREQ/24/350%256,        //4 fa
  44.     255-FREQ/24/393/256,256-FREQ/24/393%256,        //5 suo
  45.     255-FREQ/24/441/256,256-FREQ/24/441%256,        //6 la
  46.     255-FREQ/24/495/256,256-FREQ/24/495%256,        //7 xi

  47.     0xff,0xea,                                      //0 休止符
  48.     255-FREQ/24/525/256,256-FREQ/24/525%256,        //1 do
  49.     255-FREQ/24/589/256,256-FREQ/24/589%256,        //2 re
  50.     255-FREQ/24/661/256,256-FREQ/24/661%256,        //3 mi
  51.     255-FREQ/24/700/256,256-FREQ/24/700%256,        //4 fa
  52.     255-FREQ/24/786/256,256-FREQ/24/786%256,        //5 suo
  53.     255-FREQ/24/882/256,256-FREQ/24/882%256,        //6 la
  54.     255-FREQ/24/990/256,256-FREQ/24/990%256,        //7 xi

  55.     0xff,0xea,                                      //0 休止符
  56.     255-FREQ/24/1049/256,256-FREQ/24/1049%256,      //1 do
  57.     255-FREQ/24/1178/256,256-FREQ/24/1178%256,      //2 re
  58.     255-FREQ/24/1322/256,256-FREQ/24/1322%256,      //3 mi
  59.     255-FREQ/24/1400/256,256-FREQ/24/1400%256,      //4 fa
  60.     255-FREQ/24/1572/256,256-FREQ/24/1572%256,      //5 suo
  61.     255-FREQ/24/1665/256,256-FREQ/24/1665%256,      //6 la
  62.     255-FREQ/24/1869/256,256-FREQ/24/1869%256,      //7 xi

  63. };

  64. unsigned char code music_frequp_tab[64]={           //升半音
  65.     0xff,0xea,                                      //0 休止符
  66.     255-FREQ/24/139/256,        //1 do 高字节 //255-FREQ/24/x/256
  67.     256-FREQ/24/139%256,        //1 do 低字节 //256-FREQ/24/x%256
  68.     255-FREQ/24/156/256,256-FREQ/24/156%256,        //2 re
  69.     255-FREQ/24/175/256,256-FREQ/24/175%256,        //3 mi
  70.     255-FREQ/24/185/256,256-FREQ/24/185%256,        //4 fa
  71.     255-FREQ/24/208/256,256-FREQ/24/208%256,        //5 suo
  72.     255-FREQ/24/234/256,256-FREQ/24/234%256,        //6 la
  73.     255-FREQ/24/262/256,256-FREQ/24/262%256,        //7 xi

  74.     0xff,0xea,                                      //0 休止符
  75.     255-FREQ/24/278/256,256-FREQ/24/278%256,        //1 do
  76.     255-FREQ/24/312/256,256-FREQ/24/312%256,        //2 re
  77.     255-FREQ/24/350/256,256-FREQ/24/350%256,        //3 mi
  78.     255-FREQ/24/371/256,256-FREQ/24/371%256,        //4 fa
  79.     255-FREQ/24/416/256,256-FREQ/24/416%256,        //5 suo
  80.     255-FREQ/24/467/256,256-FREQ/24/467%256,        //6 la
  81.     255-FREQ/24/525/256,256-FREQ/24/525%256,        //7 xi

  82.     0xff,0xea,                                      //0 休止符
  83.     255-FREQ/24/556/256,256-FREQ/24/556%256,        //1 do
  84.     255-FREQ/24/624/256,256-FREQ/24/624%256,        //2 re
  85.     255-FREQ/24/700/256,256-FREQ/24/700%256,        //3 mi
  86.     255-FREQ/24/742/256,256-FREQ/24/742%256,        //4 fa
  87.     255-FREQ/24/833/256,256-FREQ/24/833%256,        //5 suo
  88.     255-FREQ/24/935/256,256-FREQ/24/935%256,        //6 la
  89.     255-FREQ/24/1049/256,256-FREQ/24/1049%256,      //7 xi

  90.     0xff,0xea,                                      //0 休止符
  91.     255-FREQ/24/1112/256,256-FREQ/24/1112%256,      //1 do
  92.     255-FREQ/24/1248/256,256-FREQ/24/1248%256,      //2 re
  93.     255-FREQ/24/1400/256,256-FREQ/24/1400%256,      //3 mi
  94.     255-FREQ/24/1484/256,256-FREQ/24/1484%256,      //4 fa
  95.     255-FREQ/24/1618/256,256-FREQ/24/1618%256,      //5 suo
  96.     255-FREQ/24/1764/256,256-FREQ/24/1764%256,      //6 la
  97.     255-FREQ/24/1968/256,256-FREQ/24/1968%256,      //7 xi
  98. };
  99. unsigned char ly_TH0;
  100. unsigned char ly_TL0;

  101. //函数定义:
  102. void music_delay(unsigned char timer);   //音乐节拍延时
  103. void music_play(unsigned char *pmsc);         //播放音乐子程序


  104. //---------------------------------------------------------------------------//
  105. void music_int0 (void) interrupt 1 using 1    //定时中断1//
  106. {
  107.     SPK=~SPK;
  108.     TH0=ly_TH0;
  109.     TL0=ly_TL0;
  110. }

  111. //---------------------------------------------------------------------------//
  112. void music_delay(unsigned char timer)     //延时 125*n 毫秒
  113. {
  114.     unsigned char i=125,j;
  115.     do{
  116.         do{
  117.             for(j=0; j<230; j++)
  118.                             _nop_();
  119.       }while(--i);
  120.     }while(--timer);
  121. }

  122. //---------------------------------------------------------------------------//
  123. void music_play(unsigned char *pmsc)   //音乐
  124. {
  125.     unsigned char music_freq=32;      //音高
  126.     unsigned char music_long;         //节拍延时
  127.     unsigned char music_data=0;       //音符数据
  128.     bit music_up=0;                   //升半音
  129.     bit music_break=0;                //断奏
  130.     ly_TH0=0xff;
  131.     ly_TL0=0xea;                    //关输出(输出超声波)
  132.     ET0=1;                            //开T1定时器中断
  133.         TR0=1;
  134. //---------------------------------------------------------
  135.     while (*pmsc != 0x00)
  136.         {
  137.         music_data=*pmsc & 0x07;
  138.         music_long=*pmsc>>4;
  139.         //---------------------------------------------------------
  140.         if (music_long != 0){          //是音符,非功能码
  141.             if (*pmsc&0x80){           //需升降调
  142.                 if (((*pmsc) & 0x08) == 0)
  143.                     {if(music_freq >= 16) music_freq -= 16;}   //音高下降
  144.                 else
  145.                     {if(music_freq < 48) music_freq += 16;}    //音高上升
  146.              }
  147.             //---------------------------------------------------------
  148.             if (music_up==1){          //升半音
  149.                 ly_TH0=music_frequp_tab[(music_freq  + (music_data <<1))];
  150.                 ly_TL0=music_frequp_tab[(music_freq + (music_data <<1)+1)];
  151.             }
  152.             else{                      //不升半音
  153.                 ly_TH0=music_freq_tab[(music_freq + (music_data <<1))];
  154.                 ly_TL0=music_freq_tab[(music_freq + (music_data <<1)+ 1)];
  155.             }
  156.             //---------------------------------------------------------
  157.             if (music_break){          //断奏
  158.                 music_delay(music_l_tab[music_long&0x07]-1);
  159.                 ly_TH0=0xff;
  160.                 ly_TL0=0xea;
  161.                 music_delay(1);
  162.             }
  163.             else                      //连奏
  164.                 music_delay(music_l_tab[music_long&0x07]);
  165.         }
  166.         //---------------------------------------------------------
  167.         else                          //是功能码
  168.             {
  169.             switch(music_data){
  170.             case 0x04:
  171.                     music_up=0; break;      //不升半音                    
  172.             case 0x05:
  173.                            music_up=1; break;      //升半音                    
  174.                   case 0x06:
  175.                                music_break=0; break;   //断奏                    
  176.                            case 0x07:
  177.                          music_break=1;break;    //连奏                    
  178.             }
  179.         }
  180.         //---------------------------------------------------------
  181.         pmsc++;
  182.     }
  183.     ET0=0;                          //播放结束,关T1中断
  184.         TR0=0;
  185.     SPK=1;                               //关输出
  186. }

  187. /*====================================================================
  188.   设定延时时间:x*1ms
  189. ====================================================================*/
  190. void DelayMs(unsigned int Ms)
  191. {
  192.   unsigned int i,TempCyc;
  193.   for(i=0;i<Ms;i++)
  194.   {
  195.     TempCyc = 250;
  196.     while(TempCyc--);
  197.   }
  198. }
  199. /*====================================================================
  200.   读键
  201. ====================================================================*/
  202. void keypros()
  203. {
  204.         if(K==0)                  //检测按键K1是否按下
  205.         {        
  206.                 DelayMs(10);   //消除抖动 一般大约10ms
  207.                 if(K==0)         //再次判断按键是否按下
  208.                 {
  209.                         j+=1;          //led状态取反
  210.                 }
  211.                 while(!K);         //检测按键是否松开
  212.         }               
  213. }
  214.    
  215. void main()
  216. {
  217. while (1)
  218. {
  219. j=0;
  220. P0=0xff;P1=0xff;P2=0xff;
  221. P0=0;P2=0;LED1=0;LED2=0;
  222. TMOD=0x01;       //定时器模式
  223. EA=1;
  224. EX0=0;
  225. TR0=0;
  226. music_play(music1);        //播放音乐
  227. P0=0xff;P2=0xff;LED1=1;LED2=1;DelayMs(150);

  228. P0=0xfe;DelayMs(150);
  229. P0=0xfc;DelayMs(150);
  230. P0=0xf8;DelayMs(150);
  231. P0=0xf0;DelayMs(150);
  232. P0=0xe0;DelayMs(150);
  233. P0=0xc0;DelayMs(150);
  234. P0=0x80;DelayMs(150);
  235. P0=0;DelayMs(150);
  236. P2=0x7f;DelayMs(150);
  237. P2=0x3f;DelayMs(150);
  238. P2=0x1f;DelayMs(150);
  239. P2=0x0f;DelayMs(150);
  240. P2=0x07;DelayMs(150);
  241. P2=0x03;DelayMs(150);
  242. P2=0x01;DelayMs(150);
  243. P2=0;DelayMs(150);
  244. LED1=0;DelayMs(150);
  245. LED2=0;DelayMs(150);
  246.    while(j==0)
  247.    {keypros();DelayMs(10);}
  248.    P0=0xff;P2=0xff;LED1=1;LED2=1;   
  249.    for (i=0;i<5;i++)
  250.     {  
  251.           P0=0xfe;DelayMs(20);
  252.         P0=0xfd;DelayMs(20);
  253.         P0=0xfb;DelayMs(20);
  254.         P0=0xf7;DelayMs(20);
  255.         P0=0xef;DelayMs(20);
  256.         P0=0xdf;DelayMs(20);
  257.         P0=0xbf;DelayMs(20);
  258.         P0=0x7f;DelayMs(20);
  259.         P0=0xff;
  260.         P2=0x7f;DelayMs(20);
  261.         P2=0xbf;DelayMs(20);
  262.         P2=0xdf;DelayMs(20);
  263.         P2=0xef;DelayMs(20);
  264.         P2=0xf7;DelayMs(20);
  265.         P2=0xfb;DelayMs(20);
  266.         P2=0xfd;DelayMs(20);
  267.         P2=0xfe;DelayMs(20);
  268.         P2=0xff;
  269.         LED1=0;DelayMs(20);LED1=1;
  270.         LED2=0;DelayMs(20);LED2=1;
  271.     }
  272.         for (i=0;i<10;i++)
  273.     {  
  274.           P0=0xfe;P2=0xbf;DelayMs(20);P0=0xff;P2=0xff;
  275.         P0=0xfd;P2=0xdf;DelayMs(20);P0=0xff;P2=0xff;
  276.         P0=0xfb;P2=0xef;DelayMs(20);P0=0xff;P2=0xff;
  277.         P0=0xf7;P2=0xf7;DelayMs(20);P0=0xff;P2=0xff;
  278.         P0=0xef;P2=0xfb;DelayMs(20);P0=0xff;P2=0xff;
  279.         P0=0xdf;P2=0xfd;DelayMs(20);P0=0xff;P2=0xff;
  280.         P0=0xbf;P2=0xfe;DelayMs(20);P0=0xff;P2=0xff;
  281.         P0=0x7f;LED1=0;DelayMs(20);P0=0xff;LED1=1;
  282.         P2=0x7f;LED2=0;DelayMs(20);LED2=1;P2=0xff;
  283.     }
  284.     for (i=0;i<20;i++)
  285.     {  
  286.           P0=0xb6;P2=0xb6;DelayMs(20);P0=0xff;P2=0xff;DelayMs(20);
  287.         P0=0x6d;P2=0xdb;LED1=0;DelayMs(20);P0=0xff;P2=0xff;LED1=1;DelayMs(20);
  288.         P0=0xdb;P2=0x6d;LED2=1;DelayMs(20);P0=0xff;P2=0xff;LED2=1;DelayMs(20);        
  289.     }
  290.         for (i=0;i<20;i++)
  291.     {  
  292.           P0=0xaa;P2=0x55;LED1=0;DelayMs(20);P0=0xff;P2=0xff;LED1=1;DelayMs(20);
  293.         P0=0x55;P2=0xaa;LED2=0;DelayMs(20);P0=0xff;P2=0xff;LED2=1;DelayMs(20);
  294.     }
  295.    }
  296. }
复制代码

这是我用一周时间做的心形七彩闪光灯程序
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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