#include<reg52.h>
#include<intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define unit unsigned int
sbit RS=P3^4; //3.4
sbit RW=P3^3; //3.3
sbit E=P3^2; //3.2
//sbit RS=P1^2; //3.4
//sbit RW=P1^1; //3.3
//sbit E=P1^0; //3.2
sbit trig1 = P2^3;
sbit echo1 = P2^2;
sbit trig2 = P2^1;
sbit echo2 = P2^0;
float dis = 0;
unit dist,t1,t2;
int t3=10;
uchar a1[]="声源定位系统";
uchar a2[]="X:";
uchar a3[]="Y:";
uchar a4[]="坐标:";
uchar s2[8];
uchar s3[8];
uchar s4[8];
uchar upset(uchar dat) //用12345678代表dat的各个位
{
dat=(dat>>4)|(dat<<4); //dat变成56781234
dat=((dat&0xcc)>>2)|((dat&0x33)<<2);//dat=78563412
dat=((dat&0xaa)>>1)|((dat&0x55)<<1);//dat=87654321
return dat;
}
uchar RollBack(uchar n)
{
int i,buf;
for(i=0;i<8;i++)
{
buf=(n<<i)&0x80;
buf>>=(8-i);
}
return buf;
}
void delay(int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<114;j++);
}
void wcmd(uchar cmd) //写命令
{
cmd=upset(cmd);
RS=0;
RW=0;
E=0;
_nop_();
P1=cmd;
delay(5);
E=1;
delay(5);
E=0;
}
void wdate(uchar date) //写数据
{
date=upset(date);
RS=1;
RW=0;
E=0;
P1=date;
delay(5);
E=1;
delay(5);
E=0;
}
void wplace(uchar x,uchar y) //设定显示位置
{
uchar place;
if(x==0)
x=0x80;
if(x==1)
x=0x90;
if(x==2)
x=0x88;
if(x==3)
x=0x98;
place=x+y;
wcmd(place);
}
void lcd_init() //初始化
{
wcmd(0x30);
delay(5);
wcmd(0x0C);
delay(5);
wcmd(0x01);
delay(5);
wcmd(0x06);
delay(5);
}
void dat_init() //显示标题和大、中、小、三个字
{
int i;
wplace(0,1); i=0 ;
while(a1[i]!='\0')
{
wdate(a1[i]);
i++;
}
wplace(1,0); i=0 ;
while(a2[i]!='\0')
{
wdate(a2[i]);
i++;
}
wplace(2,0); i=0 ;
while(a3[i]!='\0')
{
wdate(a3[i]);
i++;
}
wplace(3,0); i=0 ;
while(a4[i]!='\0')
{
wdate(a4[i]);
i++;
}
}
void Data()
{
int i;
wplace(1,4); i=0 ;
while(s2[i]!='\0')
{
wdate(s2[i]);
i++;
}
wplace(2,4); i=0 ;
while(s3[i]!='\0')
{
wdate(s3[i]);
i++;
}
wplace(3,4); i=0 ;
// while(s4[i]!='\0')
for(i=0;i<5;i++)
{
wdate(s4[i]);
}
}
void delay_20us()
{
uchar bt ;
for(bt = 0;bt<10;bt++);
}
void TIM1init(void)//定时器1初始化
{
TMOD=0x10;//定时器1工作方式1,TH1是重装值,TL1是初值
TH1=0x00; //重载值 溢出一次约50us
TL1=0x00; //初始化值
}
void test1()
{
TH1 = 0x00;
TL1 = 0x00;
trig1 = 1;
delay_20us();
trig1 = 0;
// EX1 = 1;
while(!echo1);
TR1 = 1; //定时器1启动
while(echo1);
TR1 = 0; //定时器1关闭
dis=TH1 * 256 + TL1;
t1=dis*344/2/10000;
// EX1 = 0;
}
void test2()
{
TH1 = 0x00;
TL1 = 0x00;
trig2 = 1;
delay_20us();
trig2 = 0;
// EX1 = 1;
while(!echo2);
TR1 = 1;
while(echo2);
TR1 = 0;
dis=TH1 * 256 + TL1;
t2=dis*344/2/10000;
}
void main(void)
{
lcd_init(); //液晶屏初始化
delay(1);
dat_init();
TIM1init();
while(1)
{
test1();
test2();
// sprintf(s2,"%d",t1); //int类型的L1变为char类型的S2
// sprintf(s3,"%d",t2);
// sprintf(s4,"%d",t3);
s2[0]=t1%100/10+0x30;
s2[1]=t1%10+0x30;
// s3[2]=t2/100+0x30;
s3[0]=t2%100/10+0x30;
s3[1]=t2%10+0x30;
s4[0]=s2[0];
s4[1]=s2[1];
s4[2]=',';
s4[3]=s3[0];
s4[4]=s3[1];
Data();
}
}