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

標題: 51單片機hc-sr04超聲波測距(脈寬測量)DEMO程序 [打印本頁]

作者: sxc677    時間: 2018-11-12 15:38
標題: 51單片機hc-sr04超聲波測距(脈寬測量)DEMO程序

單片機源程序如下:
  1. /***********************************************************************************************************/
  2. //hc-sr04 超聲波測距模塊DEMO程序
  3. //晶振:11。0592
  4. //接線:模塊TRIG接 P0.2  ECH0 接P0.1
  5. //數(shù)碼管:共陽數(shù)碼管P1接數(shù)據(jù)口,P2.5 P2.4 P2.3接選通數(shù)碼管
  6. /***********************************************************************************************************/            
  7.                      #include <reg51.h>                //器件配置文件
  8.                          #include <intrins.h>
  9.                          #define uchar unsigned char
  10.              #define uint unsigned int
  11.                          unsigned int  time=0;
  12.                          unsigned int  timer=0;
  13.                          unsigned char posit=0;
  14.                          unsigned long S=0,S1,S2;
  15.                          bit      flag =0;
  16.              sbit  TX123=P3^4;   //T
  17.                          sbit  RX123=P3^5;   //E
  18.              sbit  KJA=P3^6;     //近距離存儲按鈕
  19.                          sbit  KJAN=P3^7;    //遠距離存儲按鈕
  20.              sbit  S1J=P3^3;     //近距離動作繼電器
  21.                          sbit  S2J=P3^2;     //遠距離動作繼電器
  22.          
  23.                          unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
  24.                          unsigned char const positon[3]={ 0xdf,0xef,0xf7};
  25.                     unsigned char disbuff[4]={ 0,0,0,0,};

  26. /******************定義命令字節(jié)******************/     
  27. #define Read_COM    0x01                     //字節(jié)讀數(shù)據(jù)命令   
  28. #define Prog_COM    0x02                    //字節(jié)編程數(shù)據(jù)命令   
  29. #define Erase_COM    0x03                   //扇區(qū)擦除數(shù)據(jù)命令   
  30. #define En_Wait_TIME    0x81                //設(shè)置等待時間 ,并使能ISP/IAP      
  31. #define Start_ADDRH 0x20                    //扇區(qū)地址高位   
  32. #define Start_ADDRL 0x00                    //扇區(qū)地址低位
  33. /****************特殊功能寄存器聲明****************/
  34. sfr ISP_DATA = 0xe2;
  35. sfr ISP_ADDRH = 0xe3;   
  36. sfr ISP_ADDRL = 0xe4;
  37. sfr ISP_CMD = 0xe5;
  38. sfr ISP_TRIG = 0xe6;   
  39. sfr ISP_CONTR = 0xe7;

  40. /*****************關(guān)閉ISP&IAP功能*****************/   
  41. void ISP_IAP_disable(void)   
  42. {   
  43.     ISP_CONTR = 0x00;   
  44.     ISP_CMD = 0x00;   
  45.     ISP_TRIG = 0x00;   
  46. }   
  47. /*********************字節(jié)讀**********************/     
  48. uchar Byte_read(uint byte_addr)   
  49. {   
  50.     EA = 0;                                        //關(guān)中斷   
  51.     ISP_CONTR = En_Wait_TIME;                   //開啟ISP&IAP,并送等待時間   
  52.     ISP_CMD = Read_COM;                         //送字節(jié)讀命令字      
  53.     ISP_ADDRH = (uchar)(byte_addr >> 8);          //送地址高字節(jié)   
  54.     ISP_ADDRL = (uchar)(byte_addr & 0x00ff);    //送地址低字節(jié)        
  55.     ISP_TRIG = 0x46;                            //送觸發(fā)命令字0x46   
  56.     ISP_TRIG = 0xB9;                            //送觸發(fā)命令字0xB9   
  57.     _nop_();   
  58.     ISP_IAP_disable();                          //關(guān)閉ISP&IAP功能   
  59.     EA = 1;                                     //開中斷   
  60.     return (ISP_DATA);   
  61. }     
  62. /*********************字節(jié)編程*********************/   
  63. void Byte_program(uint byte_addr,uchar isp_iap_data)   
  64. {   
  65.     EA = 0;                                     //關(guān)中斷   
  66.     ISP_CONTR = En_Wait_TIME;                   //開啟ISP&IAP,并送等待時間   
  67.     ISP_CMD = Prog_COM;                         //送字節(jié)編程命令字      
  68.     ISP_ADDRH = (uchar)(byte_addr >> 8);          //送地址高字節(jié)   
  69.     ISP_ADDRL = (uchar)(byte_addr & 0x00ff);    //送地址低字節(jié)        
  70.     ISP_DATA = isp_iap_data;                    //送數(shù)據(jù)進ISP_DATA   
  71.     ISP_TRIG = 0x46;                            //送觸發(fā)命令字0x46   
  72.     ISP_TRIG = 0xB9;                            //送觸發(fā)命令字0xB9   
  73.     _nop_();   
  74.     ISP_IAP_disable();                          //關(guān)閉ISP&IAP功能   
  75.     EA = 1;                                     //開中斷      
  76. }   
  77.    
  78. /*********************扇區(qū)擦除*********************/   
  79. void Sector_erase(uint sector_addr)   
  80. {   
  81.     EA = 0;                                     //關(guān)中斷   
  82.     ISP_CONTR = En_Wait_TIME;                   //開啟ISP&IAP;并送等待時間   
  83.     ISP_CMD = Erase_COM;                        //送扇區(qū)擦除命令字      
  84.     ISP_ADDRH = (uchar)(sector_addr >> 8);       //送地址高字節(jié)   
  85.     ISP_ADDRL = (uchar)(sector_addr & 0X00FF);    //送地址低字節(jié)        
  86.     ISP_TRIG = 0X46;                            //送觸發(fā)命令字0x46  
  87.     ISP_TRIG = 0XB9;                            //送觸發(fā)命令字0xB9   
  88.     _nop_();   
  89.     ISP_IAP_disable();                          //關(guān)閉ISP&IAP功能   
  90.     EA = 1;   
  91. }  

  92. /********************************************************/
  93.     void Display(void)                                 //掃描數(shù)碼管
  94.         {
  95.          if(posit==0)
  96.          {P1=(discode[disbuff[posit]])&0x7f;}
  97.          else
  98.          {P2=discode[disbuff[2]];
  99.           P0=discode[disbuff[1]];}
  100.           if(++posit>=3)
  101.           posit=0;
  102.         }
  103. /********************************************************/
  104.     void Conut(void)
  105.         {
  106.          time=TH0*256+TL0;
  107.          TH0=0;
  108.          TL0=0;
  109.         
  110.          S=(time*1.7)/100;     //算出來是CM
  111.          if((S>=250)||flag==1) //超出測量范圍顯示“-”
  112.          {         
  113.           flag=0;
  114.      S=250;
  115.          }
  116.          else
  117.          {
  118.           disbuff[0]=S%1000/100;
  119.           disbuff[1]=S%1000%100/10;
  120.           disbuff[2]=S%1000%10 %10;
  121.          }
  122.         }
  123. /********************************************************/
  124.      void zd0() interrupt 1                  //T0中斷用來計數(shù)器溢出,超過測距范圍
  125.   {
  126.     flag=1;                                                         //中斷溢出標志
  127.   }
  128. /********************************************************/
  129.    void  zd3()  interrupt 3                  //T1中斷用來掃描數(shù)碼管和計800MS啟動模塊
  130.   {
  131.          TH1=0xfc;
  132.          TL1=0x30;
  133.          Display();
  134.          timer++;
  135.          if(timer>=400)          //調(diào)節(jié)測速頻率
  136. {
  137.           timer=0;
  138.           TX123=1;                                        //800MS  啟動一次模塊
  139.           _nop_();
  140.           _nop_();
  141.           _nop_();
  142.           _nop_();
  143.           _nop_();
  144.           _nop_();
  145.           _nop_();
  146.           _nop_();
  147.           _nop_();
  148.           _nop_();
  149.           _nop_();
  150.           _nop_();
  151.           _nop_();
  152.           _nop_();
  153.           _nop_();
  154.           _nop_();
  155.           _nop_();
  156.           _nop_();
  157.           _nop_();
  158.           _nop_();
  159.           _nop_();
  160.      _nop_();
  161.           TX123=0;
  162.          }
  163.   }

  164. /*****************************************************************************
  165. *  延時子程序                                                                                                                             *
  166. *                                                                                                                                                         *
  167. ******************************************************************************/
  168. void delay(unsigned int ms)
  169. {
  170.         unsigned char i;
  171.         while(ms--)
  172.         {
  173.         for(i = 0; i < 120; i++);
  174.         }
  175. }
  176. /*********************************************************/

  177.         void  main(  void  )

  178.   {
  179.    S1J=0;
  180.    delay(1000);
  181.    S1J=1;
  182.    TMOD=0x11;                   //設(shè)T0為方式1,GATE=1;
  183.         TH0=0;
  184.         TL0=0;         
  185.         TH1=0xf8;                   //2MS定時
  186.         TL1=0x30;
  187.         ET0=1;             //允許T0中斷
  188.         ET1=1;                           //允許T1中斷
  189.         TR1=1;                           //開啟定時器
  190.         EA=1;                           //開啟總中斷  
  191.    
  192.    S1=Byte_read(0x2000);   
  193.    S2=Byte_read(0x2200);   //讀EEPROM
  194.    disbuff[0]=S1%1000/100;
  195.         disbuff[1]=S1%1000%100/10;
  196.         disbuff[2]=S1%1000%10 %10;
  197.    Display();
  198.    delay(1000);
  199.    disbuff[0]=S2%1000/100;
  200.         disbuff[1]=S2%1000%100/10;
  201.         disbuff[2]=S2%1000%10 %10;
  202.    Display();
  203.    delay(1000);
  204.         while(1)
  205.         {
  206.          while(!RX123);                //當RX為零時等待
  207.          TR0=1;                            //開啟計數(shù)
  208.          while(RX123);                        //當RX為1計數(shù)并等待
  209.          TR0=0;                                //關(guān)閉計數(shù)
  210.     Conut();                        //計算
  211.     if(!KJA){Sector_erase(0x2000);                       //扇區(qū)擦除   
  212.     Byte_program(0x2000,S);                     //寫EEPROM   
  213.     _nop_();   
  214.     _nop_();   
  215.     _nop_();
  216.     _nop_();   
  217.     _nop_();   
  218.     _nop_();
  219.     S1=Byte_read(0x2000); }
  220.     if(!KJAN){Sector_erase(0x2200);                       //扇區(qū)擦除   
  221.     Byte_program(0x2200,S);                     //寫EEPROM   
  222.     _nop_();   
  223.     _nop_();   
  224.     _nop_();
  225.     _nop_();   
  226.     _nop_();   
  227.     _nop_();
  228.     S2=Byte_read(0x2200); }
  229.     if(S>=S1)S1J=0;
  230.     else S1J=1;
  231.         }

  232.   }
