单片机——用SRF04、BUZZER设计一个能单次启动测距系统电路

博客简介

本次实验是倒车雷达的C任务,在proteus上利用SRF04、BUZZER设计一个能单次启动测距系统电路,一开始我的方案是用单片机设计,但是后来老师要求不用单片机,所以转至其他方案。单片机的方案在这里记录:
在这里插入图片描述

实验内容

阅读教材、观察传感器视频(两组特定距离的trig和echo的示波器捕获波形),认识超声波测距传感器工作原理,在Proteus上用SRF04传感器、蜂鸣器BUZZER和数字电路芯片设计一个能单次启动测距系统电路。要求:

  • 分析波形、计算距离并说明。
  • 数码管上显示出距离远近程度(8位距离采样值)
  • 蜂鸣器能根据距离远近发出多种不同频率组合声音。

实验原理

(1)实现echo的高电平计数和距离计算

  • 计算高电平的时间time=TH0*256+TL0
  • 距离S=(time*1.7)/100
void Count(void)
{
    time=TH0*256+TL0;
    TH0=0;
    TL0=0;

    S=(time*1.7)/100;     //算出来是CM
    if((S>=700)||flag==1) //超出测量范围显示“-”
    {  
         flag=0;
         l_disbuff[1]=10;   //“-”
         l_disbuff[2]=10;   //“-”
         l_disbuff[3]=10;   //“-”
    }
    else
    {
         l_disbuff[1]=S%1000/100;
         l_disbuff[2]=S%1000%100/10;
         l_disbuff[3]=S%1000%10%10;
    }
}

数码管扫描

  • 根据位选信号l_posit来选择不同的显示位
void display()
{
    P0=0X00; //
    switch(l_posit){
        case 0: //选择千位数码管,关闭其它位
        //SMG_q=0;
        SMG_b=1;
        SMG_s=1;
        SMG_g=1;
        P0=table[l_disbuff[0]];
        break;

        case 1: //选择百位数码管,关闭其它位
        //SMG_q=1;
        SMG_b=0;
        SMG_s=1;
        SMG_g=1;
        P0=table[l_disbuff[1]];//加入小数点要与一下
        break;

        case 2: //选择十位数码管,关闭其它位
        //SMG_q=1;
        SMG_b=1;
        SMG_s=0;
        SMG_g=1;
        P0=table[l_disbuff[2]];
        break;
        case 3: //选择个位数码管,关闭其它位
        //SMG_q=1;
        SMG_b=0;
        SMG_s=0;
        SMG_g=1;
        P0=table[l_disbuff[3]];
        break;
    }
    l_posit++;
    if(l_posit>3)
    l_posit=0;
}

(3)根据距离选通不同的频率:

给距离分段:

  • 如果0<=S<20,选通clk2
  • 如果20<=S<60,选通clk3
  • 如果60<=S<100,选通clk4
  • 如果100<=S<150,选通clk5
void buzzer()//蜂鸣器
{
    buzze=0x00;
    if(0<=S<20)
    {
        buzze=clk2;//时钟1
    }
    else if (20<=S<60)
    {
        buzze=clk3;//时钟2
    }
    else if(60<S<=100)
    {
        buzze=clk4;//时钟3
    }
    else if(100<S<=150)
    {
        buzze=clk5;//时钟4
    }
    else 
    {
        buzze=0x00;
    }
}

电路实现

在这里插入图片描述

实验仿真验证

生成hex文件并装载

  • 新建工程
    在这里插入图片描述
  • 点击project,选择option for Target,在output选项中勾选create Hex File
    在这里插入图片描述
  • F7 编译后在debug目录中生成Hex文件
    在这里插入图片描述
  • 装载到单片机中
    在这里插入图片描述

仿真

  • 设置echo回响信号的高电平时间
  • 点击仿真
  • 可以看到数码管显示距离distance
  • 改变echo高电平时间可以听到不同频率的声段

在这里插入图片描述

  • 附上代码
#include "reg51.h"
#include <intrins.h>

