#ifndef _LED_H_
#define _LED_H_
//控制板跳線帽接法
//定義小車驅動模塊輸入IO口
sbit IN1=P1^0; // 右1電機 高電平前進
sbit IN2=P1^1; // 右1電機 高電平后退 可以改接成PWM輸出
sbit IN3=P1^2; // 右2電機 高電平后退
sbit IN4=P1^3; // 右2電機 高電平前進 可以改接成PWM輸出
sbit IN5=P1^4; // 左1電機 高電平前進
sbit IN6=P1^5; // 左1電機 高電平后退 可以改接成PWM輸出
sbit IN7=P1^6; // 左2電機 高電平后退
sbit IN8=P1^7; // 左2電機 高電平前進 可以改接成PWM輸出
/***蜂鳴器接線定義*****/
sbit BUZZ=P2^6;
//傳感器定義 R是右(right),L是左(left) 小車對著自己看時 分的左右
//循跡傳感器X 左P3.6 右P3.5
#define Left_X_led P3_6 //P3_6接左邊 紅外循跡傳感器 接第3路輸出信號即中控板上面標記為P3
#define Right_X_led P3_5 //P3_5接右邊 紅外循跡傳感器 接第2路輸出信號即中控板上面標記為P2
//避障傳感器B 左P3.7 右P3.4
#define Left_B_led P3_7 //P3_7接左邊 紅外避障傳感器 接第4路輸出信號即中控板上面標記為P4
#define Right_B_led P3_4 //P3_4接右邊 紅外避障傳感器 接第1路輸出信號即中控板上面標記為P1
//電機PWM調速度IO口定義
#define Left_moto_pwm P0_0 //PWM信號端
#define Left_moto_pwm1 P0_1
#define Right_moto_pwm P0_2
#define Right_moto_pwm1 P0_3
//電機轉向定義
#define Left_moto_go {IN5=1,IN6=0,IN7=0,IN8=1;} //左邊兩個電機向前走
#define Left_moto_Stop {IN5=0,IN8=0;} //左邊兩個電機停轉
#define Right_moto_go {IN1=1,IN2=0,IN3=0,IN4=1;} //右邊兩個電機向前走
#define Right_moto_Stop {IN1=0,IN4=0;} //右邊兩個電機停轉
//定義變量
unsigned char 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;
/************************************************************************/
//延時函數
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=4; //速度調節變量 0-9。。。9最小,0最大
push_val_right=4;
Left_moto_go ; //左電機往前走
Right_moto_go ; //右電機往前走
}
//左轉
void leftrun(void)
{
push_val_left=4;
push_val_right=4;
Left_moto_go ; //左電機往前走
// Right_moto_back ; //右電機往前走
}
//右轉
void rightrun(void)
{
push_val_left=4;
push_val_right=4;
// Left_moto_back ; //左電機往前走
Right_moto_go ; //右電機往前走
}
/************************************************************************/
/* 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;
Left_moto_pwm1=1;
}
else
{
Left_moto_pwm=0;
Left_moto_pwm1=0;
}
if(pwm_val_left>=10)
pwm_val_left=0;
}
else
{
Left_moto_pwm=0;
Left_moto_pwm1=0;
}
}
/******************************************************************/
/* 右電機調速 */
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
{
Right_moto_pwm=1;
Right_moto_pwm1=1;
}
else
{
Right_moto_pwm=0;
Right_moto_pwm1=0;
}
if(pwm_val_right>=10)
pwm_val_right=0;
}
else
{
Right_moto_pwm=0;
Right_moto_pwm1=0;
}
}
/***************************************************/
///*TIMER0中斷服務子函數產生PWM信號*/
void timer0()interrupt 1 using 2
{
TH0=0XFc; //1Ms定時
TL0=0X18;
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
/*********************************************************************/
#endif
#include<AT89X52.H> //包含51單片機頭文件,內部有各種寄存器定義
#include<HJ-4WD_PWM.H> //包含HJ-4WD藍牙智能小車驅動IO口定義等函數
//主函數
void main(void)
{
unsigned char i;
P1=0X00; //小車停止
TMOD=0X01;
TH0= 0XFc; //1ms定時
TL0= 0X18;
TR0= 1;
ET0= 1;
EA = 1;
while(1) //無限循環
{
//有信號為0 沒有信號為1
if(Left_X_led==0&&Right_X_led==0) //白線
run();
else
{
if(Left_X_led==0&&Right_X_led==1) //左邊檢測到紅外
{
Left_moto_go; //左邊兩個電機正轉
Right_moto_Stop;
}
if(Right_X_led==0&&Left_X_led==1) //右邊檢測到紅外
{
Right_moto_go; //右邊兩個電機正轉
Left_moto_Stop;
}
}
}
}
|