2019-07-15 23:52发布
sbook 发表于 2013-7-2 17:18 #include "reg52.h" #define Left_moto_go {a=0,b=1;} //P3_4 P3_5 接IN1 IN2 当 P3_4=0,P3_5=1; ...
最多设置5个标签!
#define Left_moto_go {a=0,b=1;} //P3_4 P3_5 接IN1 IN2 当 P3_4=0,P3_5=1; 时左电机前进
#define Left_moto_back {a=1,b=0;} //P3_4 P3_5 接IN1 IN2 当 P3_4=1,P3_5=0; 时左电机后退
#define Left_moto_stp {a=1,b=1;} //P3_4 P3_5 接IN1 IN2 当 P3_4=1,P3_5=1; 时左电机停转
#define Right_moto_go {c=0,d=1;} //P3_6 P3_7 接IN1 IN2 当 P3_6=0,P3_7=1; 时右电机前转
#define Right_moto_back {c=1,d=0;} //P3_6 P3_7 接IN1 IN2 当 P3_6=1,P3_7=0; 时右电机后退
#define Right_moto_stp {c=1,d=1;} //P3_6 P3_7 接IN1 IN2 当 P3_6=1,P3_7=0; 时右电机停转
sbit a = P3^4;
sbit b = P3^5;
sbit c = P3^6;
sbit d = P3^7;
sbit beep = P2^4;
sbit v = P2^5;
/*********************************位定义*************************************************/
sbit Left_moto_pwm = P1^6; //接驱动模块ENA 使能端,输入PWM信号调节速度
sbit Right_moto_pwm = P1^7; //接驱动模块ENB
unsigned int pwm_val_left =0;//变量定义
unsigned char push_val_left =0;// 左电机占空比N/10
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;// 右电机占空比N/10
bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned int time=0;
/******************************小车前进,左转,右转PWM调节控制函数开始*******************************************
//小车延时
void delay(unsigned int k) //延时函数
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
/************************************************************************/
/* PWM调制电机转速 */
/************************************************************************/
/* 左电机调速 */
/******************调节push_val_left的值改变电机转速,占空比**************/
void pwm_out_left_moto(void)
{
if(Left_moto_stop)
{
if(pwm_val_left<=push_val_left)
Left_moto_pwm=1;
else
Left_moto_pwm = 0;
if(pwm_val_left>=10)
pwm_val_left=0;
}
else Left_moto_pwm=0;
}
/******************************************************************/
/* 右电机调速 */
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
Right_moto_pwm=1;
else
Right_moto_pwm=0;
if(pwm_val_right>=10)
pwm_val_right=0;
}
else Right_moto_pwm=0;
}
//前进
void run(void) //前进函数
{
// P2 = 0x00;
v = 0;
beep = 0;
push_val_left =5 ; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
push_val_right =5; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
Left_moto_go ; //左电机前进
Right_moto_go; //右电机前进
}
//左转
void left(void) //左转函数
{
/// P2 = 0x00;
v = 0;
beep = 0;
push_val_left = 4; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
push_val_right = 4; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
Right_moto_go; //右电机继续
Left_moto_back; //左电机停走
}
//右转
void right(void) //右转函数
{
// P2 = 0x00;
v = 0;
beep = 0;
push_val_left = 5; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
push_val_right = 5 ; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
Right_moto_back; //右电机停走
Left_moto_go; //左电机继续
}
//后退
void back(void) //后退函数
{
// P2 = 0x00;
v = 0;
beep = 0;
push_val_left = 5; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
push_val_right = 5 ; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
Right_moto_back; //右电机后退
Left_moto_back; //左电机后退
}
//停止函数
void stop()
{
P2 = 0xff;
push_val_left = 5; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
push_val_right = 5 ; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
Right_moto_stp; //右电机后退
Left_moto_stp; //左电机后退
}
/******************************小车前进,左转,右转PWM调节控制函数结束*******************************************/
void zd1() interrupt 1 using 2 //使用定时器中断0来进行pwm信号调节
{
TH0=0XF8; //1Ms定时
TL0=0X30;
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void send(unsigned char send)
{
SBUF = send;
while(!TI);
TI = 0;
}
void main()
{
unsigned char temp;
//串口通信 使用定时器1作为串口通信的波特率发生器 使用工作方式2
//PWM调节速度 使用定时器0 使用工作方式1
TMOD = 0X21; // 工作方式
//PWM信号
//定时器中断0初始化设置
TH0= 0XF8; //1ms定时
TL0= 0X30;
TR0= 1;//启动定时器中断0
ET0= 1; //定时器中断0允许使用
//串行通信初始化
TH1 = 0XFD; //9600波特率计算初值
TL1 = 0XFD;
SCON = 0X50; //穿行口设置 工作方式1 REN = 1 允许接收
PCON = 0X00; //波特率不加倍
TR1 = 1; //定时器中断1 未开则晶振无法计数
ES = 1;
ET1 = 1;
EA = 1;
while(1)
{
if(RI == 1)
{
RI = 0;
temp = SBUF ;
switch (temp)
{
case '1':run();break;
case '0':stop();break;
case '2':back();break;
case '3':left();break;
case '4':right();break;
case '5':stop();break;
}
send(temp) ;
}
}
}
啊~~多谢啦。我邮箱是326860164@qq.com
一周热门 更多>