//常变量定义:
code unsigned char table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//表:共阴数码管 0-9 -
unsigned int  time=0;
unsigned int  timer=0;
unsigned long S=0;
bit flag =0;


unsigned char l_disbuff[4]={ 0,0,0,0};//显示缓冲
unsigned char l_posit=1; //位选择


//引脚定义:
//sbit SMG_q = P2^2; //定义数码管阳级控制脚(千位)本例程只用到三位数码管
sbit SMG_b = P2^2; //定义数码管阳级控制脚(百位)
sbit SMG_s = P2^3; //定义数码管阳级控制脚(十位)
sbit SMG_g = P2^4; //定义数码管阳级控制脚(个位)

/**********************蜂鸣器引脚*/
sbit buzze= P2^5;
sbit clk1= P1^2;    //蜂鸣时钟
sbit clk2= P1^3;    //蜂鸣时钟
sbit clk3= P1^4;    //蜂鸣时钟
sbit clk4= P1^5;    //蜂鸣时钟


sbit RX = P2^1; //模块引脚
sbit TX = P2^0;
/********************************************************延时*/
void Delay1ms(uint c)//误差 0us
{
    uchar a,b;
	for (; c>0; c--)
	{
		 for (b=199;b>0;b--)
		 {
		  	for(a=1;a>0;a--);
		 }      
	}
}
/********************************************************/
//显示函数,参数为显示内容
void display()
{
    P0=0X00; //
    switch(l_posit){
        case 0: //选择千位数码管,关闭其它位
        //SMG_q=0;
        SMG_b=1;
        SMG_s=1;
        SMG_g=1;
        P0=table[l_disbuff[0]];
        break;

        case 1: //选择百位数码管,关闭其它位
        //SMG_q=1;
        SMG_b=0;
        SMG_s=1;
        SMG_g=1;
        P0=table[l_disbuff[1]];//加入小数点要与一下
        break;

        case 2: //选择十位数码管,关闭其它位
        //SMG_q=1;
        SMG_b=1;
        SMG_s=0;
        SMG_g=1;
        P0=table[l_disbuff[2]];
        break;
        case 3: //选择个位数码管,关闭其它位
        //SMG_q=1;
        SMG_b=0;
        SMG_s=0;
        SMG_g=1;
        P0=table[l_disbuff[3]];
        break;
    }
    l_posit++;
    if(l_posit>3)
    l_posit=0;
}

/********************************************************/
void Count(void)
{
    time=TH0*256+TL0;
    TH0=0;
    TL0=0;

    S=(time*1.7)/100;     //算出来是CM
    if((S>=700)||flag==1) //超出测量范围显示“-”
    {  
         flag=0;
         l_disbuff[1]=10;   //“-”
         l_disbuff[2]=10;   //“-”
         l_disbuff[3]=10;   //“-”
    }
    else
    {
         l_disbuff[1]=S%1000/100;
         l_disbuff[2]=S%1000%100/10;
         l_disbuff[3]=S%1000%10%10;
    }
}
void buzzer()//蜂鸣器
{
    buzze=0x00;
    if(0<=S<20)
    {
        buzze=clk2;//时钟1
    }
    else if (20<=S<60)
    {
        buzze=clk3;//时钟2
    }
    else if(60<S<=100)
    {
        buzze=clk4;//时钟3
    }
    else if(100<S<=150)
    {
        buzze=clk5;//时钟4
    }
    else 
    {
        buzze=0x00;
    }
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
    flag=1; //中断溢出标志
}
/********************************************************/
void  zd3()  interrupt 3 //T1中断用来扫描数码管和计800MS启动模块
{
    TH1=0xf8;
    TL1=0x30;
    display();
    timer++;
    if(timer>=400)
    {
         timer=0;
         TX=1;        //800MS  启动一次模块
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_();
         _nop_(); 
         _nop_(); 
         _nop_(); 
         _nop_();
         TX=0;
    } 
}
/*********************************************************/
void  main(  void  )
{  
    TMOD=0x11;   //设T0,T1为方式1
    TH0=0;
    TL0=0;          
    TH1=0xf8;   //2MS定时
    TL1=0x30;
    ET0=1;             //允许T0中断
    ET1=1;   //允许T1中断
    TR1=1;   //开启定时器
    EA=1;   //开启总中断
    while(1)
    {
        while(!RX); //当RX为零时等待
        TR0=1;    //开启计数
        while(RX); //当RX为1计数并等待
        TR0=0; //关闭计数
        Count(); //计算
        buzzer();//蜂鸣
    }
}

  • hex文件:
