超声波模块
在蓝桥杯单片机中,超声波模块的TX引脚接到单片机的P1^0端口,RX引脚接到单片机的P1^1端口,设计程序,进行超声波测距,最大测量范围约140cm,用cm作为显示单位,显示在数码管的最左边三位,如果测量距离超出范围,则以“F”作为标记,显示在数码管的最右边一位。
计算距离公式
距离 = 声速 * 发出超声波到接收返回的时间 / 2;
sonic.c
#include <sys.h>
void SendSonic()
{
uchar i = 8;
while(i--)
{
TX = 1;
sonic_nop; sonic_nop; sonic_nop; sonic_nop; sonic_nop;
sonic_nop; sonic_nop; sonic_nop; sonic_nop; sonic_nop;
TX = 0;
sonic_nop; sonic_nop; sonic_nop; sonic_nop; sonic_nop;
sonic_nop; sonic_nop; sonic_nop; sonic_nop; sonic_nop;
}
}
uint Rec_Distance()
{
uint distance = 0,time = 0;
SendSonic();
TR1 = 1;//启动定时器0
while((RX == 1) && (TF1 == 0));//等待超声波信号返回,或等到测量超出范围
TR1 = 0;//停止计数
if(TF1 == 0)//正常测量范围
{
time = TH1;
time = (time << 8) | TL1;
distance = (uint)time * 0.017 / 12;
}
else
{
TF1 = 0;
distance = 999;
}
TH1 = 0;
TL1 = 0;
return distance;
}
nixie.c
#include <sys.h>
uchar Nixie[] = {0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90, 0XBF, 0XFF, 0x8e};
//0~9 - 熄灭
void DisplayBit(uchar pos,uchar value)
{
Select_74HC138(7);
P0 = 0XFF;
Select_74HC138(6);
P0 = _crol_(0X01,pos);
Select_74HC138(7);
P0 = Nixie[value];
Delay(1);
Select_74HC138(0);
}
void DisplayDistance()
{
uint distance;
if(flag_wave)
{
distance = Rec_Distance();
}
if(distance == 999)
{
DisplayBit(7,12);
}
else
{
DisplayBit(0,distance / 100);
DisplayBit(1,distance / 10 % 10);
DisplayBit(2,distance % 10);
// Select_74HC138(7);
// P0 = 0XFF;
}
}
sys.c
#include <sys.h>
bit flag_wave = 0;
uchar t = 0;
void Select_74HC138(uchar channel)
{
switch(channel)
{
case 0: P2 = P2 & 0X1F; break;
case 4: P2 = (P2 & 0X1F) | 0X80; break;
case 5: P2 = (P2 & 0X1F) | 0XA0; break;
case 6: P2 = (P2 & 0X1F) | 0XC0; break;
case 7: P2 = (P2 & 0X1F) | 0XE0; break;
}
}
void Init_System()
{
Select_74HC138(4);
P0 = 0XFF;
Select_74HC138(5);
P0 = 0X00;
Select_74HC138(7);
P0 = 0XFF;
Select_74HC138(0);
}
void Delay(uint ms)
{
uint i;
for(ms; ms > 0; ms--)
for(i = 921; i > 0; i--);
}
void InitTimer0()//定时1ms
{
AUXR |= 0X80;//定时器时钟1T模式
TMOD &= 0XF0;//设置定时器模式
TL0 = 0X20;
TH0 = 0XD1;
TF0 = 0;//清除TF0标志
TR0 = 1;//定时器0开始计时
ET0 = 1;
EA = 1;
}
void ServiceTimer0() interrupt 1
{
uchar t;
t++;
if(t == 100)
{
t = 0;
flag_wave = !flag_wave;
}
DisplayDistance();
}
void InitTimer1()
{
AUXR |= 0X40;
TMOD &= 0X0F;
TL1 = 0;
TH1 = 0;
TF1 = 0;
TR1 = 0;
}
main.c
#include <sys.h>
uint distance;
void main()
{
Init_System();
InitTimer0();
InitTimer1();
while(1)
{
// DisplayDistance();
}
}
sys.h
#ifndef _SYS_H_
#define _SYS_H_
#include <STC15F2K60S2.H>
#include <INTRINS.H>
sbit TX = P1^0;
sbit RX = P1^1;
#define uchar unsigned char
#define uint unsigned int
#define sonic_nop {_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();};
extern bit flag_wave;
//sys.h
void Select_74HC138(unsigned char channel);
void Init_System();
void Delay(unsigned int ms);
void InitTimer0();
void InitTimer1();
//nixie.c
void DisplayBit(unsigned char pos,unsigned char value);
void DisplayDistance();
//sonic.c
void SendSonic();
unsigned int Rec_Distance();
#endif