注册 登录
查看: 422|回复: 9

写了个超声波模块 但是用不了 不知道为什么

[复制链接]
发表于 2014-5-17 19:58:34 | 显示全部楼层 |阅读模式
#include "include.h"
#include "isr.h"
#define  Trig   PTB0  //超声波输入(触发)
#define  Echo   PTB1  //超声波接收


void HC_SR04_Send(void)
{

  MK60_gpio_set(Trig,1);
  dwt_delay_us(20);
  MK60_gpio_set(Trig,0);
}

void main()
{
  LED_init();
  MK60_gpio_init(Trig, GPO,0);
  dwt_delay_us(2);
  pit_init_us(PIT0, 100);                                //定时 1000 个bus时钟 后中断  100us
  port_init(Echo, ALT1 | IRQ_EITHER | PULLUP );          //初始化Echo管脚,复用功能为GPIO ,下降沿触发中,上拉电阻
  set_vector_handler(PORTB_VECTORn ,PORTB_IRQHandler);   //设置PORTE的中断复位函数为 PORTE_IRQHandler
  enable_irq (PORTB_IRQn);                             //使能PORTE中断
  while(1)
  {
    HC_SR04_Send();

    delay();
  }
}
void PORTB_IRQHandler()
{
    u8  n = 0;    //引脚号
    n = 1;
    m++;
    if(PORTB_ISFR & (1 << n))         //PTB10触发中断
    {
        PORTB_ISFR  |= (1 << n);        //写1清中断标志位
        /*  用户任务  */
         if(m==1)
          {
            t=0;
            enable_irq(PIT0_IRQn);                         // 使能LPTMR
          }
         if((m==2)||(t>=348))
          {
           disable_irq(PIT0_IRQn);
           if(t>=348)
           t=348;
           distance=17*t;//(340*t*100us)/2=17*t 为啥是实际距离的两倍?????
           printf("distance为:%d mm\n",distance);    //打印延时时间
           m=0;
          }     //打印延时时间
    }
}
void PIT0_IRQHandler()
{   
     PIT_Flag_Clear(PIT0);       //清中断标志位
     LED_turn(LED0);
     t++;
}



回复

使用道具 举报

发表于 2014-5-17 20:00:29 | 显示全部楼层
超声波模块就是检测一下电平的时间,可以先用示波器看看模块有没有输出电平,如果模块正常,就用硬件仿真检查一下程序
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-17 20:02:05 | 显示全部楼层
子车梨祎 发表于 2014-5-17 20:00
超声波模块就是检测一下电平的时间,可以先用示波器看看模块有没有输出电平,如果模块正常,就用硬件仿真检 ...

数据一直没有更新  串口看到的一直是17mm    先前用示波器看到Trig引脚有波形的
回复 支持 反对

使用道具 举报

发表于 2014-5-17 20:08:25 | 显示全部楼层
还不够 发表于 2014-5-17 20:02
数据一直没有更新  串口看到的一直是17mm    先前用示波器看到Trig引脚有波形的

这代码,都需要调试过才知道对不对。仅仅看代码,是很难看得出问题的。
数据一直没更新,那就在线调试,看看为啥没更新
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-17 20:09:55 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-17 20:08
这代码,都需要调试过才知道对不对。仅仅看代码,是很难看得出问题的。
数据一直没更新,那就在线调试, ...

就是没调试出来    我硬件没问题    用51例程程序没得问题    K60程序发送出来20us的高电平时间示波器也看得到
回复 支持 反对

使用道具 举报

发表于 2014-5-17 20:36:29 | 显示全部楼层
还不够 发表于 2014-5-17 20:09
就是没调试出来    我硬件没问题    用51例程程序没得问题    K60程序发送出来20us的高电平时间示波器也看 ...

跳变沿触发中断,是否真的能保证就是两次触发就是需要测的时间脉冲呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-17 20:46:57 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-17 20:36
跳变沿触发中断,是否真的能保证就是两次触发就是需要测的时间脉冲呢?

应该没问题撒   我是在触发中断结束后才开的定时器中断
回复 支持 反对

使用道具 举报

发表于 2014-5-17 20:53:17 | 显示全部楼层
还不够 发表于 2014-5-17 20:46
应该没问题撒   我是在触发中断结束后才开的定时器中断

HC_SR04_Send(); 之后,应该先清一下 IO中断的标志位,而且m清为0
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-17 20:59:55 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-17 20:53
HC_SR04_Send(); 之后,应该先清一下 IO中断的标志位,而且m清为0

我照你这样已经改了   还是数据没变
u8   m=0;
while(1)
  {
    HC_SR04_Send();
    PORTB_ISFR  |= (1 << 1);
    m=0;
    delay();
  }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-17 23:15:09 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-17 20:53
HC_SR04_Send(); 之后,应该先清一下 IO中断的标志位,而且m清为0

我   给超声波给的3.3V供电,资料说明是5V不知道有没有影响
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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