|
現(xiàn)在代碼改成這樣,能正常工作了,因?yàn)橥婢哕?chē)的直流電機(jī)速度太快,加載了軟調(diào)速PWM,可能是51單片機(jī)CPU處理能力不足,超聲波不能正常工作。
#include <reg51.h>
#include <intrins.h>
#include "lcd.h"
typedef unsigned int u16;
sbit Trig = P1^1;
sbit Echo = P1^0;
sbit a1=P2^1; //驅(qū)動(dòng)電機(jī)
sbit a2=P2^2;
sbit z1=P3^5; //轉(zhuǎn)向電機(jī)
sbit z2=P3^6;
sbit led1=P2^3;
unsigned char PuZh[]="Yuan new car";
unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M',};
static unsigned char DisNum = 0; //顯示用指針
unsigned int time = 0;
unsigned long S = 0;
bit flag = 0;
unsigned char disbuff[4] = {0,0,0,0,};
/*
void aa2(void)
{
u16 i;
u16 c =100;
while(1)
{
for(i=0;i<10;i++)
{
}
a2=0;
for(i=0;i<10;i++) //占空比50%,直流電機(jī)降速
{
}
a2=1;
c--;
}
a1=0; //小車(chē)待機(jī)
a2=0;
led1=0;
}
void aa1(void)
{
u16 i;
u16 c =100;
while(c>2)
{
for(i=0;i<10;i++)
{
}
a1=0;
for(i=0;i<10;i++) //占空比50%,直流電機(jī)降速
{
}
a1=1;
c--;
}
a1=0; //小車(chē)待機(jī)
a2=0;
led1=0;
}
*/
void delay(u16 i)
{
while(--i);
}
void Moto(void) // 小車(chē)前行
{
a1=0;
a2=1;
led1=1;
delay(30000);
a1=1;
a2=1;
led1=1;
}
void conut(void) //超聲波數(shù)據(jù)檢測(cè)計(jì)算,轉(zhuǎn)換為cm
{
time = TH0*256+TL0;
TH0 = 0;
TL0 = 0;
S=(time*1.7)/100; //算出來(lái)是cm
if((S>=400)||flag==1) //超出測(cè)量范圍顯示“-”|
{
flag=0;
DisplayOneChar(0,1,ASCII[11]);
DisplayOneChar(1,1,ASCII[10]); //顯示點(diǎn)
DisplayOneChar(2,1,ASCII[11]);
DisplayOneChar(3,1,ASCII[11]);
DisplayOneChar(4,1,ASCII[12]); //顯示M
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10%10;
DisplayOneChar(0,1,ASCII[disbuff[0]]);
DisplayOneChar(1,1,ASCII[10]); //顯示點(diǎn)
DisplayOneChar(2,1,ASCII[disbuff[1]]);
DisplayOneChar(3,1,ASCII[disbuff[2]]);
DisplayOneChar(4,1,ASCII[12]); //顯示M
}
}
void StartModule() //發(fā)出超聲波
{
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;
}
void delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
void main(void)
{
TMOD=0x01; //設(shè)T0為方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //允許T0中斷
EA=1; //開(kāi)啟總中斷
LcdInit(); //LCD初始化子程序
LcdShowStr(0,0,PuZh); //顯示字符串
while(1)
{
StartModule(); //發(fā)出超聲波
while(!Echo); //當(dāng)RX為零時(shí)等待
TR0=1; //開(kāi)啟計(jì)數(shù)
while(Echo); //當(dāng)RX為1計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)
conut(); //計(jì)算
delayms(80);
if(S<30)
{
a1=1; //小車(chē)后退
a2=0;
led1=1;
delay(50000);
a1=1;
a2=1;
led1=1;
}
else
{
Moto(); //小車(chē)前行子程序
}
}
}
void ModuleT0() interrupt 1 //T0中斷用來(lái)計(jì)數(shù)器溢出
{
flag=1; //中斷溢出標(biāo)志
}
|
|