📄 超声波程序.c
字号:
#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int
#define v 0.34 //声波在空气中的传播速度
sbit out=P3^2;
bit flag=0;
uchar N;
uchar dis_SMG[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管显示码
uint time;
float s; //距离长度
uchar sm=0; //数码管段位
uint fir,sec,thi,four; //显示值
void scan( );
void delay( uint i) ; //延时函数
void main (void)
{
delay(500);
TMOD=0x11; //TO为计时(发脉冲的时间),T1为计数(算出超声波的传输时间)
// IE1=1;
IT1=1;
EA=1;
ET0=1;
ET1=1;
EX1=1;
TH0=(65536-200)/256;
TL0=(65536-200)%256; //T0发200微秒的时间
TR0=1;
TH1=0x00;
TL1=0x00;
//高电平发脉冲
N=0; //计时标记
while(1)
{ // if(TF1==1) { TF1=0;N++; }
if(flag==1)
{ EA=0;
flag=0;
s=v*time*100;
fir=s/1000;
sec=(s-1000*fir)/100;
thi=(s-fir*1000-sec*100)/10;
four=s-1000*fir-100*sec-thi; }
scan(); }
}
void scan( ) //显示函数
{
switch(sm++)
{
case 1: P0=dis_SMG[fir];
P1=0x01; delay(20); break;
case 2: P0=dis_SMG[sec];
P1=0x02; delay(20); break;
case 3: P0=dis_SMG[thi];
P1=0x04; delay(20); break;
case 4: P0=dis_SMG[four];
P1=0x08; delay(20); break;
default: { } break;
}
if(sm>4) sm=0; }
void outer1(void)interrupt 2 using 2
{
EA=0;
TR1=0; //关定时器
time=(65536*N+TH1*256+TL1)/2;
flag=1; //标记开始算时间
EX1=0;
EA=1;
}
void timer0(void)interrupt 1 using 1
{
TR0=0;
out=0; //关闭3.2的高电平
TR1=1; //打开定时器1
}
void delay( uint i)
{
for(i;i>0;i--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -