標(biāo)題: 51單片機(jī)超聲波測(cè)距倒車(chē)?yán)走_(dá)Proteus仿真+源代碼 [打印本頁(yè)]

作者: wqian123    時(shí)間: 2020-11-22 09:25
標(biāo)題: 51單片機(jī)超聲波測(cè)距倒車(chē)?yán)走_(dá)Proteus仿真+源代碼
1) 基本任務(wù)
(1) 當(dāng)車(chē)距(HC-SR04 超聲波測(cè)距的位置)離障礙物小于 1 米,報(bào)警器響起, 發(fā)出一定
頻率的“滴滴” 聲音, 報(bào)警指示燈閃爍。
(2) LCD1602 液晶屏顯示超聲波模塊安裝位置與障礙物之間的距離。
2) 擴(kuò)展任務(wù):
(1) 隨著車(chē)距與障礙物的距離的縮小,報(bào)警器聲音越來(lái)越尖銳急促(聲音頻率越來(lái)越高)。
(2) 隨著車(chē)距與障礙物的距離的縮小, 報(bào)警指示燈閃爍頻率增加。
(3) 按鍵調(diào)整報(bào)警門(mén)限距離, 當(dāng)車(chē)距離障礙物小于該值(默認(rèn)值為 1 米),聲音報(bào)警。
(4) LCD1602 第一行顯示超聲波模塊安裝位置與障礙物之間的距離;第二行實(shí)時(shí)顯示按
鍵所調(diào)整的報(bào)警門(mén)限距離。  

倒車(chē)?yán)走_(dá)仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

倒車(chē)?yán)走_(dá)的單片機(jī)源程序如下:
  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;  //定時(shí)器溢出中斷
  22. uint time=0;        //定時(shí)器定時(shí)時(shí)間
  23. uchar one_final=0;   //一次測(cè)量完成
  24. uint distance=0.0,set_dis=100;   //距離和設(shè)定報(bào)警距離

  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ā)  定時(shí)器0加門(mén)控位 高電平開(kāi)啟
  33.         TMOD=0x09;  //16位 TR0=1; INT0=1; 開(kāi)啟
  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) //測(cè)量值小于下限
  110.                 {
  111.                         juli[0]='-';
  112.                         juli[2]='-';
  113.                         juli[3]='-';
  114.                 }
  115.         else if(distance>500)        //測(cè)量值大于上限
  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);  //顯示測(cè)距
  132.         LCD_Write_String(5,0,zifu);   //顯示distance
  133.         LCD_Write_String(11,1,set_juli); //顯示報(bào)警距離
  134. }


  135. void button_choose()
  136. {
  137.         uint k,e,xs;   //e 控制個(gè)性化顯示 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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

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


作者: 51hei團(tuán)團(tuán)    時(shí)間: 2020-11-22 16:17
好資料,51黑有你更精彩!!!
作者: GEYI123546    時(shí)間: 2021-6-12 15:19
樓主,仿真沒(méi)有反應(yīng)
作者: 51hei團(tuán)團(tuán)    時(shí)間: 2021-6-12 16:07
GEYI123546 發(fā)表于 2021-6-12 15:19
樓主,仿真沒(méi)有反應(yīng)

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

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

51hei.gif

作者: 071ya    時(shí)間: 2021-10-16 22:51
你好,請(qǐng)問(wèn)為什么我把顯示的位置改成第一行0位后就出現(xiàn)了這種情況?

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

E6E45CF41617F9ED8669BE19F8E69F8B.jpg

作者: 噶實(shí)踐活動(dòng)    時(shí)間: 2021-11-19 00:24
那超聲波測(cè)距和測(cè)速的原理圖是不是一樣的呢
作者: 小碩314    時(shí)間: 2023-11-6 15:51
proteus 8 打開(kāi)沒(méi)有顯示,改天換個(gè)版本試下吧

作者: Eren0528    時(shí)間: 2024-6-7 16:16
好資料,51黑有你更精彩!!!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1