- #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;
- }
- }
- }
- }
復制代碼
|