前言
每次把标题写成C51都有点心虚,之前还想着全TM都用汇编写。但是有一次看了别的学校的家伙的微机原理实验报告才知道。我学的汇编一点皮毛啊。也许微机原理是单片机课程的进阶版,下次去图书馆看看多哪些内容。
超声波测距模块HC-SR04
原理图
电器特性
电器特性 HC-SR04超声波模块
工作电压 DC 5V (直流5V)
工作电流 15mA
工作频率 40kHz
最远射程 4m
最近射程 2cm
测量角度 15°
输入触发信号 10us的TTL脉冲
输出回响信号 输出TTL电平信号,与射程相关
规格尺寸 452015mm (长宽高)
实物图
时序图
用T1发出触发,用T0测量时间
#include<reg52.h>
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit ECHO_port=P2^1;
sbit TRIG_port=P2^0;
bit UltraWave_Flag=0;
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71
};
unsigned char leds[4]=0;
void delay(int i);
void Init();
void Show();
void Count();
void main(){
Init();
while(1){
while(!ECHO_port);
//start T0
TR0=1;
while(ECHO_port);
TR0=0;
//analyze T0's data
Count();
}
}
void delay(int i){
while(i--);
}
void Init(){
TMOD=0x11;//T1-mode1 T0-mode1
//initialize T0
TH0=0;
TL0=0;
//initialize T1
TH1=(0xff + 1 - 2000)/256;
TL1=(0xff + 1 - 2000)%256;
IE=0x8a;//1000 1010
//start T1
TR1=1;
}
void Show(){
int i;
for(i=0;i<4;i++){
switch(i){
case 0:
LSC=0,LSB=0,LSA=0;
break;
case 1:
LSC=0,LSB=0,LSA=1;
break;
case 2:
LSC=0,LSB=1,LSA=0;
break;
case 3:
LSC=0,LSB=1,LSA=1;
break;
}
P0=leds[i];
delay(10);
P0=0;
}
}
void Count(){
unsigned long a,b;
a=TH0 * 256 + TL0;
b=(long)a*0.17;
//clear T0
TH0=0;
TL0=0;
if(b>=4000||UltraWave_Flag){
UltraWave_Flag=0;
leds[3]=0x79;//E
leds[2]=0x50;//r
leds[1]=0x50;//r
leds[0]=0x3f;//0
}
else{
leds[3]=table[b/1000%10];
leds[2]=table[b/100%10];
leds[1]=table[b/10%10];
leds[0]=table[b%10];
}
}
void timer0_interrupt()interrupt 1{
UltraWave_Flag=1;
}
void timer1_interrupt()interrupt 3{
static int c=0;
//initialize T1
TH1=(0xff + 1 - 2000)/256;
TL1=(0xff + 1 - 2000)%256;
Show();
if(++c>=100){///100 X 2ms
c=0;
TRIG_port=1;
delay(1);
TRIG_port=0;
}
}
显示效果: