#include<STC12.h> #define uchar unsigned char #define uint unsigned int #define ADC_POWER 0x80 #define ADC_FLAG 0x10 #define ADC_START 0x08 #define ADC_SPEEDLL 0x00 #define ADC_SPEEDL 0x20 #define ADC_SPEEDH 0x40 #define ADC_SPEEDHH 0x60 uchar code table[]="0123456789"; uchar code table1[]="D1="; uchar code table3[]="D2="; uchar code table2[]="set:"; sbit lcden=P3^4; sbit lcdrs=P3^5; sbit dula=P2^5; sbit wela=P2^3; sbit key1=P2^1; sbit key2=P2^0; sbit key3=P1^6; sbit key4=P1^7; //sfr ADC_CONTR = 0xBC; //sfr ADC_RES = 0xBD; sfr ADC_LOW2 = 0xBE; sfr PLASF = 0x9D; int distance_danger=30; int a=0; int c=0; int e=0; int bai,shi,ge; int AD_result=0; int AD_result2=0; int count=0; int beep_count=0; int aa=0; int distance=0,distance2=0; uchar num; void delay(uint z) //延時 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) //液晶寫命令 { lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_data(uchar date) //液晶寫數(shù)據(jù) { lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void init() //1602液晶初始化 { // dula=0; wela=0; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } void keyone() { if(key1==0&&a==0) { distance_danger++; a=1; } else if(key1==1) { a=0; } } void keytwo() { if(key2==0&&c==0) { distance_danger--; c=1; } else if(key2==1) { c=0; } } void xianshi(int number, int adress) //數(shù)值位運(yùn)算與顯示 { write_com(0x80+adress);//84 if (number>999||number<=0) { bai=0; shi=0; ge=0; write_data(table[bai]); delay(5); write_data(table[shi]); delay(5); write_data(table[ge]); delay(5); } else if (number>99) { bai=number/100; shi=number%100/10; ge=number%100%10; write_data(table[bai]); delay(5); write_data(table[shi]); delay(5); write_data(table[ge]); delay(5); } else if (number>9) { bai=0; shi=number/10; ge=number%10; write_data(table[bai]); delay(5); write_data(table[shi]); delay(5); write_data(table[ge]); delay(5); } else { bai=0; shi=0; ge=number; write_data(table[bai]); delay(5); write_data(table[shi]); delay(5); write_data(table[ge]); delay(5); } } void InitADC() //ad轉(zhuǎn)換初始化 { PLASF = 0xff; ADC_RES = 0; //ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch; delay(2); } int AD_cal(int AD) { float y; if(AD>=98&&AD<140) { y=-0.0045*AD*AD+0.715*AD+3.1; } else//if(AD>=71&&AD<=98) { y=0.0344*AD*AD-6.554*AD+341.9; } if(y>50) { y=50; } return y; } int AD_caculate(char ch) // 讀取ad值 { int result=0; ADC_CONTR &= !ADC_FLAG; result=ADC_RES; //ch = 0; ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch; return result; } int pinjun(char ch) //求20次ad轉(zhuǎn)換的平均值 { int i; float sum1=0; int he[30]; for(i=0;i<20;i++) { he=AD_caculate(ch); sum1+=he; } sum1=sum1/20; return AD_caculate(ch); } /**/ void beep_time(int x) //蜂鳴器 { beep_count++; if(beep_count>x) { beep_count=0; dula=~dula; wela=~wela; } } void beep_warning(int xg,int yg) { if(yg<=distance_danger) { beep_time(yg*3); // deng=1; } else if(xg<=distance_danger) { beep_time(xg*3); //yin=~yin; // deng=1; } else { // P2=0x00; dula=0;//yin=1;deng=0; wela=1; } } void main() { init(); write_com(0x80); write_data(1); init(); InitADC(); //IE = 0xa0; delay(5); write_com(0x80+0x40); //顯示"D1=" for(aa=0;aa<3;aa++) { write_data(table1[aa]); delay(5); } delay(5); write_com(0x80+0x48); //顯示"D2=" for(aa=0;aa<3;aa++) { write_data(table3[aa]); delay(5); } write_com(0x80); //顯示"set=" for(aa=0;aa<4;aa++) { write_data(table2[aa]); delay(5); } //a=0; c=0; e=0; //P2=0x00; dula=0; // yin=1; // deng=0; while(1) { // //dula=0; count++; keyone(); keytwo(); // keytwo(); // keythree(); AD_result=pinjun(0); AD_result2=pinjun(1); distance=AD_cal(AD_result);// distance2=AD_cal(AD_result2); beep_warning(distance,distance2); if(count>10) { delay(5); xianshi(distance_danger,0x04); delay(5); xianshi(distance,0x43); delay(5); xianshi(distance2,0x4b); count=0; } } /* init(); write_com(0x80); for(num=0;num<11;num++) { write_data(table[num]); delay(5); } write_com(0x80+0x40); for(num=0;num<13;num++) { write_data(table1[num]); delay(5); } while(1) { beep=1; delay(500); beep=0; delay(500); } */ }
|