⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ultrasonic.c

📁 超声波程序.rar
💻 C
字号:
#include <REG52.h>                  
#include<stdio.h>

#define uchar unsigned char
#define uint  unsigned int
extern char *itoa(int  i); 

uint code SEG7[16]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,
                     0x30,0x25,0xa9,0x26,0xa1,0xb1};//0 1 2 3 4 5 6 7 8 9 A-E

uchar code ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管显示位置

uchar dis[4];
sbit trig=P1^0;
sbit echo=P1^1;

void delay(uint k)
{
    uint i,j;
    for(i=0;i<k;i++)
    {
        for(j=0;j<121;j++)
        {;}
    }
}

void display(uint dis)
{
    P0=SEG7[dis%10];
    P2=ACT[3];
    delay(1);

    P0=SEG7[(dis/10)%10];
    P2=ACT[2];
    delay(1); 

	P0=SEG7[(dis/100)%10];
	P2=ACT[1];
	delay(1);

	P0=SEG7[dis/1000];
	P2=ACT[0];
	delay(1);
}  

void display2(uint Hi,uint Low)
{
    P0=SEG7[Hi%10];
    P2=ACT[3];
    delay(1);

    P0=SEG7[(Hi/10)%10];
    P2=ACT[2];
    delay(1); 

	P0=SEG7[(Hi/100)%10];
	P2=ACT[1];
	delay(1);

/*	P0=SEG7[Hi/1000];
	P2=ACT[0];
	delay(1);
 */
    //Low
    P0=SEG7[Low%10];
    P2=ACT[7];
    delay(1);

    P0=SEG7[(Low/10)%10];
    P2=ACT[6];
    delay(1); 

	P0=SEG7[(Low/100)%10];
	P2=ACT[5];
	delay(1);

/*	P0=SEG7[Low/1000];
	P2=ACT[4];
	delay(1);   */
}

void delay10us()    
{
    uchar i;
    for(i=11;i>0;i--);
}

void init()
{
    TMOD=0x21;//模式1
    TH1=0xf3;//4800bps fosc=12M
    TL1=0xf3;
    TR0=0;
    trig=0;                             
    echo=0;
    TH0=0;
    TL0=0;
    TCON=0x00;
    SCON=0x50;//SM0=0 SM1=1 SM2=0 REN=1 TB8=0 R8=0 TI=0 RI=0
    PCON=0x80;//SMOD=1
    TR1=1;
    ES=1;
    EA=1;
}

uint getDistance()
{
    uint i=29412;//5m来回需要的时间(us)   (5*2/340)*1000000
    TR0=0;
    TH0=0;
    TL0=0;
    //接收信号端置0
    echo=0;
    //开始触发
    trig=1;
    //延时10微秒
    delay10us();
    //停止触发                         
    trig=0;
    //没有信号返回并且在5米障碍物信号返回需要的时间前则等待 (无信号即时返回,防止死循环,阻碍其它程序的执行)
    while(!echo&&i>0)
    {
        i--;
    }  

    if(i>0)//小于5米,说明有信号返回
    { 
        TR0=1;//开始计时
        while(echo); //持续高电平则计时,转为低电平则退出
        TR0=0;//停止计时
       return (uint)((TH0*256+TL0)*0.170); //单位:mm           //340000/1000000/2=0.17   mm/us
    } 
    //display2(TH0,TL0);                                    
    return  0; //大于5米则返回0
}

void SendChar(uchar ch)
{
    SBUF=ch;
    while(!TI);
    TI=0;
}
void SendCmd(uchar *cmd,uchar sz)
{
    uchar i=0;
    SendChar('$');
    for(i=0;i<sz;i++)
    {
        SendChar(*(cmd+i));
    }
    SendChar('@');
}

void main()
{
    uint distance=0;
    init();
    while(1)
    {
        //测距
        distance=getDistance();
        //sprintf(dis,"%4d",distance);
        //SendCmd(dis,4);
        display(distance);
      /*  if(TF0)
        {
            TF0=0;
            TH0=0;
            TL0=0;
        }  */
    }
}

void serial_serve(void) interrupt 4
{
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -