標(biāo)題: 基于51單片機(jī)超聲波測距防近視臺燈程序 [打印本頁]

作者: 152xyq    時間: 2020-12-2 18:25
標(biāo)題: 基于51單片機(jī)超聲波測距防近視臺燈程序
程序代碼

仿真圖


單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. /*********************宏定義************************/
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. /************位定義*****************************/
  7. sbit Trig=P3^7; //超聲波模塊觸發(fā)位
  8. sbit LEDRED=P1^0;
  9. sbit LEDGREEN=P1^2;
  10. sbit speaker=P1^7;
  11. sbit person=P1^6;
  12. sbit TLED= P1^5;
  13. /************全局變量聲明***********************/
  14. uint H,T;  //定義全局變量,H--距離,T--時間

  15. /***********共陰數(shù)碼管段碼表********************/
  16. uchar a_code[]={                                          //共陰數(shù)碼管編碼0~9
  17. 0x3f,0x06,0x5b,0x4f,0x66,
  18. 0x6d,0x7d,0x07,0x7f,0x6f,
  19. /*0x77,0x7c,0x39,0x5e,0x79,
  20. 0x71*/};

  21. /***************延時函數(shù)************************/
  22. void delay(uint z)                                   //*1ms延時函數(shù)
  23. {
  24.         uint x,y;
  25.         for(x=z;x>0;x--)
  26.                 for(y=110;y>0;y--);
  27. }

  28. /*************超聲波模塊啟動函數(shù)**************/
  29. void start()
  30. {
  31.         
  32.         Trig=1; //拉高觸發(fā)信號,啟動超聲波模塊發(fā)射超聲波
  33.         _nop_();  //延時10us
  34.         _nop_();
  35.         _nop_();
  36.         _nop_();
  37.         _nop_();
  38.         _nop_();
  39.         _nop_();
  40.         _nop_();
  41.         _nop_();
  42.         _nop_();
  43.         _nop_();
  44.         _nop_();
  45.         _nop_();
  46.         _nop_();
  47.         Trig=0;  //拉低觸發(fā)信號
  48. }


  49. /*****************數(shù)碼管顯示函數(shù)*****************/
  50. void  display(unsigned int a,unsigned int b,unsigned int c,unsigned int d)
  51. {
  52.     P2=0xfe;
  53.     P0=a_code[a];
  54.     delay(5);
  55.     P2=0xfd;
  56.     P0=a_code[b];
  57.     delay(5);
  58.         P2=0xfb;
  59.     P0=a_code[c];
  60.     delay(5);
  61.         P2=0xf7;
  62.     P0=a_code[d];
  63.     delay(5);

  64. }


  65. /*****************主函數(shù)*************************/
  66. void main()
  67. {
  68.           Trig=0;
  69.          LEDRED=1;
  70.          LEDGREEN=1;
  71.          speaker=0;
  72.      EA=1;
  73. TMOD=0x19;//定時器0工作模式:
  74.                /*GATE=1(由外部中斷0引腳及TR0共同啟動定時器0)
  75.                C/T=0(定時模式)
  76.                                 M1M0=01(16位定時)*/
  77.         TH1=64580/256;
  78.         TL1=65480%256;
  79.         ET1=1;
  80.         TR0=1;        //啟動定時器0
  81.         EX0=1;        //開外部中斷0
  82.         IT0=1;        //外部中斷0設(shè)置為下降沿觸發(fā)方式
  83.         while(1)
  84. {
  85. start();   //調(diào)用超聲波模塊啟動函數(shù)
  86. display(H/1000,H%1000/100,H%1000%100/10,H%10); //調(diào)用數(shù)碼管顯示函數(shù)
  87. if(person==1)  
  88.          {
  89.                 TLED=1;
  90.                 if(H<=25)
  91.                 {
  92.                         LEDRED=0;
  93.                         LEDGREEN=1;
  94.                         TR1=1;
  95.                 }
  96.                 else
  97.                 {
  98.                         LEDRED=1;
  99.                         LEDGREEN=0;
  100.                         TR1=0;
  101.                 }
  102.         }
  103.         else
  104.         {
  105.                 TLED=0;
  106.                 LEDRED=1;
  107.                 LEDGREEN=1;
  108.                 TR1=0;
  109.         }
  110. }
  111. }

  112. /***************外部中斷0函數(shù)************************
  113. 回響輸出端高電平寬度測量(上升沿到來時啟動定時器0開始計時,
  114. 下降沿到來進(jìn)入外部中斷,關(guān)閉定時器0,停止計時,計算距離
  115. ********************************************************/
  116. void int0() interrupt 0         
  117. {
  118.          TR0=0;                //關(guān)閉定時器0
  119.         EX0=0;                //關(guān)閉外部中斷0
  120.         T=(TH0*256+TL0);//計算超聲波傳輸時間,CPU采用12M時鐘,則計算的單位為us
  121.          TH0=0;                        //定時器清0
  122.          TL0=0;
  123.          H=T*0.017;         //計算距離,單位cm(注意:不能用H=(T*17)/1000,這樣變成取整了)
  124.          H=H+2;
  125.         TR0=1;                //開啟定時器0
  126.         EX0=1;                //開啟外部中斷0        
  127. }
  128. void time1() interrupt 3
  129. {
  130.         TR1=0;
  131.         TH1=65480/256;
  132.         TL1=65480%256;
  133.         speaker=~speaker;
  134.         TR1=1;
  135. }
復(fù)制代碼





作者: 1396319318    時間: 2020-12-8 16:26
有沒有文件呢?





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