欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機用藍牙控制小車的舵機一些問題,求大神解答
[打印本頁]
作者:
jfmdam
時間:
2021-4-12 19:25
標題:
51單片機用藍牙控制小車的舵機一些問題,求大神解答
我想做一個用藍牙控制小車的舵機,但是遇到很多問題
1.我看到說是51單片機里面t0和t1定時器是可以同時工作的,又查到小車的藍牙波特率是用T1做的(T1的ET0=0,沒有開中斷允許位),然后我就自己寫了個T0定時器產生pwm控制舵機的程序,單獨打開并且下載進去之后,舵機可以正常使用,但是我移植到藍牙控制小車的大程序之后,我將TR0置0,然后通過藍牙寫入一個字符串,調用舵機函數,舵機函數中把TR0打開,但是進不了T0的中斷函數,藍牙也失效。這是什么問題,有時候我用藍牙控制小車的時候前進后退的時候,舵機也會轉,我不知道怎么辦了,用T2做波特率發生器,用T1做PWM能行嗎?不知道是舵機會影響單片機,還是T0和T1沖突,還是我用藍牙調用函數開T0中斷的問題。程序如下,求大神解答。
單片機源程序如下:
#include<AT89x51.H>
#include <intrins.h>
//HJ-4WD小車驅動接線定義
#define Left_moto_go {P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //左邊兩個電機向前走
#define Left_moto_back {P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //左邊兩個電機向后轉
#define Left_moto_Stop {P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //左邊兩個電機停轉
#define Right_moto_go {P1_0=1,P1_1=0,P1_2=1,P1_3=0;} //右邊兩個電機向前走
#define Right_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //右邊兩個電機向后走
#define Right_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0;} //右邊兩個電機停轉
#define left 'C'
#define right 'D'
#define up 'A'
#define down 'B'
#define stop 'F'
#define guiwei1 '1'
#define uchar unsigned char
#define ulong unsigned long
#define uint unsigned int
char code str[] = "收到指令,向前!\n";
char code str1[] = "收到指令,向后!\n";
char code str2[] = "收到指令,向左!\n";
char code str3[] = "收到指令,向右!\n";
char code str4[] = "收到指令,停止!\n";
char code str5[] = "收到指令,舵機歸位!\n";
bit flag_REC=0;
bit flag =0;
sbit Sevro_moto_pwm1=P2^7; //左右
sbit Sevro_moto_pwm2=P2^1; //伸縮
sbit Sevro_moto_pwm3=P2^2; //上下
sbit LED=P2^0;//用來測試的LED
uchar i=0;
uchar dat=0;
uchar buff[5]=0; //接收緩沖字節
uchar pwm_val_left1=0;//變量定義
uchar pwm_val_left2=0;//變量定義
uchar pwm_val_left3=0;//變量定義
uchar push_val_left1=18;//1舵機歸位,產生約,1.9MS 信號
uchar push_val_left2=11;//2舵機歸位,產生約,1.2MS 信號
uchar push_val_left3=15;//3舵機歸位,產生約,1.6MS 信號
uint flag1=1;
uint timer=0;
/************************************************************************/
//延時函數
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
void motoinit()//舵機初始位置定義
{
push_val_left1=18;
push_val_left2=11;
push_val_left3=15;
}
/************************************************************************/
/* PWM信號產生控制舵機 */
/************************************************************************/
/* */
/*調節push_val_left的值改變電機轉速,占空比 */
void pwm_Servomoto1(void)
{
if(pwm_val_left1<=push_val_left1)//1號舵機控制
Sevro_moto_pwm1=1;
else
{
Sevro_moto_pwm1=0;
flag1++;
}
if(pwm_val_left1>=200)
pwm_val_left1=0;
}
void pwm_Servomoto2(void)
{
if(pwm_val_left2<=push_val_left2)//2號舵機控制
Sevro_moto_pwm2=1;
else
{
Sevro_moto_pwm2=0;
flag1++;
}
if(pwm_val_left2>=200)
pwm_val_left2=0;
}
void pwm_Servomoto3(void)//三號舵機控制
{
if(pwm_val_left3<=push_val_left3)
Sevro_moto_pwm3=1;
else
{
Sevro_moto_pwm3=0;
flag1=1;
TR=0;//三個舵機歸位后,定時器0關閉
}
if(pwm_val_left3>=200)
pwm_val_left3=0;
}
void guiwei()//三個舵機歸位函數
{
TR0=1;//打開T0定時器,后面會考慮增加延時函數,確保舵機歸位完成
}
/************************************************************************/
//字符串發送函數
void send_str( )
// 傳送字串
{
unsigned char i = 0;
while(str[i] != '\0')
{
SBUF = str[i];
while(!TI); // 等特數據傳送
TI = 0; // 清除數據傳送標志
i++; // 下一個字符
}
}
void send_str1( )
// 傳送字串
{
unsigned char i = 0;
while(str1[i] != '\0')
{
SBUF = str1[i];
while(!TI); // 等特數據傳送
TI = 0; // 清除數據傳送標志
i++; // 下一個字符
}
}
void send_str2( )
// 傳送字串
{
unsigned char i = 0;
while(str2[i] != '\0')
{
SBUF = str2[i];
while(!TI); // 等特數據傳送
TI = 0; // 清除數據傳送標志
i++; // 下一個字符
}
}
void send_str3()
// 傳送字串
{
unsigned char i = 0;
while(str3[i] != '\0')
{
SBUF = str3[i];
while(!TI); // 等特數據傳送
TI = 0; // 清除數據傳送標志
i++; // 下一個字符
}
}
void send_str4()
// 傳送字串
{
unsigned char i = 0;
while(str4[i] != '\0')
{
SBUF = str4[i];
while(!TI); // 等特數據傳送
TI = 0; // 清除數據傳送標志
i++; // 下一個字符
}
}
void send_str5()
// 傳送字串
{
unsigned char i = 0;
while(str4[i] != '\0')
{
SBUF = str5[i];
while(!TI); // 等特數據傳送
TI = 0; // 清除數據傳送標志
i++; // 下一個字符
}
}
/************************************************************************/
//前速前進
void run(void)
{
Left_moto_go; //左電機往前走
Right_moto_go; //右電機往前走
}
//前速后退
void backrun(void)
{
Left_moto_back ; //左電機往前走
Right_moto_back ; //右電機往前走
}
//左轉
void leftrun(void)
{
Left_moto_back ; //左電機往前走
Right_moto_go ; //右電機往前走
}
//右轉
void rightrun(void)
{
Left_moto_go; //左電機往前走
Right_moto_back; //右電機往前走
}
//STOP
void stoprun(void)
{
Left_moto_Stop ; //左電機往前走
Right_moto_Stop ; //右電機往前走
}
/************************************************************************/
void sint() interrupt 4 //中斷接收3個字節
{
if(RI) //是否接收中斷
{
RI=0;
dat=SBUF;
if(dat=='O'&&(i==0)) //接收數據第一幀
{
buff[i]=dat;
flag=1; //開始接收數據
}
else
if(flag==1)
{
i++;
buff[i]=dat;
if(i>=2)
{i=0;flag=0;flag_REC=1 ;} // 停止接收
}
}
if(flag_REC==1) //
{
flag_REC=0;
if(buff[0]=='O'&&buff[1]=='N') //第一個字節為O,第二個字節為N,第三個字節為控制碼
switch(buff[2])
{
case up : // 前進
send_str( );
run();
break;
case down: // 后退
send_str1( );
backrun();
break;
case left: // 左轉
send_str3( );
leftrun();
break;
case right: // 右轉
send_str2( );
rightrun();
break;
case stop: // 停止
send_str4( );
stoprun();
break;
case guiwei1: // 停止
send_str5( );
// LED=~LED;
guiwei();
break;
}
}
}
void time1()interrupt 1
{
TH0=(65536-10000)/256; //100US定時
TL0=(65536-10000)%256;
timer++;//定時器100US為準。在這個基礎上延時,在后續增加延時確保舵機歸位完成。
LED=~LED;
if(flag1==1)//三個舵機分別歸位的函數
{
pwm_val_left1++;
pwm_Servomoto1();
// LED=0;
}
if(flag1==2)
{
pwm_val_left2++;
pwm_Servomoto2();
}
else
{
pwm_val_left3++;
pwm_Servomoto3();
}
}
/*********************************************************************/
/*--主函數--*/
void main(void)
{
TMOD=0x01;
IE|=0x82;
TH0=(65536-100)/256; //100US定時
TL0=(65536-100)%256;
ET0=1;
TR0=1;
TMOD=0x20;
TH1=0xFd; //11.0592M晶振,9600波特率
TL1=0xFd;
SCON=0x50;
PCON=0x00;
TR1=1;
ES=1; //開串口中斷
EA=1; //打開總中斷
TR0=0; //關閉定時器0,在藍牙發出對應的調用指令后開啟。
Sevro_moto_pwm1=0;
Sevro_moto_pwm2=0;
Sevro_moto_pwm3=0;
motoinit(); //舵機的歸位數值(分別產生數個100us的高脈沖)
LED=1;
while(1) /*無限循環*/
{
}
}
復制代碼
作者:
jfmdam
時間:
2021-4-13 16:22
大哥們,,有沒有啥51單片機的好書推薦一下我康康也可以、
作者:
aking991
時間:
2021-4-15 08:17
TMOD=0x01;和TMOD=0x20; 這個要改成TMOD|=0x01;和TMOD|=0x20; 就不會互相影響到各自的定時器配置了
作者:
jfmdam
時間:
2021-4-15 19:03
aking991 發表于 2021-4-15 08:17
TMOD=0x01;和TMOD=0x20; 這個要改成TMOD|=0x01;和TMOD|=0x20; 就不會互相影響到各自的定時器配置了
這么做還是不行,后來多次測試,我又換了T2定時器做波特率發生器,然后T1產生PWM波形,最終發現中斷只進了一次,舵機1的PWM輸出口一直保持的是高電平,好像是硬件沒有清零溢出的標志位,最后沒辦法了,我又買了一塊單片機單獨控制三個舵機,
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1