找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8453|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

51單片機超聲波測距倒車雷達Proteus仿真+源代碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:367685 發(fā)表于 2020-11-22 09:25 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
1) 基本任務(wù)
(1) 當車距(HC-SR04 超聲波測距的位置)離障礙物小于 1 米,報警器響起, 發(fā)出一定
頻率的“滴滴” 聲音, 報警指示燈閃爍。
(2) LCD1602 液晶屏顯示超聲波模塊安裝位置與障礙物之間的距離。
2) 擴展任務(wù):
(1) 隨著車距與障礙物的距離的縮小,報警器聲音越來越尖銳急促(聲音頻率越來越高)。
(2) 隨著車距與障礙物的距離的縮小, 報警指示燈閃爍頻率增加。
(3) 按鍵調(diào)整報警門限距離, 當車距離障礙物小于該值(默認值為 1 米),聲音報警。
(4) LCD1602 第一行顯示超聲波模塊安裝位置與障礙物之間的距離;第二行實時顯示按
鍵所調(diào)整的報警門限距離。  

倒車雷達仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

倒車雷達的單片機源程序如下:
  1. #include <REGX52.H>
  2. #include <stdio.h>
  3. #include "LCD.H"
  4. #include "delay.h"
  5. #define  uint unsigned int
  6. #define  uchar unsigned char        
  7.         
  8. //定義引腳
  9. sbit k1=P3^5;
  10. sbit k2=P3^6;
  11. sbit Trig=P2^5;   //trig 發(fā)射脈沖
  12. sbit Echo=P3^2;  //echo 接受脈沖
  13. sbit bg=P2^6;
  14. sbit beep=P3^3;  //beep
  15. sbit led=P1^2;
  16. //定義固定顯示
  17. uchar juli[5]={'A','.','A','A','m'};
  18. uchar set_juli[]={'A','.','A','A','m'};
  19. uchar zifu[]={'D','i','s',':'};           //Distance
  20. //定義全局變量
  21. uchar time0_flag=0;  //定時器溢出中斷
  22. uint time=0;        //定時器定時時間
  23. uchar one_final=0;   //一次測量完成
  24. uint distance=0.0,set_dis=100;   //距離和設(shè)定報警距離

  25. void display();
  26. void Trig_SR04();
  27. void button_choose();
  28. void judge_baojing();
  29. void main()
  30. {
  31.         
  32.         EA=1;       //外部中斷0下降沿觸發(fā)  定時器0加門控位 高電平開啟
  33.         TMOD=0x09;  //16位 TR0=1; INT0=1; 開啟
  34.         TR0=1;
  35.         EX0=1;
  36.         IT0=1;      //下降沿觸發(fā)
  37.         
  38.         TH0=0;
  39.         TL0=0;
  40.         init();     //1602初始化        
  41.         Trig_SR04();
  42.         while(1)
  43.         {
  44.                 if(one_final)   //一次完成后再次觸發(fā)
  45.                 {
  46.                         Trig_SR04();
  47.                         one_final=0;
  48.                 }
  49.                 judge_baojing();
  50.                 display();    //液晶顯示
  51.                 button_choose();  //按鍵調(diào)整
  52.         }
  53. }

  54. void INT0_hander() interrupt 0
  55. {
  56.         time = TH0*256+TH0;    //  time us
  57.         distance=time*0.0170;  //cm    34000cm*10e-6*time/2
  58.         one_final=1;
  59.         TH0=0;
  60.         TL0=0;
  61. }

  62. void Trig_SR04()  //仿真里是地脈沖觸發(fā)
  63. {
  64.         Trig=0;
  65.         Trig=1;
  66.         _nop_();
  67.         _nop_();
  68.         _nop_();
  69.         _nop_();
  70.         _nop_();
  71.         _nop_();
  72.         _nop_();
  73.         _nop_();
  74.         _nop_();
  75.         _nop_();
  76.         _nop_();
  77.         _nop_();
  78.         _nop_();
  79.         _nop_();
  80.         _nop_();
  81.         _nop_();
  82.         _nop_();
  83.         _nop_();
  84.         _nop_();
  85.         _nop_();
  86.         _nop_();
  87.         Trig=0;
  88. }


  89. void judge_baojing()
  90. {
  91.         uint time_baojing,i;
  92.         if(distance<set_dis)
  93.         {
  94.                         time_baojing=distance*10;
  95.                           for (i=0;i<time_baojing;i++)
  96.                           {
  97.                             DelayUs2x(100);
  98.                             beep=!beep;       //BEEP取反
  99.                           }
  100.                                 for (i=0;i<time_baojing;i++)
  101.                           {
  102.                                         led=~led;
  103.                                         DelayUs2x(time_baojing);
  104.                           }
  105.         }
  106. }
  107. void display()
  108. {
  109.         if(distance<5) //測量值小于下限
  110.                 {
  111.                         juli[0]='-';
  112.                         juli[2]='-';
  113.                         juli[3]='-';
  114.                 }
  115.         else if(distance>500)        //測量值大于上限
  116.                 {
  117.                         juli[0]='C';
  118.                         juli[2]='C';
  119.                         juli[3]='C';
  120.                 }
  121.         else
  122.         {
  123.                 juli[0]=distance/100+'0';
  124.                 juli[2]=distance/10%10+'0';
  125.                 juli[3]=distance%10+'0';
  126.         }
  127.         set_juli[0]=set_dis/100+'0';
  128.         set_juli[2]=set_dis/10%10+'0';
  129.         set_juli[3]=set_dis%10+'0';
  130.         
  131.         LCD_Write_String(11,0,juli);  //顯示測距
  132.         LCD_Write_String(5,0,zifu);   //顯示distance
  133.         LCD_Write_String(11,1,set_juli); //顯示報警距離
  134. }


  135. void button_choose()
  136. {
  137.         uint k,e,xs;   //e 控制個性化顯示 xs顯示周期
  138.         uchar a1,a2,a3,n=0,m=0,z=0;   //按鍵調(diào)整 a1,a2,a3調(diào)整設(shè)定距離的三位從高到低  nmz控制循環(huán)
  139.                 if(!k1)      //按鍵處理程序
  140.                 {
  141.                         EA=0;
  142.                         TR0=0;
  143.                   set_juli[0]='A';
  144.                         set_juli[1]='.';
  145.                         set_juli[2]='A';
  146.                         set_juli[3]='A';
  147.                         set_juli[4]='m';
  148.                         LCD_Write_String(11,1,set_juli);
  149.                         k=500;
  150.                   while(k)
  151.                         {
  152.                                  k--;
  153.                                 DelayMs(2);
  154.                         }
  155.                   set_juli[0]=set_dis/100+'0';
  156.                         set_juli[2]=set_dis/10%10+'0';
  157.                         set_juli[3]=set_dis%10+'0';
  158.                         LCD_Write_String(11,1,set_juli);
  159.                         a1=set_dis/100;
  160.                         a2=set_dis/10%10;
  161.                         a3=set_dis%10;
  162.                         
  163.                         
  164.                         //按鍵調(diào)整最小距離
  165.                         n=1;
  166.                   while(n)
  167.                         {
  168.                                 if(!k2)
  169.                                 {
  170.                                         while(!k2);
  171.                                         e=1;
  172.                                         xs=3;
  173.                                         a1+=1;
  174.                                         if(a1>5)
  175.                                         a1=0;
  176.                                           juli[0]=a1+'0';
  177.                                 }

  178.                                 if (e==1)
  179.                                 {
  180.                                         xs++;
  181.                                            juli[0]=a1+'0';
  182.                                           if(xs>6)
  183.                                           {
  184.                                     xs=0;
  185.                                                                         e=0;
  186.                                           }
  187.                                 }
  188.                                 else
  189.                                 {
  190.                                         juli[0]=' ';
  191.                                         xs++;
  192.                                         if(xs>3)
  193.                                         {
  194.                                                 xs=0;
  195.                                                 e=1;
  196.                                         }
  197.                                 }
  198.                                 LCD_Write_String(11,1,juli);
  199.                                 if(!k1)
  200.                                 {
  201.                                         while(!k1);
  202.                                            juli[0]=a1+'0';
  203.                                         m=1;
  204.                                         while(m)
  205.                                         {
  206.                                                 if(!k2)
  207.                                                 {
  208.                                                         while(!k2);
  209.                                                         e=1;
  210.                                                         xs=3;
  211.                                                         a2+=1;
  212.                                                         if(a2>9)
  213.                                                         a2=0;
  214.                                                           juli[2]=a2+'0';
  215.                                                         LCD_Write_String(11,1,juli);
  216.                                                 }

  217.                                                 if (e==1)
  218.                                                 {
  219.                                                         xs++;
  220.                                                            juli[2]=a2+'0';
  221.                                                           if(xs>6)
  222.                                                           {
  223.                                                     xs=0;
  224.                                                                                         e=0;
  225.                                                           }
  226.                                                 }
  227.                                                 else
  228.                                                 {
  229.                                                         juli[2]=' ';
  230.                                                         xs++;
  231.                                                         if(xs>3)
  232.                                                         {
  233.                                                                 xs=0;
  234.                                                                 e=1;
  235.                                                         }
  236.                                                 }
  237.                                                 LCD_Write_String(11,1,juli);
  238.                                                 
  239.                                                 if(!k1)
  240.                                                 {
  241.                                                         while(!k1);
  242.                                                         juli[2]=a2+'0';
  243.                                                         z=1;
  244.                                                         while(z)
  245.                                                         {
  246.                                                                 if(!k2)
  247.                                                                 {
  248.                                                                         while(!k2);
  249.                                                                         e=1;
  250.                                                                         xs=3;
  251.                                                                         a3+=1;
  252.                                                                         if(a3>9)
  253.                                                   a3=0;
  254.                                                                   juli[3]=a3+'0';
  255.                                                                         LCD_Write_String(11,1,juli);
  256.                                                                 }

  257.                                                                 if (e==1)
  258.                                                                 {
  259.                                                                         xs++;
  260.                                                                            juli[3]=a3+'0';
  261.                                                                           if(xs>6)
  262.                                                                           {
  263.                                                     xs=0;
  264. ……………………

  265. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

附件如下:帶仿真和keil源碼 51超聲波測距報警.zip (113.86 KB, 下載次數(shù): 382)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:328014 發(fā)表于 2020-11-22 16:17 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

板凳
ID:935889 發(fā)表于 2021-6-12 15:19 | 只看該作者
樓主,仿真沒有反應(yīng)
回復(fù)

使用道具 舉報

地板
ID:328014 發(fā)表于 2021-6-12 16:07 | 只看該作者
GEYI123546 發(fā)表于 2021-6-12 15:19
樓主,仿真沒有反應(yīng)

用Proteus7.5打開才有反應(yīng),如圖

51hei.gif (123.88 KB, 下載次數(shù): 118)

51hei.gif
回復(fù)

使用道具 舉報

5#
ID:648123 發(fā)表于 2021-10-16 22:51 | 只看該作者
你好,請問為什么我把顯示的位置改成第一行0位后就出現(xiàn)了這種情況?

E6E45CF41617F9ED8669BE19F8E69F8B.jpg (1.21 MB, 下載次數(shù): 127)

E6E45CF41617F9ED8669BE19F8E69F8B.jpg
回復(fù)

使用道具 舉報

6#
ID:982171 發(fā)表于 2021-11-19 00:24 來自手機 | 只看該作者
那超聲波測距和測速的原理圖是不是一樣的呢
回復(fù)

使用道具 舉報

7#
ID:965040 發(fā)表于 2023-11-6 15:51 | 只看該作者
proteus 8 打開沒有顯示,改天換個版本試下吧
回復(fù)

使用道具 舉報

8#
ID:1124222 發(fā)表于 2024-6-7 16:16 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表