找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 2448|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

寫一個(gè)簡(jiǎn)單的單片機(jī)超聲波測(cè)距程序,數(shù)碼管顯示距離,單位厘米

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:743179 發(fā)表于 2020-5-3 20:03 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
寫一個(gè)簡(jiǎn)單地超聲波測(cè)距程序,數(shù)碼管顯示距離,單位厘米

單片機(jī)源程序如下:
  1. #include "reg51.h"

  2. unsigned char table[]=
  3.                         {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  4.                        
  5. #define uint  unsigned int
  6. #define uchar unsigned char

  7. sbit D1= P2^7;
  8. sbit Trig = P2^2;
  9. sbit Echo = P3^2;                               
  10. sbit SMG_q = P1^0;       
  11. sbit SMG_b = P1^1;       
  12. sbit SMG_s = P1^2;       
  13. sbit SMG_g = P1^3;       

  14. uint time = 0;
  15. uint timeH = 0;
  16. uint timeL = 0;
  17. uint succeed_flag;
  18.                        
  19. void display(uint da);
  20. void delay(uint z);
  21. void delay_20us();
  22.        
  23. void main(void)  
  24. {               
  25.           uint distance;

  26.     Trig=0;       //首先拉低脈沖輸入引腳
  27.     EA=1;         //打開總中斷0
  28.     TMOD=0x10;    //定時(shí)器1,16位工作方式
  29.     while(1)        
  30.     {
  31.         EA=0;           //關(guān)總中斷
  32.         Trig=1;         //超聲波輸入端
  33.         delay_20us();   //延時(shí)20us
  34.         Trig=0;         //產(chǎn)生一個(gè)20us的脈沖
  35.         while(Echo==0); //等待Echo回波引腳變高電平
  36.         succeed_flag=0; //清測(cè)量成功標(biāo)志
  37.         EA=1;
  38.         EX0=1;          //打開外部中斷0
  39.         TH1=0;          //定時(shí)器1清零
  40.         TL1=0;          //定時(shí)器1清零
  41.         TF1=0;          //計(jì)數(shù)溢出標(biāo)志
  42.         TR1=1;          //啟動(dòng)定時(shí)器1
  43.         delay(20);      //等待測(cè)量的結(jié)果
  44.         TR1=0;          //關(guān)閉定時(shí)器1
  45.         EX0=0;          //關(guān)閉外部中斷0
  46.        if(succeed_flag==1)
  47.        {   
  48.                                         time=timeH*256+timeL;
  49.           distance=time*0.0172;  //厘米

  50.                                   display(distance );
  51.                                        
  52.                                         if(distance<=150 && distance>=80)
  53.           {
  54.                                                 D1=0;
  55.                                         }
  56.                                         else D1=1;
  57.                          }
  58.                          
  59.        if(succeed_flag==0)
  60.        {
  61.                                         distance=9999;               
  62.                                         D1=1;
  63.                                         delay(24);
  64.         }               
  65.     }
  66. }

  67. void display(uint da)
  68. {
  69.         SMG_q=0;                       
  70.         P0=table[da/1000];       
  71.         delay(1);                       
  72.         P0=0XFF;                       
  73.         SMG_q=1;       
  74.        
  75.         SMG_b=0;                       
  76.         P0=table[da/100%10];       
  77.         delay(1);                       
  78.         P0=0XFF;                       
  79.         SMG_b=1;       
  80.        
  81.         SMG_s=0;                       
  82.         P0=table[da%100/10];       
  83.         delay(1);                       
  84.         P0=0XFF;                       
  85.         SMG_s=1;                       

  86.         SMG_g=0;                       
  87.         P0=table[da%10];       
  88.         delay(1);                       
  89.         P0=0XFF;                       
  90.         SMG_g=1;                       
  91. }

  92. void exter()  interrupt 0   // 外部中斷0是0號(hào)
  93. {   
  94.      timeH =TH1;    //取出定時(shí)器的值
  95.      timeL =TL1;    //取出定時(shí)器的值
  96.      succeed_flag=1;//至成功測(cè)量的標(biāo)志
  97.      EX0=0;         //關(guān)閉外部中斷
  98. }
  99. //****************************************************************
  100. //定時(shí)器1中斷,用做超聲波測(cè)距計(jì)時(shí)
  101. void timer1() interrupt 3  //
  102. {
  103.     TH1=0;
  104.     TL1=0;
  105. }

  106. void delay(uint z)
  107. {
  108.         uint x,y;
  109.         for(x=z;x>0;x--)
  110.         for(y=125;y>0;y--);
  111. }

  112. void delay_20us()
  113. {
  114.     uchar a ;
  115.     for(a=0;a<100;a++);
  116. }
復(fù)制代碼

所有程序51hei提供下載:
超聲波測(cè)距—數(shù)碼管顯示距離(單位厘米)程序.rar (28.34 KB, 下載次數(shù): 31)


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

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2020-5-5 14:27 | 只看該作者
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說(shuō)明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復(fù)

使用道具 舉報(bào)

板凳
ID:756037 發(fā)表于 2020-5-24 15:16 | 只看該作者
你好,請(qǐng)問(wèn)數(shù)碼管怎么連接的,我在仿真上沒(méi)有結(jié)果
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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