找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

有關(guān)51單片機超聲波測距的代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:419428 發(fā)表于 2018-11-1 22:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
LCD1602液晶 顯示器及SR4超聲波傳感器檢測障礙物距離

單片機源程序如下:

  1. #include<reg51.h>
  2. #include<intrins.h>       
  3. #include"lcd.h"
  4. sbit moto1=P1^0;
  5. sbit moto2=P1^1;
  6. sbit moto3=P1^2;
  7. sbit moto4=P1^3;
  8. sbit hw=P1^7;
  9. sbit hw1=P1^6;                   
  10. sbit k1=P3^1;
  11. //sbit key2=P3^2;
  12. sbit beep=P1^5;
  13. sbit Trig = P2^1;
  14. sbit Echo =  P2^0;
  15. //sbit PWM = P0^7;
  16. sbit hw2=P2^3;
  17. sbit hw3=P2^4;
  18. unsigned int  j,a,h,w,c,z,x,y,u,v;

  19. unsigned char PuZh[]="The Distance is";
  20. unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
  21. static unsigned char DisNum = 0; //顯示用指針                                  
  22.        unsigned int  time=0;
  23.            unsigned long S=0;
  24.            bit      flag =0;
  25.            unsigned char disbuff[6]           ={ 0,0,0,0,0,};
  26.            void Conut(void);
  27. void delayms();
  28. void  StartModule();
  29. void delayms(unsigned int ms)
  30. {
  31.         unsigned char i=100,j;
  32.         for(;ms;ms--)
  33.         {
  34.                 while(--i)
  35.                 {
  36.                         j=10;
  37.                         while(--j);
  38.                 }
  39.         }
  40. }
  41. void delay(unsigned char i)
  42. {
  43.         while(i--);       
  44. }
  45. void Int0Init()
  46. {
  47.         //設(shè)置INT0
  48.         IT0=1;//跳變沿出發(fā)方式(下降沿)
  49.         EX0=1;//打開INT0的中斷允許。       
  50.         EA=1;//打開總中斷       
  51. }
  52. //中斷
  53. void forward()
  54. {
  55.         moto1=1;
  56.         moto2=1;
  57.         moto3=1;
  58.         moto4=1;
  59.         delay(80);
  60. }
  61. void stop()
  62. {
  63.         moto1=0;
  64.         moto2=0;
  65.         moto3=0;
  66.         moto4=0;
  67.         delay(80);
  68. }
  69. void turnright()
  70. {
  71.         moto1=1;
  72.         moto2=0;
  73.         moto3=1;
  74.         moto4=0;
  75.         delay(80);
  76. }
  77. void turnleft()
  78. {
  79.         moto1=0;
  80.         moto2=1;
  81.         moto3=0;
  82.         moto4=1;
  83.         delay(80);
  84. }
  85. void Conut(void)
  86.         {
  87.          time=TH0*256+TL0;
  88.          TH0=0;
  89.          TL0=0;
  90.          S=time;     //算出來是CM
  91.          if((S>=700)||flag==1) //超出測量范圍顯示“-”
  92.          {         
  93.           flag=0;
  94.           DisplayOneChar(0, 1, ASCII[11]);
  95.           DisplayOneChar(1, 1, ASCII[10]);        //顯示點
  96.           DisplayOneChar(2, 1, ASCII[11]);
  97.           DisplayOneChar(3, 1, ASCII[11]);
  98.           DisplayOneChar(4, 1, ASCII[12]);
  99.         //顯示M
  100.          }
  101.          else
  102.          {
  103.           disbuff[0]=S%1000/100;
  104.           disbuff[1]=S%1000%100;
  105.           disbuff[2]=S%1000%100%10;
  106.           DisplayOneChar(0, 1, ASCII[disbuff[1]]);
  107.           DisplayOneChar(1, 1, ASCII[10]);        //顯示點
  108.           DisplayOneChar(2, 1, ASCII[disbuff[2]]);
  109.           DisplayOneChar(3, 1, ASCII[disbuff[3]]);
  110.           DisplayOneChar(4, 1, ASCII[12]);
  111.                   //顯示M
  112.          }
  113.         }

  114. void zd0() interrupt 1                  //T0中斷用來計數(shù)器溢出,超過測距范圍
  115.   {
  116.     flag=1;                                                         //中斷溢出標(biāo)志
  117.   }

  118. void  StartModule()                          //啟動模塊
  119.   {
  120.           Trig=1;                                             //啟動一次模塊
  121.           _nop_();
  122.           _nop_();
  123.           _nop_();
  124.           _nop_();
  125.           _nop_();
  126.           _nop_();
  127.           _nop_();
  128.           _nop_();
  129.           _nop_();
  130.           _nop_();
  131.           _nop_();
  132.           _nop_();
  133.           _nop_();
  134.           _nop_();
  135.           _nop_();
  136.           _nop_();
  137.           _nop_();
  138.           _nop_();
  139.           _nop_();
  140.           _nop_();
  141.           _nop_();
  142.           Trig=0;
  143.   }

  144. void warning()
  145. {
  146.         unsigned int b;
  147.         if(S<5)
  148.         {
  149.            do
  150.            {
  151.            for(b=0;b<100;b++)
  152.            {
  153.                 beep=~beep;       
  154.                 delay(100);
  155.                 }
  156.                 }while(S>5);       

  157.         }
  158. }
  159. void main(void)
  160. {

  161.          TMOD=0x01;                   //設(shè)T0為方式1,GATE=1;
  162.          TH0=0;
  163.          TL0=0;         
  164.          ET0=1;             //允許T0中斷
  165.          EA=1;                           //開啟總中斷       

  166.         InitLcd1602();
  167.         LcdShowStr(0,0,PuZh);
  168.          stop();
  169.         while(1)
  170.         {
  171.                  StartModule();
  172.              while(Echo);                //當(dāng)RX為零時等待
  173.              TR0=1;                            //開啟計數(shù)
  174.              while(Echo);                        //當(dāng)RX為1計數(shù)并等待
  175.              TR0=0;                                //關(guān)閉計數(shù)
  176.          Conut();                        //計算
  177.                  delayms(8);
  178.                  if(k1==0)
  179.                  {
  180.                  forward();
  181.                  if(S<=35)
  182.                  {
  183.                  stop();
  184.                  warning();
  185.                          if(hw1==0)
  186.                 {
  187.            turnleft();
  188.            delay(80);
  189.                 }
  190.                 if(hw3==0)
  191.                 {
  192.            turnleft();
  193.            delay(80);
  194.                 }
  195.                 if(hw==0)
  196.                 {
  197.            turnright();
  198.            delay(80);
  199.                 }
  200.         if(hw2==0)
  201.                 {
  202.            turnright();
  203.            delay(80);
  204.                 }
  205.                  }
  206.                 if(hw1==0)
  207.                 {
  208.            turnleft();
  209.            delay(80);
  210.                 }
  211.                  if(hw3==0)
  212.                 {
  213.            turnleft();
  214.            delay(80);
  215.                 }
  216.                 if(hw==0)
  217.                 {
  218.            turnright();
  219.            delay(80);
  220.                 }
  221.                         if(hw2==0)
  222.                 {
  223.            turnright();
  224.            delay(80);
  225.                 }
  226.                         if(hw1==0)
  227.                 {
  228.            turnleft();
  229.            delay(80);
  230.                 }
  231.                         h=hw;
  232.                 w=hw1;
  233.                 c=hw2;
  234.                 z=hw3;
  235.                     x=h+w;
  236.                         y=c+z;
  237.                         u=h+z;
  238.                         v=w+c;
  239.                 if(x==0)
  240.                         {
  241.                                 stop();
  242.                                 delay(50);
  243.                         }
  244.         if(y==0)
  245.                         {
  246.                                 stop();
  247.                                 delay(50);
  248.                         }
  249.                                 if(u==0)
  250.                 {
  251.                                 stop();
  252.                                 delay(50);
  253.                         }
  254.                         if(v==0)
  255.                         {
  256.                                 stop();
  257.                                 delay(50);
  258.                         }
  259.                  }
  260.         }
  261.                        
  262. }
復(fù)制代碼

所有資料51hei提供下載:
程序.rar (37.07 KB, 下載次數(shù): 18)


評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:471216 發(fā)表于 2019-4-17 11:50 | 只看該作者
為什么定時器TMOD 明明就是0x01沒有打開GATE為什么都說  GATE為1,能解釋下嗎
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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