//超声波模块程序
//超声波模块程序 #include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit SIG = P3^2;
sbit test = P2^7; uint succeed_flag,time,timeH,timeL,flag;
double distance;
#define sled_dm_port P0 /*定义数码管段码的控制脚*/
#define sled_wm_port P2 /*定义数码管位码的控制脚*/
/*定义数码管显示字符跟数字的对应数组关系*/
uchar code sled_mun_to_char[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
/*共阴显示 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /*定义需要点亮的数码管*/
uchar code sled_bit_table[]={0x08,0x04,0x02,0x01};//位选信号
uchar data sled_data[4]={0xff,0xff,0xff,0xff}; /*0-3号SLED缓冲值*/
uchar data led_lighten_bit=0 ; /*LED灯点亮标志位0-3*/
void delay_ms(uint x)//毫秒级延时
{
uint i,j;
i=0;
for(i=0;i<x;i++)
{
j=108;
while(j--);
}
}
void view_ds(double tem_in)
{
uint i,dp=4;
long int tem;
//if(succeed_flag==0)for(j=0;j<4;j++) sled_data[i] = sled_mun_to_char[0];
//if(tem_in==0){for(j=0;j<3;j++) sled_data[i] = sled_mun_to_char[17];sled_data[3] = sled_mun_to_char[0];}
//else
{
for(i=0;tem_in/1>=1;i++)
{
tem_in=tem_in/10;
dp=i;
}
tem=tem_in*10000;
sled_data[0] = sled_mun_to_char[tem/1000];
sled_data[1] = sled_mun_to_char[tem%1000/100];
sled_data[2] = sled_mun_to_char[tem%100/10];
sled_data[3] = sled_mun_to_char[tem%10];
}
for(i=0;i<4;i++)
{
sled_wm_port = 0x00; /*关闭显示*/
sled_dm_port = sled_data[i]; /*输出段码数据到数码管*/
if(i==dp) sled_dm_port = sled_dm_port+0x80; /*显示小数点*/
sled_wm_port = sled_bit_table[i]; /*输出位码数据到数码管*/
delay_ms(5);
}
sled_wm_port = 0x00; /*关闭显示*/
} void delay_4us()
{
uchar a ;
for(a=0;a<2;a++);
} void main()
{
uint i,j;
succeed_flag=time=timeH=timeL=flag=test =0;
SIG=0; //首先拉低脉冲输入引脚
EA=1; //打开总中断0
TMOD=0x10; //定时器1,16位工作方式
while(1)
{
distance=0;
P2=0;
EA=0; //关总中断
SIG=1; //超声波输入端
delay_4us(); //延时4us
SIG=0; //产生一个4us的脉冲
flag=0;
succeed_flag=0; //清测量成功标志
while(SIG==0) //等待Echo回波引脚变高电平
{
if(flag==1)break;
for(i=0;i<20;i++)
for(j=0;j<120;j++)
if(SIG==1)
break;
flag=1;
} if(flag==0)
{
EA=1; //开总中断
EX0=1; //打开外部中断0
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //计数溢出标志
TR1=1; //启动定时器1
delay_ms(20);//view_ds(distance); //等待测量的结果
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断0
}
if(succeed_flag==1)
{
time=timeH*256+timeL;
distance=time*0.172; //厘米 53.21;//
//view_ds(distance);
}
if(succeed_flag==0)
{
distance=0; //没有回波则清零
//test = 1; //测试灯变化
}
view_ds(distance);
}
}
//***************************************************************
//外部中断0,用做判断回波电平
void exter() interrupt 0 // 外部中断0是0号
{
timeH =TH1; //取出定时器的值
timeL =TL1+4; //取出定时器的值
succeed_flag=1;//至成功测量的标志
EX0=0; //关闭外部中断
//while(1)view_ds(53.12);
}
//****************************************************************
//定时器1中断,用做超声波测距计时
void timer1() interrupt 3 //
{
TH1=0;
TL1=0;
distance=0;
}
//超声波模块程序 #include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit SIG = P3^2;
sbit test = P2^7; uint succeed_flag,time,timeH,timeL,flag;
double distance;
#define sled_dm_port P0 /*定义数码管段码的控制脚*/
#define sled_wm_port P2 /*定义数码管位码的控制脚*/
/*定义数码管显示字符跟数字的对应数组关系*/
uchar code sled_mun_to_char[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
/*共阴显示 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /*定义需要点亮的数码管*/
uchar code sled_bit_table[]={0x08,0x04,0x02,0x01};//位选信号
uchar data sled_data[4]={0xff,0xff,0xff,0xff}; /*0-3号SLED缓冲值*/
uchar data led_lighten_bit=0 ; /*LED灯点亮标志位0-3*/
void delay_ms(uint x)//毫秒级延时
{
uint i,j;
i=0;
for(i=0;i<x;i++)
{
j=108;
while(j--);
}
}
void view_ds(double tem_in)
{
uint i,dp=4;
long int tem;
//if(succeed_flag==0)for(j=0;j<4;j++) sled_data[i] = sled_mun_to_char[0];
//if(tem_in==0){for(j=0;j<3;j++) sled_data[i] = sled_mun_to_char[17];sled_data[3] = sled_mun_to_char[0];}
//else
{
for(i=0;tem_in/1>=1;i++)
{
tem_in=tem_in/10;
dp=i;
}
tem=tem_in*10000;
sled_data[0] = sled_mun_to_char[tem/1000];
sled_data[1] = sled_mun_to_char[tem%1000/100];
sled_data[2] = sled_mun_to_char[tem%100/10];
sled_data[3] = sled_mun_to_char[tem%10];
}
for(i=0;i<4;i++)
{
sled_wm_port = 0x00; /*关闭显示*/
sled_dm_port = sled_data[i]; /*输出段码数据到数码管*/
if(i==dp) sled_dm_port = sled_dm_port+0x80; /*显示小数点*/
sled_wm_port = sled_bit_table[i]; /*输出位码数据到数码管*/
delay_ms(5);
}
sled_wm_port = 0x00; /*关闭显示*/
} void delay_4us()
{
uchar a ;
for(a=0;a<2;a++);
} void main()
{
uint i,j;
succeed_flag=time=timeH=timeL=flag=test =0;
SIG=0; //首先拉低脉冲输入引脚
EA=1; //打开总中断0
TMOD=0x10; //定时器1,16位工作方式
while(1)
{
distance=0;
P2=0;
EA=0; //关总中断
SIG=1; //超声波输入端
delay_4us(); //延时4us
SIG=0; //产生一个4us的脉冲
flag=0;
succeed_flag=0; //清测量成功标志
while(SIG==0) //等待Echo回波引脚变高电平
{
if(flag==1)break;
for(i=0;i<20;i++)
for(j=0;j<120;j++)
if(SIG==1)
break;
flag=1;
} if(flag==0)
{
EA=1; //开总中断
EX0=1; //打开外部中断0
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //计数溢出标志
TR1=1; //启动定时器1
delay_ms(20);//view_ds(distance); //等待测量的结果
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断0
}
if(succeed_flag==1)
{
time=timeH*256+timeL;
distance=time*0.172; //厘米 53.21;//
//view_ds(distance);
}
if(succeed_flag==0)
{
distance=0; //没有回波则清零
//test = 1; //测试灯变化
}
view_ds(distance);
}
}
//***************************************************************
//外部中断0,用做判断回波电平
void exter() interrupt 0 // 外部中断0是0号
{
timeH =TH1; //取出定时器的值
timeL =TL1+4; //取出定时器的值
succeed_flag=1;//至成功测量的标志
EX0=0; //关闭外部中断
//while(1)view_ds(53.12);
}
//****************************************************************
//定时器1中断,用做超声波测距计时
void timer1() interrupt 3 //
{
TH1=0;
TL1=0;
distance=0;
}