有3个明显的问题:1,你的程序已经开放了串口中断EA=1;ES = 1,为什么还用查询的方式读取串口数据?这样,蓝牙模块向单片机发送数据,单片机的程序就会发生中断,你的程序没有对中断进行任何处理,怎能不出错呢!2, init();while(1){ ;这里不应该有这个分号3,你用uint定义了ma,mb,mc,然后ma = SBUF;switch(ma),从串口接收的是字符类型数据,而你定义的uint类型的ma是错误的,而应该是uchar ma。你的程序这样修改后试试:#include//#include#define uchar unsigned char#define uint unsigned intuchar ma;//这样修改uint mb,mc;sbit led1 = P0^0 ;//1sbit led2 = P0^1 ;//2sbit led3 = P0^2 ;//3sbit led4 = P0^3 ;//4sbit led5 = P0^4 ;//5sbit led6 = P0^5 ;//6sbit led7 = P0^6 ;//7sbit led8 = P0^7 ;//8void init(){TMOD=0x20;//设置定时器1为工作方式2SCON=0x50;TH1=0xfd;TL1=0xfd;TR1=1;EA=0;//关闭全局中断ES=0;//关闭串口中断}void main(){init();while(1){ //去掉这里的分号while(RI==0);RI=0;ma=SBUF;switch(ma){case '1':led1=0;break; //1case '2':led2=0;break; //2case '3':led3=0;break; //3case '4':led4=0;break; //4case '5':led5=0;break; //5case '6':led6=0;break; //6case '7':led7=0;break; //7case '8':led8=0;break; //8case 'a':led1=1;break; //停case 'b':led2=1;break; //停case 'c':led3=1;break; //停case 'd':led4=1;break; //停case 'e':led5=1;break; //停case 'f':led6=1;break; //停case 'g':led7=1;break; //停case 'h':led8=1;break; //停}}}先这样试试,有问题继续追问。