智能车制作
标题:
大神帮我看看HC-SR04超声波探测程序的问题
[打印本页]
作者:
孤旅人
时间:
2015-3-23 14:30
标题:
大神帮我看看HC-SR04超声波探测程序的问题
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include <MC9S12XS128.h>
// echo连接的是PA1
//trig连接的是PA0
unsigned char a=0,s;
void PIT(void) //PIT初始化子程序
{
PITCFLMT = 0x00; //禁止PIT模块
PITMUX_PMUX0 = 1; //定时器通道使用Base Timer0(微定时基准0)
PITMTLD0 = 0x01; //设置8位微定时装载寄存器0初值(8位计数器初值)
PITLD0 = 0x0078; //设置16位微定时装载寄存器0初值(16位计数器初值)
PITCFLMT =0x80; //使能PIT模块
PITCE_PCE0 = 1; //使能定时器通道0
PITINTE = 0x01; //使能PIT定时器通道0中断
//5us计时
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED //中断服务子程序
interrupt VectorNumber_Vpit0 void PIT_ISR(void)
{
if(PITTF_PTF0 == 1)
PITTF_PTF0 = 1; //清除标志位
a++;
}
#pragma CODE_SEG DEFAULT
void IO_INIT()//初始化端口
{
DDRA = 0x01;
PORTA = 0x00;
}
void delay(unsigned int loop_times) //延时10us程序
{
unsigned int loop_i,loop_j;
for(loop_i=0;loop_i<loop_times;loop_i++)
{for(loop_j=0;loop_j<38;loop_j++)
;
}
}
void signal() //超声波触发信号
{
PORTA_PA0 = 1;
PORTA_PA2 = 1;
delay(1);
PITINTE = 0x00;//关闭定时器
PORTA_PA0 = 0;//拉低电位
a = 0; //计时清0
}
void distance() //测试距离
{
while(!(PORTA_PA1 == 1))//程序一直 卡死在这里
{
;
}
PITINTE = 0x01;
while(!(PORTA_PA1 == 0))
{
;
}
PITINTE = 0x00;
s =a * 17/20; //a每5us增加一次
}
/***************************************************
** 函数名称: PLL_Init
** 功能描述: 时钟初始化函数
** 说明: 总线时钟选定24M
****************************************************/
void PLL_Init(void)
{
CLKSEL=0x00;
SYNR=0XC0 | 0X05;
REFDV=0XC0 | 0X03;
PLLCTL_PLLON=1;
POSTDIV=0X00;
asm(nop);
asm(nop);
while(0==CRGFLG_LOCK); //锁相环锁定
CLKSEL_PLLSEL=1; //选定PLL时钟
}
void SCI0_Init() //串口初始化
{
SCI0BDL = (byte)((24000000 /* OSC freq /2*/) / 9600 /* baud rate */ / 16 /*factor*/);
SCI0CR1 = 0X00; /*normal,no parity*/
SCI0CR2 = 0X2C; /*RIE=1,TE=1,RE=1, */
}
void SCI_Write(unsigned char sendchar) 串口发送数据
{
while (!(SCI0SR1&0x80));
SCI0DRH=0;
SCI0DRL=sendchar;
}
void main(void) {
DisableInterrupts;
IO_INIT();
PLL_Init();
SCI0_Init();
PIT();
EnableInterrupts;
//-------------------//
for(;;) {
signal();
distance();
SCI_Write(s);
}
}
经过我单步调试发现问题就是echo接收不到高电平,HC-SR04模块我也有换过,应该不是模块问题,求大神 支支招!!!
作者:
空有一人
时间:
2015-3-23 14:37
:):)
作者:
村口张si傅
时间:
2015-3-23 16:22
128的话用输入捕捉吧
作者:
天涯博弈
时间:
2015-3-26 15:18
试试这个 #include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define TIMER 2
#define TRING PTP_PTP0 //控制端
#define ECHO PTP_PTP1 //接收端
int time;
//---------------------------1us准确延时__64M-----------------------------
void Delay1us(int c)
{
int cnt0;
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
}
/*IO口初始化*/
void IO_Init(void)
{
DDRP = 0x01; //A0输出,A1输入
}
/*PIT初始化,实现10US定时*/
void PIT_Init(void)
{
PITCFLMT_PITE = 0; //定时中断通道0关
PITCE_PCE0 = 1; //定时器通道0使能
PITMUX_PMUX0=0;
PITMTLD0 = 16 - 1; //8位定时器初值设定,160分频
PITLD0 = TIMER - 1; //16位定时器初值设定,TIMER*10us
PITINTE_PINTE0 = 1; //定时器中断通道0中断使能
//定时器通道0使能关
}
void main(void)
{
int t;
double dis;
IO_Init(); //IO初始化
PIT_Init(); //PIT初始化
EnableInterrupts; //开中断
/*等待200us使超声波模块初始化完毕*/
Delay1us(200);
while (1)
{
/*给控制端一个超过10US的高电平,然后置低*/
TRING = 1;
Delay1us(20);
TRING = 0;
time=900;
/*等待接收端产生高电平并计时*/
while (!ECHO);
PITCFLMT_PITE =1;
while (ECHO);
PITCFLMT_PITE =0;
t=900-time;
dis = 0.17*t*0.5;
Delay1ms(100); }
}
/*PIT定时中断*/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0(void)
{
PITTF_PTF0 = 1; //清中断标志位
--time;
}
#pragma CODE_SEG DEFAULT
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2