智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1970|回复: 4
打印 上一主题 下一主题

程序求助(程序中有部分注解)

[复制链接]

6

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
319
威望
192
贡献
51
兑换币
58
注册时间
2012-10-24
在线时间
38 小时
跳转到指定楼层
1#
发表于 2013-1-18 11:41:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是要实现一个超声波测距的程序。我的思想是:当回波引脚变为高电平时,输出回响信号,同时定时器开始计时,当检测到回响信号时,此时相当于收到了外部中断,进入中断程序,在中断程序中读取此时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;    //关中断   
}



21

主题

892

帖子

0

精华

常驻嘉宾

爱板者

Rank: 8Rank: 8

积分
3857

活跃会员奖章优秀会员奖章在线王奖章论坛元老奖章

威望
1833
贡献
1048
兑换币
736
注册时间
2012-12-4
在线时间
488 小时
2#
发表于 2013-1-18 11:58:59 | 只看该作者
看晕了
回复 支持 反对

使用道具 举报

17

主题

671

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6187
QQ
威望
3024
贡献
1755
兑换币
1315
注册时间
2012-2-4
在线时间
704 小时
3#
发表于 2013-1-18 13:08:23 | 只看该作者
:lol:lol
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

注册会员

Rank: 2

积分
131
威望
100
贡献
29
兑换币
5
注册时间
2011-11-21
在线时间
1 小时
4#
发表于 2013-1-18 14:47:36 | 只看该作者
本帖最后由 skyangel2010 于 2013-1-18 14:50 编辑

你可以测试一次,开关一次定时器中断就行了啊,何必那么麻烦
回复 支持 反对

使用道具 举报

6

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
319
威望
192
贡献
51
兑换币
58
注册时间
2012-10-24
在线时间
38 小时
5#
 楼主| 发表于 2013-1-18 19:35:39 | 只看该作者
skyangel2010 发表于 2013-1-18 14:47
你可以测试一次,开关一次定时器中断就行了啊,何必那么麻烦

请问你写过没,写过的话写一个后通过编译后让我参考下行吗?呵呵
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-6 14:26 , Processed in 0.052822 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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