標(biāo)題: 寫一個(gè)簡單的單片機(jī)超聲波測距程序,數(shù)碼管顯示距離,單位厘米 [打印本頁]

作者: 落日手工    時(shí)間: 2020-5-3 20:03
標(biāo)題: 寫一個(gè)簡單的單片機(jī)超聲波測距程序,數(shù)碼管顯示距離,單位厘米
寫一個(gè)簡單地超聲波測距程序,數(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; //清測量成功標(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;          //啟動定時(shí)器1
  43.         delay(20);      //等待測量的結(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號
  93. {   
  94.      timeH =TH1;    //取出定時(shí)器的值
  95.      timeL =TL1;    //取出定時(shí)器的值
  96.      succeed_flag=1;//至成功測量的標(biāo)志
  97.      EX0=0;         //關(guān)閉外部中斷
  98. }
  99. //****************************************************************
  100. //定時(shí)器1中斷,用做超聲波測距計(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提供下載:
超聲波測距—數(shù)碼管顯示距離(單位厘米)程序.rar (28.34 KB, 下載次數(shù): 31)



作者: admin    時(shí)間: 2020-5-5 14:27
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
作者: 單片機(jī)編程好難    時(shí)間: 2020-5-24 15:16
你好,請問數(shù)碼管怎么連接的,我在仿真上沒有結(jié)果




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