欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
51單片機串口控制舵機,出現(xiàn)詭異問題。大佬幫看看?
[打印本頁]
作者:
完后余生9375
時間:
2020-3-29 14:48
標(biāo)題:
51單片機串口控制舵機,出現(xiàn)詭異問題。大佬幫看看?
用串口控制舵機的時候會出現(xiàn)一下情況。
1.發(fā)出90度指令后,會自動回到45度。
2.發(fā)送指令偶爾不聽使喚。不響應(yīng)。
3.發(fā)送太快舵機就再也不轉(zhuǎn)了。
哪個大佬幫忙看看?
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//變量
uchar buf;
uchar sending = 0;
uint cmd = 1;//串口收到的命令是否已經(jīng)處理
//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";
//申明函數(shù)
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服務(wù)
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; //計數(shù)初值設(shè)置為0.5ms
ET0=1; //打開定時器0的中斷
TR0=1; //打開定時器0
}
//發(fā)送一個字節(jié)的數(shù)據(jù),形參d即為待發(fā)送數(shù)據(jù)。
void send(uchar d)
{
sending=1; //設(shè)置發(fā)送標(biāo)志
SBUF=d; //將數(shù)據(jù)寫入到串口緩沖
while(!TI);
TI = 0;
sending = 0; //等待發(fā)送完畢
}
//發(fā)送字符串uchar a[]='哈哈哈哈';
void sendc(uchar * pd)
{
while((*pd)!='\0') //發(fā)送字符串,直到遇到0才結(jié)束
{
send(*pd); //發(fā)送一個字符
pd++; //移動到下一個字符
}
}
/**
* 延時函數(shù)
**/
void delay(uint i)
{
uint x,y;
for(x = i; x > 0; x--)
for(y = 120; y > 0 ; y--);
}
/**
* esp8266數(shù)據(jù)反饋
*
*/
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
{
//收到數(shù)據(jù)
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; //重新賦計數(shù)初值為0.5ms
if(count<=PWM_count)
{
SG_PWM=1;
}
else
{
SG_PWM=0;
}
count++;
if(count>=40)
{
count=0;
cycle_count++;
}
TR0=1;
}
復(fù)制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1