智能车制作

 找回密码
 注册

扫一扫,访问微社区

12
返回列表 发新帖
楼主: 火海凡人
打印 上一主题 下一主题

[软件类] 谁能够写个基于16位飞思卡尔单片机的超声波测距程序给我

  [复制链接]

1

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
威望
218
贡献
83
兑换币
57
注册时间
2012-3-18
在线时间
27 小时
毕业学校
西安文理学院
11#
发表于 2013-4-9 16:43:02 | 只看该作者
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include <math.h>
//-----------------PIT定时中断参量--------------------------------------------------
#define PITTIME1 250;
#define PITTIME2 250;
int loop_i=0;
//int loop_j=0;
//-------------------中断服务变量------------
//--------------pk
int test_start=0;
int test_over=1;
int start_flage=0;
unsigned int time_m_o=0;
unsigned int time_start=0 ;
unsigned int time_over=0;
float time_rising=0;
int distance=0;
int k;
int duty;
//----------------
/****************************准确延时*****************************/
//---------------------------1us准确延时__64M-----------------------------
void Delay1us(int c)
{
  intcnt0;
for(cnt0=0;cnt0<2*c;cnt0++)
  {
     _asm NOP; _asm NOP;_asm NOP;
     _asm NOP; _asm NOP;_asm NOP;_asm NOP;
     _asm NOP; _asm NOP;_asm NOP;_asm NOP;
     _asm NOP; _asm NOP;_asm NOP;_asm NOP;
     _asm NOP; _asm NOP;_asm NOP;
  }
   
}
//---------------------------1ms准确延时__64M-------------------------
void Delay1ms(int c)
{
   int cnt;
   int cnt1;
  
   for(cnt=0;cnt<2*c;cnt++)
    {
     
       for(cnt1=0;cnt1<1000;cnt1++)
       {
           _asm NOP; _asm NOP;_asm NOP;_asm NOP;
           _asm NOP; _asm NOP;_asm NOP;_asm NOP;
           _asm NOP; _asm NOP;_asm NOP;_asm NOP;
           _asm NOP; _asm NOP;_asm NOP;_asm NOP;
           _asm NOP; _asm NOP;_asm NOP;_asm NOP;
       }
     
  }
   
}
/**************总线时钟设置函数***************************/
void SetBusCLK_64M(void)
{
CLKSEL=0x00;
PLLCTL_PLLON=1;   //turn on PLL
SYNR =0xc0 | 0x07;  //80M                     
REFDV=0x80 | 0x01;
  
POSTDIV=0x00;      //pllclock=2*16*(1+SYNR)/(1+REFDV)=xxMHz;
  
while(CRGFLG_LOCK!=1);//Wait Till VCO Run Stable
CLKSEL_PLLSEL=0x01;//PLLCLK Enabled,Bus Clock=PLLCLK/2=24M
  
}
/**************I/O初始化函数******************************/
void PORT_ini (void)
{
  
    DDRP_DDRP2=1;  //数据方向寄存器为1p2口为输出;
    DDRP_DDRP4=1;  //数据方向寄存器为1p4口为输出;
     
     
    //---发射口--------A-------------------
    DDRA_DDRA0=1;    //数据方向寄存器1为输出,写数据
    PORTA_PA0=0;
     
    //设置H0位的中断
    DDRH_DDRH0=0; //H0位:开关量输入     读数据!
    PERH_PERH0=0; //H0位:允许上拉或下拉器件
     
    //H口初始化为低电平
     
    PPSH_PPSH0=0; //H0位:1上升沿触发中断 0下降沿
    PIEH_PIEH0=1; //H0位:中断允许  中断标志位 PIFH_PIFH0
     
     
   
  }
     
  
/*******************************************************************
定时中断模块
********************************************************************/
static void PIT_ini(void)   //1ms定时中断
{                                             
     PITCFLMT_PITE=0;    //PIT控制寄存器及强制载入微定时器寄存器
                                //禁止PIT
   
     PITMUX_PMUX0=0;    //PIT定时器复合寄存器:选择8位的基时钟base0
     PITMUX_PMUX3=1;                                  // 选择8位的基时钟base1
  
                      //------溢出周期计算:time-out period = (PITMTLD +1) * (PITLD + 1) / fBUS.
     PITMTLD0=0xc7;  //PIT微定时器装载寄存器:8, 0xc7——1990x85——6399
     PITLD0=0x36f;   //PIT定时器装载寄存器:160xffff; 0x36f——879
                             //T0通道定时周期T0 period=200*880/88M=2ms;
                             
     PITMTLD1=0X85;  //0X85——133C8——200+1
     PITLD3=0XFFFF;  // FFFF——65535
                              //T0通道定时周期T3period=134*65536/88M=99.79ms;
   
     PITCE_PCE0=0;      // PIT通道使能寄存器 :  通道0使能
     PITCE_PCE3=1;         //通道3使能
   
     PITINTE_PINTE0=0;  //PIT中断使能寄存器:
     PITINTE_PINTE3=1;   //通道3中断使能
   
     PITCFLMT_PITE=1;   //PIT使能
   
  }
  
