|
#include<reg52.h>
#include"pwm.h"
void main()
{
unsigned char i;
P1=0X00; //關(guān)電車電機(jī)
B: for(i=0;i<50;i++)
{
delay(1);
if(P3^7!=0)
goto B;
}
BUZZ=0; //50次檢測(cè)K4確認(rèn)是按下之后,蜂鳴器發(fā)出“滴”聲響,然后啟動(dòng)小車。
delay(50);
BUZZ=1;//響50ms后關(guān)閉蜂鳴器
TMOD=0X01;
TH0= 0XFc; //1ms定時(shí)
TL0= 0X18;
TR0= 1;
ET0= 1;
EA = 1; //工作模式設(shè)定
while(1)
{ //有信號(hào)為0,無信號(hào)為1
if(Left_led == 1 && Left_led == 1)
{
run();
}
else if(Left_led == 0 && Right_led == 1)
{
rightrun();
}
else if(Left_led == 1 && Right_led == 0)
{
leftrun();
}
else
{
backrun();
delay(500);
leftrun();
delay(20);
}
}
}
#ifndef _PWM_H_
#define _PWM_H_
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 BUZZ = P2^3;//蜂鳴器
#define Left_led P3^5//左傳感器
#define Right_led P3^4//右傳感器
#define Left_pwm P1^5//左電機(jī)使能
#define Right_pwm P1^4//右電機(jī)使能
#define Left_moto_go {IN1=0,IN2=1;}//左電機(jī)前進(jìn)
#define Left_moto_back {IN1=1,IN2=0;}//左電機(jī)后退
#define Right_moto_go {IN3=1,IN4=0;}//右電機(jī)前進(jìn)
#define Right_moto_back {IN3=0,IN4=1;}//右電機(jī)后退
#define Left_moto_stop {EN2 = 0;}//左電機(jī)停止
#define Right_moto_stop {EN1 = 0;}//右電機(jī)停止
unsigned char Left_val_pwm = 0;
unsigned char Right_val_pwm = 0;
unsigned char Left_compare_pwm = 0;//左電機(jī)占空比
unsigned char Right_compare_pwm = 0;//右電機(jī)占空比
unsigned int time = 0;
//延時(shí)函數(shù)
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
//前進(jìn)
void run()
{
Left_compare_pwm=10; //速度調(diào)節(jié)變量 0-20。。。0最小,20最大
Right_compare_pwm=10;
Left_moto_go ; //左電機(jī)往前走
Right_moto_go ; //右電機(jī)往前走
}
//后退
void backrun()
{
Left_compare_pwm=8; //速度調(diào)節(jié)變量 0-20。。。0最小,20最大
Right_compare_pwm=8;
Left_moto_back; //左電機(jī)往后退
Right_moto_back; //右電機(jī)往后退
}
//左轉(zhuǎn)
void leftrun()
{
Right_compare_pwm=8;
Right_moto_go; //右電機(jī)往前走
Left_moto_stop; //左電機(jī)停止
}
//右轉(zhuǎn)
void rightrun()
{
Left_compare_pwm=8;
Left_moto_go ; //左電機(jī)往前走
Right_moto_stop ; //右電機(jī)
}
//左電機(jī)pwm調(diào)速
void pwm_moto_left()
{
if(Left_val_pwm >20)
Left_val_pwm = 0;
if(Left_val_pwm <= Left_compare_pwm)
Left_pwm = 1;
else
Left_pwm = 0;
}
//右電機(jī)pwm調(diào)速
void pwm_moto_right()
{
if(Right_val_pwm >20)
Right_val_pwm = 0;
if(Right_val_pwm <=Right_compare_pwm)
EN1 = 1;
else
EN1 = 0;
}
void timer0() interrupt 1
{
TH0=0XFc; //1Ms定時(shí)
TL0=0X18;
time++;
Left_val_pwm++;
Right_val_pwm++;
pwm_moto_right();
pwm_moto_left();
}
#endif
|
|