找回密码
 注册
关于网站域名变更的通知
查看: 726|回复: 4
打印 上一主题 下一主题

单片机超声波测距Proteus仿真 包含源程序 仿真 原理图

[复制链接]
  • TA的每日心情
    开心
    2023-5-15 15:25
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2021-5-31 16:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

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

    x
    本设计采用STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机作为主控制器;.LCD1602液晶显示测量的距离和温度;.带有温度补偿功能(DS18B20传感器);.测量范围0.02m~4m,精度为0.01m;按键功能:按键1:加报警值按键2:减报警值按键3:设置按键(只有在设置的时候才可以加减报警值)
    . N, p4 H7 X- X
    9 b: i$ _4 R+ r% ^! r

    # Z8 \& q$ U3 q6 \- D; b* t3 X
    ' d4 j, W7 \4 Q+ Q' v8 u: W3 h5 Q. c4 U& T, x( a

    , r) Q; @; a+ k4 L9 x% C2 Y2 _
    . Q  V$ o" r( I0 y- Y# [" R单片机源程序如下:& j% K$ o3 k; l5 I% L
    • //宏定义
    • #define uchar unsigned char
    • #define uint unsigned int
    • #define ULint unsigned long int
    • //温度零上与零下的标志位
    • char flag=0;
    • //超声波
    • char flags=0;
    • //超声波距离
    • char flag1s=0;
    • //计算定时间
    • uint time=0;
    • //计算距离
    • ULint L_=0;
    • //温度
    • uint t_=0;
    • //显示模式  0正常  1最大值调整  2最小值调整
    • uchar mode=0;
    • uint Max=490;
    • uint Min=30;
    • //按键标志
    • uchar k=0;
    • //数值有误
    • uchar FW=0;
    • //头函数
    • #include <reg52.h>
    • #include <intrins.h>
    • #include "BJ_Key.h"                    //报警按键
    • #include "display.h"                         //显示头函数
    • #include "ultrasonic_wave.h"//超声波头函数
    • #include "DS18B20.h"                    //温度传感器头函数
    • //函数声明
    • void delayms(uint ms);
    • //主函数
    • void main()
    • {
    •         Init_ultrasonic_wave();
    •         //屏幕初始化
    •         Init1602();
    •         //温度初始化
    •         tmpchange();
    •         t_=tmp();
    •         tmpchange();
    •         t_=tmp();
    •         tmpchange();
    •         t_=tmp();
    •         //循环显示
    •         while(1)
    •         {
    •                 Key();
    •                 //正常显示
    •                 if(mode==0)
    •                 {
    •                         StartModule();//启动超声波
    •                         while(!RX);          //当RX为零时等待
    •                         TR0=1;                  //开启计数
    •                         while(RX);          //当RX为1计数并等待
    •                         TR0=0;                  //关闭计数
    •                         delayms(20);  //20MS
    •                         tmpchange();  //温度转换
    •                         t_=tmp();     //度温度
    •                         Conut(t_/10); //计算距离
    •                         if(L_>Max||L_<Min)
    •                         {
    •                                 Feng_Start();
    •                         }
    •                         else
    •                         {
    •                                 if(FW!=1)
    •                                 Feng_Stop();
    •                         }
    •                         Display_1602(t_/10,L_);
    •                 }
    •                 //调整显示
    •                 else if(mode!=0)
    •                 {
    •                         //最大最小值
    •                         Init_MaxMin();
    •                         while(mode!=0)
    •                         {
    •                                 Key();
    •                                 if(k==1&&mode==1)
    •                                 {
    •                                         Init_MaxMin();
    •                                    write_com(0x8d);//设置位置
    •                                 }
    •                                 else if(k==1&&mode==2)
    •                                 {
    •                                         Init_MaxMin();
    •                                    write_com(0x8d+0x40);//设置位置
    •                                 }
    •                                 k=0;
    •                         }
    •                         //界面初始化
    •                         Init1602();
    •                 }
    •         }
    • }
    • void delayms(uint ms)
    • {
    •         uchar i=100,j;
    •         for(;ms;ms--)
    •         {
    •                 while(--i)
    •                 {
    •                         j=10;
    •                         while(--j);
    •                 }
    •         }
    • }
    • //T0中断用来计数器溢出,超过测距范围
    • void CJ_T0() interrupt 1
    • {
    •     flags=1;                                                         //中断溢出标志
    • }

    • 1 O) w0 `$ z3 A7 i! ~. \
    9 \9 P; z7 o  N( N
    / n& z2 E' g6 k7 {
    7 ?( c( x: n7 n( f; i
  • TA的每日心情
    开心
    2023-6-2 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2021-5-31 16:12 | 只看该作者
    ) y' y4 z4 f( J- M+ Q$ q/ `* x
    BJ_KEY.H(4): error C279: 'flag': multiple initialization
    0 j" }  s# c9 U8 c0 tBJ_KEY.H(6): error C279: 'flags': multiple initialization
    , W9 o1 R$ }: A$ }" _- E! uBJ_KEY.H(8): error C279: 'flag1s': multiple initialization
    2 k" j1 c' K! x# e, `, z7 k# l我运行后为啥会出现这种错误呢

    点评

    翻译一下,他这说是重复初始化,你看看是不是你配置问题或者什么的把,,反正我Proteus 8.11版本,重新导入了一下HEX文件,就可以正常运行了  详情 回复 发表于 2021-5-31 16:28
  • TA的每日心情
    开心
    2023-6-2 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2021-5-31 16:28 | 只看该作者
    Blah 发表于 2021-5-31 16:12
    ; R- G3 F9 l( a6 f+ u: ]9 O# B5 GBJ_KEY.H(4): error C279: 'flag': multiple initialization
    7 c+ F$ }  ?; k$ N$ b4 y# ]BJ_KEY.H(6): error C279: 'flags': multip ...
    2 D$ h; q: u- S" t1 Z
    翻译一下,他这说是重复初始化,你看看是不是你配置问题或者什么的把,,反正我Proteus 8.11版本,重新导入了一下HEX文件,就可以正常运行了
    . |4 f4 f% m+ O# ]& d  \( L
  • TA的每日心情
    开心
    2023-6-2 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    4#
    发表于 2021-5-31 18:04 | 只看该作者

    2 X! ?5 h( b! @, A2 b' B1 Q( v. i有没有相应的流程图啊

    点评

    就是的,有流程图吗  详情 回复 发表于 2021-5-31 18:05

    该用户从未签到

    5#
    发表于 2021-5-31 18:05 | 只看该作者
    Blah 发表于 2021-5-31 18:04* `& K% h4 Z8 z! K
    有没有相应的流程图啊

    / E* f  X- {7 G/ P! S. ?就是的,有流程图吗
      j4 [' f, a2 r: l7 M
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-8-19 21:17 , Processed in 0.156250 second(s), 31 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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