在做一个基于51单片机连接bt06蓝牙模块控制SG90舵机。 由于我买错舵机型号了买的360度的 不能像180度的可以有多种角度
只能顺时针或者逆时针 所以我就想到了用Delay延时函数来控制运行时间从而控制角度。
- 为什么我用独立按键测试舵机的时候就可以
-我先用单片机自带的串口和电脑通信试试 结果是可以运行但是会一直转我加的那个延时函数不起作用。
- 我又接上蓝牙模块试试,结果手机控制都没反应。我反复确认了接线没错,蓝牙模块和电脑也可以互传信息配置AT指令什么的。
卡两天了。b站 CSDN什么的都翻光了。
以下这3个是主要的函数, Delay延时函数是1ms的。
这是主函数
main.c
#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"
#include "UART.h"
//360度舵机
//0.5ms~1.5ms顺时针只是速度不同 3
//1.5ms~2ms逆针 5
sbit SG_PWM=P2^0; //宏定义引脚
unsigned int count=0; //计次
unsigned int PWM_count=0;
unsigned int NUM;
void main()
{
Timer0_Init();
UART_Init();
while(1)
{
// if(P3_1==0) //独立按键测试
// { Delay(20);while(P3_1==0);Delay(20);
// PWM_count=2;
// count=0;
// Delay(100);
// PWM_count=0;
// }
// if(P3_0==0)
// { Delay(20);while(P3_0==0);Delay(20);
// PWM_count=4;
// count=0;
// Delay(100);
// PWM_count=0;
//
// }
}
}
void Timer0_Routine() interrupt 1
{
TL0 = 0x33; //设置定时初始值
TH0 = 0xFE; //设置定时初始值
count++;
count%=40;
if(count<PWM_count)
{
SG_PWM=1;
}
else
{
SG_PWM=0;
}
}
void UART_Routine() interrupt 4
{
if(RI==1)
{
NUM=SBUF;
if(NUM==1)
{
PWM_count=2;
Delay(100);
}
}
if(NUM==2)
{
PWM_count=3;
}
RI=0;
}
串口函数
#include <REGX52.H>
//@brief 串口初始化 //4800bps@11.0592MHz
//@param 无
//@retval 无
void UART_Init(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设置定时初始值
TH1 = 0xFD; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
EA=1;
ES=1;
}
//@brief 串口发送一个字节数据
//@param Byte 要发送的一个字节数据
//@retval 无
void UART_BsendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;
}
定时器函数
#include <REGX52.H>
void Timer0_Init(void) //1毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x33; //设置定时初始值
TH0 = 0xFE; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}