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

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

QQ登錄

只需一步,快速開(kāi)始

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

51單片機(jī)hc-sr04超聲波測(cè)距(脈寬測(cè)量)DEMO程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:421173 發(fā)表于 2018-11-12 15:38 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

單片機(jī)源程序如下:
  1. /***********************************************************************************************************/
  2. //hc-sr04 超聲波測(cè)距模塊DEMO程序
  3. //晶振:11。0592
  4. //接線:模塊TRIG接 P0.2  ECH0 接P0.1
  5. //數(shù)碼管:共陽(yáng)數(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;     //近距離存儲(chǔ)按鈕
  19.                          sbit  KJAN=P3^7;    //遠(yuǎn)距離存儲(chǔ)按鈕
  20.              sbit  S1J=P3^3;     //近距離動(dòng)作繼電器
  21.                          sbit  S2J=P3^2;     //遠(yuǎn)距離動(dòng)作繼電器
  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è)置等待時(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;                   //開(kāi)啟ISP&IAP,并送等待時(shí)間   
  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;                                     //開(kāi)中斷   
  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;                   //開(kāi)啟ISP&IAP,并送等待時(shí)間   
  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ù)進(jìn)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;                                     //開(kāi)中斷      
  76. }   
  77.    
  78. /*********************扇區(qū)擦除*********************/   
  79. void Sector_erase(uint sector_addr)   
  80. {   
  81.     EA = 0;                                     //關(guān)中斷   
  82.     ISP_CONTR = En_Wait_TIME;                   //開(kāi)啟ISP&IAP;并送等待時(shí)間   
  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;     //算出來(lái)是CM
  111.          if((S>=250)||flag==1) //超出測(cè)量范圍顯示“-”
  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中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
  125.   {
  126.     flag=1;                                                         //中斷溢出標(biāo)志
  127.   }
  128. /********************************************************/
  129.    void  zd3()  interrupt 3                  //T1中斷用來(lái)掃描數(shù)碼管和計(jì)800MS啟動(dòng)模塊
  130.   {
  131.          TH1=0xfc;
  132.          TL1=0x30;
  133.          Display();
  134.          timer++;
  135.          if(timer>=400)          //調(diào)節(jié)測(cè)速頻率
  136. {
  137.           timer=0;
  138.           TX123=1;                                        //800MS  啟動(dòng)一次模塊
  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. *  延時(shí)子程序                                                                                                                             *
  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定時(shí)
  186.         TL1=0x30;
  187.         ET0=1;             //允許T0中斷
  188.         ET1=1;                           //允許T1中斷
  189.         TR1=1;                           //開(kāi)啟定時(shí)器
  190.         EA=1;                           //開(kāi)啟總中斷  
  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);                //當(dāng)RX為零時(shí)等待
  207.          TR0=1;                            //開(kāi)啟計(jì)數(shù)
  208.          while(RX123);                        //當(dāng)RX為1計(jì)數(shù)并等待
  209.          TR0=0;                                //關(guān)閉計(jì)數(shù)
  210.     Conut();                        //計(jì)算
  211.     if(!KJA){Sector_erase(0x2000);                       //扇區(qū)擦除   
  212.     Byte_program(0x2000,S);                     //寫(xiě)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);                     //寫(xiě)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提供下載:


此商品已被刪除

超聲波測(cè)距工程用.rar

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

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品久久久久 | 91精品久久久久久久久 | 欧美日韩专区 | 日本网站免费观看 | 成人网址在线观看 | 国产大学生情侣呻吟视频 | 欧美多人在线 | 久久精品综合 | 奇米av| 国产免费又黄又爽又刺激蜜月al | 欧美激情精品久久久久久变态 | 国产精品久久久久久婷婷天堂 | 久久久.com | 精品福利在线 | 婷婷在线视频 | 久久成人一区 | 国产精品一区二区三区四区 | 一区二区av | 日韩不卡视频在线 | 看黄在线 | 精品一区二区三区在线观看国产 | 久久久久久中文字幕 | 黑人粗黑大躁护士 | 国产福利免费视频 | 精品综合久久久 | 99精品欧美一区二区三区 | h视频在线免费观看 | 午夜影院在线观看免费 | 欧美日韩久久久 | 午夜精品久久久久久久久久久久久 | 国产乱码精品1区2区3区 | 久久久蜜桃一区二区人 | 狠狠av| 欧美高清性xxxxhdvideosex | 91久久久www播放日本观看 | 狠狠婷婷综合久久久久久妖精 | 久久久久国产一级毛片高清网站 | 亚洲综合五月天婷婷 | 日韩a在线| 日韩一区二区在线视频 | 一级毛片视频 |