中级会员
- 积分
- 319
- 威望
- 192
- 贡献
- 51
- 兑换币
- 58
- 注册时间
- 2012-10-24
- 在线时间
- 38 小时
|
我是要实现一个超声波测距的程序。我的思想是:当回波引脚变为高电平时,输出回响信号,同时定时器开始计时,当检测到回响信号时,此时相当于收到了外部中断,进入中断程序,在中断程序中读取此时TCNT的值,就可以算出定时时间,也就算出了要测的距离。此时程序又加到主程序中,在主程序中,我就是问可不可以里面再设定像while(TCNT<330)类似的式子来关闭定时器,关闭后让程序重新循环后让定时器重新开始计时,这样主要是利于我重新测距,也就是利于我重新在中断程序中读取TCNT值,好不断地测距离。我的这部分程序如下:但是我的程序编译通过不了,老是显示Error:C2801:'}' missing。我也检查不出错误是什么。希望知道的指点我下,谢谢。
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define uint unsigned int
#define uchar unsigned char
#define TX PTM_PTM0; //定义TX口,此口用来接收一个10us以上的高电平,在下面我写的是20us,肯定达到要求了
#define RX PTT_PTT7; //定义RX口,此口用来接收外部中断
#define light PTM_PTM2;
uint outcomeH,outcomeL,distance;
void delay_20us();
void delay_20us() //延时20us,可能不是很精确,但是肯定超过了10us。
{
uchar bt ;
for(bt=0;bt<100;bt++);
}
void main(void)
{
/* put your own codDisableInterrupts;e here */
while(1)
{
DisableInterrupts; //关中断
TX=1; //给PTM_PTM0一个高电平
delay_20us();
TX=0; //持续20us后变为低电平,此用来触发内部模块发出激励信号
while(RX==0); //发出激励信号后,内部就会发出超声波信号,在这里就是等待是否发出超声波信号,没收到,一直等待,收到了退出循环,进入下面的程序
TSCR2=0x07;
TIOS=0xBF; //定时器通道6为IC方式
TCTL3=0x20;
TFLG1=0x40;
TIE=0x40;
TSCR1=0x80;
TIOS=0x00;
TCTL1=0x00;
TFLG1=0x80;
TIE=0x80;
TC7=0x0160; //设定TCNT的最大值是352
TSCR1=0x90;
EnableInterrupts; //开中断
while(TCNT<330); //这里就是我用来关闭定时器的,当计数值超过330时,就跳出这个while循环,从而进入大循环,来重新让TCNT来从0开始计数,这里我也有疑问,TCNT能关闭和通过软件来使它重新从0开始计数吗?
}
}
#pragma CODE_SEG NON_BANKED
interrupt 14 void Timer6_ISR()
{
outcomeH=TCNTH; //读取TCNT的高8位
outcomeL=TCNTL; //读取TCNT的低8位
distance=outcomeH;
distance<<=8;
distance=distance|outcomeL; //通过这些运算得到dsitance的值
if(distance<295) //这个295的值是我通过计算折算出来的,也就是相当于40CM的距离,当大于这个值时,小车会停止或其他动作。
light=1; // 小灯亮来指示我们小车距前方物体小于40CM了
DisableInterrupts; //关中断
}
|
|