大家看一下,為什么小車不能用藍牙和按鍵驅動前進,后退
單片機源程序如下:
#include "REG51.h"
#include "oled.h"
#include "bmp.h"
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit S2 = P2^3;
sbit S3 = P2^2;
sbit S4 = P2^1;
sbit S5 = P2^0;
int num;
unsigned int time;
uint w,a,s,d,q,e;
sbit LIN1=P1^5;
sbit LIN2=P1^4;
sbit LIN3=P1^3;
sbit LIN4=P1^2;
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void delay_nus(unsigned int i)
{
i=i/10;
while(--i);
}
void delay_nms(unsigned int n)
{
n=n+1;
while(--n)
delay_nus(900);
}
void UsartInit()
{
SCON=0X50;
TMOD=0X20;
PCON=0X80;
TH1=0XF9;
TL1=0XF9;
ES=1;
EA=1;
TR1=1;
}
char i;
int msy;
void forward()
{
uchar t;
OLED_Init();
t=' ';
LIN1=1;LIN2=0;LIN3=0;LIN4=1;
OLED_ShowCHinese(20,0,0);
OLED_ShowCHinese(40,0,1);
}
void back()
{
uchar t;
OLED_Init();
t=' ';
LIN1=0;LIN2=1;LIN3=1;LIN4=0;
OLED_ShowCHinese(20,0,2);
OLED_ShowCHinese(40,0,3);
}
void stop()
{
LIN1=1;LIN2=1;LIN3=1;LIN4=1;
}
void left()
{
uchar t;
OLED_Init();
t=' ';
LIN1=1;LIN2=1;LIN3=0;LIN4=1;
OLED_ShowCHinese(20,0,4);
OLED_ShowCHinese(40,0,7);
}
void right()
{
uchar t;
OLED_Init();
t=' ';
LIN1=1;LIN2=0;LIN3=1;LIN4=1;
OLED_ShowCHinese(20,0,6);
OLED_ShowCHinese(40,0,5);
}
void ControlCar(unsigned char ConType)
{
stop();
switch(ConType)
{
case 01:forward(); delay(500);break;
case 02:left(); delay(500);break;
case 03:right();delay(500);break;
case 04:back();delay(500);break;
case 05:stop();delay(500);break;
}
}
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0D8;
TL0 = 0x0F0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void sao()
{if(S2 == 0)
{
delay(20);
if(S2 == 0)
{w=w+1;
q=time;
while(!S2);
}
}
if(S3 == 0)
{
delay(20);
if(S3 == 0)
{a=a+1;
while(!S3);
}
}
if(S4 == 0)
{
delay(20);
if(S4 == 0)
{
s=s+1;
e=time;
while(!S4);
}
}
if(S5 == 0)
{
delay(20);
if(S5 == 0)
{
d=d+1;
while(!S5);
}
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x0D8;
TL0 = 0x0F0;
time++;
sao();
if(q!=0||e!=0)
{switch(msy)
{
case 0:stop();
case 1:if(time==q+3000){time=0;w=0;s=0;stop();msy=0;q=0;}break;
case 2:if( time==q+6000){time=0;w=0;s=0;stop();msy=0;q=0;}break;
case 3:if( time ==q+9000){time=0;w=0;s=0;stop();msy=0;q=0;}break;
case -1:if( time ==e+3000){time=0;w=0;s=0;stop();msy=0;e=0;}break;
case -2:if( time ==e+6000){time=0;w=0;s=0;stop();msy=0;e=0;}break;
case -3:if( time ==e+9000){time=0;w=0;s=0;stop();msy=0;e=0;}break;
}
}
}
void UARTInit()
{
EA=1;
ES=1;
SM0=0;SM1=1;
REN=1;
TR1=1;
TMOD|=0X20;
TH1=0xfd;
TL1=0xfd;
}
void Usart() interrupt 4
{
uchar receiveData;
uint a;
delay_nms(50);
receiveData=SBUF;
ControlCar(5);
delay_nms(50);
RI=0;
a=SBUF;
a=SBUF%16;
ControlCar(a);
delay_nms(50);
SBUF=receiveData;
while(!TI);
TI=0;
}
void main()
{
w=0;a=0;s=0;d=0;
msy=0;
time=0;
InitTimer0();
while(1){
delay_nms (10);
UARTInit();
delay_nms (10);
msy=w-s;
if(msy!=0)
{
if(msy>0)
forward();
else
back();
}
if(a>0)
{right();
a--;
delay(2000);
stop();}
if(d>0)
{ left();
d--;
delay(2000);
stop();}
}
}
|