[求助] 怎么将超声波测距仪的蜂鸣器的频率根据测量结果的不同改变成两种不同的频率?万分感激

独家记忆的峨眉   2014-6-18 13:08 楼主
之前编写的程序,当测量结果小于100cm时,蜂鸣器就发出嘀嘀嘀的声音报警。现在怎么改动一下,使当测量距离在60-100cm时以某一频率的声音报警,当测量结果小于60cm时以更高频率的声音报警?已经编写好的程序如下: #include
#include
#define uchar unsigned char
#define uint unsigned int
#define bj P3_3                 //报警值输出(声音)
#define csbint P3_2                         //超声波接收
#define LED P2              //数码管段

#define csbout P0_0                         //超声波接收

sbit LED3 = P0^2;                        //数码管位驱动
sbit LED2 = P0^4;                        //数码管位驱动
sbit LED1 = P0^6;                        //数码管位驱动

uchar cl,csbds,xm1,xm2,xm0,sj1,buffer[3];
uchar convert[10]={0x60,0x7E,0xA2,0x2A,0x3C,0x29,0x21,0x7A,0x20,0x28};

static unsigned char temp1;         //温度值的整数部分
uint s,i,t,sj2,sj3,wd;
float csbc,wdz;


/*有关全局变量*/
void csbcj();
void delay(i);                                        //延时函数
void scanLED();                                        //显示函数
void showOnce();                                //显示循环函数
void timeToBuffer();                        //显示转换函数
void offmsd();
void csbfs();
void csbsc();


void main()
{
        EA=1;                                           //开中断
          TMOD=0x11;                                 //设定时器0为计数,设定时器1定时
        ET0=1;                                         //定时器0中断允许
        ET1=1;                                         //定时器1中断允许
        TH1=0xE7;
        TL1=0xC2;
        csbint=1;
        cl=1;
        TR1=1;                                     //设定时值1为20ms
        sj1=40;
        sj2=100;
        sj3=599;
    temp1=25;
    csbsc();
        while(1)
        {
                csbcj();                //调用超声波测距程序
                if(s>sj3)                //大于时显示“CCC”
                {
                    buffer[0]=0xE1;               
                    buffer[1]=0xE1;       
                    buffer[2]=0xE1;       

                }
                else if(s                 {
                        buffer[2]=0xBF;
                        buffer[1]=0xBF;
                        buffer[0]=0xBF;
                }
                else timeToBuffer();        //调用转换段码功能模块       
                offmsd();                                //调用判断百位数为零模块,百位为零时不显示
                if(s                 {
          bj=0;
                  if(s<40)
                  i=20;
                  else i=s*2;
                  while(--i)
                  {
                         scanLED();                                //调用显示函数
                  }
                }
                i=300;
                bj=1;
                while(--i)
                {
                         scanLED();                                //调用显示函数
                }

        }
}

void delay(i)                                //延时子程序                                       
{
    while(--i);
}

void scanLED()                             //显示功能模块
{
        LED=buffer[0];
        LED3=0;
        delay(25);
        LED3=1;
        delay(50);

        LED=buffer[1];
        LED2=0;
        delay(25);
        LED2=1;
        delay(50);
       
        LED=buffer[2];
        LED1=0;
        delay(25);
        LED1=1;
        delay(50);
}

void offmsd()                                                            //百位为数0判断模块
{
    if (buffer[2]==0x60)                                  //如果值为零时百位不显示
    buffer[2] = 0xff;
}

void timer1int (void)  interrupt 3  using 2         //终断处理程序
{
        csbds++;
        if(csbds>=10)
        {
                csbds=0;
                cl=1;
        }
}

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

void csbcj()                                //超声波测距子程序
{
        if(cl==1)
        {
                   TR1=0;
                TH0=0x00;
                TL0=0x00;
                bj=1;
                delay(2500);
                i=10;                                        //超声波脉冲个数5个
                while(i--)
                {               
                        csbout=!csbout;                           //超声波发送
                }
                TR0=1;
                   i=250;                                        //盲区值(延时躲过超声波发送头的余波)
                while(i--)                               
                {
                }
                i=0;
                while(csbint)                        //判断接收回路是否收到超声波的回波
                {
                        i++;                               
                        if(i>=3000)                        //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
                        csbint=0;
                }
                csbint=1;
                TR0=0;
                t=TH0;                                       
                t=t*256+TL0;
                t=t;                       
                s=t*csbc;                                //计算测量结果
                cl=0;
            TH1=0xE7;
            TL1=0xC2;
                TR1=1;
        }
}
//计算超声波速度
void csbsc()
{
        wdz=0.0000615*temp1;
        csbc=0.03314+wdz;
        csbc=csbc/2;
}


回复评论 (1)

你好,你这个弄好了吗
点赞  2015-1-26 11:42
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复