#单片机同时控制舵机和电机
手机蓝牙可以与单片机实现通信
以下是程序,可以做到控制舵机左与复位,电机正反转
但无法控制舵机右转,删除电机代码后舵机恢复控制三个方向。
求解答
#include<reg52.h>
#include<intrins.h>
typedef unsigned int uint;
typedef unsigned char uchar ;
uchar R_data;
unsigned char count;
unsigned char num;
sbit model1 =P0^0;
sbit model2 =P0^1;
sbit model3 =P0^2;
sbit model4 =P0^3;
sbit pwm =P1^7;
bit R_flag=0;
uchar num_model=0;
void Uart_Init(void)
{
TMOD = 0x21; //定时器工作在定时器1的方式2
PCON = 0x00; //不倍频
SCON = 0x50; //串口工作在方式1,并且启动串行接收
TH1 = 0xFd; //设置波特率 9600
TL1 = 0xFd;
TR1 = 1; //启动定时器1
IE = 0x82;
TH0 = 0xfe;
TL0 = 0x33; //11.0592MZ晶振,0.5ms
TR0 = 1;
ES = 1; //开串口中断
EA = 1; //开总中断
}
void Uart_SendByte(uchar Byte)
{
SBUF = Byte;
while(!TI) //如果发送完毕,硬件会置位TI
{
_nop_();
}
}
void start()
{
switch(num_model)//根据不同的按钮启动不同的模式
{
case 1://后退
model1=1;
model2=0;
model3=1;
model4=0;
break;
case 2://前进
model1=0;
model2=1;
model3=0;
model4=1;
break;
case 0://停止
model1=0;
model2=0;
model3=0;
model4=0;
break;
}
}
void main()
{
Uart_Init();//初始化
while(1)
{
if(R_flag==1)//接收蓝牙信号
{
Uart_SendByte(R_data );
R_flag=0;
}
start();
}
}
void Uart_Int(void) interrupt 4
{
EA = 0;
if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
R_data= SBUF;
if(R_data==0x01)//右转模式
{
count=0;
num=4;
}
if(R_data==0x02)//左转模式
{
count=0;
num=2;
}
if(R_data==0x03)//直行
{
count=0;
num=3;
}
if(R_data==0x04)//前进
{
num_model=2;
}
if(R_data==0x05)//停止
{
num_model=0;
}
if(R_data==0x06)//后退
{
num_model=1;
}
RI = 0;
R_flag=1;
}
EA = 1;
}
void Time0_Int() interrupt 1 //定时器中断程序
{
TH0 = 0xfe;
TL0 = 0x33;
count++;
switch(num)
{
case 1:
pwm=1;
break;
case 2://左转
pwm=1;
if(count==3)
num=0;
break;
case 3://直行
pwm=1;
if(count==4)
num=0;
break;
case 4://右转
pwm=1;
if(count==5)
num=0;
break;
case 0://停止转动
pwm=0;
break;
}
}