找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3798|回复: 8
收起左侧

超声波测速模块

[复制链接]
ID:386391 发表于 2018-8-29 14:06 | 显示全部楼层 |阅读模式
#include <reg52.h>
#include <string.h>
/************************************位定义************************************/
sbit echo  = P2^0;                //回声接收端口
sbit trig = P2^1;                //超声触发端口

sbit wei1=P2^4;
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;
/************************************宏定义************************************/
#define dula P0                //段选信号的锁存器控制
#define uchar unsigned char
#define uint unsigned int
/********************************定义变量和数组********************************/
long int distance=0;               //距离变量
uchar count;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
                        0x87,0xff,0xef,0x71};

unsigned char SendData[32] = {0x00};  //发送数据包
/******************************************************************************/
/* 函数名称  : delay                                                      */
/* 函数描述  : 延时函数                                               */
/* 输入参数  : 延时时间(ms)                                        */
/* 返回值    : 无                                                             */
/******************************************************************************/
void delay(unsigned int xms)                               
{
        unsigned int i,j;
        for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒
                for(j=112;j>0;j--);
}
/******************************************************************************/
/* 函数名称  : display                                                      */
/* 函数描述  : 数码管显示函数                                               */
/* 输入参数  : 测试距离值的十倍                                        */
/* 返回值    : 无                                                             */
/******************************************************************************/
void display(long int num)                        //显示程序
{
   uchar qian,bai,shi,ge;
   if((num>5000)||(num == 0))
   {
           qian=15;//距离值上为百位
           bai=15;
           shi=10;
           ge=15;
   }
   else
   {
           qian=num/1000;//距离值上为百位
           bai=(num/100)%10;//距离值上为十位
           shi=(num/10)%10;//距离值上为个位,并且显示时需要加小数点
           ge=num%10;//距离值上为小数位,并已经四舍五入
   }
   wei1=1;                //显示千位
   wei2=0;
   wei3=0;
   wei4=0;
   P0=table[qian];
   delay(2);

   wei1=0;                //显示百位
   wei2=1;
   wei3=0;
   wei4=0;
   P0=table[bai];
   delay(2);

   wei1=0;                //显示十位
   wei2=0;
   wei3=1;
   wei4=0;
   P0=table1[shi];
   delay(2);

   wei1=0;                //显示个位
   wei2=0;
   wei3=0;
   wei4=1;
   P0=table[ge];
   delay(2);

}
/******************************************************************************/
/* 函数名称  : Init_timer2                                                       */
/* 函数描述  : 初始化单片机函数                                               */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void Init_timer0(void)
{
        TMOD |= 0x01;          //定时器0初始化,设置为16位自动重装模式
        TL0 = 0x66;
        TH0 = 0xfc;              //1ms
    ET0 = 1;              //开定时器2
        EA = 1;                      //总中断使能
}
/******************************************************************************/
/* 函数名称  : Init_Parameter                                                 */
/* 函数描述  : 初始化参数和IO口函数                                           */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void Init_Parameter(void)
{
         echo = 0;
         trig = 0;
         count = 0;
         distance = 0;
}
/******************************************************************************/
/* 函数名称  : Trig_SuperSonic                                                */
/* 函数描述  : 发出声波函数                                                   */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void Trig_SuperSonic(void)//出发声波
{
         trig = 1;
         delay(1);
         trig = 0;
}
/******************************************************************************/
/* 函数名称  : Measure_Distance                                               */
/* 函数描述  : 计算距离函数                                                   */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void Measure_Distance(void)
{
        uchar l;
        uint h,y;
        TR0 = 1;
        while(echo)
    {
        ;
    }       
        TR0 = 0;
        l = TL0;
        h = TH0;
        y = (h << 8) + l;
        y = y - 0xfc66;//us部分
        distance = y + 1000 * count;//计算总时间 (us)
        TL0 = 0x66;
        TH0 = 0xfc;
        delay(30);
        distance = 0.17 * distance;//
}
/******************************************************************************/
/* 函数名称  : init_com                                                           */
/* 函数描述  : 串口初始化函数                                                         */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void init_com(void)
{
        EA=1;        //开总中断
        ES=1;        //允许串口中断
        ET1=1;        //允许定时器T1的中断
        TMOD|=0x20;   //定时器T1,在方式2中断产生波特率
        PCON=0x00;   //SMOD=0
        SCON=0x50;   // 方式1 由定时器控制
        TH1=0xfd;    //波特率设置为9600
        TL1=0xfd;
        TR1=1;       //开定时器T1运行控制?

}

