标题:
51单片机遥控强度测量设计
[打印本页]
作者:
love16811187
时间:
2016-9-11 14:02
标题:
51单片机遥控强度测量设计
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit E=P2^7; //1602使能引脚
sbit RW=P2^6; //1602读写引脚
sbit RS=P2^5; //1602数据/命令选择引脚
sbit zero=P2^3; //20厘米调零处(实际上是调20),由于我们采用强度测量,不同使用环境的白噪声(红外线)强度不同,所以需要按键调零;
sbit storage=P2^2; //存储按键
sbit lookover=P2^1; //查阅按键
sbit led=P2^0;
uint table[5]={3720,3720,3720,3720,3720};
sbit b1=P1^0;
sbit b2=P1^1;
sbit b3=P1^2;
sbit b4=P1^3;
sbit b5=P1^4;
sbit b6=P1^5;
sbit b7=P1^6;
sbit b8=P1^7;
sbit b9=P3^1;
sbit b10=P3^2;
sbit b11=P3^3;
sbit b12=P3^4; //12位数据端口定义
sbit status=P3^7; //A/D转换器中的status定义,低电平有效
sbit lben=P3^6;
sbit hben=P3^5; //对低8位数据和高4位数据的端口定义,低电平有效
uint D1_8; // A/D的低8位
uint D9_12; // A/D的高4位
uint digital_10; // A/D转换后的十进制数
uint digital_100;
uint digital_1000;
uchar shi; // 距离十位
uchar ge; //距离个位
uchar ge1; //距离十分位
float temp; //距离参考值
float D; //距离值
uint DI; //整数部分
float DD; //小数部分
float modify; //修正值
void delay()
{
uint i,j;
for(i=0; i<=100; i++)
for(j=0; j<=20; j++);
}
void Delay(uint del)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++);
}
void enable(uchar del)
{
P0=del;
RS=0;
RW=0;
E=0;
delay();
E=1;
delay();
}
void write(uchar del)
{
P0=del;
RS=1;
RW=0;
E=0;
delay();
E=1;
delay();
}
void L1602_init(void)
{
enable(0x01); //清屏
enable(0x38); //设置16*2显示,5*7点阵,8位数据接口
enable(0x0c); //显示开,不显示光标,光标不闪烁
enable(0x06); //当读或写一个字符后地址指针加1,且光标加1
enable(0xd0); //设置数据地址指针80H+05H
}
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a;
if(hang==1) a=0x80;
if(hang==2) a=0xc0;
a=a+lie-1;
enable(a);
while(1)
{
if(*p=='\0')
break;
write(*p);
p++;
}
}
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang==1) a=0x80; //a为第一行的起始数据地址指针
if(hang==2) a=0xc0; //a为第二行的起始数据地址指针
a=a+lie-1; //因为是5*7的点阵显示,所以每对地址指针加1,其实是对地址的加5
enable(a); //设置数据地址指针
write(sign);
}
void Display_num(uchar h,uchar l,uchar num)
{
L1602_char(h,l,(num+'0'));
}
void main()
{
uchar n=0; //存储距离的个数,计数
uchar m=1;//切换显示计数的定义
L1602_init();
modify=0;
while(1)
{
if(status==0)
{
lben=0;
hben=1; //读取A/D低8位的值
delay(); //延时是为了让器件达到电压稳定
digital_10=(uint)b1+b2*2+b3*4+b4*8+b5*16+b6*32+b7*64+b8*128; //低8位转化为10进制 ;
hben=0;
lben=1; //读取A/D高4位的值
delay(); //延时是为了让器件达到电压稳定
digital_10+=b9*256+b10*512+b11*1024+b12*2048; //高4位转化为10进制;
digital_10=D1_8+D9_12; //得到A/D转换的10进制数;
if(zero==0)
{
Delay(2);
if(zero==0)
{
modify=(141.0-(float)digital_10)/1000.0;
Delay(10);
}
}
//调零按键功能实现
if(storage==0)
{
Delay(2);
if(storage==0)
{
if(n==5)
{
n=0;
}
table[n++]=digital_10;
Delay(10);
}
}
//存储距离,最多存储5个距离,超过5个距离后就覆盖前面的值
if(lookover==0)
{
Delay(2);
if(lookover==0)
{
if(m==6)
{
m=0;
}
m++;
Delay(10);
}
}
L1602_string(2,5,"P=");
Display_num(2,7,digital_10/1000);
Display_num(2,8,digital_1000/100);
Display_num(2,9,digital_100/10);
Display_num(2,10,digital_10);
//显示上面的十进制数,用来作为距离的参考量
switch(m)
{
case 1: if(digital_10>=(100+modify))
{
L1602_string(1,1,"Now");
}
break;
case 2: digital_10=table[0]; L1602_string(1,1,"M[1]");break;
case 3: digital_10=table[1]; L1602_string(1,1,"M[2]");break;
case 4: digital_10=table[2]; L1602_string(1,1,"M[3]");break;
case 5: digital_10=table[3]; L1602_string(1,1,"M[4]");break;
case 6: digital_10=table[4]; L1602_string(1,1,"M[5]");break;
default: break;
}
if(digital_10>=(100+modify))
{
led=1;
temp=digital_10/1000.0+modify;
if(digital_10>=1793 )
{
D=0.3142*temp*temp-2.7701*temp+5.9567;
}
else if(digital_10>=666)
{
D=2.5279*temp*temp-9.6821*temp+11.2530;
}
else if(digital_10>=474)
{
D=16.1678*temp*temp-28.8479*temp+18.0414;
}
else if(digital_10>=313)
{
D=35.1631*temp*temp-46.1739*temp+21.9936;
}
else if(digital_10>=208)
{
D=122.7448*temp*temp-101.4691*temp+30.7590;
}
else if(digital_10>=141)
{
D=368.1020*temp*temp-201.6608*temp+41.0483;
}
else if(digital_10>=123)
{
D=-111.1111*temp+35.6667;
}
else if(digital_10>=105)
{
D=2311.1*temp*temp-693.1*temp+72.3;
}
DI=(uint)D; //得到整数;
DD=D-DI; //得到分数部分;
shi=DI/10;
ge=DI;
ge1=(uchar)(DD*10);
L1602_string(1,5,"D=");
Display_num(1,8,shi);
Display_num(1,9,ge);
L1602_char(1,10,'.');
Display_num(1,11,ge1);
L1602_string(1,12,"cm");
}
else
{
L1602_string(1,1,"Out of range ");
led=0;
}
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1