标题: 倒车雷达 [打印本页]
作者: yyw1995 时间: 2018-4-27 15:27
标题: 倒车雷达
/*-------------------------------------
超声波测距器单片机程序
MCU AT89C51 XAL 12MHz
2009.5.25
#include<at89x51.h>
#include<intrins.h>
#define uchar unsigned unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar code tab[]={0x18,0x7b,0x2c,0x29,0x4b,0x89, 0x 88, 0x3b, 0x 08, 0x 09, 0x f f, 0x 8e};//段码
data uchar testok,num,keynum1,mao;
data uchar dispram[4]={0,0,0,0};//显示初值
data uine i;
data ulong time,baojing;
sbit set=P2^0;//定义位寻址,设置键
sbit add=P2^1;//加
sbit dec= P2^2;//减
sbit ok= P2^3;//确定键
dalay(uchar t)//延时子程序
{
uchar I;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
}
init()//定时器初始化、启动超声波发送
{
uchar i=4;
TH0=0;
TL0=0;
TR0=1;
while(i--)
{
P1_0=~p1_0
dalay(1);
}
}
display()//显示子程序
{
uchar i,temp=0xef;
for{i=0;i<4;i++}
{
P2=temp;
if(mao==1&&keynum-1==i)
P0=0xff;//灭
else
p0=tab[dispram];//亮,送显示数据
temp=_crol_(temp,1);
delay(10);
P2=0xff;
}
}
viod shanshuo()//闪烁
{
if(keynum1<1)
{
keynum1++;
mao=1;
}
else
{
keynum1++;
mao=0;
if(keynum1==2)
keynum1=0;
}
}
void keyscan()//键盘扫描
{
if(set==0)//设置键
delay(10);
if(set==0)
{
while(!set);
delay(10);
while(!set);
keynum++;//键值加1
EX0=0; //管定时器0和外部中断1
ET0=0;
if(keynum==5)
keynum=1;
}
if(keynum!=0)
{
if(add==0) //增加
delay(10);
if(add==0)
{
while(!add);
delay(10);
while(!add);
dispram[keynum-1]++; //对应的缓冲区值加1
if(dispram[keynum-1]==10)
dispram[keynum-1]=0;
}
if(dec==0) //值减
delay(10);
if(dec=0)
{
while(!dec);
delay(10);
while(idec;
if(dispram[keynum-1]== 0)
dispram[keynum-1]=10;
dispram[keynum-1]--;//对应的缓冲区值减1
}
}
if(ok==0)//确定键
delay(10);
if(ok==0)
{
while(!ok)
delay(10);
while(!ok);
keynum=0;
baojing=dispram[3]*1000+dispram[2]*100+dispram[1]*10+disprm[0];//取出设置的报警值
EX0=1;
ET0=1;
}
}
/*主程序*/
void main(viod)
{
TMOD=0x01;//定时器0模式1
IE=0x80;//开总中断,相当于EA=1;
while(1)
{
testok=0;
if(keynum!=0)
shanshuo();
else{ inie();//启动定时器0和超声波发送
EX0=1;//开外部中断0
ET0=1;//开定时器0中断
while(!testok)display();
}
keyscan();
if(1==teskok)
{
time=TH0;
time=(time<<8)/TL0;//取出定时器0值
time*=172;
time/=10000;//变为厘米
if(time<baojing)
P1_1=0;//报警
else P1_1=1;
dispram[0]=(uchar)(time%10);//距离计算送显示缓冲
time/=10;
dispram[1]=(uchar)(time%10);
time/=10;
dispram[2]=(uchar)(time%10);
dispram[3]=(uchar)(time%10);
}
if(2==testok)//超时显示OFF
{
dispram[0]=11;
dispram[1]=11;
dispram[2]=0;
dispram[3]=10;
}
for(i=0;i<300;i++) display();
}
}
/*超声接收程序(外中断0)*/
void cs_r(void) interrupt 0
{
TR0=0;
ET0=0;
EX0=0;
testok=1;
}
/*超时清除程序(内中断T0)*/
void overtime(void)interrupt 1
{
EX0=0;
ET0=0;
TR0=0;
testok=2;
}
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |