找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我的倒车雷达,超声波测距(含源码,工程图)

[复制链接]
跳转到指定楼层
楼主
倒车雷达,超声波测速。
内喊源码和工程图,通俗易懂。


所有资料下载:
超声波带报警 原理图PCB图.doc (61.5 KB, 下载次数: 58)
程序.doc (41.5 KB, 下载次数: 42)

下面是部分程序预览:
  1. #include<reg51.h>
  2. #include<math.h>
  3. /*定义数据类型*/
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. /*定义系统常数*/
  7. long int  time;      /*    时间   */
  8. bit   CLflag;   /*  测量标志  */
  9. char  cshu;       /* 串数 */
  10. #define  T12us   (256-12)    /*定时器设初值   T=(256-T12us)*12/12MHZ  */
  11. sbit VOLCK=P1^0;    /* 发射 */
  12. //接收从P3^2口输入,采用外部中断方式

  13. sbit S1=P2^1;
  14. sbit S2=P2^3;
  15. sbit S3=P2^5;
  16. sbit S4=P2^7;

  17. sbit alam=P3^7;                                        //报警

  18. unsigned char  number[5];      /* 用于存放距离显示数据 */
  19. unsigned char  temp_number[5];

  20. unsigned char fr_alam;      //报警频率控制计数
  21. unsigned char icont;                //距离计数

  22. char  code table[] ={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x45,0xDF,0xD7}; //数字0-9的编码
  23. //{0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
  24.                 /* 码表 0,1,2,3,4,5,6,7,8,9 */


  25. /*    通用延时子程序  */
  26. void delay( int j)
  27. {   
  28.         int i;   
  29.         for(i=0;i<j;i++);
  30. }

  31. void display(void)     /*  显示5位数据   */
  32. {        
  33.         P0=~table[number[4]];
  34.         S1=0;
  35.         delay(200);
  36.         S1=1;
  37.         P0=~(table[number[3]]|0x20);
  38.         S2=0;
  39.         delay(200);
  40.         S2=1;
  41.         P0=~table[number[2]];
  42.         S3=0;
  43.         delay(200);
  44.         S3=1;
  45.         P0=~table[number[1]];
  46.         S4=0;
  47.         delay(200);
  48.         S4=1;
  49. }

  50. /*  初始化定时器,CTC0、CTC1用于定时     */
  51. void   init_CTC(void )
  52. {
  53.         TMOD = 0x21;      /*  设CTC1工作于模式2 */
  54.         ET0 = 0;              /* 不允许CTC0中断  */
  55. }

  56. void init_INT( )    /*  外部中断初始化为高优先级,并开中断  */
  57. {
  58.         IP=0x01;   /*  置外部中断INT0优先级为高   */
  59.         TCON=0;   /*  设置外部中断0的中断方式为电平触发  */
  60. }


  61. //=========距离与频率之间的转化==============
  62. void Distance_Frequency(void)
  63. {
  64.         //以下语句用于计算距离与报警的频率大小
  65.         if(number[3]>0)                //表示距离大于1米时,不报警
  66.                 icont=0;
  67.         else                                //否则
  68.         {
  69.                 if(number[2]>0)                //小于1米时,但分米大于0时,报警频率与分米的数据成正比
  70.                 {
  71.                     switch(number[2])
  72.                         {
  73.                                 case 9: icont=9; break;
  74.                                 case 8: icont=8; break;
  75.                                 case 7: icont=7; break;
  76.                                 case 6: icont=6; break;
  77.                                 case 5: icont=5; break;
  78.                                 case 4: icont=4; break;
  79.                                 case 3: icont=3; break;
  80.                                 case 2: icont=2; break;
  81.                                 case 1: icont=1; break;
  82.                                 default: break;
  83.                         }
  84.                 }
  85.                 else                                         //距离只在厘米时,高频率输出报警
  86.                 {
  87.                         if(number[1]>0)
  88.                                 icont=1;
  89.                         else
  90.                                 icont=0;
  91.                 }
  92.         }
  93. }

  94. void Timetojuli(void)   /*   将测量的时间转换为距离 */
  95. {
  96.         long  i;
  97.         i=(long)time*170;
  98.         temp_number[4]=i/10000000;     /* 十米  */
  99.         i=i-temp_number[4]*10000000;
  100.         temp_number[3]=i/1000000;   /*  米  */
  101.         i=i-temp_number[3]*1000000;
  102.         temp_number[2]=i/100000;    /*  分米  */
  103.         i=i-temp_number[2]*100000;
  104.         temp_number[1]=i/10000;     /*  厘米  */
  105.         i=i-(long)temp_number[1]*10000;
  106.         temp_number[0]=i/1000;     /*  毫米  */
  107.         //以下用于控制是否测到距离,如全为0,表明没有测到距离
  108.         if((temp_number[4]!=0)||(temp_number[3]!=0)||(temp_number[2]!=0)||(temp_number[1]!=0))  
  109.         {
  110.                 number[4]=temp_number[4];   //更新一次数据
  111.                 number[3]=temp_number[3];
  112.                 number[2]=temp_number[2];
  113.                 number[1]=temp_number[1];
  114.                 number[0]=temp_number[0];

  115.                 Distance_Frequency();                //转化一次
  116.         }
  117. }


  118. void serve_INT0( ) interrupt 0
  119. {
  120.         /*  外部中断0,用于检测接收信号  */
  121.         TR0=0;       /*  关闭定时器0 */
  122.         EX0=0;       /* 关中断  */
  123.         time=(long)TL0;
  124.         time+=(long)TH0*256;
  125.         Timetojuli();                                        //更新一次数据
  126.         CLflag=1;
  127.         TH0=0;
  128.         TL0=0;
  129. }

  130. void CTC0_INT (  )   interrupt  1
  131. {
  132.         TR0=0;
  133.         ET0=0;
  134. }


  135. /*  CTC1中断服务程序,12.5us 中断一次,用于发射  */
  136. void CTC1_INT (  )   interrupt  3
  137. {
  138.         VOLCK=~VOLCK;
  139.         cshu++;
  140. }



  141. /*主程序*/
  142. void main()
  143. {
  144.         init_CTC(  );                      /*   初始化定时器 */
  145.         init_INT(  );                      /* 初始化外部中断  */
  146.         CLflag=1;                         /*    测量标志    */
  147.         cshu=0;                          /*  传数 */
  148.         IE=0x80;                           /* 开中断  */
  149.         ET1=1;       ET0=1;
  150.         TR1=0;       TR0=0;
  151.         TL1=T12us;   TH1=T12us;
  152.         while(1)
  153.         {       
  154.                 CLflag=0;
  155.                 cshu=0;
  156.                 EX0=0;
  157.                 TH1=T12us;
  158.                 TL1=T12us;
  159.                 TL0 = 0;     TH0 = 0;            /*  定时器0的初始时间 */
  160.                 VOLCK=0;
  161.                 TR1=1;                                        /*  启动定时器1,发送信号  */
  162.                 while(cshu<20) ;                    /*  发10个脉冲串 */                        
  163.                 TR1=0;
  164.                 TR0=1;                                   /*  启动定时器0,开始记时  */
  165.                 EX0=1;
  166.                 display();                                        //调用显示
  167.         //        Distance_Frequency();                //调用距离频率转化程序
  168.                 fr_alam++;                                        //程序执行次数加1        用于控制报警频率与距离成正比
  169.                 if(icont>0)                                        //表示距离控制位达到报警时
  170.                 {
  171.                         if(fr_alam>=icont)               
  172.                         {
  173.                                 fr_alam=0;
  174.                                 alam=~alam;                        //蜂鸣器取反一次,即响一声
  175.                         }
  176.                 }
  177.                 else                                                //不报警时
  178.                 {
  179.                         alam=1;
  180.                 }
  181.         }
  182. }

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

使用道具 举报

沙发
ID:233124 发表于 2017-9-21 11:34 | 只看该作者
没有仿真的原理图呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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