标题:
51单片机串口控制舵机,出现诡异问题。大佬帮看看?
[打印本页]
作者:
完后余生9375
时间:
2020-3-29 14:48
标题:
51单片机串口控制舵机,出现诡异问题。大佬帮看看?
用串口控制舵机的时候会出现一下情况。
1.发出90度指令后,会自动回到45度。
2.发送指令偶尔不听使唤。不响应。
3.发送太快舵机就再也不转了。
哪个大佬帮忙看看?
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//变量
uchar buf;
uchar sending = 0;
uint cmd = 1;//串口收到的命令是否已经处理
//L298N控制电机
sbit IN1 = P1^1;
sbit IN2 = P1^2;
//舵机控制
sbit SG_PWM=P1^0;
uchar count=0;
uchar cycle_count = 0;
uchar PWM_count=2; //1--0度,2--45度,3--90度,4--135度,5--180度
//esp8266控制
uchar START_MORE_CONN[] = "AT+CIPMUX=1\r\n";
uchar START_SERVER[] = "AT+CIPSERVER=1,8080\r\n";
uchar SEND_DATA[] = "AT+CIPSEND=0,10\r\n";
//申明函数
void delay(uint);
void send(uchar);
void initUart(void);
void initTimer(void);
void sendc(uchar*);
void espData(uchar);
void espDatas(uchar*);
void main(void)
{
EA=1;
TMOD=0x21;
//初始化串口
initUart();
//打开定时器
initTimer();
//开启esp8266服务
delay(5000);
sendc(START_MORE_CONN);
delay(2000);
sendc(START_MORE_CONN);
delay(2000);
sendc(START_SERVER);
while(1){
if(cycle_count == 8){
if(cmd == 0){
count = 0;
switch(buf){
case 0x31:
PWM_count = 1;
break;
case 0x32:
PWM_count = 2;
break;
case 0x33:
PWM_count = 3;
break;
}
cmd = 1;
}
cycle_count = 0;
}
}
}
//初始化串口 9600
void initUart(void){
SCON=0x50;
PCON=0x00;
ES = 1;
TL1=0xfd;
TH1=0xfd;
TR1=1;
sending = 0;
}
void initTimer(void){
TH0=0Xfe;
TL0=0X33; //计数初值设置为0.5ms
ET0=1; //打开定时器0的中断
TR0=1; //打开定时器0
}
//发送一个字节的数据,形参d即为待发送数据。
void send(uchar d)
{
sending=1; //设置发送标志
SBUF=d; //将数据写入到串口缓冲
while(!TI);
TI = 0;
sending = 0; //等待发送完毕
}
//发送字符串uchar a[]='哈哈哈哈';
void sendc(uchar * pd)
{
while((*pd)!='\0') //发送字符串,直到遇到0才结束
{
send(*pd); //发送一个字符
pd++; //移动到下一个字符
}
}
/**
* 延时函数
**/
void delay(uint i)
{
uint x,y;
for(x = i; x > 0; x--)
for(y = 120; y > 0 ; y--);
}
/**
* esp8266数据反馈
*
*/
void espData(uchar d){
delay(100);
sendc(SEND_DATA);
delay(300);
send(d);
}
void espDatas(uchar* d){
delay(100);
sendc(SEND_DATA);
delay(300);
sendc(d);
}
/*********************************************************
串口接收
*********************************************************/
void serial() interrupt 4
{
//收到数据
if(RI){
RI=0; //清中断请求
buf = SBUF;
if(buf == 0x31 || buf == 0x32 || buf == 0x33 && cmd == 1){
cmd = 0;
}
}
}
/*********************************************************
定时器0接收
*********************************************************/
void timer() interrupt 1
{
TR0=0;
TH0=0Xfe;
TL0=0X33; //重新赋计数初值为0.5ms
if(count<=PWM_count)
{
SG_PWM=1;
}
else
{
SG_PWM=0;
}
count++;
if(count>=40)
{
count=0;
cycle_count++;
}
TR0=1;
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1