/**************ECT初始化函数***********************************/
static void ECT_ini(void)
{
   TIOS_IOS7=0; //:通道选择寄存器0:相应通道为输入捕捉;1:相应通道为输出比较;
   TIOS_IOS0=0;  //T0输入捕捉
   TIOS_IOS1=0;  //T1输入捕捉
   
   TSCR1_TEN=1; //定时器系统控制寄存器1:定时器使能
   TSCR1_PRNT=1;//定时器系统控制寄存器1:精确定时器,PTPSR寄存器有效,对主定时器计数器频率进行设置 5.5M
   PTPSR=0X07;  //8分频
   
   TCTL1_OM7=0;
   TCTL1_OL7=0; //OC7 没有输出动作!
   
   OC7M_OC7M7=0; //不把OC7D中的数据传送到定时器的数据端口;
   
   TCTL3=0X80;  //1000 0000 :脉冲累加器T1仅在上升沿捕捉
   TIE=0X80;    //1000 0000禁止中断;   0允许中断
   TSCR2_TOI=1; //定时器溢出中断允许
   
}
//------------给触发电平
void SET_PULSE (void)
{   
     if (start_flage==0)          //30us的触发电平 高于10us
      {   
         PORTA_PA0=0;
         Delay1us(30);  
         PORTA_PA0=1;
         Delay1us(300);
         PORTA_PA0=0;   
         
         
         start_flage=1;
         test_start=1;
         test_over=0;
     }
}
//------------给触发电平结束
void check_up (void)
{
   
     if ((start_flage==1)&&(PTH_PTH0==1))                 // 检测到上升沿,记录当前时间
     {
         time_start=0;
         time_m_o=0;
         TCNT=0X0000;
         start_flage=2;   // cap riseingedge
     }
     
}  
     
   
////////////中断服务函数
#pragma CODE_SEG __NEAR_SEG NON_BANKED
//----------------------------------------------
void  interrupt 25 h_irupt  (void)    //H口下降沿发生中断  
{         
      
   if (start_flage == 2)
    {
           time_over=TCNT;
           time_rising=((time_over-time_start)+time_m_o*65535)/80; //计算出来为ms
           time_m_o=0;
           start_flage=0;
           distance=(time_rising*340)/20;          //公式 计算出来为cm
                        
           TCNT=0x0000;
           test_start=0;
           test_over=1;
   }   
   
   PIFH_PIFH0=1;
}   
//--------------------------------------------------------
void interrupt 16 Irupt_t1 (void)         //计时器中断溢出
{
      if ((start_flage==2)&&(test_start==1))
      {   
           
          time_m_o++;
      }
      TFLG2_TOF=1;  //定时器溢出标志位,写10
}  
//***************************************************************/
void interrupt 69 Irupt_pit3(void)  //通道3          100ms中断,检测周期
{      
                 
         SET_PULSE();
         //test_start=1;
         PITTF_PTF3=1;  
                                       //清除中断标志位
}
#pragma CODE_SEG DEFAULT
//中断结束
  
