哪位朋友對中斷間的沖突有經(jīng)驗的,求教啊。。。下面是程序
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int u16;
typedef unsigned char u8;
//3?éù2¨?à1?1ü???¨ò?************
sbit Trig=P2^0;
sbit Echo=P2^1;
long distance;
uint timeer;
sbit IN1 = P1^2;
sbit IN2 = P1^3;
sbit IN3 = P2^4;
sbit IN4 = P2^5;
void back();
void left();
void stop();
#define left_motor_go IN1 =1 , IN2 = 0
#define left_motor_back IN1 = 0, IN2 = 1
#define right_motor_go IN3 = 1, IN4 = 0
#define right_motor_back IN3 = 0, IN4 = 1
void delay2s(void)
{
unsigned char a,b,c;
for(c=127;c>0;c--)
for(b=235;b>0;b--)
for(a=32;a>0;a--);
_nop_();
}
void delay1s(void)
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
_nop_();
}
void delay_20us()
{
uchar bt ;
for(bt=0;bt<100;bt++);
}
void delay14ms(unsigned char m)
{
unsigned char a,b,c;
for(c=m;c>0;c--)
for(b=184;b>0;b--)
for(a=8;a>0;a--);
_nop_();
}
void delay1(unsigned int z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void time_init()
{
EA = 1;
TMOD = 0X01;
TH0 = 0;
TL0 = 0;
ET0 = 0;
}
void csb_int()
{
Trig = 0;
time_init();
Trig = 1;
delay_20us();
Trig = 0;
while(!Echo);
ET0=1;
TR0=1;
while(Echo);
TR0=0;
timeer=TH0*256+TL0;
TH0=0;
TL0=0;
distance=(timeer*1.7)/100;
if(distance>400)
{
distance=666;
}
}
//à??à3?ê?
void UART_INIT()
{
PCON=0x00;
SCON=0x50;
EA = 1;
ES = 1;
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
}
//D?3μ?°
void forward()
{
IN1 =1; delay14ms(1);
IN2 =0; delay14ms(15);
IN3 =1; delay14ms(1);
IN4 =0; delay14ms(15);
}
//D?3μoó
void back()
{
IN1 =0;
IN2 =1;
IN3 =0;
IN4 =1;
}
void left_go()
{
IN1 =0; delay14ms(15);
IN2 =1; delay14ms(1);
IN3 =1; delay14ms(1);
IN4 =0; delay14ms(15);
delay1(350);
forward();
}
//óò
void right_go()
{
IN1 =1; delay14ms(1);
IN2 =0; delay14ms(15);
IN3 =0; delay14ms(15);
IN4 =1; delay14ms(1);
delay1(350);
forward();
}
//D?3μ×ó×a
void left()
{
IN1 =0; delay14ms(15);
IN2 =1; delay14ms(1);
IN3 =1; delay14ms(1);
IN4 =0; delay14ms(15);
delay1(50);
}
//D?3μóò×a
void right()
{
IN1 =1; delay14ms(1);
IN2 =0; delay14ms(15);
IN3 =0; delay14ms(15);
IN4 =1; delay14ms(1);
}
//D?3μí£
void stop()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
void main()
{
UART_INIT();
while(1)
{
csb_int();
if(distance<50)
{
back();
delay1s();
left();
}
}
}
//′??ú?D
void UART_SER() interrupt 4
{
u8 receivedata;
receivedata=SBUF;
if(RI)
{
RI = 0;
switch(receivedata)
{
case '1': forward(); break;
case '2': back(); break;
case '3': left(); break;
case '4': right(); break;
case '5': stop(); break;
case '6': left_go(); break;
case '7': right_go(); break;
}
SBUF=receivedata;
while(!TI);
TI=0;
}
}
|