51单片机与蓝牙模块的串口通信.docx
《51单片机与蓝牙模块的串口通信.docx》由会员分享,可在线阅读,更多相关《51单片机与蓝牙模块的串口通信.docx(15页珍藏版)》请在冰豆网上搜索。
51单片机与蓝牙模块的串口通信
51单片机与蓝牙模块的串口通信(共11页)
#include<>
#include<>
#include<>
#include""
#include""
#defineuintunsignedint
#defineucharunsignedchar
#defineNop()_nop_()
sbitP10=P1^0;/*定义独立对地按键端口*/
sbitP11=P1^1;/*定义独立对地按键端口*/
sbitP12=P1^2;/*定义独立对地按键端口*/
sbitP13=P1^3;/*定义独立对地按键端口*/592MHz
TL1=0XFD;
TH0=0;
TL0=0;
TR1=1;//timer1run
SCON=0x50;//UART为模式1,8位数据,允许接收
PCON|=0x80;//SMOD=1;Baud加倍
IE|=0x90;//EnableSerialInterrupt
TR1=1;//timer1run
EA=1;
ET0=1;
}
voidsend(ucharcc)
{
SBUF=cc;
while(TI==0);
TI=0;
}
voidsend_f(ucharccc)
{
send('');
send('<');
send('F');
send(ccc);
send('>');
}
voidcall_out()
{
uchari;
send('(');
for(i=0;i{
send(CallOut_Num[i]);
}
send(')');
m=0;
}
voidinterrupt_pro()
{
string_write(0,1,reci_buff);
lcd_char_write(14,1,mun_to_char[temp/10]);//fortest
lcd_char_write(15,1,mun_to_char[temp%10]);//fortest
if(temp==')')CallIn_flag=1;//|temp=='$'|temp=='%'
elseif(temp=='$'){lcd_delay(5);//if(temp=='$')
string_write(0,0,clr);
string_write(0,0,reci_buff);}
elseswitch(temp)
{
case'X':
string_write(0,0,clr);string_write(0,0,"Disconnet");break;
case'P':
string_write(0,0,clr);string_write(0,0,"Pairing");break;
case'S':
string_write(0,0,clr);string_write(0,0,"Linking");break;
case'O':
string_write(0,0,clr);string_write(0,0,"Connect");break;
case'R':
string_write(0,0,clr);string_write(0,0,"Ring");
//string_write(5,0,CallIn_Num);
break;
case'D':
string_write(0,0,clr);string_write(0,0,"Ding");
//string_write(5,0,CallIn_Num);
break;
case'I':
string_write(0,0,clr);string_write(0,0,"Talking");break;
case'L':
string_write(0,0,clr);string_write(0,0,"Callfailed");break;
case'A':
string_write(0,0,clr);string_write(0,0,"MP3playing");break;
case'E':
string_write(0,0,clr);string_write(0,0,"Callrelease");break;
case'H':
string_write(0,0,clr);string_write(0,0,"A2DPconnected");break;
case'V':
string_write(0,0,clr);string_write(0,0,"A2DPdisconnected");break;
//case')':
x=0;break;//for(i=0;i<16;i++)lcd_char_write(i,1,lcd_table[i]);/*显示标题*/
default:
break;
}
//temp='';//fortest
}
voidkey_pro()
{
uchari,key_value_buff;
key_value_buff=key_scan();
if(key_value_buff!
=0)//有按键动作
{
switch(key_value_buff)/*显示按键*/
{
case0x18:
//0
if(call_flag){CallOut_Num[m]='0';lcd_char_write(m+2,0,'0');m++;}
elseif(!
shift_flag)
{send('');send('A');//Answer
lcd_char_write(3,1,'0');//可以不显示出来
lcd_char_write(8,1,'A');
lcd_char_write(9,1,'');
}
else
{send_f('P');
lcd_char_write(3,1,'0');
lcd_char_write(8,1,'F');
lcd_char_write(9,1,'P');
}
break;
case0x28:
//1
if(call_flag){CallOut_Num[m]='1';lcd_char_write(m+2,0,'1');m++;}
elseif(!
shift_flag)
{send('');send('H');//Hangup
lcd_char_write(3,1,'1');
lcd_char_write(8,1,'H');
lcd_char_write(9,1,'');
}
else
{send_f('L');
lcd_char_write(3,1,'1');
lcd_char_write(8,1,'F');
lcd_char_write(9,1,'L');
}
break;
case0x48:
//2
if(call_flag){CallOut_Num[m]='2';lcd_char_write(m+2,0,'2');m++;}
elseif(!
shift_flag)
{send('');send('R');//Reject
lcd_char_write(3,1,'2');
lcd_char_write(8,1,'R');
lcd_char_write(9,1,'');
}
else
{send_f('U');
lcd_char_write(3,1,'2');
lcd_char_write(8,1,'F');
lcd_char_write(9,1,'U');
}
break;
case0x88:
//3
if(call_flag){CallOut_Num[m]='3';lcd_char_write(m+2,0,'3');m++;}
elseif(!
shift_flag)
{send('');send('L');//Redial
lcd_char_write(3,1,'3');
lcd_char_write(8,1,'L');
lcd_char_write(9,1,'');
}
else
{send_f('F');
lcd_char_write(3,1,'3');
lcd_char_write(8,1,'F');
lcd_char_write(9,1,'F');
}
break;
case0x14:
//4
if(call_flag){CallOut_Num[m]='4';lcd_char_write(m+2,0,'4');m++;}
elseif(!
shift_flag)
{send('');send('U');//Volup
lcd_char_write(3,1,'4');
lcd_char_write(8,1,'U');
lcd_char_write(9,1,'');
}
else
{send_f('B');
lcd_char_write(3,1,'4');
lcd_char_write(8,1,'F');
lcd_char_write(9,1,'B');
}
break;
case0x24:
//5
if(call_flag){CallOut_Num[m]='5';lcd_char_write(m+2,0,'5');m++;}
elseif(!
shift_flag)
{send('');send('D');//Voldown
lcd_char_write(3,1,'5');
lcd_char_write(8,1,'D');
lcd_char_write(9,1,'');
}
else
{send_f('S');
lcd_char_write(3,1,'5');
lcd_char_write(8,1,'F');
lcd_char_write(9,1,'S');
}
break;
case0x44:
//6
if(call_flag){CallOut_Num[m]='6';lcd_char_write(m+2,0,'6');m++;}
elseif(!
shift_flag)
{send('');send('0');//
lcd_char_write(3,1,'6');
lcd_char_write(8,1,'0');
lcd_char_write(9,1,'');
}
else
{send('');send('G');send('x');
lcd_char_write(3,1,'6');
lcd_char_write(8,1,'G');
lcd_char_write(9,1,'x');
}
break;
case0x84:
//7
if(call_flag){CallOut_Num[m]='7';lcd_char_write(m+2,0,'7');m++;}
elseif(!
shift_flag)
{send('');send('V');//Voicedial
lcd_char_write(3,1,'7');
lcd_char_write(8,1,'V');
lcd_char_write(9,1,'');
}
else
{send('');send('n');
lcd_char_write(3,1,'7');
lcd_char_write(8,1,'n');
lcd_char_write(9,1,'');
}
break;
case0x12:
//8
if(call_flag){CallOut_Num[m]='8';lcd_char_write(m+2,0,'8');m++;}
elseif(!
shift_flag)
{send('');send('Z');//Calltransfer
lcd_char_write(3,1,'8');
lcd_char_write(8,1,'Z');
lcd_char_write(9,1,'');
}
else
{send('');send('p');
lcd_char_write(3,1,'8');
lcd_char_write(8,1,'p');
lcd_char_write(9,1,'');
}
break;
case0x22:
//9
if(call_flag){CallOut_Num[m]='9';lcd_char_write(m+2,0,'9');m++;}
elseif(!
shift_flag)
{send('');send('Q');//Disconnect
lcd_char_write(3,1,'9');
lcd_char_write(8,1,'Q');
lcd_char_write(9,1,'');
}
else
{send('');send('z');//Calltransfer
lcd_char_write(3,1,'9');
lcd_char_write(8,1,'z');
lcd_char_write(9,1,'');
}
break;
case0x42:
//A*
if(call_flag){CallOut_Num[m]='*';lcd_char_write(m+2,0,'*');m++;}
else
{send('');send('Y');//Version
lcd_char_write(3,1,'A');
lcd_char_write(8,1,'Y');
lcd_char_write(9,1,'');}
break;
case0x82:
//B#
if(call_flag){CallOut_Num[m]='#';lcd_char_write(m+2,0,'#');m++;}
else
{send('');send('T');//Setautoanswer
lcd_char_write(3,1,'B');
lcd_char_write(8,1,'T');
lcd_char_write(9,1,'');}
break;
case0x11:
if(!
call_flag)
{send('');send('t');//Clrautoanswer
lcd_char_write(3,1,'C');
lcd_char_write(8,1,'t');
lcd_char_write(9,1,'');}
break;
case0x21:
if(!
call_flag){
send('');send('M');//Setvolumeset
lcd_char_write(3,1,'D');
lcd_char_write(8,1,'M');
lcd_char_write(9,1,'');}break;
case0x41:
if(!
call_flag){
send('');send('m');//Clrvolumeset
lcd_char_write(3,1,'E');
lcd_char_write(8,1,'m');
lcd_char_write(9,1,'');}break;
case0x81:
if(!
call_flag){
send('');send('N');//Setautolink
lcd_char_write(3,1,'F');
lcd_char_write(8,1,'N');
lcd_char_write(9,1,'');}break;
default:
break;
}
while(key_scan()!
=0);/*等待按键放开*/
}
scan_key_port=0xff;/*释放矩阵按键端口*/
delay_1ms(5);
if((P10==0)||(P11==0)||(P12==0)||(P13==0))
{
delay_1ms(10);/*延时去抖动*/
if((P10==0)||(P11==0)||(P12==0)||(P13==0))
{
if(P10==0){lcd_char_write(3,1,'a');send('');send('S');lcd_char_write(8,1,'S');}//Link
elseif(P11==0)
{
call_flag=~call_flag;
if(call_flag){string_write(0,0,clr);lcd_char_write(0,0,0);}//显示拨号状态符号
else{for(i=0;i<16;i++)CallOut_Num[i]='';string_write(0,0,clr);string_write(3,0,"Welcome!
");}
}
elseif(P12==0){lcd_char_write(3,1,'c');send('');send('P');lcd_char_write(8,1,'P');}//Pair
elseif(P13==0)
{
shift_flag=~shift_flag;
if(shift_flag)lcd_char_write(15,0,'s');
elselcd_char_write(15,0,'');
}
while((P10==0)||(P11==0)||(P12==0)||(P13==0));/*等待按键放开*/
}
}
delay_1ms(5);
}
voidTimer0Interrupt()interrupt1//定时器0中断服务函数
{
TH0=0;
TL0=0;
TR0=0;if(reci_flag1==1)reci_flag=1;
z=0;
if(call_flag==1)time++;
}
//串口接收中断函数
voidserial()interrupt4using3
{
if(RI)
{
RI=0;
temp=SBUF;//if(temp!
=10)
reci_buff[z]=temp;
z++;if(z>15)z=0;
TR0=1;
reci_flag1=1;
}
}
/*voidserial()interrupt4using3//串口接收字符串
{
if(RI)
{
RI=0;
temp=SBUF;
if(temp=='R')
{
CallIn_flag=1;
}
reci_flag=1;
}
}
boolRIwait(uinti)
{//等待时间到,返回1
while(i--){if(RI)return0;};//等待时间内RI=1,返回0
return1;//串行接收停止位的中间时,RI置1
}
ucharReadSbuf(void)
{
//从SBUF读数据,可得到接收的数据
ucharTmpSbuf;
TmpSbuf=SBUF;
SCON=0x50;
returnTmpSbuf;
}
voidComService(void)interrupt4
{
ucharTmpSBUF,i=0;
EA=0;
ES=0;
if(RIwait(RiWaitTimer))gotoExitCom;
switch(ReadSbuf())
{
case'R':
//currentcall
for(i=0;i<20;i++)
{
if(RIwait(RLongiWaitTimer))break;//gotoExitCom;
[i]=ReadSbuf();
TelTmpNum[i]=[i];//newaddif[i]=='\r')break;
}
[i]='\n';
TelTmpNum[i]='\n';//newaddif(StandbyStatus==IsStandby)
{
=IR_BLUETOOTHPOWERON;
}
else
{
if==BlueToothWorkInCalling)
=IR_BLUE