背景图片
Android手机通过蓝牙模块与单片机通信单片机程序 - 啊和的博客

Android手机通过蓝牙模块与单片机通信单片机程序 - 啊和的博客 Android手机通过蓝牙模块与单片机通信单片机程序 - 啊和的博客

Android手机通过蓝牙模块与单片机通信单片机程序

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

评论 0

挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
提交评论

清空信息
关闭评论