500 黑幣
本帖最后由 YQLSun 于 2018-10-5 22:22 編輯
謝謝前輩們!
解決問題,并且回復(fù)了正確的源碼,懸賞500 黑幣
想實現(xiàn)功能: 藍(lán)牙遙控的時候,小車檢測前方障礙,如果遇到障礙,小車自動停止,并且不能前進(jìn)。
遇到的問題: 小車無法行動,猜測是在中斷3的地方只能判斷出a = 0,無法判斷出 a = 1;
代碼:
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
bit flag = 0; //用來標(biāo)志定時器0溢出
uchar a; //用來判斷藍(lán)牙的通信是否運(yùn)行
uint time = 0; //用來儲存定時器0的值
unsigned long S = 0; //用來儲存距離
uchar tempbuf = 0; //用來儲存SBUF
//L298N端口聲明
sbit IN1 = P2^0;
sbit IN2 = P2^1;
sbit IN3 = P2^2;
sbit IN4 = P2^3;
sbit ENA = P2^4;
sbit ENB = P2^5;
//超聲波端口聲明
sbit TRIG = P1^0;
sbit ECHO = P1^1;
//延時函數(shù)單位:ms
void delay(uint MS)
{
uint i,j;
for(i = MS; i > 0; i--)
{
for(j = 114; j > 0; j--);
}
}
//小車運(yùn)動函數(shù)
void TZ() //停止
{
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 0;
}
void QJ() //前進(jìn)
{
IN1 = 0;
IN2 = 1;
IN3 = 1;
IN4 = 0;
}
void HT() //后退
{
IN1 = 1;
IN2 = 0;
IN3 = 0;
IN4 = 1;
}
void ZZ() //左轉(zhuǎn)(雙輪)
{
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
}
void YZ() //右轉(zhuǎn)(雙輪)
{
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
//定時器0和串口中斷初始化函數(shù)
void Init()
{
TMOD = 0x21; //定時器0:方式1,定時器1:方式2
SCON = 0x50; //0101 0000 串行口控制寄存器
PCON = 0x00; //波特率不加倍
TH0 = 0x00; //定時器0初始值設(shè)定
TL0 = 0x00;
TH1 = 0xfd; //計數(shù)器1初始值設(shè)置,波特率9600
TL1 = 0xfd;
ET0 = 1; //允許T0中斷
ET1 = 1; //允許T1中斷
ES = 1; //打開接收中斷
EA = 1; //打開總中斷
TR1 = 1; //打開計數(shù)器1
}
//超聲波啟動函數(shù)
void USStart()
{
TRIG = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TRIG = 0;
}
//超聲波測距函數(shù)
void USCount()
{
time = TH0 * 256 + TL0; //讀取脈寬長度
TH0 = 0;
TL0 = 0;
S = (time * 1.7) / 100; //算出來是CM
}
//定時器0中斷,用來儲存溢出
void DSQzd0() interrupt 1
{
flag = 1;
}
//定時器1中斷,用來給a賦值,讓串行口中斷判斷如何運(yùn)行
void DSQzd1() interrupt 3
{
if((S >= 25)||(flag == 1))
{
a = 1;
flag = 0;
}
else
{
a = 0;
}
}
//根據(jù)a來進(jìn)行判斷并處理串口的數(shù)據(jù)
void CXKzd() interrupt 4
{
if(a == 0)
{
tempbuf = SBUF;
RI = 0;
TZ();
switch(tempbuf)
{
case'b': HT(); break;
case'c': ZZ(); break;
case'd': YZ(); break;
case'e': TZ(); break;
}
}
else
{
tempbuf = SBUF;
RI = 0;
switch(tempbuf)
{
case'a': QJ(); break;
case'b': HT(); break;
case'c': ZZ(); break;
case'd': YZ(); break;
case'e': TZ(); break;
}
}
}
void main()
{
Init();
while(1)
{
USStart();
while(!ECHO); //當(dāng)RX為零時等待
TR0 = 1; //開啟計數(shù)
while(ECHO); //當(dāng)RX為1計數(shù)并等待
TR0 = 0; //關(guān)閉計數(shù)
USCount(); //計算
delay(100); //100MS
}
}
我來回答