:03000000020507EF
:0C050700787FE4F6D8FD75812002054ED7
:0A000E003F065B4F666D7D077F6FB4
:10065000040D0000000002090000020B000004115C
:0906600000000000C100010801C6
:10059300E4F580E50814601414601B14602224033E
:1005A300702CD2A2D2A3D2A4E50D801CC2A2D2A3E6
:1005B300D2A4E50E8012D2A2C2A3D2A4E50F800872
:1005C300C2A2C2A3D2A4E51090000E93F580050841
:0B05D300E508D394034003E4F5082280
:10046200C2A5AF14AE13AD12AC11E4FBFAF9F8D386
:1004720012035F50047F0180027F00C3EF64809407
:10048200945005A29292A522AF14AE13AD12AC11F4
:10049200E47B14FAF9F8D312035F50047F0180025F
:1004A2007F00C3EF648094BC5005A29392A522AF53
:1004B20014AE13AD12AC11E47B3CFAF9F8C312038B
:1004C2005F50047F0180027F00D3EF648094E45088
:1004D20005A29492A522AF14AE13AD12AC11E47B27
:1004E20064FAF9F8C312035F7E0050047F018002B0
:1004F2007F00D3EF9496EE648094805005A295928B
:05050200A522C2A522A4
:10037000AF8CEFFEAD8A7C00E42DFFEC3EFEE4F591
:100380008CF58AAD07AC061201C97B9A7A9979D9A6
:10039000783F12001EE4FBFA79C878421201271256
:1003A00002028F148E138D128C11E47FBC7E02FD2D
:1003B000FCAB14AA13A912A811C312035F50033097
:1003C000000CC200750E0A750F0A75100A22E47B34
:1003D000E87A03F9F8AF14AE13AD12AC111202BFF4
:1003E000AC00AD01AE02AF03E47B64FAF9F812028F
:1003F000BF8F0EE47BE87A03F9F8AF14AE13AD12A9
:10040000AC111202BFAC00AD01AE02AF03E47B64DD
:10041000FAF9F81202BFAC00AD01AE02AF03E47B03
:100420000AFAF9F81202BF8F0FE47BE87A03F9F8B1
:10043000AF14AE13AD12AC111202BFAC00AD01AEE1
:1004400002AF03E47B0AFAF9F81202BFAC00AD0177
:10045000AE02AF03E47B0AFAF9F81202BFAF038FD2
:01046000108B
:010461002278
:03000B00020003ED
:03000300D20032F6
:03001B000205DEFD
:1005DE00C0E0C083C082C0D0758DF8758B30120517
:1005EE0093050CE50C7002050BC39490E50B94017A
:1005FE00401F750B00750C00D2A00000000000001B
:10060E00000000000000000000000000000000C21A
:0A061E00A0D0D0D082D083D0E0320B
:10062800758911E4F58CF58A758DF8758B30D2A92A
:10063800D2ABD28ED2AF30A1FDD28C20A1FDC28C1C
:0806480012037012046280EE3F
:10001E00EC4D6011E8497017ED33EC3304600DE4DC
:10002E00FCFFFEFD22E933E8330470F802026E1283
:10003E00023958046009E4CC248150062850090284
:10004E000278284003020275C0E0EB4A7044B98082
:10005E0006D0E0FB020264EF4E701CBD8008EBFF81
:10006E00EAFEE9FD80EBE98DF0A4FEE5F002010762
:10007E00E9CDF9EAFEEBFFEF89F0A4FCE5F0CE89BD
:10008E00F0A42EFFE435F0CD89F0A42DFEE435F07A
:10009E008067EF4E7005BD80D780C3EF8BF0A4ACA8
:1000AE00F0EE8BF0A42CFCE435F0F8EF8AF0A42CE3
:1000BE00E5F038FCE433CB8DF0A42CFCE5F03BF8F6
:1000CE00EE8AF0A42CFCE5F038F8E433CF89F0A4E6
:1000DE002CFCE5F038CF3400CE89F0A42FFFE5F0EC
:1000EE003EFEE433C98DF0A42EFEE5F039CD8AF044
:1000FE00A42FFFE5F03EFEE43DFD33D0E0FB5007BC
:10010E000BBB000F020278EC2CFCEF33FFEE33FE3C
:06011E00ED33FD0202506A
:10012400020278EC5D046005E85904700302026E73
:10013400120239580460F6EC4860F2EC7004FDFEDB
:10014400FF22C860DB2481C85009C39860025006AE
:100154000202759850CAF582E9294B4A7005AB82B0
:1001640002026475F0007C1A7880C3EF9BEE9AED6E
:1001740099400DC3EF9BFFEE9AFEED99FDE842F026
:10018400DC23ACF0D0E0FFD0E0FED0E0FDAB822079
:10019400E7101BEB60BAEC2CFCEF33FFEE33FEED03
:1001A40033FD020250E803F830E705C0F075F000B3
:1001B400EF2FFFEE33FEED33FD40B830E7C280AAE7
:1001C40075F020800E75F010800575F0087D007EB6
:1001D400007F003392D530D503120351EC33401025
:1001E400EF33FFEE33FEED33FDEC33FCD5F0ED22BF
:0E01F400E5F0247EA2D513CC92E7CDCEFF22FB
:10020200EDD2E7CD33EC3392D524814006E4FFFEF4
:10021200FDFC22FCE4CFCECDCC24E0501174FF8053
:10022200EDC3CC13CCCD13CDCE13CECF13CF0470F0
:07023200F030D5DE0203519C
:10023900E9D2E7C933E833F892D5EDD2E7CD33EC0B
:0702490033FC5002B2D52284
:10025000EC30E7100FBF000C0EBE00080DBD00040F
:100260000BEB6014A2D5EB13FCED92E7FD2274FFBB
:10027000FCFDFEFF22E480F8A2D574FF13FC7D8014
:03028000E480EF28
:10051300020628E493A3F8E493A34003F68001F2D0
:1005230008DFF48029E493A3F85407240CC8C333E9
:10053300C4540F4420C8834004F456800146F6DFB8
:10054300E4800B0102040810204080900650E47EF2
:10055300019360BCA3FF543F30E509541FFEE493AD
:10056300A360010ECF54C025E060A840B8E493A374
:10057300FAE493A3F8E493A3C8C582C8CAC583CA9F
:10058300F0A3C8C582C8CAC583CADFE9DEE780BE57
:010669000090
:1002830075F008758200EF2FFFEE33FECD33CDCC32
:1002930033CCC58233C5829BED9AEC99E5829840B5
:1002A3000CF582EE9BFEED9AFDEC99FC0FD5F0D692
:1002B300E4CEFBE4CDFAE4CCF9A88222B800C1B9BC
:1002C3000059BA002DEC8BF084CFCECDFCE5F0CBFA
:1002D300F97818EF2FFFEE33FEED33FDEC33FCEB33
:1002E30033FB10D703994004EB99FB0FD8E5E4F9EE
:1002F300FA227818EF2FFFEE33FEED33FDEC33FCDB
:10030300C933C910D7059BE99A4007EC9BFCE99ACE
:10031300F90FD8E0E4C9FAE4CCFB2275F010EF2F13
:10032300FFEE33FEED33FDCC33CCC833C810D70713
:100333009BEC9AE899400AED9BFDEC9AFCE899F84E
:0E0343000FD5F0DAE4CDFBE4CCFAE4C8F922E1
:0E035100C3E49FFFE49EFEE49DFDE49CFC22BD
:10035F00EB9FF5F0EA9E42F0E99D42F0E89C45F0F4
:01036F00226B
:00000001FF

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值