首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]关于超声波测距的程序问题

[求助]关于超声波测距的程序问题

最近做一个超声波测距系统,硬件部分已经做完了  如图 程序似乎出问题了  请各位高手指正  SldBMzwq.bmp


nAWqQZwh.jpg

程序如下

#include<REG51.H>

#define k1 P3_4
#define csbout    P3_5                  //超声波发送
#define csbint    P3_7                  //超声波接收
#define csbc=0.034
#define bg  P3_3
unsigned char csbds,opto,digit,buffer[3],xm1,xm2,xm0,key,jpjs ;//显示标识
unsigned char convert[10]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ;//0~9段码
unsigned int s,t,i, xx,j,sj1,sj2,sj3,mqs,sx1 ;
bit cl ;     
                            
void csbcj() ;
void delay(j) ;                              //延时函数
void scanLED() ;                              //显示函数
void timeToBuffer() ;                  //显示转换函数
void keyscan() ;
void k1cl() ;
void k2cl() ;
void k3cl() ;
void k4cl() ;
void offmsd() ;


void main()                              //主函数
{
     EA=1 ;                                //开中断
       TMOD=0x11 ;                        //设定时器0为计数,设定时器1定时
     ET0=1 ;                              //定时器0中断允许
     ET1=1 ;                              //定时器1中断允许
     TH0=0x00 ;
     TL0=0x00 ;
     TH1=0x9E ;
     TL1=0x57 ;
     csbds=0 ;
     csbint=1 ;
     csbout=1 ;
     cl=0 ;
     opto=0xff ;
     jpjs=0 ;
     sj1=45 ;
     sj2=200 ;
     sj3=400 ;
     k4cl() ;
     TR1=1 ;                       
     while(1)
       {
           keyscan() ;
           if(jpjs<1)
           {
           csbcj() ;
           if(s>sj3)
           {
           buffer[2]=0x76 ;     
           buffer[1]=0x76 ;     
           buffer[0]=0x76 ;     
           }
           else if(s<sj1)
           {
           buffer[2]=0x40 ;     
           buffer[1]=0x40 ;     
           buffer[0]=0x40 ;
           }
           else timeToBuffer() ;     
           }
           else timeToBuffer() ;            //将值转换成LED段码
           offmsd() ;
             scanLED() ;                  //显示函数
           if(s<sj2)
           bg=0 ;
           bg=1 ;
     }
}


void scanLED()                       //显示功能模块
{
    digit=0x04 ;
    for( i=0 ; i<3 ; i++)        //3位数显示
    {
        P3=~digit&opto ;        //依次显示各位数
        P1=~buffer ;        //显示数据送P1口
        delay(20) ;              //延时处理
        P1=0xff ;             //P1口置高电平(关闭)
        if((P3&0x10)==0)      //判断3位是否显示完
           key=0 ;
        digit>>=1 ;             //循环右移1位
    }
}

void timeToBuffer()                //转换段码功能模块
{
     xm0=s/100 ;     
     xm1=(s-100*xm0)/10 ;
     xm2=s-100*xm0-10*xm1 ;
     buffer[2]=convert[xm2] ;     
     buffer[1]=convert[xm1] ;
     buffer[0]=convert[xm0] ;
}

void delay(i)                             
{
    while(--i) ;
}

void timer1int (void)  interrupt 3  using 2
{
     TH1=0x9E ;
     TL1=0x57 ;
     csbds++ ;
     if(csbds>=40)
     {
           csbds=0 ;
           cl=1 ;
     }           
}

void csbcj()
{
     if(cl==1)
     {
               TR1=0 ;
           TH0=0x00 ;
           TL0=0x00 ;
           i=10 ;
           while(i--)
           {
                 csbout=!csbout ;
           }
           TR0=1 ;                 
               i=mqs ;                              //盲区
           while(i--)
           {
           }
           i=0 ;
           while(csbint)
           {
                 i++ ;
                 if(i>=2450)                  //上限值
                 csbint=0 ;
           }
           TR0=0 ;
           TH1=0x9E ;
           TL1=0x57 ;
           t=TH0 ;
           t=t*256+TL0 ;
           s=t*csbc/2 ;
           TR1=1 ;
           cl=0 ;
     }
}

void keyscan()                        //健盘处理函数
{
     xx=0 ;
     if(k1!=1)                              // 判断开关是否按下
     {
           delay(400) ;                        //延时去抖动
           if(k1!=1)                              // 判断开关是否按下     
           {           
           while(!k1)
           {
                 delay(30) ;     
                 xx++ ;
           }
           if(xx>2000)           
           {
                 jpjs++ ;
                 if(jpjs>4)
                 jpjs=0 ;
           }
           xx=0 ;
           switch(jpjs)
           {
           case 1: k1cl() ;break ;           
           case 2: k2cl() ;break ;
           case 3: k3cl() ;break ;
           case 4: k4cl() ;break ;
           }
           }
     }
}
    


void k1cl()
{
sj1=sj1+5 ;
if(sj1>100)
sj1=30 ;
s=sj1 ;
}
void k2cl()
{
sj2=sj2+5 ;
if(sj2>500)
sj2=40 ;
s=sj2 ;
}

void k3cl()
{
sj3=sj3+10 ;
if(sj3>500)
sj3=100 ;
s=sj3 ;
}

void k4cl()
{
sx1=sj1-1 ;
sx1=sx1/csbc ;
mqs=sx1/4.5 ;
}

void offmsd()                                             
{
    if (buffer[0] == 0x3f)                           
    buffer[0] = 0x00 ;
}

真心求学
初涉单片机&nbsp; 很多不懂的地方 请多多指教
真心求学

我可以给你一点资料

我有这方面的书,下次来时给你说一下,你查一下!!!&nbsp; 和你的题目一样的,程序也有的。

[此贴子已经被作者于2007-1-5 20:37:15编辑过]

好的&nbsp; 谢谢
真心求学
《单片机课程设计实例指导&nbsp;》&nbsp;&nbsp; 北京航空航天大学出版社&nbsp;&nbsp;&nbsp; 这本书里有你要找的东西
返回列表