搜索
bottom↓
回复: 6

请高手看一下那程序,超声波传感器为什么测不了距离呢

[复制链接]

出0入0汤圆

发表于 2012-10-23 17:03:33 | 显示全部楼层 |阅读模式
请教一下高手,为什么这个写的这个程序用超声波只能显示刚开始的距离,请帮忙改一下,谢谢了
  #include   "STC15F2K.H"
        #include   <intrins.h>       
//引脚定义
    sbit     RX    =  P1 ^ 2;
    sbit     TX    =  P1 ^ 3;
    sbit     CS    =  P4 ^ 5;        //片选 高电平有效 单片LCD使用时可固定高电平
    sbit     SID   =  P5 ^ 5;        //数据
    sbit     SCLK  =  P5 ^ 4;        //时钟
        sbit         LCD_PSB= P4 ^ 1;
        sbit         LCD_K =  P4 ^ 2;
        sbit         LCD_L =  P4 ^ 4;
#define LCD_data P0
void Write_char(bit start, unsigned char ddata);
void Delaynms(unsigned int di);
void Lcd_init(void);
//void Disp_img(unsigned char *img);
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s);
void LCD_set_xy( unsigned char x, unsigned char y );
unsigned char code num[]={"0123456789 :.-"};
unsigned char code waves[]={"超声波测距系统"};
unsigned char code znwk[] ={"智能微控工作室"};
unsigned char code CM[] =  {"M"};
static         unsigned char DisNum = 0;
                unsigned int  time=0;
               unsigned  long S=0;
               bit  flag =0;
                unsigned char disbuff[4]           ={ 0,0,0,0,};       


/******************************************************************************/
void Lcd_init(void)        //初始化LCD
{
        LCD_K=0;
        LCD_L=1;
        LCD_PSB=1;
//        Delaynms(2); //启动等待,等LCM讲入工作状态
          CS=1;
          Write_char(0,0x30);  //8 位介面,基本指令集
          Write_char(0,0x0c);  //显示打开,光标关,反白关
          Write_char(0,0x01);  //清屏,将DDRAM的地址计数器归零
}

/******************************************************************************/
void Write_char(bit start, unsigned char ddata) //写指令或数据
{
        CS=start;
        SID=0;
        SCLK=0;
        P0=ddata;
        Delaynms(5);
        SCLK=1;
        Delaynms(5);
        SCLK=0;
}
/******************************************************************************/
void Delaynms(unsigned int di) //延时
{
        unsigned int da,db;
        for(da=0;da<di;da++)
                   for(db=0;db<10;db++);
}

/******************************************************************************/

void Clr_Scr(void)//清屏函数
{
        Write_char(0,0x01);
}

/******************************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{        //设置LCD显示的起始位置,X为行,Y为列
    unsigned char address;
        switch(x)
        {
                case 0: address = 0x80 + y; break;   
            case 1: address = 0x80 + y; break;
                case 2: address = 0x90 + y; break;
                    case 3: address = 0x88 + y; break;
                case 4: address = 0x98 + y; break;
                default:address = 0x80 + y; break;
        }
    Write_char(0, address);
}

/******************************************************************************/
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
{        //        中英文字符串显示函数
        LCD_set_xy( X, Y );
   
    while (*s)
    {
                Write_char( 1, *s );
            s ++;
                Delaynms(1);
        }
}

/******************************************************************************/
void LCD_Write_number(unsigned char s)//        数字显示函数
{       
        Write_char(1,num[s]);
        Delaynms(5);
}
/******************************************************************************/
void Lcd_Mark2(void)
{
        Clr_Scr();//清屏
        LCD_Write_string(1,0,znwk);//
        LCD_Write_string(2,0,waves);//       
        LCD_Write_string(3,7,CM);//       
}
//5ms延时
void Delay5Ms(void)
{
        unsigned int TempCyc = 5552;
        while(TempCyc--);
}

//400ms延时
void Delay400Ms(void)
{
        unsigned char TempCycA = 5;
        unsigned int TempCycB;
        while(TempCycA--)
                {
                        TempCycB=7269;
                        while(TempCycB--);
                };
}

/********************************************************/
    void Conut(void)
        {
           time=TH0*256+TL0;
           TH0=0;
           TL0=0;
           S=time*1.87/100;       //算出来是CM          11。0592M晶振
           if(flag==1)                      //超出测量
          {         
           flag=0;
           LCD_set_xy( 3, 4 );
           LCD_Write_number(13);
           LCD_Write_number(12);
           LCD_set_xy( 3, 5 );
           LCD_Write_number(13);
           LCD_Write_number(13);
          
           }
         else
          {
           disbuff[1]=S%1000/100;
           disbuff[2]=S%1000%100/10;
           disbuff[3]=S%1000%10 %10;
           LCD_set_xy( 3, 4 );
           LCD_Write_number(disbuff[1]);
           LCD_Write_number(12);
           LCD_set_xy( 3, 5 );
           LCD_Write_number(disbuff[2]);
           LCD_Write_number(disbuff[3]);
          }
        }
/********************************************************/
void delayms(unsigned int ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}
/********************************************************/
     void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;                                                         //中断溢出标志
  }
/********************************************************/
   void  StartModule()                          //T1中断用来扫描数码管和计800MS启动模块
  {
          TX=1;                                         //800MS  启动一次模块
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          TX=0;
  }
/********************************************************/
void main(void)
{
        void Delay400Ms(void);  
        Lcd_init();       //设置液晶显示器
        Clr_Scr();        //清屏       
        Lcd_init();       //从图形显示状态下返回
    Lcd_Mark2();
        while(1)
        {
            TMOD=0x01;                   //设T0为方式1,GATE=1
                TH0=0;
                TL0=0;
                TR0=1;
                EA=1;
                while(1)
                {
                         StartModule();
                         while(!RX);                //当RX为零时等待
                         TR0=1;                            //开启计数
                         while(RX);                        //当RX为1计数并等待
                         TR0=0;                                //关闭计数
                         Conut();                        //计算
                         delayms(80);                //80MS
                }
        }
}           

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-10-23 17:26:07 | 显示全部楼层

检查输出到模块讯号、模块输入讯号、或模块电压、等

出0入0汤圆

 楼主| 发表于 2012-10-23 17:54:39 | 显示全部楼层
devcang 发表于 2012-10-23 17:26
检查输出到模块讯号、模块输入讯号、或模块电压、等

我拔了超声波的正电,他会有测量,但他的测量不准

出0入0汤圆

发表于 2012-10-24 18:00:09 | 显示全部楼层
把    StartModule();函数丢在中断服务函数里面去定时60-80MS发射一次 就可以了

出0入0汤圆

发表于 2012-10-24 19:36:42 | 显示全部楼层
你用的是STC的15系列的那个片子,咋搞到的?

出0入0汤圆

 楼主| 发表于 2012-10-25 00:10:32 | 显示全部楼层
jqfsjt 发表于 2012-10-24 19:36
你用的是STC的15系列的那个片子,咋搞到的?

网上买的那单片机啊

出0入0汤圆

发表于 2012-10-25 00:46:21 来自手机 | 显示全部楼层
超声波没做过!是什么
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 16:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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