久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1711|回復: 2
打印 上一主題 下一主題
收起左側

單片機超聲波測距倒車雷達程序原理圖PCB文件

[復制鏈接]
跳轉到指定樓層
樓主
基于51單片機的智能倒車雷達系統,立創設計,導出成AD文件
根據距離結合蜂鳴器判斷距離

電路原理圖如下:


單片機源程序如下:
  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, 下載次數: 21)
代碼: supersonic-程序.zip (87.99 KB, 下載次數: 15)
仿真: 無



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区免费观看 | 欧美成人免费在线视频 | a在线视频 | 午夜精品一区二区三区在线视 | 日韩电影免费在线观看中文字幕 | 高清色视频 | 色综久久| 操亚洲 | 国产东北一级毛片 | 欧美一极视频 | 97国产精品| 久久久久成人精品 | 黄色视频a级毛片 | 国产男女精品 | 夜夜撸av| 国产综合久久 | av大全在线观看 | 久久久91精品国产一区二区三区 | 精品国产乱码久久久久久影片 | 国产美女免费视频 | 欧州一区二区三区 | 日本在线视频一区二区 | 国产一区二区自拍 | 亚洲精品粉嫩美女一区 | 国产美女一区二区三区 | 亚洲一区 中文字幕 | 在线播放日韩 | 久久久久国产 | www.亚洲一区 | 国产精品久久久久久久久免费丝袜 | 久久精品一级 | 日韩一级免费电影 | 亚洲男人天堂 | 天堂久久久久久久 | 国产亚韩| 久久久久久免费看 | 婷婷激情综合 | 成人精品毛片国产亚洲av十九禁 | 国产日韩亚洲欧美 | 久久久久久久久久久福利观看 | 久久久久国产一级毛片高清网站 |