蓝桥杯篇---超声波隔断丈量&频率丈量

打印 上一主题 下一主题

主题 871|帖子 871|积分 2613



  

简介

本文简单介绍了IAP15F2K61S2中的超声波隔断丈量与频率丈量。
第一部分:超声波的简介

IAP15F2K61S2 是一款基于8051内核的单片机,常用于超声波测距。超声波测距通过发射超声波并吸收反射波,计算时间差来确定隔断
工作原理

1.发射超声波

发射超声波:单片机通过IO口触发超声波传感器发射超声波
2.吸收反射波

吸收反射波:传感器吸收反射波并输出信号
3.计算时间差

计算时间差:单片机丈量发射到吸收的时间差
4.计算隔断

计算隔断:根据声速和时间差计算隔断
硬件连接

1.Trig

Trig:连接单片机IO口,用于触发超声波
2.Echo

Echo:连接单片机IO口,用于吸收反射信号
示例代码

以下代码展示了如何在IAP15F2K61S2上实现超声波测距。
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit Trig = P1^0;  // 超声波Trig引脚
  5. sbit Echo = P1^1;  // 超声波Echo引脚
  6. void delay_us(uint us) {
  7.     while (us--);
  8. }
  9. void delay_ms(uint ms) {
  10.     uint i, j;
  11.     for (i = ms; i > 0; i--)
  12.         for (j = 110; j > 0; j--);
  13. }
  14. void Ultrasonic_Init() {
  15.     Trig = 0;
  16.     Echo = 1;
  17. }
  18. uint Ultrasonic_Measure() {
  19.     uint time = 0;
  20.     Trig = 1;
  21.     delay_us(10);  // 保持10us高电平
  22.     Trig = 0;
  23.     while (!Echo);  // 等待Echo变高
  24.     while (Echo) {  // 测量高电平时间
  25.         time++;
  26.         delay_us(1);
  27.     }
  28.     return time;
  29. }
  30. void main() {
  31.     uint distance;
  32.     Ultrasonic_Init();
  33.     while (1) {
  34.         distance = Ultrasonic_Measure() * 0.017;  // 计算距离,单位cm
  35.         delay_ms(100);  // 延时100ms
  36.     }
  37. }
复制代码
代码说明


  • delay_us 和 delay_ms:用于微秒和毫秒级延时
  • Ultrasonic_Init:初始化超声波传感器。
  • Ultrasonic_Measure:触发超声波并丈量反射时间。
  • main:循环丈量隔断并计算。
留意事项

1.声速

声速:假设声速为340m/s,实际应用中需根据情况调解。
2.延时精度

延时精度:延时函数的精度会影响丈量结果。
3.硬件连接

硬件连接:确保Trig和Echo引脚连接正确。
通过以上代码,你可以在IAP15F2K61S2上实现超声波测距。
第二部分:频率丈量简介

IAP15F2K61S2 是一款基于8051内核的单片机,支持通过定时器和外部停止实现频率丈量。频率丈量通常用于丈量周期性信号的频率,例如方波、正弦波等。
频率丈量原理

1.信号输入

信号输入:将待测信号连接到单片机的外部停止引脚或定时器输入引脚
2.计数

计数:在固定时间内统计信号的脉冲数目
3.计算频率

计算频率:根据脉冲数目和丈量时间计算频率。
硬件连接

将待测信号连接到单片机的 P3.2(INT0)P3.3(INT1) 引脚(外部停止引脚),大概连接到定时器的输入引脚(如 T0 或 T1)
示例代码:利用定时器和外部停止丈量频率

以下代码展示了如何利用定时器和外部停止在 IAP15F2K61S2 上实现频率丈量。
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit FreqInput = P3^2;  // 待测信号连接到P3.2(INT0)
  5. uint pulse_count = 0;    // 脉冲计数
  6. bit measure_flag = 0;    // 测量标志位
  7. void Timer0_Init() {
  8.     TMOD |= 0x02;  // 定时器0,模式2(8位自动重装)
  9.     TH0 = 0x00;    // 初始值
  10.     TL0 = 0x00;
  11.     ET0 = 1;       // 使能定时器0中断
  12.     EA = 1;        // 使能总中断
  13.     TR0 = 1;       // 启动定时器0
  14. }
  15. void External_Init() {
  16.     IT0 = 1;  // 设置INT0为下降沿触发
  17.     EX0 = 1;  // 使能外部中断0
  18.     EA = 1;   // 使能总中断
  19. }
  20. void Timer0_ISR() interrupt 1 {
  21.     measure_flag = 1;  // 定时器溢出,设置测量标志
  22. }
  23. void External_ISR() interrupt 0 {
  24.     pulse_count++;  // 每次下降沿触发,脉冲计数加1
  25. }
  26. void main() {
  27.     uint frequency = 0;
  28.     Timer0_Init();     // 初始化定时器0
  29.     External_Init();   // 初始化外部中断
  30.     while (1) {
  31.         if (measure_flag) {  // 如果定时器溢出
  32.             measure_flag = 0; // 清除标志位
  33.             frequency = pulse_count * 2;  // 计算频率(假设定时器溢出时间为0.5秒)
  34.             pulse_count = 0;  // 重置脉冲计数
  35.         }
  36.     }
  37. }
复制代码
代码说明


  • Timer0_Init:初始化定时器0,设置为模式2(8位自动重装),定时器溢出时间为固定值。
  • External_Init:初始化外部停止0,设置为降落沿触发。
  • Timer0_ISR:定时器0停止服务函数,定时器溢出时设置丈量标记。
  • External_ISR:外部停止0服务函数,每次检测到降落沿时增加脉冲计数。
  • main:主循环中检测丈量标记,计算频率并重置计数。
频率计算公式

频率 = 脉冲数 / 丈量时间
代码中假设定时器溢出时间为 0.5 秒,因此频率为 pulse_count * 2。
留意事项

1.定时器溢出时间

定时器溢出时间:根据实际需求调解定时器的溢出时间,确保丈量精度。
2.信号幅度

信号幅度:待测信号的幅度须要在单片机输入引脚的可接受范围内。
3.噪声干扰

噪声干扰:高频信号可能受到噪声干扰,建议在硬件上添加滤波电路
4.丈量范围

丈量范围:定时器和外部停止的频率丈量范围有限,高频信号可能须要分频处理。
通过以上代码和说明,你可以在 IAP15F2K61S2 上实现频率丈量功能。假如须要丈量更高频率的信号,可以考虑利用定时器的捕获功能或外部计数器。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了IAP15F2K61S2中的超声波隔断丈量与频率丈量。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表