#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
/***定义SRF05超声波控制引脚***/
sbit Trig=P3^0; //超声波发射端
sbit Echo=P3^2; //超声波接收端
sbit beep=P1^2;
uchar code k[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint mm,count,distance;
/***延时1ms***/
void delay(unsigned int aa)
{
unsigned int i,j;
for(i=0;i<aa;i++)
for(j=0;j<110;j++);
}
/////显示数据转换程序
//void display(uint distance)
// {
// uchar ge,shi,bai;
// bai=distance/100;
// shi=(distance%100)/10;
// ge=distance%10;
//
// P2=0x20;
// P0=k[bai];
// delay(5);
// P2=0x00;
//
// P2=0x40;
// P0=k[shi];
// delay(5);
// P2=0x00;
//
// P2=0x80;
// P0=k[ge];
// delay(5);
// P2=0x00;
//
// }
void display(uint distance)
{
uchar ge,shi,bai,xs;
bai=distance/1000;
shi=(distance%1000)/100;
ge=distance%100/10;
xs=distance%10;
P2=0x10;
P0=k[bai];
delay(5);
P2=0x00;
P2=0x20;
P0=k[shi];
delay(5);
P2=0x00;
P2=0x40;
P0=k[ge];
delay(5);
P2=0x00;
P2=0x80;
P0=k[xs];
delay(5);
P2=0x00;
}
/***外部中断初始化***/
void int0_ini()
{
IT0=1;//下降沿触发
EX0=1;//外部中断0允许中断
}
/***定时器0中断初始化***/
void t0_ini()
{
TMOD=0x02;//定时器0处于工作方式2
TH0=0xca;
TL0=0xca;//5us中断一次
ET0=1;//允许定时器0中断
}
/***延时1us***/
void delay_us(unsigned char aa)
{
while(aa--);
}
void test()
{
EA=1; //开总中断
Trig=1; //发射端置高
delay_us(10); //延时10us
Trig=0; //发射端置低
while(Echo==0); //等待接收端准备接收
TR0=1;//启动定时器0
while(Echo==1); //等待接收端接收
// if(distance<400) //SRF05测最远距离400cm
// if(distance<25&&distance>0)
// {
// beep=~beep;
// }
// display(distance);
// delay(10); //延时800ms,等待数据处理完并且显示
}
/*****主函数*****/
void main()
{
Trig=0; //发射端置低
int0_ini(); //外部中断初始化
t0_ini(); //定时器中断初始化
while(1)
{
test();
if(distance<25&&distance>0)
{
beep=~beep;
}
display(distance);
delay(75); //延时75ms,等待数据处理完并且显示
}
}
/***定时器中断***/
void t0() interrupt 1
{
count++; //每中断一次count加1,count即为距离值
}
/***外部中断***/
void int0() interrupt 0
{
TR0=0; //关定时器
distance=count*10; //将count的值赋给distance
count=0; //count清零
}