#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
sbit RX=P2^0;
sbit TX=P2^1;
sbit LCM_RW=P2^5; //定义LCD引脚
sbit LCM_RS=P2^4;
sbit LCM_E=P2^6;
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
void Decode(unsigned char ScanCode);
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
unsigned char code mcustudio[] ={"==Range Finder=="};
unsigned char code Cls[] = {" "};
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,};
uint xian=0;
uint a;
uint quanshu;
sbit l0=P1^4;
sbit l1=P1^5;
sbit r0=P1^6;
sbit r1=P1^7;
sbit youce=P3^7;
sbit zuoce=P3^5;
sbit zhongjian=P3^6;
sbit zuodeng=P3^1;
sbit zhongdeng=P3^3;
sbit youdeng=P3^2;
void delay2(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void delay(uint skeed)
{
uint tt;
tt=65536-1000*skeed;
// TMOD=0x10;
TH1=tt/256;
TL1=tt%256;
TR1=1;
while(TF1!=1);
TF1=0;
TR1=0;
}
void motor_right()
{
l0=1;
l1=0;
r0=0;
r1=1;
}
void motor_left()
{
l0=0;
l1=1;
r0=1;
r1=0;
}
void motor_run()
{
l0=1;
l1=0;
r0=1;
r1=0;
}
void motor_stop()
{
r0=0;
r1=0;
l0=0;
l1=0;
}
void zhuanwan1()
{
uint i;
for(i=0;i<400;i++)
motor_run();
for(i=0;i<400;i++)
motor_left();
}
void zhuanwan2()
{
uint i;
for(i=0;i<400;i++)
motor_run();
for(i=0;i<500;i++)
motor_left();
}
void weitiao()
{
/* if(youce==0&&zhongjian==0&&zuoce==0)
{
motor_run(26,1);
}*/
if(youce==0&&zhongjian==0&&zuoce==1)
{
zuodeng=0;
delay2(100);
zuodeng=1;
motor_right();
// motor_run(5,10);
// motor_left(20,1);
}
if(zhongjian==0&&youce==1&&zuoce==0)
{
youdeng=0;
delay2(100);
youdeng=1;
motor_left();
// motor_run();
// motor_right(20,1);
}
}
void saomiao0()
{
if(zhongjian==1)
{
zhongdeng=0;
delay2(100);
zhongdeng=1;
xian++;
if(xian==5)
{
xian=1;
quanshu=1;
}
switch(xian)
{
case 1:
case 2:zhuanwan1();
break;
case 3:zhuanwan2();
break;
case 4:zhuanwan1();
default: break;
}
}
else
motor_run();
}
void saomiao1()
{
uint i;
if(zhongjian==1)
{
zhongdeng=0;
delay2(100);
zhongdeng=1;
xian++;
if(xian==5)
{
xian=1;
quanshu++;
}
switch(xian)
{
case 1:
case 2:zhuanwan1();
break;
case 3:zhuanwan2();
break;
case 4:
{
for(i=0;i<400;i++)
motor_run();
for(i=0;i<400;i++)
motor_left();
for(i=0;i<600;i++)
motor_run();
weitiao();
motor_stop();
for(i=0;i<100;i++)
delay2(60);
motor_run();
}
default: break;
}
}
else
motor_run();
}
void saomiao2()
{
uint i;
if(zhongjian==1)
{
zhongdeng=0;
delay2(100);
zhongdeng=1;
xian++;
if(xian==5)
{
xian=1;
quanshu++;
}
switch(xian)
{
case 1:
case 2:zhuanwan1();
break;
case 3:zhuanwan2();
break;
case 4:
{
for(i=0;i<400;i++)
motor_run();
for(i=0;i<400;i++)
motor_left();
for(i=0;i<430;i++)
motor_run();
for(i=0;i<500;i++)
motor_left();
for(i=0;i<370;i++)
motor_run();
for(i=0;i<670;i++)
motor_right();
for(i=0;i<550;i++)
motor_run();
for(i=0;i<550;i++)
motor_right();
for(i=0;i<370;i++)
motor_run();
for(i=0;i<500;i++)
motor_left();
}
default: break;
}
}
else
motor_run();
}
//写数据
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
P0 = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时
LCM_E = 0; //延时
LCM_E = 1;
}
//写指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
P0 = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
//读数据
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(P0);
}
//读状态
unsigned char ReadStatusLCM(void)
{
P0 = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (P0 & Busy); //检测忙信号
return(P0);
}
void LCMInit(void) //LCM初始化
{
P0 = 0;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0F,1); // 显示开及光标设置
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
WriteCommandLCM(X, 1); //发命令字
WriteDataLCM(DData); //发数据
}
//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x19) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.8)/10; //算出来是MM
if((S>=7000)||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[11]);
DisplayOneChar(5, 1, ASCII[12]); //显示M
}
else
{
disbuff[0]=S/1000;
disbuff[1]=S/100%10;
disbuff[2]=S/10%10;
disbuff[3]=S%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[disbuff[3]]);
DisplayOneChar(5, 1, ASCII[12]); //显示M
}
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
RX=0;
}
/********************************************************/
void StartModule() //启动模块
{
TX=1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
void Timer_Count(void)
{
TR0=1