单片机89C52通过蓝牙HC-06控制两台9g舵机

2015-07-08 浏览:1053
单片机89C52通过蓝牙HC-06控制两台9g舵机
评论:(0)复制地址

前段时间一时兴起和小伙伴准备搞个智能手机支架玩玩,然后把大学被遗忘的嵌入式拾起进行了一番学习,考虑产品功能和现有材料就选用了STC89C52作为控制芯片,利用蓝牙HC-06作为无线控制传输方式,采用9g舵机作为机械动力。手机上装上蓝牙串口助手就可控制,支架是我特意学习solidworks来设计打印的(3D打印还真贵)。废话有点多了哈,下面直接贴源码吧


#include <reg52.h>
#include <intrins.h>
unsigned char tmp;
unsigned char count1;
unsigned char count2;
unsigned int jd1;//角度标识
unsigned int jd2;
unsigned int c=0;
bit flag_REC=0;
sbit led1=P0^0;                     //指示灯0
sbit led2=P0^1;                     //指示灯1
sbit led3=P0^3;                     //指示灯3
sbit pwm1=P1^3; //PWM信号输出
sbit pwm2=P1^5;
void init();   //串口初始化
void send(unsigned char a);     //单字节发送函数
void ctrl(); //接收处理函数
void time0_init();
void main()
{
    jd1=12;
    count1=0;
    jd2=9;
    count2=0;
    time0_init();
    init();
    while(1){
        if(flag_REC==1)
        {
            flag_REC=0;
            ctrl();
        }
    }
}
void time0_init()//定时器初始化
{
    TMOD|=0x01;
    TH0=0xff;
    TL0=0x8d;
    TR0=1;
    EA=1;
    ET0=1;
}
void time0_Int() interrupt 1 { //中断程序
    TH0=0xff;
    TL0=0x8d;
    if(count1<jd1)//判断 0.125ms 次数是否小于角度标识
        pwm1=1;//确实小于PWM输出高电平
    else
        pwm1=0;//大于则输出低电平
    if(count2<jd2)
        pwm2=1;
    else
        pwm2=0;
    count1=(count1+1);//0.125ms次数加一
    count1=count1%160;//次数始终保持为160 即保持周期为20ms
    count2=(count2+1);
    count2=count2%160;
}
void init()        //串口初始化
{
    ES=0;
    SCON=0x50;
    TMOD|=0x20;   //定时器1工作于方式2,8位自动重载模式,用于产生波特率
    TH1=TL1=0xFD;   //波特率9600 
    PCON&=0x7f;   //波特率不倍增 
    TR1 = 1;
    TI=0;
    RI=0;
    ES=1;
    led1=0;      //初始化设置3个指示灯全亮
    led2=0;
    led3=0;
}
void sint() interrupt 4      //中断接收3个字节
{ 
    if(RI)           //是否接收中断
    {
        RI=0;
        tmp=SBUF;
        flag_REC=1;
    }
}
void send(unsigned char a)
{
    TI=0;
    SBUF=a;
    while(TI==0);
    TI=0;
    if(c%2)  //发送指示灯标志,每接收一次,此灯亮灭交替
    led3=1;
    else
    led3=0;
    c++;
}
void ctrl()
{
    switch(tmp) {
        case 0x0A:
            led1=1;     //收到字符0A,指示灯0灭   记得手机上勾选HEX发送
            jd1++;//角度标识加1
            count1=0; //按键按下 则20ms 周期重新开始
            if(jd1==19)
            jd1=18;//已经是180 则保持
            send(tmp);
            send(jd1);
            break;
        case 0x0B:                                         //收到字符0B,指示灯1灭
            led2=1;
            jd1--;//角度标识减1
            count1=0;
            if(jd1==5)
            jd1=6;
            send(tmp);
            send(jd1);
            break;
        case 0x0C:
            led1=0;
            led2=0;
            jd2++;
            count2=0;
            if(jd2==19)
            jd2=18;
            send(tmp);
            send(jd2);
            break;
        case 0x0D: 
            led1=1;
            led2=1;
            jd2--;
            count2=0;
            if(jd2==5)
            jd2=6;
            send(tmp);
            send(jd2);
            break;
        default:                   //其他,灯全灭
            led1=1;
            led2=1;
            led3=1;
            send(tmp);
    }
}

后面再准备装两轮子,控制轮子的代码我先整理整理


对了,关于接线我啰嗦几句,蓝牙RXD接单片机的TXD,蓝牙的TXD接单片机的RXD,还有特别重要的一点:蓝牙模块和单片机模块要共地(这个特别重要)

评论:(0)复制地址
发布:zpblog | 分类:Other | Tags:单片机 蓝牙

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。