/******************************************************************************/
/* 函数名称  : PutString                                                           */
/* 函数描述  : 串口发送函数                                                         */
/* 输入参数  : 数组                                                             */
/* 参数描述  : char类型字符串                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void PutString(unsigned char *TXStr)  
{               
        ES=0;     
        while(*TXStr!=0)
        {                     
          SBUF=*TXStr;
          while(TI==0);
          TI=0;   
          TXStr++;
        }
        ES=1;
}

/******************************************************************************/
/* 函数名称  : main                                                           */
/* 函数描述  : 主函数                                                         */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/                                       
void main(void)
{
        uchar a;       
        init_com();
        Init_timer0();
        Init_Parameter();
        while(1)
        {
                Trig_SuperSonic();         //触发超声波发射
                while(echo == 0)          //等待回声
                {
                         ;
                }
                Measure_Distance();        //计算脉宽并转换为距离
                for(a=100;a>0;a--)
                {          
                        display(distance);
                }
                //组装发送超声波到上位机
                memset(SendData, 0x00, sizeof(SendData));
                memcpy(SendData, "$51,CSB", sizeof("$51,CSB"));
       
                SendData[7] = distance / 1000 + '0';
                SendData[8] = distance % 1000 / 100 + '0';
                SendData[9] = distance % 100 / 10  + '0';
                SendData[10] = '.';
                SendData[11] = distance % 10 + '0';
                SendData[12] = '#';
                SendData[13] = 0x00;
                PutString(SendData);
       


                Init_Parameter();          // 参数重新初始化
         }       
}
/******************************************************************************/
/* 函数名称  : timer0                                                         */
/* 函数描述  : T0中断处理函数                                                 */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void timer0 (void) interrupt 1
{
        TF0 = 0;
        TL0 = 0x66;
        TH0 = 0xfc;
        count++;
        if(count == 18)//超声波回声脉宽最多18ms
        {
                TR0 =0;
                TL0 = 0x66;
                TH0 = 0xfc;
                count = 0;
        }
}
/******************************************************************************/


回复

使用道具 举报

ID:1 发表于 2018-8-29 17:30 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

ID:386391 发表于 2018-8-31 15:55 | 显示全部楼层
这是超声波测距的原理图
超声波模块原理图.jpg
回复

使用道具 举报

ID:437724 发表于 2019-4-14 21:02 | 显示全部楼层
请问stc11如何烧录程序
回复

使用道具 举报

ID:517235 发表于 2019-5-4 18:20 | 显示全部楼层
有没有直接连接雷达进行测速的原理图
回复

使用道具 举报

ID:527906 发表于 2019-5-6 20:29 | 显示全部楼层
1546485047 发表于 2019-4-14 21:02
请问stc11如何烧录程序

STC单片机系列和STC59C51类似的。现在关键是应该烧录什么程序。。
回复

使用道具 举报

ID:527906 发表于 2019-5-6 20:32 | 显示全部楼层
想问问楼主,这个原理图中的STC11内烧录的程序是什么。我是用51作为外部控制的,这个STC11是超声波模块的一部分。但是我不知道应该给这个单片机烧什么程序进去。
回复

使用道具 举报

ID:433256 发表于 2019-6-17 08:56 | 显示全部楼层
请问Init_Parameter这个是初始化什么的呢?超声波传感器码?
回复

使用道具 举报

ID:687974 发表于 2020-1-24 11:35 | 显示全部楼层
楼主有没有加lcd的仿真电路图
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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