超声波测距程序(包括延时和数码管显示子程序)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define uchar unsigned char
#define uint unsigned int
sbit pwm=P1^0;
sbit jieshou=P1^1;
uchar biaozhi=0,flag1=0,flag2=0,flag3=0;
uint time,juli;
float juli1;
uchar shu[8];
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//"共阳数码管编码 0 1 2 3 4 5 6 7 8 9 a b c d e f "
uchar code table1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//"数码管位选编码 1 2 3 4 5 6 7 8 "
void delayms(uint t)//"毫秒延时"
{
uint x,y;
for(x=t;x>0;x--)
for(y=850;y>0;y--);
}
void delayus(uint t)//"t=1时,6us延时"
{
uint x,y;
for(x=t;x>0;x--)
for(y=1;y>0;y--);
}
void BEEP(uchar a)//"a=0关,a=1开"
{
P2=0xa0;
if(a==1)
P0=0xff;
if(a==0)
P0=0x00;
P2=0x00;
}
void send()
{
TMOD=0X01;
TR0=0;
flag1=1;
TH0=(65536-10)/256;
TL0=(65536-10)%256;
EA=1;
ET0=1;
TR0=1;
delayus(5);//"延时30us"
TR0=0;
flag1=0;
}
void display(uint m)//"可以显示4位数,可调整显示位数"
{
uchar i,a,b,c,d;
a=m/1000;
b=m/100%10;
c=m/10%10;
d=m%10;
shu[0]=table[a];
shu[1]=table[b];
shu[2]=table[c];//"在此处与上0x7f即可使此位显示小数点"
shu[3]=table[d];
/*shu[4]=table[0];
shu[5]=table[0];
shu[6]=table[0];
shu[7]=table[0];*/
for(i=0;i<4;i++)
{
P2=0xe0;//"段选锁存器打开"
P0=shu[i];//"数码管段选"
P2=0X00;//"段选锁存器关闭"
P2=0xc0;//"位选锁存器打开"
P0=table1[i];//"数码管位选"
P2=0X00;//"位选锁存器关闭"
delayms(1);
}
}
void main()
{
BEEP(0);
delayms(5);
pwm=1;
while(1)
{
send();
//TMOD=0X01;
flag2=1;
TH0=0;
TL0=0;
//EA=1;
//ET0=1;
TR0=1;
while((jieshou==1)&&(biaozhi==0));
TR0=0;
flag2=0;
juli1=(float)(TH0*256+TL0+18)*170.0/1000.0;
juli=(uint)juli1;
if(biaozhi==1)
juli=9999;
biaozhi=0;
display(juli);
}
}
void chaosheng() interrupt 1
{
if(flag1==1)
{
pwm=~pwm;
TH0=(65536-10)/256;
TL0=(65536-10)%256;
}
if(flag2==1)
biaozhi=1;
}