頭文件:
#ifndef _LED_H_
#define _LED_H_
//定義小車驅動模塊輸入IO口
sbit IN1=P0^0;
sbit IN2=P0^1;
sbit IN3=P0^2;
sbit IN4=P0^3;
sbit EN1=P0^4;
sbit EN2=P0^5;
/***蜂鳴器接線定義*****/
sbit BUZZ=P0^6;
#define Left_1_led P3_5 // 左傳感器
#define Right_1_led P3_6 //右傳感器
#define PWMSD 5 ////速度調節變量 0-20。。。0最小,20最大
#define Left_moto_pwm P0_4 //PWM信號端 ,EN1
#define Right_moto_pwm P0_5 //PWM信號端,EN2
#define Left_moto_go {P0_0=1,P0_1=0;} //左電機向前走
#define Left_moto_back {P0_0=0,P0_1=1;} //左邊電機向后轉
#define Left_moto_Stop {P0_4=0;} //左邊電機停轉
#define Right_moto_go {P0_2=1,P0_3=0;} //右邊電機向前走
#define Right_moto_back {P0_2=0,P0_3=1;} //右邊電機向后走
#define Right_moto_Stop {P0_5=0;} //右邊電機停轉
unsigned char pwm_val_left =0;//變量定義
unsigned char push_val_left =0;// 左電機占空比N/20
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;// 右電機占空比N/20
bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned int time=0;
/************************************************************************/
//延時函數
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
/************************************************************************/
//前速前進
void run(void)
{
push_val_left=PWMSD; //速度調節變量 0-20。。。0最小,20最大
push_val_right=PWMSD;
Left_moto_go ; //左電機往前走
Right_moto_go ; //右電機往前走
}
void stop(void)
{
Left_moto_Stop;
Right_moto_Stop;
}
//左轉
void leftrun(void)
{
push_val_left=PWMSD;
push_val_right=PWMSD;
Right_moto_go ; //右電機往前走
Left_moto_back ; //左電機后走
}
//右轉
void rightrun(void)
{
push_val_left=PWMSD;
push_val_right=PWMSD;
Left_moto_go ; //左電機往前走
Right_moto_back ; //右電機往后走
}
/************************************************************************/
/* 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>=20)
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>=20)
pwm_val_right=0;
}
else
{
Right_moto_pwm=0;
}
}
/***************************************************/
///*TIMER0中斷服務子函數產生PWM信號*/
void timer0()interrupt 1 using 2
{
TH0=0XFc; //1ms定時
TL0=0X66;
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
/*********************************************************************/
#endif |