#include "reg52.h"
#include "..\XUNJI\XUNJI.h"
void pwm_out_left_moto();
void pwm_out_right_moto();
void T0_time() interrupt 1
{
pwm_val_left++;
pwm_val_right++;
pwm_out_right_moto();
pwm_out_left_moto();
}
void main ()
{
TMOD |=0X02;// 设置定时器0为8位定时器
TH0=220;
TL0=220;//0.01s
TR0=1;//启动定时器
ET0=1; //允许定时器0中断
EA=1; //总中断
while (1);
{
if(L1==0&&L2==0&&R1==0&&R2==0) //前进
run() ;
else
{
if(L1==0&&L2==1&&R1==0&&R2==0) //左转
leftrun();
if(L1==1&&L2==0&&R1==0&&R2==0)//左转
leftrun();
if(L1==0&&L2==0&&R1==0&&R2==1)//右转
rightrun();
if(L1==0&&L2==0&&R1==1&&R2==0)//右转
rightrun();
if(L1==1&&L2==1&&R1==1&&R2==1) //停止
stop();
}
}
}
#ifndef __XUNJI_H__
#define __XUNJI_H__
//定义小车驱动模块输入IO口
sbit IN1=P1^2; //左
sbit IN2=P1^3;
sbit IN3=P1^4; //右
sbit IN4=P1^5;
sbit ENA=P1^0; //左电机使能
sbit ENB=P1^1; //右电机使能
/***蜂鸣器接线定义*****/
sbit BUZZ=P2^3;
#define L1 P2^7 //左循迹传感器
#define R1 P2^6 //右循迹传感器
#define L2 P2^5 //左循迹传感器
#define R2 P2^4 //右循迹传感器
#define Left_moto_go IN1=0,IN2=1 //左电机向前走
#define Left_moto_back IN1=1,IN2=0 //左边电机向后转
#define Left_moto_Stop IN1=0,IN2=0 //左边电机停转
#define Right_moto_go IN3=1,IN4=0 //右边电机向前走
#define Right_moto_back IN3=0,IN4=1 //右边电机向后走
#define Right_moto_Stop IN3=0,IN4=0 //右边电机停转
unsigned char pwm_val_left =0;//变量定义
unsigned char pwm_val_right =0;
unsigned char push_val_left =0;
unsigned char push_val_right=0;
bit Right_moto_stop=0;
bit Left_moto_stop=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=170; //速度调节变量256 0 最小,256最大
push_val_right=170;
Left_moto_go ; //左电机往前走
// Right_moto_go ; //右电机往前走
}
//后退函数
void backrun(void)
{
push_val_left=150; //速度调节变量256 0 最小,256最大
push_val_right=150;
Left_moto_back; //左电机往后走
Right_moto_back; //右电机往后走
}
//左转
void leftrun(void)
{
push_val_left=140;
push_val_right=160;
Right_moto_go ; //右电机往前走
Left_moto_back ; //左电机后走
}
//右转
void rightrun(void)
{
push_val_left=160;
push_val_right=140;
Left_moto_go ; //左电机往前走
Right_moto_back ; //右电机往后走
}
//停止
void stop(void)
{ push_val_left=0;
push_val_right=0;
Right_moto_Stop ; //右电机停止
Left_moto_Stop ; //左电机停止
}
/************************************************************************/
/* PWM调制电机转速 */
/************************************************************************/
/* 左电机调速 */
/*调节push_val_left的值改变电机转速,占空比 */
void pwm_out_left_moto(void)
{
if(Left_moto_stop){
if(pwm_val_left<=push_val_left)
{
ENA=1;
}
else
{
ENA=0;
}
if(pwm_val_left>=255)
pwm_val_left=0;
else ENA=0;
}
}
/******************************************************************/
/* 右电机调速 */
void pwm_out_right_moto(void)
{
if(Right_moto_stop){
if(pwm_val_right<=push_val_right)
{
ENB=1;
}
else
{
ENB=0;
}
if(pwm_val_right>=push_val_right ){
pwm_val_right=0;
}
if(pwm_val_right>=255)
pwm_val_left=0;
}else ENB=0;
}
#endif
|