下面是一款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);
}