基于51单片机的音乐蓝牙台灯,拥有音乐播放功能,手机SPF软件蓝牙控制功能,可实现手机控制播放,暂停,切换歌,按键同理,
实时检测温湿度,时间闹钟功能
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <math.h>
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- #define uchar unsigned char
- #define uint unsigned int
- uchar receive=0;
- int i=0;
- bit busy;
- bit qhgn=0; //切换功能标志位
- sbit dula=P2^6;
- sbit wela=P2^7;
- sbit leden=P3^4;
- sbit ledrs=P3^5;
- sbit ledrw=P3^6;
- sbit s0=P2^1; //按键
- sbit s1=P2^2;
- sbit s2=P2^4;
- sbit s3=P2^5;
- sbit s4=P1^1;
- sbit deng=P1^0; //播歌指示灯
- sbit dscs=P1^4; //ds12c887
- sbit dsas=P1^5;
- sbit dsrw=P1^6;
- sbit dsds=P1^7;
- sbit Data=P2^0; //DHT11
- void set_time();
- void write_ds(uchar add,uchar date);
- void SendData(unsigned char* bytes);
- void SendByte(unsigned char byte);
- uchar code MP3data1[4]={0xfd,0x02,0x01,0xdf}; //播放
- uchar code MP3data2[4]={0xfd,0x02,0x02,0xdf}; //暂停
- uchar code MP3data3[4]={0xfd,0x02,0x03,0xdf}; //切歌
- uchar code MP3data4[4]={0xfd,0x02,0x06,0xdf};//降低?
- //unsigned int MP3data5[6]={0xfd,0x04,0x41,0x00,0x01,0xdf};
- uchar num,count,shi,fen,miao,s0num,flag=0,nian,yue,ri;
- uint RH,TH;
- uchar code table[]=" 20 . . C";
- uchar code table1[]=" : : RH";
- uchar rec_dat[9]="12369566";
- void Delay20ms(unsigned int z)
- {
- unsigned int i, j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void Delay_1ms(int i)//1ms延时
- {
- int x,j;
- for(j=i;j>0;j--)
- for(x=110;x>0;x--);
- }
- /********************************************************************
- * 名称 : Com_Init()
- * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void Com_Init()
- {
- SCON = 0x50; //8???,?????
- TMOD = 0x20; //?????1?8???????
- TL1 = 0xfd; //??????
- TH1 = 0xfd;
- TR1 = 1;
-
- SM0=0;
- SM1=1;
- REN=1;
- EA=1;
- ES=1;
- }
- ///////////////////////////////////DHT11
- void DHT11_delay_us(uchar n)
- {
- while(--n);
- }
- void DHT11_delay_ms(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void DHT11_start()
- {
- Data=1;
- DHT11_delay_us(2);
- Data=0;
- DHT11_delay_ms(20);
- Data=1;
- DHT11_delay_us(30);
- }
- uchar DHT11_rec_byte()
- {
- uchar i,dat=0;
- for(i=0;i<8;i++)
- {
- while(!Data);
- DHT11_delay_us(8);
- dat<<=1;
- if(Data==1)
- dat+=1;
- while(Data);
- }
- return dat;
- }
- void DHT11_receive()
- {
- uchar R_H,R_L,T_H,T_L,revise;
- DHT11_start();
- if(Data==0)
- {
- while(Data==0);
- DHT11_delay_us(40);
- R_H=DHT11_rec_byte();
- R_L=DHT11_rec_byte();
- T_H=DHT11_rec_byte();
- T_L=DHT11_rec_byte();
- revise=DHT11_rec_byte();
- DHT11_delay_us(25);
- if((R_H+R_L+T_H+T_L)==revise)
- {
- RH=R_H|R_L;
- TH=T_H|T_L;
- }
- }
- }
- ///////////////////////////////LCD
- void delay(uchar z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(uchar com)
- {
- ledrs=0;
- leden=1;
- delay(5);
- P0=com;
- delay(5);
- leden=0;
- }
- void write_date(uchar date)
- {
- ledrs=1;
- leden=1;
- delay(5);
- P0=date;
- delay(5);
- leden=0;
- }
- void write_sfm(uchar add,date)
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- write_com(0x80+0x40+add);
- write_date(0x30+shi);
- write_date(0x30+ge);
- }
- void write_nyr(uchar add,uchar date)
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- write_com(0x80+add);
- write_date(0x30+shi);
- write_date(0x30+ge);
- }
- void write_SHIDU(unsigned char add,unsigned char date)
- {
- unsigned char shi,ge;
- shi=date/10;
- ge=date%10;
- write_com(0x80+0x40+add);
- write_date(0x30+shi);
- write_date(0x30+ge);
- }
- void write_WENDU(unsigned char add,unsigned char date)
- {
- unsigned char shi,ge;
- shi=date/10;
- ge=date%10;
- write_com(0x80+add);
- write_date(0x30+shi);
- write_date(0x30+ge);
- }
- /////////////////////////////按键
- void keyscan()
- {
- if(qhgn==0) /////////////////改时间
- {
- if(s0==0) ////移动光标
- {
- delay(2);
- if(s0==0)
- {
- s0num++;
- while(!s0);
- }
- }
- if(s3==0)
- {
- delay(1);
- if(s3==0)
- {
- if(s0num>=1)
- s0num--;
- while(!s3);
- }
- }
-
- if(s0num==1) //////光标位置
- {
- flag=1;
- write_com(0x80+0x40+9);
- write_com(0x0f);
- }
- if(s0num==2)
- {
- write_com(0x80+0x40+6);
- write_com(0x0f);
- }
- if(s0num==3)
- {
- write_com(0x80+0x40+3);
- write_com(0x0f);
- }
- if(s0num==4)
- {
- write_com(0x80+11);
- write_com(0x0f);
- }
- if(s0num==5)
- {
- write_com(0x80+8);
- write_com(0x0f);
- }
- if(s0num==6)
- {
- write_com(0x80+5);
- write_com(0x0f);
- }
-
- if(s0num==7) ///重载时间
- {
- s0num=0;
- write_com(0x0c);
- flag=0;
- write_ds(0,miao);
- write_ds(2,fen);
- write_ds(4,shi);
- write_ds(7,ri);
- write_ds(8,yue);
- write_ds(9,nian);
- }
-
- if(s0num!=0) //////修改时间
- {
- if(s1==0)
- {
- delay(2);
- if(s1==0)
- {
- while(!s1);
- if(s0num==1)
- {
- miao++;
- if(miao==60)
- miao=0;
- write_sfm(8,miao);
- write_com(0x80+0x40+9);
- }
- if(s0num==2)
- {
- fen++;
- if(fen==60)
- fen=0;
- write_sfm(5,fen);
- write_com(0x80+0x40+6);
- }
- if(s0num==3)
- {
- shi++;
- if(shi==24)
- shi=0;
- write_sfm(2,shi);
- write_com(0x80+0x40+3);
- }
- if(s0num==4)
- {
- ri++;
- if(ri==31)
- ri=1;
- write_nyr(10,ri);
- write_com(0x80+11);
- }
- if(s0num==5)
- {
- yue++;
- if(yue==12)
- yue=1;
- write_nyr(7,yue);
- write_com(0x80+8);
- }
- if(s0num==6)
- {
- nian++;
- if(nian==99)
- nian=0;
- write_nyr(4,nian);
- write_com(0x80+5);
- }
- }
- }
- if(s2==0)
- {
- delay(2);
- if(s2==0)
- {
- while(!s2);
- if(s0num==1)
- {
- if(miao==0)
- miao=60;
- miao--;
- write_sfm(8,miao);
- write_com(0x80+0x40+9);
- }
- if(s0num==2)
- {
- if(fen==0)
- fen=60;
- --fen;
- write_sfm(5,fen);
- write_com(0x80+0x40+6);
- }
- if(s0num==3)
- {
- if(shi==0)
- shi=24;
- --shi;
- write_sfm(2,shi);
- write_com(0x80+0x40+3);
- }
- if(s0num==4)
- {
- if(ri==0)
- ri=31;
- ri--;
- write_nyr(10,ri);
- write_com(0x80+11);
- }
- if(s0num==5)
- {
- if(yue==0)
- yue=12;
- yue--;
- write_nyr(7,yue);
- write_com(0x80+8);
- }
- if(s0num==6)
- {
- if(nian==0)
- nian=99;
- nian--;
- write_nyr(4,nian);
- write_com(0x80+5);
- }
- }
- }
- }
- if(s4==0) ///切换按键功能
- {
- delay(5);
- if(s4==0)
- {
- write_com(0x80+0x40);
- write_date('M');
- qhgn=1;
- while(!s4);
- }
- }
- }
-
-
- if(qhgn==1) /////////////////按键切歌
- {
- if(s0==0) ////播放
- {
- delay(2);
- if(s0==0)
- {
- while(!s0);
- deng=1;
- for(i=0;i<4;i++)
- {
- SendData(MP3data1);
- Delay20ms(2);
- }
-
- }
- }
- if(s1==0) ////暂停
- {
- delay(2);
- if(s1==0)
- {
- while(!s1);
- deng=0;
- for(i=0;i<4;i++)
- {
- SendData(MP3data2);
- Delay20ms(2);
- }
-
- }
- }
- if(s2==0) ////切歌
- {
- delay(2);
- if(s2==0)
- {
- while(!s2);
- for(i=0;i<4;i++)
- {
- SendData(MP3data3);
- Delay20ms(2);
- }
-
- }
- }
- if(s3==0) ////降低音量
- {
- delay(2);
- if(s3==0)
- {
- while(!s3);
- for(i=0;i<4;i++)
- {
- SendData(MP3data4);
- Delay20ms(2);
- }
-
- }
- }
-
- if(s4==0) ///切换按键功能
- {
- delay(5);
- if(s4==0)
- {
- while(!s4);
- write_com(0x80+0x40);
- write_date(' ');
- qhgn=0;
-
- }
- }
- }
- }
- /*??*/
- void write_ds(uchar add,uchar date)
- {
- dscs=0;
- dsas=1;
- dsds=1;
- dsrw=1;
- P0=add;
- dsas=0;
- dsrw=0;
- P0=date;
- dsrw=1;
- dsas=1;
- dscs=1;
- }
- uchar read_ds(uchar add)
- {
- uchar ds_date;
- dscs=0;
- dsas=1;
- dsds=1;
- dsrw=1;
- P0=add;
- dsas=0;
- dsds=0;
- P0=0xff;
- ds_date=P0;
- dsds=1;
- dsas=1;
- dscs=1;
- return ds_date;
- }
- void set_time()
- {
- write_ds(0,0); //秒
- write_ds(2,51); //分
- write_ds(4,12); //时
- write_ds(7,21); //日
- write_ds(8,03); //月
- write_ds(9,19); //年
- }
- /*???*/
- void init()
- {
- ledrw=0;
- wela=0;
- dula=0;
- set_time();
-
- write_ds(0x0B,0x26);
- write_ds(0x0A,0x20); //打开振荡器并允许RTC计时
- write_ds(0x0B,0x06); //关闹钟
- read_ds(0x0c);
-
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- for(num=0;num<16;num++)
- {
- write_date(table[num]);
- delay(5);
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_date(table1[num]);
- delay(5);
- }
- }
- void SendByte(unsigned char byte)
- {
- ES = 0;
- SBUF = byte;
- while(!TI);
- TI = 0;
- ES = 1;
- }
-
- void SendData(unsigned char* bytes)
- {
- int i = 0;
- for(i=0;i<4;i++)
- {
- SendByte(bytes[i]);
- Delay_1ms(1);
- }
- }
- void main()
- {
- Com_Init();//串口初始化
- init();
- while(1)
- {
- keyscan();
- if(flag==0)
- {
- miao=read_ds(0);
- fen=read_ds(2);
- shi=read_ds(4);
- ri=read_ds(7);
- yue=read_ds(8);
- nian=read_ds(9);
- write_sfm(8,miao);
- write_sfm(5,fen);
- write_sfm(2,shi);
- write_nyr(10,ri);
- write_nyr(7,yue);
- write_nyr(4,nian);
- }
- keyscan();
- DHT11_receive();
- write_SHIDU(12,RH);
- write_WENDU(13,TH);
-
- }
- }
- /********************************************************************
- * 名称 : Com_Int()
- * 功能 : 串口中断子函数
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void Com_Int() interrupt 4
- {
- if(RI == 1) //当硬件接收到一个数据时,RI会置位
- {
- RI = 0;
- receive = SBUF ;
- }
- if(TI==0)
- {
- TI=0;
- }
- switch(receive)
- {
- case 0x01:SendData(MP3data1);break;//播放
- case 0x02:SendData(MP3data2);break;
- case 0x03:SendData(MP3data3);break;
- }
- }
复制代码
全部资料51hei下载地址:
音乐蓝牙台灯.zip
(107.35 KB, 下载次数: 24)
|