#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; //中断溢出标志
}
|