找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 532|回复: 2
收起左侧

单片机超声波测距倒车雷达程序原理图PCB文件

[复制链接]
ID:962485 发表于 2024-3-6 10:09 | 显示全部楼层 |阅读模式
基于51单片机的智能倒车雷达系统,立创设计,导出成AD文件
根据距离结合蜂鸣器判断距离

电路原理图如下:
51hei.png 51hei.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<HC-SR04.h>
  3. #include<public.h>
  4. #include<oled.h>
  5. #include <intrins.h>
  6. u32 gAlarm;                                                        // 报警距离变量


  7. /*********************************************************/
  8. // 单片机内部EEPROM不使能
  9. /*********************************************************/
  10. void ISP_Disable()
  11. {
  12.         ISP_CONTR = 0;
  13.         ISP_ADDRH = 0;
  14.         ISP_ADDRL = 0;
  15. }


  16. /*********************************************************/
  17. // 从单片机内部EEPROM读一个字节,从0x2000地址开始
  18. /*********************************************************/
  19. unsigned char EEPROM_Read(unsigned int add)
  20. {
  21.         ISP_DATA  = 0x00;
  22.         ISP_CONTR = 0x83;
  23.         ISP_CMD   = 0x01;
  24.         ISP_ADDRH = (unsigned char)(add>>8);
  25.         ISP_ADDRL = (unsigned char)(add&0xff);
  26.         // 对STC89C51系列来说,每次要写入0x46,再写入0xB9,ISP/IAP才会生效
  27.         ISP_TRIG  = 0x46;          
  28.         ISP_TRIG  = 0xB9;
  29.         _nop_();
  30.         ISP_Disable();
  31.         return (ISP_DATA);
  32. }


  33. /*********************************************************/
  34. // 往单片机内部EEPROM写一个字节,从0x2000地址开始
  35. /*********************************************************/
  36. void EEPROM_Write(unsigned int add,unsigned char ch)
  37. {
  38.         ISP_CONTR = 0x83;
  39.         ISP_CMD   = 0x02;
  40.         ISP_ADDRH = (unsigned char)(add>>8);
  41.         ISP_ADDRL = (unsigned char)(add&0xff);
  42.         ISP_DATA  = ch;
  43.         ISP_TRIG  = 0x46;
  44.         ISP_TRIG  = 0xB9;
  45.         _nop_();
  46.         ISP_Disable();
  47. }


  48. /*********************************************************/
  49. // 擦除单片机内部EEPROM的一个扇区
  50. // 写8个扇区中随便一个的地址,便擦除该扇区,写入前要先擦除
  51. /*********************************************************/
  52. void Sector_Erase(unsigned int add)          
  53. {
  54.         ISP_CONTR = 0x83;
  55.         ISP_CMD   = 0x03;
  56.         ISP_ADDRH = (unsigned char)(add>>8);
  57.         ISP_ADDRL = (unsigned char)(add&0xff);
  58.         ISP_TRIG  = 0x46;
  59.         ISP_TRIG  = 0xB9;
  60.         _nop_();
  61.         ISP_Disable();
  62. }


  63. u32 GetDistance4(void)
  64. {
  65.         u32 ss;                                        // 用于记录测得的距离

  66.         TH0=0;
  67.         TL0=0;

  68.         Trig4_P=1;                                // 给超声波模块4一个开始脉冲
  69.         DelayMs(1);
  70.         Trig4_P=0;

  71.         while(!Echo4_P);        // 等待超声波模块4的返回脉冲
  72.         TR0=1;                                                // 启动定时器,开始计时
  73.         while(Echo4_P);                // 等待超声波模块4的返回脉冲结束
  74.         TR0=0;                                                // 停止定时器,停止计时

  75.         ss=((TH0*256+TL0)*0.034)/2+1;                // 距离cm=(时间us * 速度cm/us)/2
  76.         return ss;
  77. }

  78. void AlarmInit()    //报警初始化
  79. {
  80.         gAlarm=EEPROM_Read(0x2000)*100+EEPROM_Read(0x2001);                // 从EEPROM读取报警值

  81.         if((gAlarm==0)||(gAlarm>400))                        // 如果读取到的报警值异常(等于0或大于400则认为异常)
  82.         {
  83.                 gAlarm=25;                                                                                        // 重新赋值报警值为25
  84.         }
  85. }
  86. //报警
  87. void Beep (u32 distance)
  88. {
  89.                 if(distance > gAlarm)
  90.                 {
  91.         if(distance <= 1.5*gAlarm){
  92.                         Buzzer_P=1;
  93.                         DelayMs(50);
  94.                         Buzzer_P=0;
  95.                         DelayMs(50);
  96.                 }       
  97.                 else if((1.5*gAlarm< distance) && (distance <= 2*gAlarm)){
  98.                         Buzzer_P=1;
  99.                         DelayMs(200);
  100.                         Buzzer_P=0;
  101.                         DelayMs(150);
  102.                 }
  103.                 else if((2*gAlarm< distance) && (distance <= 3*gAlarm))
  104.                         {
  105.                         Buzzer_P=1;
  106.                         DelayMs(500);
  107.                         Buzzer_P=0;
  108.                         DelayMs(500);
  109.                 }
  110.                 else if(distance>3*gAlarm)
  111.                 {
  112.                         Buzzer_P=0;
  113.     }
  114.         }
  115.                 if(distance <= gAlarm)
  116.                 {Buzzer_P=1;}
  117. }

  118. //报警距离设置
  119. void KeyScanf()
  120. {
  121.         if(KeySet_P==0)                                        // 判断是否有按键按下
  122.         {
  123.                 OLED_Clear();
  124.                 OLED_ShowString(10,0,"Alarm Set",16);        // 第0行显示“   Alarm Set    ”                                                       
  125.                 OLED_ShowString(10,3,"Alarm=     CM",16);        // 第1行显示“  alarm=   cm   ”
  126.                 OLED_ShowNum(60,3,gAlarm,3,16);                                                        // 显示当前的报警值

  127.                 DelayMs(100);                                                                                        // 消除按键按下的抖动
  128.                 while(!KeySet_P);                                                                        // 等待按键释放
  129.                 DelayMs(100);                                                                                        // 消除按键松开的抖动               

  130.                 while(1)
  131.                 {               
  132.                         /* 报警值减的处理 */
  133.                         if(KeyDown_P==0)                                       
  134.                         {
  135.                                 if(gAlarm>2)                                                // 报警值大于2才能减1
  136.                                         gAlarm--;                                                        // 报警值减1
  137.                                 OLED_ShowNum(60,3,gAlarm,3,16);        // 刷新修改后的报警值
  138.                                 DelayMs(300);                                                // 延时
  139.                         }

  140.                         /* 报警值加的处理 */
  141.                         if(KeyUp_P==0)                                       
  142.                         {
  143.                                 if(gAlarm<400)                                        // 报警值小于400才能加1
  144.                                         gAlarm++;                                                        // 报警值加1
  145.                                 OLED_ShowNum(60,3,gAlarm,3,16);        // 刷新修改后的报警值
  146.                                 DelayMs(300);                                                // 延时
  147.                         }
  148.                        
  149.                         /* 退出报警值设置 */
  150.                         if(KeySet_P==0)                                       
  151.                         {
  152.                                 OLED_Clear();
  153.                                 OLED_ShowString(10,0,"Set Done!",16);
  154.                                 break;                                                                        // 退出while循环
  155.                         }       
  156.                 }
  157.                                     // 液晶恢复测量到测量界面
  158.                 DelayMs(100);                                                          // 消除按键按下的抖动
  159.                 while(!KeySet_P);                                                // 等待按键释放
  160.                 DelayMs(100);                                                          // 消除按键松开的抖动               

  161.                 Sector_Erase(0x2000);                                // 保存报警距离
  162.                 EEPROM_Write(0x2000,gAlarm/100);
  163.                 EEPROM_Write(0x2001,gAlarm%100);               
  164.         }       
  165. }
复制代码

原理图PCB: Altium_super sonic_2024-03-06.zip (49.94 KB, 下载次数: 10)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:433219 发表于 2024-3-13 14:51 | 显示全部楼层
用的是超声波模块吧
回复

使用道具 举报

ID:962485 发表于 2024-3-17 22:26 | 显示全部楼层
wkman 发表于 2024-3-13 14:51
用的是超声波模块吧

对的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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