#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;
sbit a2=P2^2;
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;
while(1)
{
for(i=0;i<10;i++)
{
}
a2=0;
for(i=0;i<10;i++) //占空比50%,直流電機降速
{
}
a2=1;
}
}
void aa1(void)
{
u16 i;
while(1)
{
for(i=0;i<10;i++)
{
}
a1=0;
for(i=0;i<10;i++) //占空比50%,直流電機降速
{
}
a1=1;
}
}
void Moto(void) // 小車前行
{
a1=0;
aa2();
led1=1;
}
void conut(void) //超聲波數據檢測計算,轉換為cm
{
time = TH0*256+TL0;
TH0 = 0;
TL0 = 0;
S=(time*1.7)/100; //算出來是cm
if((S>=400)||flag==1) //超出測量范圍顯示“-”|
{
flag=0;
DisplayOneChar(0,1,ASCII[11]);
DisplayOneChar(1,1,ASCII[10]); //顯示點
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]); //顯示點
DisplayOneChar(2,1,ASCII[disbuff[1]]);
DisplayOneChar(3,1,ASCII[disbuff[2]]);
DisplayOneChar(4,1,ASCII[12]); //顯示M
}
}
void StartModule() //發出超聲波
{
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; //設T0為方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //允許T0中斷
EA=1; //開啟總中斷
LcdInit(); //LCD初始化子程序
LcdShowStr(0,0,PuZh); //顯示字符串
while(1)
{
a1=0; //小車待機
a2=0;
led1=0;
StartModule(); //發出超聲波
while(!Echo); //當RX為零時等待
TR0=1; //開啟計數
while(Echo); //當RX為1計數并等待
TR0=0; //關閉計數
conut(); //計算
delayms(80);
if(S<20)
{
aa1(); //小車后退
a2=0;
led1=1;
delayms(100);
a1=1; // 小車剎車
a2=1;
led1=0;
delayms(80);
}
else
{
Moto();
delayms(800);
}
}
}
void zd0() interrupt 1 //T0中斷用來計數器溢出
{
flag=1; //中斷溢出標志
}
|