电子技术论坛

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
下载方法|用单线程|避免多扣帖子规范|求助必读|发帖建议积分策略|勋章介绍|新人必读获取金币|推广论坛|出售帖子基本礼节|致会员信|版规总则
禁涉政治|反对低俗|举报专帖征集相片|留下足迹|推荐精华上传附件|制作分卷|使用网盘禁发qq群|恶意灌水|纯表情帖加入团队|监督机制|安全上网
查看: 4197|回复: 3

超声波测距C51程序,跪求高人指点~本人菜鸟~~

[复制链接]
发表于 2012-5-12 16:26:40 | 显示全部楼层 |阅读模式

注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
我做了模拟部分的超声波发射和接收电路~~现在通过点按发射机的按钮开关,给单片机一个引脚提供低电平,让其开始定时,然后查询单片机另一个引脚的状态,当查询到低时,终止定时~程序如下~~跪求高人指点~~

#include<reg52.h>
#include<stdio.h>
#include<string.h>
#include<intrins.h>  //包含_nop_()函数定义的头文件
#define uchar unsigned char         //宏定义
#define ulong unsigned long
#define uint  unsigned int

/**********************************************
端口定义
液晶屏端口:rs=P3^5;        lcden=P3^4;输出端口接P2
定时器启动和关闭引脚:定时开始P1.3,定时结束P1.4
**********************************************/

sbit rs=P3^6;
sbit lcden=P3^7;
sbit TimeSt=P1^3;
sbit TimeEd        =P1^4;
uchar code table1[]="ULTRASOUND";           //code的内容只能读,不能改.   
uchar code table2[]="DISTANCE:";
uchar table3[4];                                           //定义一个空数组,存放测算的距离
uchar code table4[]="m" ;                           
uchar code table5[]="safe  " ;                        
ulong c=340;                           //超声波传播速度
bit succeed_flag;

/**********************************************
延时函数
短延时:delay(unit x)
长延时:delay1(uint x)       
函数返回值为空
延时1Ms函数 void delay1ms(void)
**********************************************/

void delay(uint x)                                           //短延时子函数        100us延时函数
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=11;b>0;b--);
}

void delay1(uint x)                                           //长延时子函数
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=100;b>0;b--);
}

void delay1ms(void)                                   //1ms延时函数        
{
    uchar i,j;
    for(i=0;i<2;i++)
        for(j=0;j<255;j++);
}

/**********************************************
  LCD1602子函数部分
  write_com(unchar com):写指令函数
  write_data(uchar date:写数据函数
  LCD_Display(uchar *str):字符串显示函数       
  void init()CD初始化函数
************************************************/

void write_com(uchar com)
{
        P2=com;
        rs=0;                                           //RS=0,输入指令
        lcden=0;
        delay(10);
        lcden=1;
        delay(10);
        lcden=0;
}

void write_data(uchar date)
{
        P2=date;
        rs=1;                                                  //RS=1,输入数据
        lcden=0;
        delay(10);
        lcden=1;                                          //使能信号LCDEN,在时钟下降沿时执行指令
        delay(10);
        lcden=0;
}

void LCD_Display(uchar *str)
{
    uchar i;
    for(i=0;i<strlen(str);i++)
    {
          write_data(str[i]);
          delay(40);
        }
}

void init()
{
        write_com(0x38);                          //显示模式设置,设置16 *2显示,5*7点阵,8位数据接口
        delay(20);
        write_com(0x0d);                          //设置开显示,显示光标,光标闪烁
        delay(20);
        write_com(0x06);                      //写一个字符后,地址指针加1,且光标加1,写一个字符时,整屏显示不移动
        delay(20);
        write_com(0x01);                      // 显示清零,数据指针清零
        delay(20);       
}

/*********************************************
unit Time()

获取时间
发射超声波时开始计时,收到回波后定时结束
*********************************************/

