#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);
}
} |