找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机智能音乐蓝牙控制时钟台灯源代码

[复制链接]
ID:505041 发表于 2019-4-4 21:17 | 显示全部楼层 |阅读模式
基于51单片机的音乐蓝牙台灯,拥有音乐播放功能,手机SPF软件蓝牙控制功能,可实现手机控制播放,暂停,切换歌,按键同理,
实时检测温湿度,时间闹钟功能
~P(B63)MS9]_(WRCHQ5$}ZD.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <math.h>
  4. typedef unsigned char BYTE;
  5. typedef unsigned int WORD;
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. uchar receive=0;
  9. int i=0;
  10. bit busy;
  11. bit qhgn=0; //切换功能标志位
  12. sbit dula=P2^6;
  13. sbit wela=P2^7;
  14. sbit leden=P3^4;
  15. sbit ledrs=P3^5;
  16. sbit ledrw=P3^6;

  17. sbit s0=P2^1;  //按键
  18. sbit s1=P2^2;
  19. sbit s2=P2^4;
  20. sbit s3=P2^5;
  21. sbit s4=P1^1;

  22. sbit deng=P1^0;  //播歌指示灯

  23. sbit dscs=P1^4;  //ds12c887
  24. sbit dsas=P1^5;
  25. sbit dsrw=P1^6;                                                                                                           
  26. sbit dsds=P1^7;

  27. sbit Data=P2^0;  //DHT11

  28. void set_time();
  29. void write_ds(uchar add,uchar date);
  30. void SendData(unsigned char* bytes);
  31. void SendByte(unsigned char byte);

  32. uchar code MP3data1[4]={0xfd,0x02,0x01,0xdf};  //播放
  33. uchar code MP3data2[4]={0xfd,0x02,0x02,0xdf};  //暂停
  34. uchar code MP3data3[4]={0xfd,0x02,0x03,0xdf};  //切歌
  35. uchar code MP3data4[4]={0xfd,0x02,0x06,0xdf};//降低?
  36. //unsigned int MP3data5[6]={0xfd,0x04,0x41,0x00,0x01,0xdf};

  37. uchar num,count,shi,fen,miao,s0num,flag=0,nian,yue,ri;
  38. uint RH,TH;
  39. uchar code table[]="  20  .  .     C";
  40. uchar code table1[]="    :  :      RH";
  41. uchar rec_dat[9]="12369566";

  42. void Delay20ms(unsigned int z)        
  43. {
  44.         unsigned int i, j;

  45.         for(i=z;i>0;i--)
  46.         for(j=110;j>0;j--);
  47. }
  48. void Delay_1ms(int i)//1ms延时
  49. {
  50.         int x,j;
  51.         for(j=i;j>0;j--)
  52.           for(x=110;x>0;x--);        
  53. }

  54. /********************************************************************
  55. * 名称 : Com_Init()
  56. * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
  57. * 输入 : 无
  58. * 输出 : 无
  59. ***********************************************************************/
  60. void Com_Init()
  61. {
  62.   SCON = 0x50;                //8???,?????
  63.         TMOD = 0x20;                //?????1?8???????
  64.         TL1 = 0xfd;                //??????
  65.         TH1 = 0xfd;               
  66.         TR1 = 1;
  67.                
  68.                 SM0=0;
  69.                 SM1=1;
  70.                 REN=1;
  71.                 EA=1;
  72.                 ES=1;               
  73. }

  74. ///////////////////////////////////DHT11
  75. void DHT11_delay_us(uchar n)
  76. {
  77.     while(--n);
  78. }

  79. void DHT11_delay_ms(uint z)
  80. {
  81.    uint i,j;
  82.    for(i=z;i>0;i--)
  83.       for(j=110;j>0;j--);
  84. }

  85. void DHT11_start()
  86. {
  87.    Data=1;
  88.    DHT11_delay_us(2);
  89.    Data=0;
  90.    DHT11_delay_ms(20);   
  91.    Data=1;
  92.    DHT11_delay_us(30);
  93. }

  94. uchar DHT11_rec_byte()   
  95. {
  96.    uchar i,dat=0;
  97.   for(i=0;i<8;i++)   
  98.    {         
  99.       while(!Data);   
  100.       DHT11_delay_us(8);   
  101.       dat<<=1;         
  102.       if(Data==1)   
  103.          dat+=1;
  104.       while(Data);      
  105.     }  
  106.     return dat;
  107. }

  108. void DHT11_receive()   
  109. {
  110.     uchar R_H,R_L,T_H,T_L,revise;
  111.     DHT11_start();
  112.     if(Data==0)
  113.     {
  114.         while(Data==0);      
  115.         DHT11_delay_us(40);  
  116.         R_H=DHT11_rec_byte();     
  117.         R_L=DHT11_rec_byte();     
  118.         T_H=DHT11_rec_byte();     
  119.         T_L=DHT11_rec_byte();   
  120.         revise=DHT11_rec_byte();

  121.         DHT11_delay_us(25);   

  122.         if((R_H+R_L+T_H+T_L)==revise)     
  123.         {
  124.             RH=R_H|R_L;

  125.             TH=T_H|T_L;
  126.         }
  127.      }
  128. }

  129. ///////////////////////////////LCD
  130. void delay(uchar z)
  131. {
  132.   uchar x,y;
  133.         for(x=z;x>0;x--)
  134.           for(y=110;y>0;y--);
  135. }
  136. void write_com(uchar com)
  137. {
  138.   ledrs=0;
  139.         leden=1;
  140.         delay(5);
  141.         P0=com;
  142.         delay(5);
  143.         leden=0;
  144. }

  145. void write_date(uchar date)
  146. {
  147.   ledrs=1;
  148.         leden=1;
  149.         delay(5);
  150.         P0=date;
  151.         delay(5);
  152.         leden=0;
  153. }


  154. void write_sfm(uchar add,date)
  155. {
  156.         uchar shi,ge;
  157.         shi=date/10;
  158.         ge=date%10;
  159.   write_com(0x80+0x40+add);
  160.         write_date(0x30+shi);
  161.         write_date(0x30+ge);
  162. }
  163. void write_nyr(uchar add,uchar date)
  164. {
  165.         uchar shi,ge;
  166.         shi=date/10;
  167.         ge=date%10;
  168.         write_com(0x80+add);
  169.         write_date(0x30+shi);
  170.         write_date(0x30+ge);
  171. }
  172. void write_SHIDU(unsigned char add,unsigned char date)
  173. {
  174.         unsigned char shi,ge;
  175.         shi=date/10;
  176.         ge=date%10;
  177.         write_com(0x80+0x40+add);
  178.         write_date(0x30+shi);
  179.         write_date(0x30+ge);
  180. }


  181. void write_WENDU(unsigned char add,unsigned char date)
  182. {
  183.         unsigned char shi,ge;
  184.         shi=date/10;
  185.         ge=date%10;
  186.         write_com(0x80+add);
  187.         write_date(0x30+shi);
  188.         write_date(0x30+ge);
  189. }
  190. /////////////////////////////按键
  191. void keyscan()
  192. {
  193.   if(qhgn==0)        /////////////////改时间        
  194.         {
  195.                 if(s0==0)           ////移动光标
  196.                 {
  197.                         delay(2);
  198.                         if(s0==0)
  199.                         {
  200.                                 s0num++;
  201.                                 while(!s0);
  202.                         }
  203.                 }
  204.                 if(s3==0)
  205.                 {
  206.                                 delay(1);
  207.                                 if(s3==0)
  208.                                 {
  209.                                         if(s0num>=1)
  210.                                         s0num--;
  211.                                         while(!s3);
  212.                                 }
  213.                 }
  214.                
  215.                                         if(s0num==1)              //////光标位置
  216.                                 {
  217.                                   flag=1;
  218.                                         write_com(0x80+0x40+9);
  219.                                         write_com(0x0f);
  220.                                 }
  221.                                 if(s0num==2)
  222.                                 {
  223.                                         write_com(0x80+0x40+6);
  224.                                         write_com(0x0f);
  225.                                 }
  226.                                 if(s0num==3)
  227.                                 {
  228.                                         write_com(0x80+0x40+3);
  229.                                         write_com(0x0f);
  230.                                 }
  231.                                 if(s0num==4)
  232.                                 {
  233.                                         write_com(0x80+11);
  234.                                         write_com(0x0f);
  235.                                 }
  236.                                 if(s0num==5)
  237.                                 {
  238.                                         write_com(0x80+8);
  239.                                         write_com(0x0f);
  240.                                 }
  241.                                 if(s0num==6)
  242.                                 {
  243.                                         write_com(0x80+5);
  244.                                         write_com(0x0f);
  245.                                 }
  246.                                 
  247.                                 if(s0num==7)                        ///重载时间
  248.                                 {
  249.                                         s0num=0;
  250.                                         write_com(0x0c);
  251.                                         flag=0;
  252.                                         write_ds(0,miao);
  253.                                         write_ds(2,fen);
  254.                                         write_ds(4,shi);
  255.                                         write_ds(7,ri);
  256.                                         write_ds(8,yue);
  257.                                         write_ds(9,nian);
  258.                                 }
  259.                                 
  260.                         if(s0num!=0)                     //////修改时间
  261.                                         {
  262.                                                 if(s1==0)
  263.                                                 {
  264.                                                         delay(2);
  265.                                                         if(s1==0)
  266.                                                         {
  267.                                                                 while(!s1);
  268.                                                                 if(s0num==1)
  269.                                                                 {
  270.                                                                         miao++;
  271.                                                                         if(miao==60)
  272.                                                                                 miao=0;
  273.                                                                         write_sfm(8,miao);
  274.                                                                         write_com(0x80+0x40+9);                                                               
  275.                                                                 }
  276.                                                                 if(s0num==2)
  277.                                                                 {
  278.                                                                         fen++;
  279.                                                                         if(fen==60)
  280.                                                                                 fen=0;
  281.                                                                         write_sfm(5,fen);
  282.                                                                         write_com(0x80+0x40+6);
  283.                                                                 }
  284.                                                                 if(s0num==3)
  285.                                                                 {
  286.                                                                         shi++;
  287.                                                                         if(shi==24)
  288.                                                                                 shi=0;
  289.                                                                         write_sfm(2,shi);
  290.                                                                         write_com(0x80+0x40+3);
  291.                                                                 }
  292.                                                                 if(s0num==4)
  293.                                                                 {
  294.                                                                         ri++;
  295.                                                                         if(ri==31)
  296.                                                                                 ri=1;
  297.                                                                         write_nyr(10,ri);
  298.                                                                         write_com(0x80+11);
  299.                                                                 }
  300.                                                                 if(s0num==5)
  301.                                                                 {
  302.                                                                         yue++;
  303.                                                                         if(yue==12)
  304.                                                                                 yue=1;
  305.                                                                         write_nyr(7,yue);
  306.                                                                         write_com(0x80+8);
  307.                                                                 }
  308.                                                                 if(s0num==6)
  309.                                                                 {
  310.                                                                         nian++;
  311.                                                                         if(nian==99)
  312.                                                                                 nian=0;
  313.                                                                         write_nyr(4,nian);
  314.                                                                         write_com(0x80+5);
  315.                                                                 }
  316.                                                         }
  317.                                                 }
  318.                                                 if(s2==0)
  319.                                                 {
  320.                                                         delay(2);
  321.                                                         if(s2==0)
  322.                                                         {
  323.                                                                 while(!s2);
  324.                                                                 if(s0num==1)
  325.                                                                 {
  326.                                                                         if(miao==0)
  327.                                                                                 miao=60;
  328.                                                                         miao--;
  329.                                                                         write_sfm(8,miao);
  330.                                                                         write_com(0x80+0x40+9);                                                               
  331.                                                                 }
  332.                                                                 if(s0num==2)
  333.                                                                 {
  334.                                                                         if(fen==0)
  335.                                                                                 fen=60;
  336.                                                                         --fen;
  337.                                                                         write_sfm(5,fen);
  338.                                                                         write_com(0x80+0x40+6);
  339.                                                                 }
  340.                                                                 if(s0num==3)
  341.                                                                 {
  342.                                                                         if(shi==0)
  343.                                                                                 shi=24;
  344.                                                                         --shi;
  345.                                                                         write_sfm(2,shi);
  346.                                                                         write_com(0x80+0x40+3);
  347.                                                                 }
  348.                                                                 if(s0num==4)
  349.                                                                 {
  350.                                                                         if(ri==0)
  351.                                                                                 ri=31;
  352.                                                                         ri--;
  353.                                                                         write_nyr(10,ri);
  354.                                                                         write_com(0x80+11);
  355.                                                                 }
  356.                                                                 if(s0num==5)
  357.                                                                 {
  358.                                                                         if(yue==0)
  359.                                                                                 yue=12;
  360.                                                                         yue--;
  361.                                                                         write_nyr(7,yue);
  362.                                                                         write_com(0x80+8);
  363.                                                                 }
  364.                                                                 if(s0num==6)
  365.                                                                 {
  366.                                                                         if(nian==0)
  367.                                                                                 nian=99;
  368.                                                                         nian--;
  369.                                                                         write_nyr(4,nian);
  370.                                                                         write_com(0x80+5);
  371.                                                                 }
  372.                                                         }
  373.                                                 }
  374.                                         }
  375.                                 if(s4==0)                    ///切换按键功能
  376.                                 {
  377.                                         delay(5);
  378.                                                 if(s4==0)
  379.                                                 {
  380.                                                         write_com(0x80+0x40);
  381.                                                         write_date('M');
  382.                                                         qhgn=1;               
  383.                                                         while(!s4);
  384.                                                 }
  385.                                 }
  386.                         }
  387.                         
  388.                         
  389.                         if(qhgn==1)                        /////////////////按键切歌
  390.                         {
  391.                                                 if(s0==0)           ////播放
  392.                                                 {
  393.                                                         delay(2);
  394.                                                         if(s0==0)
  395.                                                         {
  396.                                                                   while(!s0);
  397.                                                                   deng=1;
  398.                                                                         for(i=0;i<4;i++)
  399.                                                                         {                                                        
  400.                                                                          SendData(MP3data1);               
  401.                                                                          Delay20ms(2);
  402.                                                                         }
  403.                                                                
  404.                                                         }
  405.                                                 }
  406.                                                                                                 if(s1==0)           ////暂停
  407.                                                                                                 {
  408.                                                                                                         delay(2);
  409.                                                                                                         if(s1==0)
  410.                                                                                                         {
  411.                                                                                                                 while(!s1);
  412.                                                                                                                         deng=0;
  413.                                                                                                                         for(i=0;i<4;i++)
  414.                                                                                                                         {
  415.                                                                                                                          SendData(MP3data2);               
  416.                                                                                                                          Delay20ms(2);
  417.                                                                                                                         }
  418.                                                                                                                
  419.                                                                                                         }
  420.                                                                                                 }
  421.                                                                                                 if(s2==0)           ////切歌
  422.                                                                                                 {
  423.                                                                                                         delay(2);
  424.                                                                                                         if(s2==0)
  425.                                                                                                         {
  426.                                                                                                                 while(!s2);
  427.                                                                                                                         for(i=0;i<4;i++)
  428.                                                                                                                         {
  429.                                                                                                                          SendData(MP3data3);               
  430.                                                                                                                          Delay20ms(2);
  431.                                                                                                                         }
  432.                                                                                                                
  433.                                                                                                         }
  434.                                                                                                 }
  435.                                                                                                 if(s3==0)           ////降低音量
  436.                                                                                                 {
  437.                                                                                                         delay(2);
  438.                                                                                                         if(s3==0)
  439.                                                                                                         {
  440.                                                                                                                 while(!s3);
  441.                                                                                                                         for(i=0;i<4;i++)
  442.                                                                                                                         {
  443.                                                                                                                          SendData(MP3data4);               
  444.                                                                                                                          Delay20ms(2);
  445.                                                                                                                         }
  446.                                                                                                                
  447.                                                                                                         }
  448.                                                                                                 }
  449.                                                 
  450.                                                                         if(s4==0)                     ///切换按键功能
  451.                                                                 {
  452.                                                                         delay(5);
  453.                                                                                 if(s4==0)
  454.                                                                                 {
  455.                                                                                         while(!s4);
  456.                                                                                         write_com(0x80+0x40);
  457.                                                                 write_date(' ');
  458.                                                                                         qhgn=0;
  459.                                                                                        
  460.                                                                                 }
  461.                                                                 }
  462.                         }
  463. }
  464. /*??*/
  465. void write_ds(uchar add,uchar date)
  466. {
  467.         dscs=0;
  468.         dsas=1;
  469.         dsds=1;
  470.         dsrw=1;
  471.         P0=add;
  472.         dsas=0;
  473.         dsrw=0;
  474.         P0=date;
  475.         dsrw=1;
  476.         dsas=1;
  477.         dscs=1;
  478. }
  479. uchar read_ds(uchar add)
  480. {
  481.         uchar ds_date;
  482.         dscs=0;
  483.         dsas=1;
  484.         dsds=1;
  485.         dsrw=1;
  486.         P0=add;
  487.         dsas=0;
  488.         dsds=0;
  489.         P0=0xff;
  490.         ds_date=P0;
  491.         dsds=1;
  492.         dsas=1;
  493.         dscs=1;
  494.         return ds_date;
  495. }
  496. void set_time()
  497. {
  498.         write_ds(0,0);   //秒
  499.         write_ds(2,51);   //分
  500.         write_ds(4,12);   //时
  501.         write_ds(7,21);   //日
  502.         write_ds(8,03);   //月
  503.         write_ds(9,19);   //年
  504. }
  505. /*???*/
  506. void init()
  507. {
  508.         ledrw=0;
  509.         wela=0;
  510.         dula=0;
  511.         set_time();
  512.         
  513.   write_ds(0x0B,0x26);
  514.   write_ds(0x0A,0x20);        //打开振荡器并允许RTC计时
  515.   write_ds(0x0B,0x06);   //关闹钟
  516.   read_ds(0x0c);
  517.         
  518.   write_com(0x38);
  519.         write_com(0x0c);
  520.         write_com(0x06);
  521.   write_com(0x01);
  522.         for(num=0;num<16;num++)
  523.         {
  524.     write_date(table[num]);
  525.                 delay(5);
  526.         }
  527.         write_com(0x80+0x40);
  528.         for(num=0;num<16;num++)
  529.         {
  530.           write_date(table1[num]);
  531.                 delay(5);
  532.         }
  533. }

  534. void SendByte(unsigned char byte)
  535.         {
  536.     ES = 0;
  537.     SBUF = byte;
  538.     while(!TI);
  539.     TI = 0;
  540.     ES = 1;
  541. }
  542.         
  543. void SendData(unsigned char* bytes)
  544.         {
  545.     int i = 0;
  546.     for(i=0;i<4;i++)
  547.                         {
  548.         SendByte(bytes[i]);
  549.                                 Delay_1ms(1);
  550.       }
  551.   }

  552. void main()
  553. {
  554.         Com_Init();//串口初始化
  555.   init();
  556.         while(1)
  557.         {
  558.                 keyscan();
  559.                 if(flag==0)
  560.                 {
  561.                         miao=read_ds(0);
  562.                         fen=read_ds(2);
  563.                         shi=read_ds(4);
  564.                         ri=read_ds(7);
  565.                         yue=read_ds(8);
  566.                         nian=read_ds(9);
  567.                         write_sfm(8,miao);
  568.                         write_sfm(5,fen);
  569.                         write_sfm(2,shi);
  570.                         write_nyr(10,ri);
  571.                         write_nyr(7,yue);
  572.                         write_nyr(4,nian);
  573.                 }
  574.                 keyscan();
  575.     DHT11_receive();
  576.                 write_SHIDU(12,RH);
  577.                 write_WENDU(13,TH);
  578.                
  579.         }                        
  580. }



  581. /********************************************************************
  582. * 名称 : Com_Int()
  583. * 功能 : 串口中断子函数
  584. * 输入 : 无
  585. * 输出 : 无
  586. ***********************************************************************/
  587. void Com_Int() interrupt 4
  588. {        
  589.         if(RI == 1)   //当硬件接收到一个数据时,RI会置位
  590.         {
  591.                 RI = 0;         
  592.                 receive = SBUF ;
  593.         }
  594.         if(TI==0)
  595.         {
  596.                 TI=0;
  597.         }
  598.                 switch(receive)
  599.                 {               
  600.                         case 0x01:SendData(MP3data1);break;//播放
  601.                         case 0x02:SendData(MP3data2);break;
  602.                         case 0x03:SendData(MP3data3);break;
  603.                 }
  604. }
复制代码

全部资料51hei下载地址:
音乐蓝牙台灯.zip (107.35 KB, 下载次数: 24)
回复

使用道具 举报

ID:1 发表于 2019-4-5 02:32 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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