ulong Time()
{                                                                                       
    ulong time1,Th,Tl;       
        uint i;
        time1=0;
        Th=0;                                                                                 
        Tl=0;
        TimeSt=1;
        TimeEd=1;

    TMOD=0x01;                                            //定时器0,工作方式1
    TH0=0;                                           //从0开始定时,最多可计65536个数
    TL0=0;       

        EA=1;
        ET0=1;
        TR0=0;

waitforstarting:                   //检测按键
    while(TimeSt);                                   //延迟20MS,去除按键抖动
        for(i=0;i<20;i++)
           delay1ms();
        if(TimeSt)
          goto waitforstarting;

    TR0=1;
        succeed_flag=1;
        delay(3);                      //除直接接收的超声波信号的干扰      
    while(TimeEd);                           //等待接收到回波信号,终止定时
        if(succeed_flag==1)
        {
     TR0=0;                    
         Th=TH0;                                                  
         Tl=TL0;
         time1=Th*256+Tl-300;         //读取定时器的数值,计算时间
        }
        else
        {
         time1=0;
        }
    return (time1);                                                                                                                                       
}

void T0_time() interrupt 1                   //产生中断,超出测距范围,提示安全
  {
    TR0=0;
        succeed_flag=0;
        TimeEd=0;
  }

/*********************************************
ulong Distance(ulong t)

距离的计算
**********************************************/

ulong Distance(ulong t)
{                          
        ulong time2;
        ulong distance1;
        time2=t;
        distance1=(time2*c)/2;
        return (distance1);
}

/*********************************************
主函数MAIN
void main()
实现距离的测算和CD1602液晶显示功能
**********************************************/

void main()
{
        ulong time;
        ulong distance,i;
        time=0;
        distance=0;
/*******LCD1602静态显示部分*******************/
    init();                               //LCD1602初始化
        write_com(0x80+0x03);                   //设置数据地址指针
        delay(20);
    LCD_Display(table1);
        delay(20);
        write_com(0xc0);                           //从第二行首地址显示数据
        delay(20);
        LCD_Display(table2);
        delay(20);
while(1)
{               
/*******超声波测量距离**************/
    time=Time();                       //获取时间
        if(time==0)
   {
         write_com(0xc0+0x0a);                   //从第二行第10个地址显示转换结果
         delay(20);                                                         
         LCD_Display(table5);
   }
        else
   {
    distance=Distance(time);           //获取距离

/**更新table3的内容,实时显示距离***/
    table3[0]=distance/1000000+'0';//取个位
    distance=distance%1000000;
        table3[1]='.';
    table3[2]=distance/100000+'0'; //取小数点后一位
        distance=distance%100000;
        table3[3]=distance/10000+'0';  //取小数点后两位

/*******LCD1602动态显示部分**********/
          write_com(0xc0+0x0a);                   //从第二行第10地址显示转换结果
        delay(20);                                                         
        LCD_Display(table3);
        delay(20);               
        write_com(0xc0+0x0e);                                
        delay(20);
        LCD_Display(table4);
        delay(20);
   }
/*************使测试结果显示0.5秒*****/
        for(i=0;i<500;i++)
        delay1ms();
}
}
发表于 2012-10-21 17:49:43 | 显示全部楼层
初学路过!
发表于 2015-6-1 11:41:58 | 显示全部楼层
初学,看看。
发表于 2015-6-1 11:48:06 | 显示全部楼层

初学,看看。
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|家电维修技术论坛 ( 鄂ICP备09003585号-2 )

GMT+8, 2024-11-22 02:39 , Processed in 0.054834 second(s), 4 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

CopyRight © 电子技术论坛
电子邮箱:8794149@qq.com | 联系 QQ:3081868839 | 官方网址:www.dzdu.com

Qiji. All Rights Reserved


服务条款 | 站长声明

Wuhan Qiji Technology Co., Ltd.武汉奇迹科技有限公司版权所有


鄂ICP备09003585号-2鄂公网安备42010602000420号

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