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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的超聲波測距程序 Proteus仿真圖

[復制鏈接]
跳轉到指定樓層
樓主
可以設定超聲波測距的報警范圍,顯示超聲波距離
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1.     #include <REGX52.H>
  2.     #include "LCD1602.h"                //LCD1602頭文件
  3.     #include "Delay.h"                        //延時
  4.     #include "Timer0.h"                        //定時0頭文件
  5.     #include "Timer1.h"                        //定時1頭文件

  6.     //定義各種參數
  7.     unsigned short Distance;
  8.     unsigned char i;
  9.     unsigned long DisH,DisL;
  10.     unsigned int T0Count;
  11.     unsigned char Time;
  12.     unsigned int a,b;
  13.     sbit Trig = P3^6;                                //定義兩個超聲波管腳
  14.     sbit Echo = P3^7;

  15.     sbit  set = P3^0;                                //切換模式
  16.     sbit up = P3^1;  //加
  17.     sbit down = P3^2; //減

  18.     sbit  yled = P2^1;                                
  19.     sbit gled = P2^2;  
  20.     sbit rled = P2^3;
  21.     sbit beep = P3^5;

  22.     unsigned char Flag;//測量標志位0.5秒觸發一次
  23.     unsigned char nodis;//超出量程

  24.     unsigned int mode;
  25.     unsigned int change;
  26.     unsigned int waring;
  27.     unsigned int upper = 120;//上限
  28.     unsigned int lower = 50;//下限

  29.     //超聲波初始化
  30.     void Super_Wave_Init()
  31.     {
  32.             Trig = 0;
  33.             Echo = 0;
  34.     }





  35.     //

  36.     /**************************************************
  37.     距離測量
  38.     **************************************************/
  39.     void Measure(void)
  40.     {
  41.         unsigned char Err; //錯誤標記
  42.         unsigned long distance,pTime;//距離,時間變量
  43.         Err=0;
  44.         Trig=1;     //TR保持10us高電平觸發模塊測距
  45.         Delay10Us();
  46.         Trig=0;
  47.         TH0=0;
  48.         TL0=0;
  49.         while(Echo==0);//等待ECHO變為高
  50.         TR0=1;       //啟動定時器,外部高電平觸發
  51.         while(Echo==1)//等待超聲波回應獲超時
  52.         {
  53.             pTime=TH0*256+TL0;
  54.             if(pTime>40000)//時間超時
  55.             {
  56.                 Err=1;
  57.                 break;
  58.             }
  59.         }
  60.         TR0=0;//關閉定時器
  61.         pTime=TH0*256+TL0; //獲取時間
  62.                   
  63.         if(Err==0)
  64.         {
  65.             
  66.             distance=(pTime*173)/1000;//;pTime*346/1000000/2=pTime*0.0173 仿真的環境溫度為25度346m/s
  67.                                     DisH = distance/10;
  68.                                     DisL = distance%10;
  69.                   
  70.                                     if((DisH>170)||(DisH<2))//量程170cm,超過量程顯示0;測量距離小?cm,HCSR04最小測算2cm
  71.             {
  72.                Err=1;   
  73.                                                    
  74.             }
  75.                                     else if(DisH>upper)
  76.             {
  77.                gled = 0;
  78.                                                     yled = 1;
  79.                                             rled = 1;
  80.                                             beep = 1;
  81.             }
  82.                                     else if((DisH>=lower)&&(DisH<=upper))
  83.             {
  84.                gled = 1;
  85.                                             yled = 0;
  86.                                             rled = 1;
  87.                                             if(waring == 0)
  88.                                             {
  89.                                                     beep = 1;
  90.                                             }
  91.                                             else
  92.                                             {
  93.                                                     beep = 0;
  94.                                             }
  95.             }
  96.                                     else if(DisH<lower)
  97.             {
  98.                                                    
  99.                gled = 1;
  100.                                                     yled = 1;
  101.                                                     rled = 0;
  102.                                             beep = 0;
  103.                                             if(waring == 0)
  104.                                             {
  105.                                                     LCD_ShowString(2,1,"warning");
  106.                                             }
  107.                                             else
  108.                                             {
  109.                                                             LCD_ShowString(2,1,"                 ");
  110.                                             }
  111.                                           
  112.             }
  113.                                     
  114.                                     
  115.                     }
  116.                     if(Err == 1)
  117.                             {
  118.                                     nodis = 1;
  119.                                             gled = 1;
  120.                                                     yled = 1;
  121.                                             rled = 1;
  122.                                             beep = 1;                        
  123.                     }
  124.             }

  125.     void outkey()
  126.     {
  127.             if(set == 0)
  128.             {
  129.                             //Delay(8);
  130.                     mode++;
  131.                     change = 1;
  132.                     if(mode>2)
  133.                     {
  134.                             mode = 0;
  135.                     }
  136.                     while(set == 0);
  137.             }
  138.             switch(mode)
  139.             {
  140.                     case 0://正常讀數模式
  141.                     if(change == 1)
  142.                     {
  143.                             change = 0;
  144.                   
  145.                     LCD_ShowString(1,1,"distance:");
  146.                     LCD_ShowString(1,15,"cm");
  147.                     LCD_ShowString(1,13,".");
  148.                     LCD_ShowString(2,1,"                 ");
  149.                     }
  150.                             if(Flag)//每500ms測量一次
  151.          {
  152.              Flag=0;
  153.              Measure();//測量
  154.                              if(nodis == 0)
  155.                              {
  156.                                     LCD_ShowNum(1,10,DisH,3);
  157.                                     LCD_ShowNum(1,14,DisL,1);
  158.                              }
  159.                              else
  160.                              {
  161.                                             nodis = 0;
  162.                                      LCD_ShowString(1,10,"-");
  163.                                             LCD_ShowString(1,11,"-");
  164.                                             LCD_ShowString(1,12,"-");
  165.                                             LCD_ShowString(1,14,"-");
  166.                              }                        
  167.           }
  168.                      break;
  169.                     case 1://改下限
  170.                             if(change == 1)
  171.                     {
  172.                             change = 0;
  173.                             LCD_ShowString(2,1,"upper:");
  174.                             LCD_ShowNum(2,7,upper,3);
  175.                             LCD_ShowString(2,10,"       ");
  176.                             LCD_ShowString(1,1,"lower:");
  177.                             LCD_ShowNum(1,7,lower,3);
  178.                             LCD_ShowString(1,10,"       ");
  179.                            
  180.                     }
  181.                             if(up == 0)
  182.                             {
  183.                                     lower++;
  184.                                     LCD_ShowNum(1,7,lower,3);
  185.                                     while(up == 0);
  186.                             }
  187.                             if(down == 0)
  188.                             {
  189.                                     lower--;
  190.                                     LCD_ShowNum(1,7,lower,3);
  191.                                     while(down == 0);
  192.                             }
  193.                             break;
  194.                             case 2://改上限
  195.                             if(change == 1)
  196.                     {
  197.                             change = 0;
  198.                             LCD_ShowString(2,1,"upper:");
  199.                             LCD_ShowNum(2,7,upper,3);
  200.                             LCD_ShowString(2,10,"       ");
  201.                             LCD_ShowString(1,1,"lower:");
  202.                             LCD_ShowNum(1,7,lower,3);
  203.                             LCD_ShowString(1,10,"       ");
  204.                            
  205.                     }
  206.                             if(up == 0)
  207.                             {
  208.                                     upper++;
  209.                                     LCD_ShowNum(2,7,upper,3);
  210.                                     while(up == 0);
  211.                             }
  212.                             if(down == 0)
  213.                             {
  214.                                     upper--;
  215.                                     LCD_ShowNum(2,7,upper,3);
  216.                                     while(down == 0);
  217.                             }
  218.                             break;
  219.                             default:break;
  220.                            
  221.             }

  222.     }

  223.     //主函數
  224.     void main()
  225.     {
  226.             LCD_Init();
  227.             Timer0Init();      //該定時器沒有寫TR0.
  228.             Timer1Init();
  229.             LCD_ShowString(1,1,"distance:");
  230.             LCD_ShowString(1,15,"cm");
  231.             LCD_ShowString(1,13,".");
  232.             while(1)
  233.             {
  234.                   
  235.                     outkey();

  236.                   
  237.             }
  238.     }






  239.     /**************************************************
  240.     定時器1中斷服務
  241.     **************************************************/
  242.     void Time1_Isr() interrupt 3
  243.     {        
  244.             static unsigned char value;                         //定時2ms中斷一次
  245.             TH1 = (65536-2000)/256;
  246.             TL1 = (65536-2000)%256;     //2ms
  247.     //        smgDis();                //數碼管顯示函數
  248.             value++;
  249.             if(value >= 250)//250次2ms中斷總時間位500ms
  250.             {
  251.                     value = 0;
  252.                     Flag = 1;
  253.                     waring ++;
  254.             }
  255.             if(waring>1)
  256.             {
  257.                     waring = 0;
  258.             }
  259.     }
