微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 我自己写的实现超声波测距的程序有问题,还请大神帮助...

我自己写的实现超声波测距的程序有问题,还请大神帮助...

时间:10-02 整理:3721RD 点击:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit trig=P2^1;   //超声波触发控制
sbit echo=P2^0;   //超声波回响信号输出
sbit we=P2^7;   //位选
sbit du=P2^6;   //段选
uint juli = 0;    //定义超声波距离
uchar dian0,dian1,dian2;    //定义数码管显示数据
uint code tabledu[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x80,0x37};  //数码管显示
uint code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};        //控制第几个数码管显示
//void nop(uint a)        //机器周期延时
//{
// uint x;
// for(x=a;x>0;x--)
// {
//  _nop_();
// }
//}
void init()     //初始化程序
{
we=0xff;    //位选关闭
du=0x00;    //段选关闭
TMOD=0x11;    //开定时器0,1工作方式为方式1
TH1=(65535-55296)/256;   //给定时器1赋初值,定时为60ms 晶振频率为11.0592MHZ
TL1=(65535-55296)%256;
TH0=0x00;     //给定时器0赋初值
TL0=0x00;
EA=1;      //开总中断
ET1=1;   //开T1中断
TR1=1;   //开定时器1
ET0=1;   //开T0中断
TR0=0;   //关定时器0
trig=0;   //触发信号清零
echo=0;   //回响信号清零
}
void delay (uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void display(uchar dian0,uchar dian1,uchar dian2)   //数码管显示函数
{
dian0=juli/100;    //各个数码管赋值
dian1=juli/10%10;
dian2=juli%10;
P0=0xff;     //消影
we=1;      //开位选
P0=0xfe;     //赋值
we=0;      //关位选
P0=0x00;     //消影
du=1;      //开段选
P0=tabledu[dian0];   //赋值
du=0;      //关段选
delay(7);     //延时,让数码管亮一会
P0=0xff;     //消影
we=1;      //开位选
P0=0xfd;     //赋值
we=0;      //关位选
P0=0x00;     //消影
du=1;      //开段选
P0=tabledu[10];    //赋值
du=0;      //关段选
delay(7);     //延时,让数码管亮一会
P0=0xff;     //消影
we=1;      //开位选
P0=0xfb;     //赋值
we=0;      //关位选
P0=0x00;     //消影
du=1;      //开段选
P0=tabledu[dian1];   //赋值
du=0;      //关段选
delay(7);     //延时,让数码管亮一会
P0=0xff;     //消影
we=1;      //开位选
P0=0xf7;     //赋值
we=0;      //关位选
P0=0x00;     //消影
du=1;      //开段选
P0=tabledu[dian2];   //赋值
du=0;      //关段选
delay(7);     //延时,让数码管亮一会
P0=0xff;     //消影
we=1;      //开位选
P0=0xef;     //赋值
we=0;      //关位选
P0=0x00;     //消影
du=1;      //开段选
P0=tabledu[11];    //赋值
du=0;      //关段选
delay(7);     //延时,让数码管亮一会
P0=0xff;     //消影
we=1;      //开位选
P0=0xdf;     //赋值
we=0;      //关位选
P0=0x00;     //消影
du=1;      //开段选
P0=tabledu[11];    //赋值
du=0;      //关段选
delay(7);     //延时
}
void distance(float juli)  //测试距离函数
{
float time;
trig=1;       //触发超声波
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();    //延长十一个机器周期
trig=0;
while(echo==0);
TH0=0x00;       //给定时器0赋初值
TL0=0x00;
TR0=1;      //开定时器0
while(echo==1);
time=(TH0*256+TL0)*1.08;  //读出定时器0的时间
TR0=0;      
juli=time/58;    //计算出距离
}
void main()
{
init();      //初始化函数  
while(1)  
{
  dian0=juli/100;   //各个数码管赋值
  dian1=juli/10%10;
  dian2=juli%10;
  display(dian0,dian1,dian2);
}
}
void ultrasonic() interrupt 3
{
TH1=(65535-55296)/256;  //定时器1重装初值
TL1=(65535-55296)%256;
distance(juli);    //距离函数
}
void fuwe() interrupt 1
{
TH0=0x00;       //给定时器0赋初值
TL0=0x00;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top