打印

51做的程序,死在一个地方,急求大虾帮助

[复制链接]
3511|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
迷惘的年代|  楼主 | 2011-11-13 10:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
sbit LED=P1^2;//模拟蜂鸣器
sbit ECHO=P1^0;//超声波回响引脚
sbit TRIG=P1^3;//超声波触发引脚
uint flag=0;
uint time;
long S;
void delay(uint z)            //声音延时子函数
{
  int x;
  for(;z>0;z--)
  for(x=110;x>0;x--);
}
void zd1() interrupt 1
{
     TR0=0;
     flag=1;
     TH0=0;
     TL0=0;
}
void count()         
  {
      
       time=TH0*256+TL0;
       S=time*0.00017;       //算出来是M  12M晶振        
  }

/*----------声音部分--------*/
void mansu()
{  
  LED=1;
  delay(600);
  LED=0;
  delay(600);
}
void zhongsu()
{
  LED=1;
  delay(300);
  LED=0;
  delay(300);
}
void kuaisu()
{  
  LED=1;
  delay(50);
  LED=0;
  delay(50);
}
/*--------超声处理部分--------*/
void chaoshengjingbao()
{  
  if(flag!=1)
       {
         if((S>3)&&(S<4))
         {
           mansu();
           S=500;
           //delay(1000);
         }
         if((S>2)&&(S<=3))
         {
           zhongsu();
           S=500;
           //delay(1000);
         }
         if(S<=2)
         {
           kuaisu();
           S=500;
           //delay(500);
         }
       }
       if(flag==1)
       {
        LED=1;
        delay(1000);
        flag=3;
       }
}
void timerinit()       //定时器初始化
{
    TMOD=0x01;           //设T0为方式1,GATE=1
    TH0=0;
    TL0=0;
    TR0=1;
}
void StartModule()           //超声波触发程序,打开定时器开始计时
{      
      TRIG=0;                              
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      TRIG=1;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      TRIG=0;
}      
/*------------------------------------------------------*/  
void main()
{  
   ECHO=0;
   for(;;)
   {
       timerinit();
       StartModule();
       //delay(1000);
       while(ECHO==0)
          {
                _nop_();
          }
       TR0=0;
       count();
       //delay(110);
       chaoshengjingbao();
   }
这个程序是一个简易的通过超声波模块测距的程序,程序烧录到单片机以后不能正常运行,观察LED发现它只在一个频率闪烁,但正常的应该是随着距离的变化LED以不同的频率闪烁 。程序已经调了3,4天了,还是没结果,故请求各路高手帮我查出错误,万分感谢   。
}

相关帖子

沙发
迷惘的年代|  楼主 | 2011-11-13 10:47 | 只看该作者
我这超声波模块是通过TRIG引脚发送10UF的高脉冲后模块自动发射40KHZ的超声波,反射回来的超声波通过ECHO引脚产生高脉冲。

使用特权

评论回复
板凳
langren023| | 2011-11-13 12:24 | 只看该作者
新手 路过 顶下

使用特权

评论回复
地板
hotpower| | 2011-11-13 12:43 | 只看该作者
flag被优化掉了。

使用特权

评论回复
5
hotpower| | 2011-11-13 12:50 | 只看该作者
virtual char flag;
51是8位机,要节约。最好用char类型。
无论速度和占用空间。

使用特权

评论回复
6
hotpower| | 2011-11-13 12:53 | 只看该作者
在中断内不易delay()

使用特权

评论回复
7
hotpower| | 2011-11-13 12:53 | 只看该作者
在中断内不易delay()

使用特权

评论回复
8
hotpower| | 2011-11-13 12:54 | 只看该作者
在中断内不易delay()

使用特权

评论回复
9
hotpower| | 2011-11-13 12:55 | 只看该作者
晕,手机连发。

使用特权

评论回复
10
wangxinaaa| | 2011-11-13 13:41 | 只看该作者
2# 迷惘的年代

使用特权

评论回复
11
linqing171| | 2011-11-13 18:52 | 只看该作者
哈哈,没有看懂。
但是感觉flag不可能被优化掉。
楼主单步走一下看看吧。

感觉你的大S,会一直在0和500之间变化。

使用特权

评论回复
12
nongfuxu| | 2011-11-13 20:00 | 只看该作者
这么复杂的程序,俺老农眼花看不清了.:lol

使用特权

评论回复
13
xhtxzxw| | 2011-11-13 21:12 | 只看该作者
一行一行写成这个样子,不象程序,感觉象找个母猴做媳妇不象个老婆。
很多错误,比如:
TMOD=0x01;           //设T0为方式1,GATE=1,咋就GATE=1了呢?
void StartModule()           //超声波触发程序,打开定时器开始计时,你怎么就说打开了定时器了呢?咋打开的啊??
等等,不爱看母猴,看不下去了。。。。。。。。。。

使用特权

评论回复
14
shendalei| | 2011-11-13 21:19 | 只看该作者
if((S>3)&&(S<4))

使用特权

评论回复
15
shendalei| | 2011-11-13 21:22 | 只看该作者
for(;;)
不规范

使用特权

评论回复
16
shendalei| | 2011-11-13 21:24 | 只看该作者
chaoshengjingbao();函数比较乱
还有你的’S‘你弄明白了没

使用特权

评论回复
17
shendalei| | 2011-11-13 21:26 | 只看该作者
坑爹呀:lol

使用特权

评论回复
18
kxylure| | 2011-11-13 21:27 | 只看该作者
呵呵呵

使用特权

评论回复
19
hotpower| | 2011-11-13 21:49 | 只看该作者
绝对是flag的问题。这是最基础的。

使用特权

评论回复
20
c126| | 2011-11-13 21:51 | 只看该作者
if((S>3)&&(S<4))
         {
           mansu();
           S=500;
           //delay(1000);
         }
此处的(S>3)&&(S<4)何解,要让S等于几?3.5?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

7

帖子

1

粉丝