蓝牙控制舵机开关灯(附源码)

蓝牙控制舵机开关灯(附源码),第1张


一、目标

1、控制两个舵机任意角度转动

2、当一个舵机转动时,另一个舵机抬起

3、舵机待机功能,加长电池续航

4、上锁功能,其他人连接蓝牙后,不输入正确密码无法控制

5、复位功能


二、材料准备

1、51单片机开发板

2、舵机两个

3、蓝牙模块一个(从机就好,蓝牙模块)

4、一些杜邦线


三、源码(C语言)

#include 
 
//=========================串口==========================
 
void UART_Init() //9600bps @12:F9 F9  11.0592:FA FA
{
    PCON |= 0x80;      //波特率加倍
    SCON |= 0x50;      //8位数据,可变波特率(模式选择)
    TMOD &= 0x0F;      //定时器1
    TMOD |= 0x20;      //八位自动重装模式
    TL1 = 0xFA;        //设置定时器1初始值,可去除?
    TH1 = 0xFA;        //设置定时器1重载值
    ET1 = 0;           //禁止定时器1中断
    TR1 = 1;
    EA = 1;
    ES = 1;
}
 
 
void UART_SendByte(unsigned char Byte)
{
    SBUF = Byte;
    while(TI == 0); //类似消抖?
    TI = 0; //由手册得知每次请求中断后必须置回1
}
 
//========================信号产生========================
 
unsigned char PWM_high1 = 5;
unsigned char PWM_high2 = 23;
unsigned char PWM_high_num1 = 0;
unsigned char PWM_high_num2 = 0;
 
void PWM()
{
    if(PWM_high_num1 <= PWM_high1)
    {
        P0_0 = 1;    //将电机的PWM线接到P0_0口
    }
    else
    {
        P0_0 = 0;    //限制高电平长度
    }
    if(PWM_high_num1 == 200)    //PWM需要的信号周期为20ms
    {
        PWM_high_num1 = 0;
    }
    //====================================================//
        if(PWM_high_num2 <= PWM_high2)
    {
        P0_1 = 1;    //将电机的PWM线接到P0_1口
    }
    else
    {
        P0_1 = 0;    //限制高电平长度
    }
    if(PWM_high_num2 == 200)    //PWM需要的信号周期为20ms
    {
        PWM_high_num2 = 0;
    }
 
}
 
//========================定时器设置=======================
 
void Timer0Init()        //100微秒@12:9C FF  11.0592:A4 FF
{
    TMOD &= 0xF0;        //设置定时器模式
    TMOD |= 0x01;        //设置定时器模式
    TL0 = 0xA4;        //设置定时初始值
    TH0 = 0xFF;        //设置定时初始值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    ET0 = 1;
    EA = 1;
    PT0 = 1;
}
 
unsigned char KeyNum = 0;
unsigned char lock = 1;    //上锁
 
void main()    //============主函数============
{
    Timer0Init();
    UART_Init();
    PWM_high2 = 23;
    PWM_high1 = 5;
    while(1)
    {
        if(KeyNum == 0x01 && lock % 2)
        {
            PWM_high2 = 23;
            PWM_high1 = 23;    //开灯
        }
        if(KeyNum == 0x02 && lock % 2)
        {
            PWM_high1 = 5;
            PWM_high2 = 5;     //关灯
        }
        if(KeyNum == 0x03 && lock % 2)
        {
            PWM_high2 = 23;
            PWM_high1 = 5;     //复位
        }
        if(KeyNum == 0xFF)
        {
            lock++;    //密码上锁
        }
        if(KeyNum == 0x04)
        {
            PWM_high2 = 0;    //待机模式
            PWM_high1 = 0;
        }
    }
}
 
//========================定时器0中断=========================
 
void Timer0_Rountine() interrupt 1
{
    TH0 = 0xFF;        //设置定时初始值
    TL0 = 0xA4;        //设置定时初始值
    PWM_high_num1++;
    PWM_high_num2++;
    PWM();
}
 
//========================串口中断============================
 
void UART_Routine() interrupt 4 //接收到数据跳到这执行
{
    if(RI == 1)
    {
        KeyNum = SBUF;
        UART_SendByte(SBUF);
        RI = 0;
    }
}

四、效果展示

基于51单片机的蓝牙控制舵机开关灯_哔哩哔哩_bilibili

 自学单片机有一个月了,想做点什么东西,代码不是很熟练,单片机也没有很熟,有什么问题希望有前辈多多指出,感谢大家的支持!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/564536.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-06
下一篇 2022-04-06

发表评论

登录后才能评论

评论列表(0条)

保存