历年的省赛都没有考到超声波模块,但是超声波模块还是非常重要的一个模块,还有就是既然很久没有考过,那么突然考一波也是很有可能的喔。还不抓紧学起来。
其实呢超声波模块的编程并不难,其实非常的简单,下面直接来看代码吧。
# include "reg52.h"
# include "intrins.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
typedef unsigned char u8;
typedef unsigned int u16;
u8 code shuma[10] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit TX = P1^0; // 超声波发送端
sbit RX = P1^1; // 超声波接受端
unsigned char distance_table[3]; // 超声波检测到的距离值
// 选择开通的外设
void select(u8 local)
{
switch(local)
{
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 delay_shuma()
{
u16 i = 200;
while(i--);
}
// 点亮单个数码管函数
void display(u8 local, u8 num)
{
select(6);
P0 = 0x80 >> (local - 1);
P2 = P2 & 0x1f;
select(7);
P0 = shuma[num];
P2 = P2 & 0x1f;
// 延时一下先
delay_shuma();
// 消隐
select(6);
P0 = 0x00;
P2 = P2 & 0x1f;
}
void send_wave() // 超声波发送函数
{
u8 i = 8;
while(i--) // 连续发送8个波形,方便检测接收
{
TX = 1;
somenop;somenop;somenop;somenop;somenop;
TX = 0;
somenop;somenop;somenop;somenop;somenop;
}
}
// 发送超声波的延时函数 不用发送太过于频繁
void delay()
{
unsigned char i, j;
_nop_();
i = 40;
j = 146;
do
{
while (--j);
} while (--i);
}
/* Timer0 interrupt routine */
void tm0_isr() interrupt 3
{
TH1 = (65535 - 50000) / 256;
TL1 = (65535 - 50000) % 256;
}
void main()
{
u16 t,distance;
TMOD = 0x10;
TH1 = (65535 - 50000) / 256;
TL1 = (65535 - 50000) % 256;
ET1 = 1;
EA = 1;
while(1)
{
send_wave();
TR1 = 1; // 这里直接打开TR1就可以打开定时器1了
while((RX == 1) && (TF1 == 0)); // 一直在等待
TR1 = 0;
if (TF1 == 1) // 计时溢出的时候
{
distance = 999;
TF1 = 0;
} // 接收到信号
else
{
t = TH1;
t <<= 8;
t |= TL1;
distance = (u16)(t * 0.017);
}
TH1 = 0;
TL1 = 0;
display(1, distance%10);
display(2, distance/10%10);
display(3, distance/100);
delay(); // 延时两毫秒,不用一直发送超声波
}
}
具体思路可以查看图片解析:
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115110.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...