|
我有別人的程序,我使用過,沒問題,你可以試試,也可以根據(jù)這個(gè)程序,學(xué)習(xí)、修改自己的程序。
頭文件bst_car.h
#ifndef __BSTCAR_H__
#define __BSTCAR_H__
//定義小車驅(qū)動(dòng)模塊輸入IO口
sbit IN1=P1^2;
sbit IN2=P1^3;
sbit IN3=P1^6;
sbit IN4=P1^7;
sbit EN1=P1^4;
sbit EN2=P1^5;
//定義按鍵
sbit K4=P3^7;
//sbit K3=P3^6;
//蜂鳴器驅(qū)動(dòng)口定義
sbit FM=P2^3;
//循跡LED指示燈定義
sbit Left_1_led=P3^3; //左循跡紅外傳感器
sbit Right_1_led=P3^2; //右循跡紅外傳感器
//避障LED指示燈定義
//sbit Left_2_led=P3^4; //左避障紅外傳感器
//sbit Right_2_led=P3^5; //右避障紅外傳感器
#define Left_moto_go {IN1=0,IN2=1;} //左電機(jī)向前走
//#define Left_moto_back {IN1=1,IN2=0;} //左邊電機(jī)向后轉(zhuǎn)
#define Left_moto_Stop {EN1=0;IN1=0,IN2=0;} //左邊電機(jī)停轉(zhuǎn)
#define Right_moto_go {IN3=1,IN4=0;} //右邊電機(jī)向前走
//#define Right_moto_back {IN3=0,IN4=1;} //右邊電機(jī)向后走
#define Right_moto_Stop {EN2=0;IN3=0,IN4=0;} //右邊電機(jī)停轉(zhuǎn)
#endif
主程序main.c
//按下K4按鍵,1秒左右啟電小車
//按下復(fù)位健可以停止小車
//注意程序只做參考之用,要達(dá)到最理想的尋跡效果,還需要同學(xué)們細(xì)心調(diào)試。
#include <reg52.h>
#include "bst_car.h"
unsigned char pwm_val_left =0;
unsigned char pwm_val_right =0;
unsigned char push_val_left =5;
unsigned char push_val_right=5;
bit Right_PWM_ON=1;
bit Left_PWM_ON =1;
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--) //i=xms即延時(shí)約xms毫秒
for(j=112;j>0;j--);
}
//前進(jìn)
void run(void)
{
push_val_left=6; //速度調(diào)節(jié)變量 0-20。。。0最小,20最大
push_val_right=6;
Left_moto_go ;
Right_moto_go ;
}
//左轉(zhuǎn)
void leftrun(void)
{
push_val_left=5;
push_val_right=5;
Right_moto_go ;
Left_moto_Stop ;
}
//右轉(zhuǎn)
void rightrun(void)
{
push_val_left=5;
push_val_right=5;
Left_moto_go ;
Right_moto_Stop ;
}
//停止
void stop(void)
{
Left_moto_Stop ;
Right_moto_Stop ;
}
void pwm_out_left_moto(void)
{
if(Left_PWM_ON)
{
if(pwm_val_left<=push_val_left)
{
EN1=1;
}
else
{
EN1=0;
}
if(pwm_val_left>=20)
pwm_val_left=0;
}
else
{
EN1=0; //若未開啟PWM則EN1=0 左電機(jī) 停止
}
}
void pwm_out_right_moto(void)
{
if(Right_PWM_ON)
{
if(pwm_val_right<=push_val_right)
{
EN2=1;
}
else
{
EN2=0;
}
if(pwm_val_right>=20)
pwm_val_right=0;
}
else
{
EN2=0;
}
}
//TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)
void timer0()interrupt 1 using 2
{
TH0=0XFC; //1Ms定時(shí)
TL0=0X66;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void keyscan(void) //按鍵掃描函數(shù)
{
A: if(K4==0)
{
delay(10);
if(K4==0)
{
FM=0;
while(K4==0);
FM=1;
}
else
{
goto A;
}
}
else
{
goto A;
}
}
void main(void)
{
P1=0X00;
keyscan();
delay(1000);
TMOD=0X01;
TH0= 0XFC;
TL0= 0X66;
TR0= 1;
ET0= 1;
EA = 1;
while(1)
{
if(Left_1_led==0&&Right_1_led==0)
run();
else if(Left_1_led==1&&Right_1_led==0)
{
leftrun();
}
else if(Right_1_led==1&&Left_1_led==0)
{
rightrun();
}
else
stop();
}
}
|
評(píng)分
-
查看全部評(píng)分
|