logo资料库

用MC9S12XS128实现超声波测距(使用PIT模块定时).pdf

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
用用MC9S12XS128实现超声波测距(使用 希望对初学者有用 先来说说超声波测距模块的引脚: VCC, ECHO(接收端), TRING(控制端), OUT(悬空), GND 实现超声波测距(使用PIT模块定时) 模块定时) 希望对初学者有用 先来说说超声波测距模块的引脚: VCC, ECHO(接收端), TRING(控制端), OUT(悬空), GND 时序图: 参考代码: 开发环境:Freescale Codewarrior 5.0 /* * Authour: flyreally * *自己写的一个超声波测距的模块,用查询方式做的, *当然也可以用中断了 * */ #include /* common defines and macros */ #include /* derivative information */ #pragma LINK_INFO DERIVATIVE "mc9s12xs128" /*可以通过更改TIMER的值来实现不同时间的定时, 定时长为TIMER * 10us*/ #define TIMER 1 #define TRING PORTA_PA0 //控制端 #define ECHO PORTA_PA1 //接收端 ulong time = 0; /* n * 10us延时*/ void Delay_Us(ulong n) { time = n; while (time); } /*IO口初始化*/ void IO_Init(void) { DDRA = 0x02; //A0输出,A1输入 } /*PIT初始化,实现10US定时*/ void PIT_Init(void)
{ PITCFLMT_PITE = 0; //定时中断通道0关 PITCE_PCE0 = 1; //定时器通道0使能 PITMTLD0 = 160 - 1; //8位定时器初值设定,160分频 PITLD0 = TIMER - 1; //16位定时器初值设定,TIMER*10us PITINTE_PINTE0 = 1; //定时器中断通道0中断使能 PITCFLMT_PITE = 1; //定时器通道0使能 } void main(void) { ulong t; double dis; IO_Init(); //IO初始化 PIT_Init(); //PIT初始化 EnableInterrupts; //开中断 /*等待200us使超声波模块初始化完毕*/ Delay_Us(20); while (1) { /*给控制端一个超过10US的高电平,然后置低*/ TRING = 1; Delay_Us(2); TRING = 0; /*等待接收端产生高电平并计时*/ while (!ECHO); time = 0xff; while (ECHO); t = 0xff - time; //计时 dis = 1.7 * t; //计算距离 //延时10MS,这个的原因大家看时序图,不同的硬件不同 Delay_Us(1000); } } /*PIT定时中断*/ #pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 66 PIT0(void) { PITTF_PTF0 = 1; //清中断标志位
--time; }
分享到:
收藏