#include <at89x51.h>
#include <intrins.h>
#include "LCD1602display.h"
#define TX P2_1
#define RX P2_0
sbit DU = P2^6;
sbit WE = P2^7;
/*****°′ÕÕÔ-í¼½óÏß¶¨òå******/
sbit L293D_IN1=P1^2;
sbit L293D_IN2=P1^3;
sbit L293D_IN3=P1^6;
sbit L293D_IN4=P1^7;
sbit L293D_EN1=P1^4;
sbit L293D_EN2=P1^5;
void Delay400Ms(void);//Ñóê±400oáÃëoˉêy
unsigned char code Range[] ="==Range Finder==";//LCD1602ÏÔ꾸ñê½
unsigned char code ASCII[13] = "0123456789.-M";
unsigned char code table[]="Distance:000.0cm";
unsigned char code table1[]="!!! Out of range";
unsigned char disbuff[4]={0,0,0,0};//óÃóú·Ö±e′æ·Å¾ààëμÄÖμ0.1mm¡¢mm¡¢cmoímμÄÖμ
void Count(void);//¾ààë¼ÆËãoˉêy
unsigned int time=0;//óÃóú′æ·Å¶¨ê±Æ÷ê±¼äÖμ
unsigned long S=0;//óÃóú′æ·Å¾ààëμÄÖμ
bit flag =0; //á¿3ìòç3ö±ê־λ
bit turn_right_flag;
//=========================================================================================================================
void Forward(unsigned char Speed_Right,unsigned char Speed_Left)// ǰ½ø
{
L293D_IN1=0;
L293D_IN2=1;
L293D_IN3=1;
L293D_IN4=0;
// PWM_Set(255-Speed_Right,255-Speed_Left);
}
void Stop(void) //é23μ
{
L293D_IN1=0;
L293D_IN2=0;
L293D_IN3=0;
L293D_IN4=0;
// PWM_Set(0,0);
}
void Turn_Right(unsigned char Speed_Right,unsigned char Speed_Left) //oó
{
L293D_IN1=1;
L293D_IN2=0;
L293D_IN3=0;
L293D_IN4=0;
// PWM_Set(255-Speed_Right,255-Speed_Left);
}
//=========================================================================================================================
/********¾ààë¼ÆËã3ìDò***************/
void Conut(void)
{
time=TH1*256+TL1;
TH1=0;
TL1=0;
//′Ëê±timeμÄê±¼äμ¥λ¾ö¶¨óú¾§ÕñμÄËù¶è£¬ía½ó¾§ÕñÎa11.0592MHZê±£¬
//timeμÄÖμÎa0.54us*time£¬μ¥λÎa΢Ãë
//ÄÇÃ′1uséù2¨Äü×ß¶àÔ¶μľààëÄØ£¿1s=1000ms=1000000us
// 340/1000000=0.00034Ã×
//0.00034Ã×/1000=0.34oáÃ× ò2¾íêÇ1usÄü×ß0.34oáÃ×
//μ«êÇ£¬ÎòÃÇÏÖÔú¼ÆËãμÄêÇ′ó3¬éù2¨·¢éäμ½·′éä½óêÕμÄ˫·3죬
//ËùòÔÎòÃǽ«¼ÆËãμĽá1û3yòÔ22ÅêÇêμ¼êμÄ·3ì
S=time*2;//ÏèËã3öò»12μÄê±¼äêǶàéù΢Ãë¡£
S=S*0.17;//′Ëê±¼ÆËãμ½μĽá1ûÎaoáÃ×£¬2¢ÇòêǾ«è·μ½oáÃ×μÄoóá½Î»áË£¬óDὸöD¡êyμã
if(S<=300) //
{
if(turn_right_flag!=1)
{
Stop();
Delay1ms(5);//·¢ÏÖD¡3μ×Ô¶ˉ¸′λμÄê±oò£¬¿éòÔéÔ΢Ñó3¤ò»μãÕa¸öÑóê±£¬¼õéùμç»ú·′ÏòμçÑ1¶Ôμç·°åμÄ3å»÷¡£
}
turn_right_flag=1;
P2_3=0;
Delay1ms(50);
P2_3=1;
Turn_Right(120,120); //D¡óúé趨¾ààëê±μç»úoóíË×aíä
}
else
{
turn_right_flag=0;
Forward(0,0); //ǰ½ø£¨′óóú20-30CMǰ½ø£©
}
//=======================================
if((S>=5000)||flag==1) //3¬3ö2aá¿·¶Î§
{
flag=0;
DisplayListChar(0, 1, table1);
}
else
{
disbuff[0]=S%10;
disbuff[1]=S/10%10;
disbuff[2]=S/100%10;
disbuff[3]=S/1000;
DisplayListChar(0, 1, table);
DisplayOneChar(9, 1, ASCII[disbuff[3]]);
DisplayOneChar(10, 1, ASCII[disbuff[2]]);
DisplayOneChar(11, 1, ASCII[disbuff[1]]);
DisplayOneChar(12, 1, ASCII[10]);
DisplayOneChar(13, 1, ASCII[disbuff[0]]);
}
}
/********************************************************/
void zd0() interrupt 3 //T0ÖD¶ÏóÃà′¼ÆêyÆ÷òç3ö,3¬1y2a¾à·¶Î§
{
flag=1; //ÖD¶Ïòç3ö±êÖ¾
RX=0;
}
/********3¬éù2¨¸ßμçÆ½Âö3å¿í¶è¼ÆËã3ìDò***************/
void Timer_Count(void)
{
TR1=1; //¿aÆô¼Æêy
while(RX); //μ±RXÎa1¼Æêy2¢μè′y
TR1=0; //1رռÆêy
Conut(); //¼ÆËã
}
/********************************************************/
void StartModule() //Æô¶ˉÄ£¿é
{
TX=1; //Æô¶ˉò»′ÎÄ£¿é
Delay10us(2);
TX=0;
}
/********************************************************/
/*************Ö÷3ìDò********************/
void main(void)
{
unsigned char i;
unsigned int a;
Delay1ms(400); //Æô¶ˉμè′y£¬μèLCM½2èë1¤×÷×′ì¬
LCMInit(); //LCM3õê¼»ˉ
Delay1ms(5);//Ñóê±Æ¬¿ì
DisplayListChar(0, 0, Range);
DisplayListChar(0, 1, table);
TMOD=TMOD|0x10;//éèT0Îa·½ê½1£¬GATE=1£»
EA=1; //¿aÆô×üÖD¶Ï
TH1=0;
TL1=0;
ET1=1; //ÔêDíT0ÖD¶Ï
turn_right_flag=0;
while(1)
{
RX=1;
StartModule(); //Æô¶ˉÄ£¿é
for(a=951;a>0;a--)
{
if(RX==1)
{
Timer_Count(); //3¬éù2¨¸ßμçÆ½Âö3å¿í¶è¼ÆËãoˉêy
}
}
}
}
|