27,375
社区成员
发帖
与我相关
我的任务
分享
#include<reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
/***左右轮的 PWM***/
sbit EN1=P0^6;
sbit EN2=P0^7;
sbit EN3=P1^6;
sbit EN4=P1^7;
sbit IN11=P0^0;
sbit IN12=P0^1;
sbit IN21=P0^2;
sbit IN22=P0^3;
sbit IN41=P1^2;
sbit IN42=P1^3;
sbit IN31=P1^0;
sbit IN32=P1^1;
unsigned long int counter;
uchar PWM_1,PWM_2;
#define High_Speed 19
#define ML_Speed 5
#define Middle_Speed 12
#define Stop 0
bit sgn1=0,sgn2=0;
uchar speed1=0;
uchar speed2=0;
uchar blue_receivestore=0;
void initial()
{
ES=1;
EA=1;
EX0=1;
IT0=1;
ET0=1;
TR0=1;
TH0=0XF8;
TL0=0X10;
TMOD=0x21;
TH1=0Xfd;
TL1=0Xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
// ES=1;
// EA=1;
EN1=0;
EN2=0;
EN3=0;
EN4=0;
counter=0;
}
void motor(uchar index, bit sgn,uchar speed)
{
if(speed>=0&&speed<=19)
{
if(index==1)
{
if(sgn==1)
{
IN11=0;
IN12=1;
IN41=0;
IN42=1;
PWM_1=speed;
}
else
{
IN11=1;
IN12=0;
IN41=1;
IN42=0;
PWM_1=speed;
}
}
if(index==2)
{
if(sgn==1)
{
IN21=0;
IN22=1;
IN31=0;
IN32=1;
PWM_2=speed;
}
else
{
IN21=1;
IN22=0;
IN31=1;
IN32=0;
PWM_2=speed;
}
}
}
}
void number_analyse(uint tmp)
{
uint operation;
//if(tmp==0xff){sgn1=0;sgn2=0;speed1=High_Speed;speed2=High_Speed;}
operation=tmp&0x30;
if(operation==0x00){sgn1=0;sgn2=0;} //前行
if(operation==0x20){sgn1=0;sgn2=0;} //左行
if(operation==0x10){sgn1=1;sgn2=1;} //右行
if(operation==0x30){sgn1=1;sgn2=1;} //后退
operation=tmp&0x0c;
if(operation==0x0c){speed1=High_Speed;} //设定左轮为高速
if(operation==0x08){speed1=Middle_Speed;} //设定左轮为中速
if(operation==0x04){speed1=ML_Speed;} //设定左轮为低速
if(operation==0x00){speed1=Stop;} //设定左轮停下来
operation=tmp&0x03;
if(operation==0x03){speed2=High_Speed;}
if(operation==0x02){speed2=Middle_Speed;}
if(operation==0x01){speed2=ML_Speed;}
if(operation==0x00){speed2=Stop;}
motor(1, sgn1,speed1);
motor(2, sgn2,speed2);
}
void main()
{
uint extern_accept_now=0;
uint extern_accept=0;
initial();
while(1)
{
extern_accept_now=blue_receivestore;
extern_accept=extern_accept_now;
number_analyse(extern_accept);
}
}
void timer1() interrupt 1
{
counter++;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
//TH0=(65536-50000)/256;
//TL0=(65536-50000)%256;
if(counter%20<PWM_1){EN1=1;EN4=1;}
if(counter%20>PWM_1){EN1=0;EN4=0;}
if(counter%20<PWM_2){EN2=1;EN3=1;}
if(counter%20>PWM_2){EN2=0;EN3=0;}
if(counter==60000) counter=0;
}
void blue_receive() interrupt 4
{
if(RI==1)
{
blue_receivestore=SBUF;
RI=0;
}
}