#include <reg52.h> //51单片机最好不用浮点数因为C51中
#include"number.h" //有关于浮点运算的函数可以用但代码量大非常耗时不建议使用
void delay(unsigned int xms);
void shu(int cm);
void Delay10us();
void send_out();
int Sum(int a);
sbit tring=P3^7;
sbit echo=P3^6;
void initialization() //初始化
{
tring=0;
echo=0;
}
int distance()
{
int a;
int s;
while(echo==0)
TR0=1;
while(echo==1) //就是这一块
{;}
TR0=0;
a=TH0*256+TL0; //得出定时器从开始到结束的时间
s=a*0.017; //高电平时间*170m 要厘米所以 *100 还要小数点后两位 *100;
TH0=0x00;
TL0=0x00; //重置
return s;
}
void timer0()
{ EA=1;
ET0=1;
TMOD &= 0xF0; //清空
TMOD |= 0x01; //设置定时器模式
TH0=0x00;
TL0=0x00; //从0000 0000 0000 0000开始记数 为十六位
}
int main()
{
int cm;
initialization(); //初始化
timer0(); //配置定时器 while (1)
{
send_out(); //发射18us高电平
cm=distance(); //从距离函数中获得返回值
shu(cm); //让数码管显示
}
}
void Delay10us() //@11.0592MHz 20us 左右{
unsigned char i;
i = 5;
while (--i);
}
void send_out() //每隔5.54ms 提高20us或10us高电平 搞不懂 不动 可能是第22行while的问题
{
tring=1;
Delay10us();
tring=0;
Delay10us();
}
void delay(unsigned int xms) //延迟
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void shu(int cm) //数码管显示数
{
int a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定义时需要放在前面否则报错
int b[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; int yi,er,san,si;
yi=(int)cm/1000%10;
er=(int)cm/100%10;
san=(int)cm/10%10;
si=(int)cm%10;
{
P2=0xfe;
P0=a[yi];
delay(1);
P2=0xfd;
P0=b[er];
delay(1);
P2=0xfb;
P0=a[san];
delay(1);
P2=0xf7;
P0=a[si];
delay(1);
}
} |