#include<reg52.h>
#include<math.h>
#include<ABSACC.H>
#include<INTRINS.H>
#define Uchar unsigned char
Uchar NumberShow=0;
///////////////////////
sbit RDIN =P3^2;
sbit RST =P1^5; //INT0
sbit CS2 =P3^3; //INT1
sbit CS1 =P3^4; //T0
sbit Elcd =P1^0; //T1
sbit RW =P3^7; //WD
sbit DI =P3^6; //RD
//测量按扭定义
sbit StCal =P1^3;
sbit Led =P2^2; //led light
sbit Model =P1^4;
sbit MLed =P2^1;
sfr Datalcd = 0x80;
/**********常用操作命令和参数定义************/
#define DISTTOD 0x1b //定义探测头距�,根据探测头距离修改�
#define DISPON 0x3f //显示打开
#define DISPOFF 0x3e //显示关闭
#define DISPFIRST 0xc0 //显示起始行
#define SETYPAGE 0xb8 //设置首页地址
#define SETXCOL 0x40 //设置首列地址#
#define pt1 DBYTE[0x14]
#define pt2 DBYTE[0x16]
#define pt3 DBYTE[0x17]
void Esignal(); //E信号控制,从高电平跳变低�
void Delay(Uchar ms); //延迟函�
void WrCommand(Uchar Command,bit c1,bit c2); //写指令函数
void WrData(Uchar Data,Uchar ypage,Uchar xcol); //写数据函数
void LcdInit(); //液晶初始化函数
void SetLcd();//粒�
void ClrLcd();//清屏
void WrString(Uchar *ptr,Uchar Number,Uchar page,Uchar col);//显示字符串
void ShowNumber(Uchar *ptr,Uchar Number,Uchar page,Uchar col);//显示数字
void ShowTwoFloat(float Nfraction,Uchar page,Uchar col);
void init_serial();
void serial() interrupt 4 using 2 ;
//下面是用汇编实现的函数(接收数据)
void ReadDatea();
Uchar code Point[];
Uchar code Sstring[]={"Dist"};
Uchar code dist[];
Uchar code C0To9[];
Uchar code xarry[];
Uchar code yarry[];
Uchar code zarry[];
Uchar code space[];
Uchar code minus[];
//*******************************************************
//测量键标志=0,开始测量,定标键标志=0,进入标准测量状态,
//*******************************************************
main()
{
Uchar flag=0;
Uchar flagx=0,flagy=0; //标志坐标x,y是否小于0,1小于0,0大于0;
Uchar i=0; //时间延迟
Uchar array1[3];
RST=0;
Delay(10);
RST=1;
LcdInit();
SetLcd();
ClrLcd();
//WrString(dist,4,0,10);
Delay(10);
Led=1;
StCal=1;
Model=1;
MLed=1;
while(1)
{
Uchar idata Numbera,Numberb,Numberc;
ReadDatea(); //读取数据函数
Numbera=pt1;
Numberb=pt2;
Numberc=pt3;
/***************************************************************************************************************************/
if(StCal==0) //测量键标志=0,开始测量
{
Led=0; //点亮测量键灯
if(Model==0)
{
// WrString(Point,1,0,0);
char idata x,y,z;
float idata xx,yy,zz;
float idata temp;
Uchar L=12.5; //三角形边长
Uchar a,b,c;
MLed=0; //测量状态为x,y,z
a=Numbera;
b=Numberb;
c=Numberc;
//测试用
//xx=(a*a+L*L-b*b)/2*L;
temp=a*a;
temp+=L*L;
temp-=b*b;
xx=temp/(2*L);
// yy=(a*a+L*L-c*c-L*xx)/1.73*L;
temp=a*a;
temp+=b*b;
temp+=L*L;
temp-=2*c*c;
temp=temp/3.464;
yy=temp/L;
//zz=sqrt(c*c+L*xx+1.732*L*yy-xx*xx-yy*yy-L*L);
temp=a*a;
temp-=xx*xx;
temp-=yy*yy;
zz=sqrt(temp);
x=(char) xx;
y=(char) yy;
z=(char) zz;
//判断x,y是否小于0
if(x<0)
{
flagx=1;
x=-x;
}
else
flagx=0;
if(y<0)
{
flagy=1;
y=-y;
}
else
flagy=0;
//xianshi x
WrString(xarry,1,1,30);
WrString(space,1,1,39);
WrString(Point,1,1,39);
if(flagx==1)
WrString(minus,1,2,48);
else
WrString(space,1,1,48);
NumberShow=x;
array1[0]=NumberShow/100;
NumberShow=NumberShow-100*array1[0];
array1[1]=NumberShow/10;
NumberShow=NumberShow-10*array1[1];
array1[2]=NumberShow;
ShowNumber(array1,3,1,60);
NumberShow=Numbera;
array1[0]=NumberShow/100;
NumberShow=NumberShow-100*array1[0];
array1[1]=NumberShow/10;
NumberShow=NumberShow-10*array1[1];
array1[2]=NumberShow;
ShowNumber(array1,3,1,90);
//xianshi y
WrString(yarry,1,3,30);
WrString(space,1,3,39);
WrString(Point,1,3,39);
if(flagy==1)
WrString(minus,1,4,48);
else
WrString(space,1,3,48);
NumberShow=y;
array1[0]=NumberShow/100;
NumberShow=NumberShow-100*array1[0];
array1[1]=NumberShow/10;
NumberShow=NumberShow-10*array1[1];
array1[2]=NumberShow;
ShowNumber(array1,3,3,60);
NumberShow=Numberb;
array1[0]=NumberShow/100;
NumberShow=NumberShow-100*array1[0];
array1[1]=NumberShow/10;
NumberShow=NumberShow-10*array1[1];
array1[2]=NumberShow;
ShowNumber(array1,3,3,90);
//xianshi z
WrString(zarry,1,5,30);
WrString(space,1,5,39);
WrString(Point,1,5,39);
WrString(space,1,5,48);
NumberShow=z;
array1[0]=NumberShow/100;
NumberShow=NumberShow-100*array1[0];
array1[1]=NumberShow/10;
NumberShow=NumberShow-10*array1[1];
array1[2]=NumberShow;
ShowNumber(array1,3,5,60);
NumberShow=Numberc;
array1[0]=NumberShow/100;
NumberShow=NumberShow-100*array1[0];
array1[1]=NumberShow/10;
NumberShow=NumberShow-10*array1[1];
array1[2]=NumberShow;
ShowNumber(array1,3,5,90);
}//if ,表示测量模式
/**********************************************************************************************************************/
else
{
MLed=1;
WrString(dist,1,1,30);
array1[0]='1';
ShowNumber(array1,1,1,39);
WrString(Point,1,1,48);
NumberShow=Numbera;
array1[0]=NumberShow/100;
NumberShow=NumberShow-100*array1[0];
array1[1]=NumberShow/10;
NumberShow=NumberShow-10*array1[1];
array1[2]=NumberShow;
ShowNumber(array1,3,1,60);
WrString(space,1,1,90);
WrString(space,1,1,98);
WrString(space,1,1,106);
WrString(dist,1,3,30);
array1[0]='2';
ShowNumber(array1,1,3,39);
WrString(Point,1,3,48);
NumberShow=Numberb;
array1[0]=NumberShow/100;
NumberShow=NumberShow-100*array1[0];
array1[1]=NumberShow/10;
NumberShow=NumberShow-10*array1[1];
array1[2]=NumberShow;
ShowNumber(array1,3,3,60);
WrString(space,1,3,90);
WrString(space,1,3,98);
WrString(space,1,3,106);
WrString(dist,1,5,30);
array1[0]='3';
ShowNumber(array1,1,5,39);
WrString(Point,1,5,48);
NumberShow=Numberc;
array1[0]=NumberShow/100;
NumberShow=NumberShow-100*array1[0];
array1[1]=NumberShow/10;
NumberShow=NumberShow-10*array1[1];
array1[2]=NumberShow;
ShowNumber(array1,3,5,60);
WrString(space,1,5,90);
WrString(space,1,5,98);
WrString(space,1,5,106);
}//表示测量模式的esle
}//表示开始测量
//开始测量的else
else
{
Led=1;
MLed=1;
}
for(i=0;i<2;i++)
Delay(200);
}//while
}//main
void init_serial()
{
TMOD=TMOD | 0x11 ;
RCAP2L = 232;
RCAP2