参考代码:
开发环境:Freescale Codewarrior 5.0
/*
* Authour: flyreally
*
*自己写的一个超声波测距的模块,用查询方式做的,
*当然也可以用中断了
*
*/
#include #include #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; }
上一篇:MC9S12G单片机的中断系统
下一篇:Freescale MC9S12G128 GPIO
推荐阅读最新更新时间:2024-11-01 11:19
设计资源 培训 开发板 精华推荐
- 具有内置诊断功能的 TDA7563BPDTR 4 x 50W 多功能四路功率放大器的典型应用电路
- Tl431 可调精密并联稳压器的典型应用
- 使用 Microchip Technology 的 MICRF001 的参考设计
- 采用小型 DFN 封装的电子断路器无需使用感应电阻器
- 周二电路图
- LT6656BCS6-2.5、2.5V 电压基准作为微功率稳压器的典型应用
- 用于高电流分流稳压器的 NCP431B 可编程精密基准的典型应用
- 使用 Analog Devices 的 LTC3615HUF 的参考设计
- LT1072HVIT 反激式转换器的典型应用
- ADR420 超精密、低噪声、5.00 Vout XFET 电压基准和高压浮动电流源的典型应用