標(biāo)題: 基于51單片機(jī)的汽車紅外測距程序 [打印本頁]
作者: hzylisa 時(shí)間: 2016-6-13 23:05
標(biāo)題: 基于51單片機(jī)的汽車紅外測距程序
#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) //延時(shí)
{
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);
} */
}
-
-
汽車紅外測距程序.docx
2016-6-13 23:01 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
13.78 KB, 下載次數(shù): 29, 下載積分: 黑幣 -5
51單片機(jī)控制紅外傳感器測距,通過LC1602顯示
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |