#include<reg52.h>
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define command 0
#define date 1
sbit RS = P0^5;
sbit RW = P0^6;
sbit EN = P0^7;
sbit ITN=P3^4;
sbit CMP=P0^2;
sbit M11=P1^0;
sbit M12=P1^1;
sbit M13=P1^2;
sbit M21=P1^3;
sbit M22=P1^4;
sbit M23=P1^5;
uchar count=0,count1=0;//用来记录当前的距离
uchar temp=0;//用来记录上次测量距离,当返回无效时显示上次的数据
uchar leng[6];//显示当前的数据
uint V=0;//测速度,计数速度的脉冲数
uchar s[];//显示的速度
uint s1;//速度的转速
bit flag=0;
bit flag1=0;
bit flag2=0;
/************************************************************************************
查忙函数RS=0;RW=1;wait=0闲;wait!=0忙
************************************************************************************/
void busy()
{
uchar wait;
RS = 0;
RW = 1;
EN = 1;
P0=0xff;
while(1)
{
wait = P0;
wait &= 0x80;
if(wait == 0)break;
}
EN = 0;
}
/******************************************************************
延时
*******************************************************************/
void delay(uchar t)
{
uchar tt;
for(t;t>0;t--)
for(tt=110;tt>0;tt--);
}
void delayms(uint t)
{
uint tt;
for(t;t>0;t--)
for(tt=2000;tt>0;tt--);
}
/************************************************************************************
写指令函数 i=date为写数据,command为写命令
RW=0;E下降沿锁存数据
************************************************************************************/
void writelcd( i,uchar dat)
{
busy();
RW=0;
RS=i;
EN=1;
P0=dat;
_nop_ ();
_nop_ ();
EN=0;
delay(5);
}
/************************************************************************************
读数据函数RS=1;RW=1;E高电平读数据
************************************************************************************/
/*uchar readlcd()
{
uchar dat;
busy();
RS = 1;
RW = 1;
EN = 1;
dat = P2;
EN = 0;
return dat;
P2=0xff;
} */
/************************************************************************************
初始化液晶屏
0:字库 1:绘图
************************************************************************************/
void lcdinit(bit a)
{
if(a==1)
{
writelcd(command,0x01);// 清屏
writelcd(command,0x34); //扩展指令
writelcd(command,0x32);// 功能设置---8BIT控制界面,绘图显示ON
writelcd(command,0x36);// 功能设置---8BIT控制界面,扩充指令集
}
else
{
delay(10);
writelcd(command,0x30);// 功能设置---8BIT控制界面,基本指令集
delay(5);
writelcd(command,0x30);
delay(5);
writelcd(command,0x0e);
delay(5);
writelcd(command,0x14);
delay(5);
writelcd(command,0x01); // 清除屏幕显示,将DDRAM的地址计数器归零 */
delay(10);
writelcd(command,0x06);
delay(5);
}
}
void lcdword(uchar *str)
{
while(*str>0)
{
writelcd(date,*str);
str++;
delay(10);
}
}
/********************************************************************/
void display(bit i,uint x)
{
if(i==1)//
{
leng[0]=x/100+'0';
leng[1]=(x/10)%10+'0';
leng[2]=x%10;
leng[3]='C';
leng[4]='M';
leng[5]='\0';
writelcd(command,0x86);
lcdword(leng);
}
else
{
s[0]=
}
}
/********************************************************************/
void main()
{
uchar i=0;
TMOD=0X01;
TH0=(65536-50)/256;
TL0=(65536-50)%256;
EA=1;
ET0=1;
ET1=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
M11=1;
M12=1;
M13=0;
M21=1;
M22=1;
M23=0;
CMP=1;
writelcd(command,0x80);
lcdword("障碍物距离:");
while(1)
{
if(flag1==1)//测试完成
{
flag1=0;
if(flag=1)//测试无效
count1=temp;//测试无效时显示上次的数据
CMP=0;
for(i=10;i>0;i--);
CMP=1;//发送超声波
}
display(1,count1);
EX0=1;
if(flag2==0)
EX1=1;
}
}
void inti() interrupt 0
{
EX0=0;
TR0=1;
}
void inti() interrupt 2
{
TR1=1;
flag2++;
if(flag2==2)
{
flag2=0;
EX1=0;
TR1=0;
TH1=(65536-2500)/256;//清除计数器的数据
TL1=(65536-2500)%256;
s2=(60*5*1000)/V;
V=0;//下次计数
}
}
void time0() interrupt 1
{
TH0=(65536-50)/256;
TL0=(65536-50)%256;
count++;
if(ITN==1)
{
TR0=0;
TH0=(65536-50)/256;
TL0=(65536-50)%256;
if(count1>=1000)
{
flag=1;//测试无效
temp=count1;//测试无效时返回上次的数据
}
else if(count1<=15)
{
uchar i;
M23=1;
for(i=110;i>0;i--); //转弯
}
count1=count;//当测试没完成时count1为上次的值,测试完时为本次测量的距离
count=0;
flag1=1;//本次测量完成,请求发送下二次测量
}
}
void timer1() interrupt 3
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
V++;
}
评论11