//------------------------------------------------------
/////////////中断服务程序结束///////////////
/*PWM初始化程序*/
void PWM1_init()
{
PWME_PWME2=0x00;  // Disable  PWM           禁止            
PWMPRCLK=0x33;    // 0011 0011A=B=24M/8=3M  时钟预分频寄存器设置
PWMSCLA=150;      //SA=A/2/150=10k          时钟设置
PWMSCLB=15;       // SB=B/2/15=100k         时钟设置                    
PWMCLK_PCLK2=1;   //PWM3-----SB             时钟源的选择
PWMPOL_PPOL2=1;   // Duty=HighTime          极性设置
PWMCAE_CAE2=0;    //Left-aligned            对齐方式设置
PWMCTL=0x00;      // noconcatenation        控制寄存器设置
PWMPER2=100;      // Frequency=SB/100=1K     周期寄存器设置
PWMDTY2=0;        // Duty cycle =duty      占空比寄存器设置
PWME_PWME2=1;     // Enable  PWM             使能
}
voidmotor_forward() //控制电机
{
      PWME_PWME4=0;
      PWME_PWME2=1;
      DDRP_DDRP2=1;
      PTP_PTP2=0;
       k=distance/5;
       duty=k-1;
      PWMDTY2=duty;
                 
}
void main(void)
{
     
     
     DisableInterrupts;
     
     SetBusCLK_64M();
   
     PORT_ini();
     ECT_ini();
     PIT_ini();
     EnableInterrupts;
     SET_PULSE();
      
     for(;;)
     {   
         
         
         
         
         if(test_start==1)
         {
              
              check_up();
         }
         
      
         if(time_m_o>=300)
         {
                 duty=100;
         }  
         
         if ((test_start==1)&&(test_over==1) )
          {
               SET_PULSE();                        
          }   
         
         
        PWM1_init();
        motor_forward();
     }
  
}

回复

使用道具 举报

1

主题

3

帖子

0

精华

注册会员

Rank: 2

积分
134
威望
76
贡献
32
兑换币
36
注册时间
2013-3-14
在线时间
13 小时
毕业学校
哈工大
12#
发表于 2013-4-20 10:20:57 | 只看该作者
OPQ_XYQ 发表于 2012-3-24 17:11
#include       /* common defines and macros */
#include "derivative.h"      /* derivative-speci ...

这个用的是DG128吧?
回复

使用道具 举报

15

主题

35

帖子

0

精华

高级会员

Rank: 4

积分
792
威望
406
贡献
214
兑换币
233
注册时间
2013-1-5
在线时间
86 小时
毕业学校
哈工大
13#
发表于 2013-4-26 22:12:21 | 只看该作者
njhgrmk 发表于 2011-9-25 12:54
n值没有修改

n怎么改呀!??急急急!!
回复

使用道具 举报

2

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
485
威望
257
贡献
134
兑换币
147
注册时间
2012-11-6
在线时间
47 小时
14#
发表于 2013-8-14 15:51:32 | 只看该作者
1347519017 发表于 2013-4-5 11:09
#include       /* common defines and macros */    #include      /* derivative information */    #pra ...

非常感谢,很好用
回复

使用道具 举报

2

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
485
威望
257
贡献
134
兑换币
147
注册时间
2012-11-6
在线时间
47 小时
15#
发表于 2013-8-14 16:00:31 | 只看该作者
1347519017 发表于 2013-4-5 11:09
#include       /* common defines and macros */    #include      /* derivative information */    #pra ...

你的程序很好用,有一个问题,请问下面打问号的什么意思,谢谢
while (!ECHO);   
       time = 0xff;   ?
       while (ECHO);   
       t = 0xff - time;     //计时   ?



补充内容 (2013-8-14 19:20):
距离换成m就不准了


补充内容 (2013-8-14 19:20):
cm
回复

使用道具 举报

8

主题

324

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1209

活跃会员奖章优秀会员奖章

威望
528
贡献
373
兑换币
291
注册时间
2013-7-24
在线时间
154 小时
16#
发表于 2013-8-18 15:41:04 | 只看该作者
楼上给的例子不行啊
回复

使用道具 举报

0

主题

2

帖子

0

精华

注册会员

Rank: 2

积分
174
威望
94
贡献
42
兑换币
43
注册时间
2012-11-2
在线时间
19 小时
毕业学校
杞县高中
17#
发表于 2013-9-2 15:20:58 | 只看该作者
1347519017 发表于 2013-4-5 11:09
#include       /* common defines and macros */    #include      /* derivative information */    #pra ...

有点浪费资源了,10us都要进一次中断。。。
回复

使用道具 举报

0

主题

1

帖子

0

精华

高级会员

Rank: 4

积分
680
威望
364
贡献
180
兑换币
221
注册时间
2013-10-3
在线时间
69 小时
18#
发表于 2014-1-21 12:09:18 | 只看该作者
H口和T1口都借到ECHO上吗?
回复

使用道具 举报

0

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
威望
139
贡献
76
兑换币
81
注册时间
2014-9-15
在线时间
19 小时
毕业学校
兰州交通大学
19#
发表于 2015-7-18 18:19:55 | 只看该作者

n值怎么修改?
这是啥东西
回复

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-27 04:09 , Processed in 0.077959 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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