|
#include<reg52.h>
#include<stdio.h>
#include<Step_Moter.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
sbit open=P0^0;//軟開關
sbit ENA=P1^0;
sbit IN1=P1^1;
sbit IN2=P1^2;
sbit IN3=P1^3;
sbit IN4=P1^4;
sbit ENB=P1^5;
sbit ENC=P3^0;
sbit IN5=P3^1;
sbit IN6=P3^2;
sbit IN7=P3^3;
sbit IN8=P3^4;
sbit END=P3^5;
sbit left=P0^1;//左紅外檢測模塊
sbit centre=P0^2;//中間傳感器
sbit right=P0^3;//右紅外檢測模塊
uchar t;
uchar PWM1,PWM2,PWM3,PWM4;
uchar k=0;
/*延時函數*/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
/*中斷服務特殊功能寄存器配置*/
void init()
{
TMOD|=0x01;/*定時器0定時*/
TH0=(65535-100)/256;
TL0=(65535-100)%256; //定時0.1ms
ET0=1;
EA=1;
TR0=1;
}
void main()
{
if(open==0)
{
// Robot_Walk();//循跡過程中的齊步走動作
init();
ENA=1;
ENB=1;
ENC=1;
END=1;
IN1=0;
IN2=1;
IN3=0;
IN4=1;
IN5=1;
IN6=0;
IN7=1;
IN8=0;
PWM1=25;
PWM2=25;
PWM3=25;
PWM4=25;
delay(500);
while(1)
{
if(left==0 && centre==0 && right==0)k=1;
if(left==0 && centre==0 && right==1)k=2;//偏右,左移
if(left==0 && centre==1 && right==0)k=3;
if(left==0 && centre==1 && right==1)k=4;//偏右,左移
if(left==1 && centre==0 && right==0)k=5;//偏左,右移
if(left==1 && centre==0 && right==1)k=6;//直行
if(left==1 && centre==1 && right==0)k=7;//偏左,右移
if(left==1 && centre==1 && right==1)k=8;//停止
switch(k)
{
case 2:
PWM1=PWM2=80;
PWM3=PWM4=10;
break;
case 4:
PWM1=PWM2=80;
PWM3=PWM4=10;
break;
case 5:
PWM1=PWM2=10;
PWM3=PWM4=80;
break;
case 7:
PWM1=PWM2=10;
PWM3=PWM4=80;
break;
case 6:
PWM1=PWM2=PWM3=PWM4=50;
break;
case 8:
PWM1=PWM2=PWM3=PWM4=0;
break;
default:
PWM1=PWM2=PWM3=PWM4=30;
break;
}
}
}
else
{
ENA=ENB=ENC=END=0;
}
}
/*中斷服務程序*/
void Timer() interrupt 1
{
TR0=0;//賦初值時,關閉定時器
TH0=(65536-100)/256;//賦初值定時
TL0=(65536-100)%256;//0.1ms
TR0=1;//打開定時器
t++;
if(t>=100)
t=0;
if(t<=PWM1)
ENA=1;
else
ENA=0;
if(t<=PWM2)
ENB=1;
else
ENB=0;
if(t<=PWM3)
ENC=1;
else
ENC=0;
if(t<=PWM4)
END=1;
else
END=0;
}
|
評分
-
查看全部評分
|