/**
* 超声波测距组件
* 文件名:ultrasonic.h
*/
#ifndef _ULTRASONIC_H
#define _ULTRASONIC_H
#define somenop(); {
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
sbit TX = P1^0; //发射引脚
sbit RX = P1^1; //接收引脚
void tmr1_specialInit();
uint8_t ult_getDis();
#endif // _ULTRASONIC_H
/**
* 超声波测距组件
* 文件名:ultrasonic.c
*/
#include #include #include "stdint.h" #include "ultrasonic.h" /* 特殊配置定时器1,作为计时器 */ void tmr1_specialInit() { //不要开启中断,要将溢出标志位置0,不要开始运行 AUXR &= 0xBF; TMOD &= 0x0F; TMOD |= 0x10; TL1 = 0; //!!! TH1 = 0; //!!! TF1 = 0; //!!! } //TX引脚发送40KHz方波信号驱动超声波发送探头 static void ult_sendWave() { uint8_t cnt = 8; //发送8个脉冲 EA = 0; //!!! do { TX = 1; somenop(); //保持TX一段时间 TX = 0; somenop(); //保持TX一段时间 } while (--cnt); EA = 1; //!!! } uint8_t ult_getDis() { uint16_t count; //定时器1的计数值,即为时间间隔 uint8_t distance; //单位为cm,实测最大测量距离约为90cm RX = 1; //!! ult_sendWave(); //发送方波信号 TR1 = 1; //启动计时 while ((RX == 1) && (TF1 == 0)); //等待收到脉冲 TR1 = 0; //关闭计时 if (TF1 == 1) { //如果定时器发生溢出,则超过量程 TF1 = 0; distance = 0xFF; //无返回,距离为无穷远 } else { count = TH1; count <<= 8; count |= TL1; distance = (uint8_t)((uint32_t)count * 17 / 1000); //计算距离(cm) } TH1 = 0; //重新复位定时器,为下次测量做好准备 TL1 = 0; return distance; }
上一篇:51单片机项目 门禁系统
下一篇:51单片机项目:多功能记录仪
推荐阅读最新更新时间:2024-11-13 08:14
设计资源 培训 开发板 精华推荐
- 使用 ON Semiconductor 的 ILC6380 的参考设计
- MIKROE-3867,基于 EMC2103 SMBus 兼容风扇控制器的风扇 6 Click 板
- 将 LT3045EMSE 超低噪声电流源用于 RF 偏置应用的典型应用
- 征集令 |智能小精灵
- 可能是你见过最小的 Ramps 1.6 3D打印机主板
- 基于磁性旋转编码器的 AS5145B-EK-AB-STM1.0、AS5145B Eval-Kit 步进电机
- 全向移动底盘电路
- lite200_miyoo_loft
- LTC3110HUF 3.3V/2A 输出的典型应用电路来自具有有源电压平衡的超级电容器备份/再充电应用
- TWR-K21D50M: Kinetis K21 50 MHz MCU塔式系统模块