找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3262|回复: 1
打印 上一主题 下一主题
收起左侧

单片机超声波测距+行人检测系统电路原理图PCB文件与源码

[复制链接]
跳转到指定楼层
楼主
超声波测距 + 行人检测系统电路原理图如下:


Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


元件清单:




单片机源程序如下:
  1. #include "reg52.h"
  2. #include "18b20.h"
  3. #include "delay.h"
  4. #include "math.h"
  5. #include "stdio.h"
  6. #include "lcd.h"

  7. bit ReadTemFlag=0; //定义读时间标志
  8. bit ViewTemFlag=0; //定义读时间标志
  9. bit PeopleFlag=0;//定义行人标志
  10. uint time=0;
  11. uchar DisdisData[];

  12. sbit War1=P3^2;
  13. sbit Beep=P3^7;
  14. sbit War=P1;

  15. sbit IRIG=P2^0;//超声波接口
  16. sbit ECHO=P2^1;//超声波接口

  17. void TIMInit()
  18. {
  19.         TMOD|=0x11;          //定时计数0、1,工作方式为1,即16位定时
  20.         TH0=0x00;
  21.         TL0=0x00;
  22.         ET0=1;           //定时计数器中断0允许位
  23.         ET1=1;           //定时计数器中断1允许位
  24.         TR1=1;          //开放定时计数器中断1
  25.         EA=1;          //总开关开启


  26. }


  27. void main()
  28. {
  29.         int temp;
  30.         float temperature;
  31.         char displaytemp[16];        //定义显示区域临时存储数组
  32.         float s,a;

  33.         DS18b20Init();                   //温度初始化
  34.         LCD1602Init();                   //LCD初始化
  35.         LCD1602Char();         //写入自定义字符

  36.         while(1)
  37.         {
  38.                 if(ReadTemFlag==1)
  39.                 {
  40.                           ReadTemFlag=0;
  41.                           temp=DS18b20sj();
  42.                           if(temp<0)
  43.                           {
  44.                                       temp=temp-1;
  45.                                           temp=~temp;
  46.                                         temperature=(float)temp*0.0625;
  47.                                         sprintf(displaytemp,"-TEMP  % 7.3f",temperature);//        把温度值放入displaytemp       
  48.                           }
  49.                           else
  50.                           {                          
  51.                                           temperature=(float)temp*0.0625;
  52.                                           sprintf(displaytemp,"TEMP  % 7.3f",temperature);//把温度值放入displaytemp
  53.                           }
  54.                 }
  55.       
  56.             if(ViewTemFlag==1)
  57.                 {
  58.                         ViewTemFlag=0;
  59.                         War1=0;//行人检测灯灭
  60.                         Beep=0;//蜂鸣器关闭
  61.                         War=0xff;//关闭所有指示灯
  62.                         LCD1602WriteChar(13,1,0x01); //点亮温度右上角的一个小点
  63.                         LCD1602WriteChar(14,1,'C');         //显示温度单位
  64.                         LCD1602WriteChar(15,1,' ');  //空格
  65.                         LCD1602SWritetring(0,1,displaytemp); //第二行显示温度
  66.                 }
  67.                 IRIG=1;
  68.                 Delayus(3);        //延时10us
  69.                 while(!ECHO);//当ECHO为0时等待
  70.                 TR0=1;
  71.                 while(ECHO);//等待ECHO为低电平
  72.                 TR0=0;
  73.                 time=TH0*256+TL0;//*256是左移八位的意思,计数为16位,这是算出的总时间,但要乘以12/11.0592
  74.                 TH0=0;                         //清零
  75.                 TL0=0;                        //清零
  76.                 temperature=(int)temperature;//取整数有利于数据稳定
  77.                 a=(331.5+0.607*temperature);//声速与温度的函数关系
  78. /* s=time*a/2 ;time的单位是s,a的单位是m/s,如果time的单位是us,a的单位仍旧是m/s,s的单位是cm
  79. 那么s*10^-2=time*10^-6*a/2
  80. 化成s=time*10^-4*a/2=time*a/20000 和 S=(time*a/200)/100是一样的  */
  81.                 s=(time*a*(12/11.0592))/20000; //单位为厘米 ,这里原先s的单位是米,time的单位是us
  82.                 sprintf(DisdisData,"Dis=  % 7.3f cm",s);
  83.                 LCD1602SWritetring(0,0,DisdisData);          //在液晶屏显示出来

  84.                 if(PeopleFlag==1)
  85.                 {
  86.                         PeopleFlag=0;
  87.                         if(s>200)
  88.                         {
  89.                                 Beep=1;
  90.                                 War=0xff;
  91.                         }
  92.                         else if(s>150)
  93.                         {
  94.                             War=0xfe;
  95.                                 LCD1602SWritetring(0,1,"Waring1:<200CM R");//距离小于200cm大于150cm,准备随时停车
  96.                                 Beep=0;
  97.                                 Delayms(255);
  98.                                 Delayms(255);
  99.                                 Delayms(255);
  100.                                 Delayms(255);
  101.                                 Delayms(255);
  102.                                 Beep=1;
  103.                         }
  104.                         else if(s>100)
  105.                         {
  106.                                 War=0xf0;
  107.                                 LCD1602SWritetring(0,1,"Waring2:<150CM L");//距离小于150cm大于100cm,减速慢行
  108.                                 Beep=0;
  109.                                 Delayms(255);
  110.                                 Delayms(255);
  111.                                 Delayms(255);
  112.                                 Delayms(255);
  113.                                 Delayms(255);
  114.                                 Beep=1;
  115.                         }
  116.                         else if(s>40)
  117.                         {
  118.                                 War=0x90;
  119.                                 LCD1602SWritetring(0,1,"Waring3:<100CM A");//距离小于100cm大于40cm,警戒区
  120.                                 Beep=0;
  121.                                 Delayms(255);
  122.                                 Delayms(255);
  123.                                 Delayms(255);
  124.                                 Delayms(255);
  125.                                 Delayms(255);
  126.                                 Beep=1;
  127.                         }
  128.                         else if(s>20)
  129.                         {
  130.                                 War=0x00;
  131.                                 LCD1602SWritetring(0,1,"Waring4:<40CM S");//距离小于40cm,停止
  132.                                 Beep=0;
  133.                                 Delayms(255);
  134.                                 Delayms(255);
  135.                                 Delayms(255);
  136.                                 Delayms(255);
  137.                                 Delayms(255);
  138.                                 Beep=1;
  139.                         }
  140.                         else if(s<20)
  141.                         {
  142.                                 War=0xff;
  143.                                 LCD1602SWritetring(0,1,"Waring3:<20CM L");//距离小于20cm,危险紧停
  144.                                 Beep=0;
  145.                                 Delayms(255);
  146.                                 Delayms(255);
  147.                                 Delayms(255);
  148.                                 Delayms(255);
  149.                                 Delayms(255);
  150.                                 Beep=1;
  151.                         }
  152.                 }
  153.         }
  154. }

  155. //定时器0中断服务程序
  156. void Timer0_isr(void) interrupt 1
  157. {
  158.         ECHO=0;
  159. }
  160. //定时器1中断服务程序
  161. void Timer1_isr(void) interrupt 3
  162. {
  163.         static unsigned int num;
  164.         static unsigned int num1;
  165.         TH1=(65536-2000)/256;                  //重新赋值 2ms
  166.         TL1=(65536-2000)%256;
  167.        
  168.         num++;
  169.         if(num==300)        
  170.         {
  171.                 num=0;
  172.                 num1++;
  173.                 ReadTemFlag=1; //读标志位置1
  174.                 if(num1==30)
  175.                 {
  176.                     num1=0;
  177.                         ViewTemFlag=1; //显示标志位置1
  178.                         PeopleFlag=0;
  179.                 }
  180.         }
  181. }

  182. void exter0(void) interrupt 2
  183. {
  184. //由于热释电是当有人时为高电平,因此当有人进入时是一个上升沿,而中断跳沿触发默认为下降沿,因此在程序中取反后几位上升沿
  185. //有行人时将PeopleFlag置位,并开启行人指示灯,蜂鸣器长鸣,开启所有指示灯进行提示
  186.         if(!INT1)
  187.         {               
  188.                 LCD1602SWritetring(0,1,"Waring:People D");//Danger即刻停止,危险
  189.                 War1=0;        //行人指示灯亮
  190.                 Beep=0;        //蜂鸣器长鸣
  191.                 War=0x00;//开启所有指示灯
  192.                 PeopleFlag=1;
  193. ……………………

  194. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
多功能超声波测距.zip (457.61 KB, 下载次数: 49)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:323078 发表于 2018-5-16 10:14 | 只看该作者
PCB板的尺寸是多少的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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