找回密码
 注册
关于网站域名变更的通知
查看: 732|回复: 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:设置按键(只有在设置的时候才可以加减报警值)
    " r6 Y! r: s8 t* X; o( m0 Z6 G  q! s8 o

    2 h7 f  Z) d6 c& I 9 [; }% b. T( A0 B# P
    ( P. u" ]  U, {/ d. [: h* ]
    - {6 e+ M2 R) k$ f
    $ e; i3 [' ^! X2 ]4 }; a2 s
    单片机源程序如下:$ ?  A1 \* M  D; w) w1 e+ Q
    • //宏定义
    • #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;                                                         //中断溢出标志
    • }

    • - V8 D/ z* p6 E1 P4 j, ?2 G8 q' F
    8 ^7 T* t) N. d5 ^  _, ]

    5 y, ]; @  n1 j; z; d4 G( {- o% e( ?+ t9 ~
  • TA的每日心情
    开心
    2023-6-2 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2021-5-31 16:12 | 只看该作者
    2 H/ E% v; h( L" R; i5 C
    BJ_KEY.H(4): error C279: 'flag': multiple initialization
    3 b$ @7 d: F* q" h: B4 M& c6 L! N, ~BJ_KEY.H(6): error C279: 'flags': multiple initialization: S/ P  K) t- c' l3 v
    BJ_KEY.H(8): error C279: 'flag1s': multiple initialization- _& ?: w8 F0 w! b
    我运行后为啥会出现这种错误呢

    点评

    翻译一下,他这说是重复初始化,你看看是不是你配置问题或者什么的把,,反正我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
    . m! C3 i- B, K( m. l7 y, a6 k2 IBJ_KEY.H(4): error C279: 'flag': multiple initialization7 ?8 {8 ?! d- w: b( H# B
    BJ_KEY.H(6): error C279: 'flags': multip ...
    ! k0 c+ J2 `* P! A" c6 }4 C3 c! I2 y6 M
    翻译一下,他这说是重复初始化,你看看是不是你配置问题或者什么的把,,反正我Proteus 8.11版本,重新导入了一下HEX文件,就可以正常运行了1 o2 ~! Q/ r. Q4 ?  |  }
  • TA的每日心情
    开心
    2023-6-2 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    : [8 j; H8 q! g" O2 Y" ]3 G有没有相应的流程图啊

    点评

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

    该用户从未签到

    5#
    发表于 2021-5-31 18:05 | 只看该作者
    Blah 发表于 2021-5-31 18:04( g6 ?0 w' I; @: o( ?3 K# k- T, y6 r
    有没有相应的流程图啊
    # V* g" \* @9 ~* p3 K
    就是的,有流程图吗  ?/ u9 K9 w+ o
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-10 03:45 , Processed in 0.156250 second(s), 28 queries , Gzip On.

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

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

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