復制代碼

Keil代碼與Proteus仿真下載: 超聲波.7z (85.15 KB, 下載次數: 88)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看深夜视频 | 久久777| 一级黄色毛片a | 综合精品在线 | 亚洲精品一区二区三区在线 | 国产精品成人免费 | 精品国产乱码久久久久久影片 | 91麻豆精品国产91久久久久久 | 国产精品69毛片高清亚洲 | 欧美日本久久 | 中文字幕一区二区三区四区五区 | 久久久精品 | 亚洲欧美日韩一区二区 | 亚洲精品一区二三区不卡 | 国产精品99久久久久久久久 | www精品美女久久久tv | 欧美一区视频在线 | 日本天堂视频在线观看 | 91短视频网址 | 亚洲成人久久久 | 日韩精品一区二区三区高清免费 | 免费在线观看一级毛片 | 蜜桃五月天| 黄色香蕉视频在线观看 | 97国产爽爽爽久久久 | 日韩精品在线网站 | www在线视频 | 欧美一区二区三区免费在线观看 | 亚洲国产精品一区二区第一页 | 日韩精品久久久久久 | 91高清在线观看 | 欧美一二三四成人免费视频 | 国产精品九九视频 | 亚洲激情综合 | 成人二区 | 亚洲一区二区中文字幕 | 国产精品99久久久久久大便 | 久久精品免费 | 亚洲成人一区二区 | 日韩精品视频在线观看一区二区三区 | 成人一区二区电影 |