復(fù)制代碼

所有資料51hei提供下載:


超聲波測距工程用.rar

131.29 KB, 下載次數(shù): , 下載積分: 黑幣 -5






歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩av一区二区在线观看 | 国产亚洲精品久久久久久牛牛 | 亚洲一区中文字幕 | 日韩免费一区二区 | 精品中文字幕久久 | 久久大陆| 国产伦精品一区二区三毛 | 国产精品亚洲一区 | 午夜视频在线观看网址 | 精品久久久久久久久久久 | 久久国产精品色av免费观看 | 特黄级国产片 | 精精国产视频 | 久久91精品国产一区二区三区 | 日本不卡免费新一二三区 | 久久中文免费视频 | 欧美一二三 | 久久国产精品色av免费观看 | 国产精品一区二区免费 | 国产一区亚洲 | 成人午夜影院 | 成人天堂 | 黄色大全免费看 | 免费av手机在线观看 | 国内毛片毛片毛片毛片 | 日本福利片 | 亚洲网站在线观看 | 亚洲一区中文字幕 | 亚洲精品大片 | 日韩av大片免费看 | 天天干.com | 国产三区四区 | www.夜夜骑.com| www天天操 | 国产一区二区激情视频 | 日本成人毛片 | 亚洲精品自在在线观看 | 久久久久国产一区二区三区四区 | 日韩一区二区在线播放 | 黄色av观看 | 欧美成人手机在线 |