下面是一款Android手机通过蓝牙模块与单片机通信单片机程序,单片机可以使用以下51单片机:AT89C51,AT89C52,AT89S51,AT89S52,STC89C52RC,下面是单片机程序。 #include“reg52.h“ #include “intrins.h“ unsigned char tmp; unsigned int c=0; sbitled1=P2^0;//指示灯0 sbitled2=P2^1;//指示灯1 sbitled3=P2^3;//指示灯3 voidinit();//串口初始化 voidsend(unsignedchara);//单字节发送函数 voidctrl();//接收处理函数 voidmain() { init(); while(1) { if(RI==1)//是否有数据到来 { RI=0; tmp=SBUF;//暂存接收到的数据 ctrl(); } } } voidinit()//串口初始化 { ES=0;//关中断 SCON=0x50;//REN=1允许串行接受状态,串口工作模式1, //10位UART(1位起始位,8位数据位,1位停止位,无奇偶校验),波特率可变 TMOD=0x20;//定时器1工作于方式2,8位自动重载模式,用于产生波特率 TH1=TL1=0xFD;//波特率9600(本次测试采用晶振为11.0592) PCON&=0x7f;//波特率不倍增 TR1=1;//定时器1开始工作,产生波特率 //发送标志位置0 TI=0;//接收标志位置0 RI=0; //EA=0; ES=1; led1=0;//初始化设置3个指示灯全亮 led2=0; led3=0; } voidsend(unsigned char a)//单字节数据发送 {//注意:若单片机TXD(P3.1)无上拉能力,必须在P3.1端接上拉电阻。本次测试需要接上拉电阻 TI=0; SBUF=a; while(TI==0); TI=0; if(c%2)//发送指示灯标志,每接收一次,此灯亮灭交替 led3=1; else led3=0; c++; } voidctrl()//接收处理函数 { switch(tmp) { case'1': led1=1;//收到字符1,指示灯0灭 send(tmp); break; case'2'://收到字符2,指示灯1灭 led2=1; send(tmp); break; case'3'://收到字符3,指示灯0、1亮 led1=0; led2=0; send(tmp); break; case'4'://收到字符4,指示灯0、1灭 led1=1; led2=1; send(tmp); break; case'5'://收到字符5,指示灯3亮 led3=0; send(tmp); break; default://其他,灯全灭 led1=1; led2=1; led3=1; send(tmp); } } 蓝牙遥控小车程序 #include ’reg52.h‘ #define uchar unsigned char #define uint unsigned int sbit IN1 = P1^2; //为1 左电机反转 sbit IN2 = P1^3; //为1 左电机正转 sbit IN3 = P1^6; //为1 右电机正转 sbit IN4 = P1^7; //为1 右电机反转 sbit EN1 = P1^4; //为1 左电机使能 sbit EN2 = P1^5; //为1 右电机使能 sbit key_s2 = P2^1; sbit key_s3 = P2^0; sbit led1 = P0^1; //sbit led2 = P0^3; #define left_motor_en EN1 = 1 //左电机使能 #define left_motor_stops EN1 = 0 //左电机停止 #define right_motor_en EN2 = 1 //右电机使能 #define right_motor_stops EN2 = 0 //右电机停止 #define left_motor_go IN1 = 0, IN2 = 1//左电机正传 #define left_motor_back IN1 = 1, IN2 = 0//左电机反转 #define right_motor_go IN3 = 1, IN4 = 0//右电机正传 #define right_motor_back IN3 = 0, IN4 = 1//右电机反转 void delay(uint z) { uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); } unsigned char pwm_left_val = 0;//左电机占空比值 取值范围0-170,0最快 unsigned char pwm_right_val = 0;//右电机占空比值取值范围0-170 ,0最快 unsigned char pwm_t;//周期 //小车初始化 void Che_init() { TMOD |= 0x02;//8位自动重装模块 TH0 = 220; TL0 = 220;//11.0592M晶振下占空比最大比值是256,输出100HZ TR0 = 1;//启动定时器0 ET0 = 1;//允许定时器0中断 EA = 1;//总中断允许 } //蓝牙初始化 void UART_INIT() { SM0 = 0; SM1 = 1;//串口工作方式1 REN = 1;//允许串口接收 EA = 1;//开总中断 ES = 1;//开串口中断 TMOD = 0x20;//8位自动重装模式 TH1 = 0xfd; TL1 = 0xfd;//9600波特率 TR1 = 1;//启动定时器1 } //小车前进 void forward() { ET0 = 1; left_motor_go; //左电机前进 right_motor_go; //右电机前进 } //小车左转 void left() { ET0 = 1; delay(100); left_motor_back; right_motor_go; delay(700); forward(); } //小车右转 void right() { ET0 = 1; left_motor_go; right_motor_back; } //小车后退 void back() { ET0 = 1; left_motor_back; right_motor_back; } //小车停止 void stop() { ET0 = 0; EN1 = 0; EN2 = 0; } //定时器0中断 void timer0() interrupt 1 { pwm_t++; if(pwm_t == 255) pwm_t = EN1 = EN2 = 0; if(pwm_left_val == pwm_t) EN1 = 1; if(pwm_right_val == pwm_t) EN2 = 1; } //串口中断 void UART_SER() interrupt 4 { if(RI) { RI = 0;//清除接收标志 switch(SBUF) { case 0x41: forward(); break;//前进 case 0x42: back(); break;//停止 case 0x43: left(); break;//左转 case 0x44: right(); break;//右转 case 0x45: stop(); break;//停止 case 0x31: led1 = 0; break;//右转 case 0x32: P0 = 0; break;//停止 case 0x33: led1 = 1; break;//右转 case 0x34: P0 = 0xff; break;//停止 } } } void main() { UART_INIT();//串口初始化 Che_init(); while(1); }