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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機擴展超聲波模塊測距1602顯示程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:146680 發(fā)表于 2016-11-7 21:16 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

超聲波.rar

2.16 MB, 下載次數(shù): 17, 下載積分: 黑幣 -5

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

使用道具 舉報

沙發(fā)
ID:146711 發(fā)表于 2016-11-7 21:35 | 只看該作者
很好很強大
  1. /*=============================================================
  2. 安裝HC SR04請參照該文件夾下的圖片01



  3. =============================================================*/
  4. #include <AT89x51.H>                //器件配置文件
  5. #include <intrins.h>
  6. #define  RX  P1_6
  7. #define  TX  P1_7

  8. #define LCM_RW  P3_6 //定義LCD引腳
  9. #define LCM_RS  P3_5
  10. #define LCM_E   P3_4
  11. #define LCM_Data  P0
  12. #define Key_Data P3_0 //定義Keyboard引腳
  13. #define Key_CLK  P3_2

  14. #define Busy    0x80 //用于檢測LCM狀態(tài)字中的Busy標(biāo)識

  15. void LCMInit(void);
  16. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  17. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  18. void Delay5Ms(void);
  19. void Delay400Ms(void);
  20. void Decode(unsigned char ScanCode);
  21. void WriteDataLCM(unsigned char WDLCM);
  22. void WriteCommandLCM(unsigned char WCLCM,BuysC);

  23. unsigned char ReadDataLCM(void);
  24. unsigned char ReadStatusLCM(void);
  25. unsigned char code mcustudio[] ={"qx-muc.taobao.co"};
  26. unsigned char code email[] =    {"fhwxaoo@163.com "};
  27. unsigned char code Cls[] =      {"                "};
  28. unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

  29. static unsigned char DisNum = 0; //顯示用指針                                  
  30.        unsigned int  time=0;
  31.            unsigned long S=0;
  32.            bit      flag =0;
  33.            unsigned char disbuff[4]           ={ 0,0,0,0,};


  34. //寫數(shù)據(jù)
  35. void WriteDataLCM(unsigned char WDLCM)
  36. {
  37.         ReadStatusLCM(); //檢測忙
  38.         LCM_Data = WDLCM;
  39.         LCM_RS = 1;
  40.         LCM_RW = 0;
  41.         LCM_E = 0; //若晶振速度太高可以在這后加小的延時
  42.         LCM_E = 0; //延時
  43.         LCM_E = 1;
  44. }

  45. //寫指令
  46. void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測
  47. {
  48.         if (BuysC) ReadStatusLCM(); //根據(jù)需要檢測忙
  49.         LCM_Data = WCLCM;
  50.         LCM_RS = 0;
  51.         LCM_RW = 0;       
  52.         LCM_E = 0;
  53.         LCM_E = 0;
  54.         LCM_E = 1;       
  55. }

  56. //讀數(shù)據(jù)
  57. unsigned char ReadDataLCM(void)
  58. {
  59.         LCM_RS = 1;
  60.         LCM_RW = 1;
  61.         LCM_E = 0;
  62.         LCM_E = 0;
  63.         LCM_E = 1;
  64.         return(LCM_Data);
  65. }

  66. //讀狀態(tài)
  67. unsigned char ReadStatusLCM(void)
  68. {
  69.         LCM_Data = 0xFF;
  70.         LCM_RS = 0;
  71.         LCM_RW = 1;
  72.         LCM_E = 0;
  73.         LCM_E = 0;
  74.         LCM_E = 1;
  75.         while (LCM_Data & Busy); //檢測忙信號
  76.         return(LCM_Data);
  77. }

  78. void LCMInit(void) //LCM初始化
  79. {
  80.         LCM_Data = 0;
  81.         WriteCommandLCM(0x38,0); //三次顯示模式設(shè)置,不檢測忙信號
  82.         Delay5Ms();
  83.         WriteCommandLCM(0x38,0);
  84.         Delay5Ms();
  85.         WriteCommandLCM(0x38,0);
  86.         Delay5Ms();

  87.         WriteCommandLCM(0x38,1); //顯示模式設(shè)置,開始要求每次檢測忙信號
  88.         WriteCommandLCM(0x08,1); //關(guān)閉顯示
  89.         WriteCommandLCM(0x01,1); //顯示清屏
  90.         WriteCommandLCM(0x06,1); // 顯示光標(biāo)移動設(shè)置
  91.         WriteCommandLCM(0x0F,1); // 顯示開及光標(biāo)設(shè)置
  92. }

  93. //按指定位置顯示一個字符
  94. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  95. {
  96.         Y &= 0x1;
  97.         X &= 0xF; //限制X不能大于15,Y不能大于1
  98.         if (Y) X |= 0x40; //當(dāng)要顯示第二行時地址碼+0x40;
  99.         X |= 0x80; //算出指令碼
  100.         WriteCommandLCM(X, 1); //發(fā)命令字
  101.         WriteDataLCM(DData); //發(fā)數(shù)據(jù)
  102. }

  103. //按指定位置顯示一串字符
  104. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  105. {
  106.         unsigned char ListLength;

  107.   ListLength = 0;
  108.         Y &= 0x1;
  109.         X &= 0xF; //限制X不能大于15,Y不能大于1
  110.         while (DData[ListLength]>0x19) //若到達(dá)字串尾則退出
  111.                 {
  112.                         if (X <= 0xF) //X坐標(biāo)應(yīng)小于0xF
  113.                                 {
  114.                                         DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
  115.                                         ListLength++;
  116.                                         X++;
  117.                                 }
  118.                 }
  119. }

  120. //5ms延時
  121. void Delay5Ms(void)
  122. {
  123.         unsigned int TempCyc = 5552;
  124.         while(TempCyc--);
  125. }

  126. //400ms延時
  127. void Delay400Ms(void)
  128. {
  129.         unsigned char TempCycA = 5;
  130.         unsigned int TempCycB;
  131.         while(TempCycA--)
  132.                 {
  133.                         TempCycB=7269;
  134.                         while(TempCycB--);
  135.                 };
  136. }
  137. /********************************************************/
  138.     void Conut(void)
  139.         {
  140.          time=TH0*256+TL0;
  141.          TH0=0;
  142.          TL0=0;
  143.        
  144.          S=(time*1.7)/100;     //算出來是CM
  145.          if((S>=700)||flag==1) //超出測量范圍顯示“-”
  146.          {         
  147.           flag=0;
  148.          
  149.           DisplayOneChar(0, 1, ASCII[11]);
  150.           DisplayOneChar(1, 1, ASCII[10]);        //顯示點
  151.           DisplayOneChar(2, 1, ASCII[11]);
  152.           DisplayOneChar(3, 1, ASCII[11]);
  153.           DisplayOneChar(4, 1, ASCII[12]);        //顯示M
  154.          }
  155.          else
  156.          {
  157.           disbuff[0]=S%1000/100;
  158.           disbuff[1]=S%1000%100/10;
  159.           disbuff[2]=S%1000%10 %10;
  160.           DisplayOneChar(0, 1, ASCII[disbuff[0]]);
  161.           DisplayOneChar(1, 1, ASCII[10]);        //顯示點
  162.           DisplayOneChar(2, 1, ASCII[disbuff[1]]);
  163.           DisplayOneChar(3, 1, ASCII[disbuff[2]]);
  164.           DisplayOneChar(4, 1, ASCII[12]);        //顯示M
  165.          }
  166.         }
  167. /********************************************************/
  168.      void zd0() interrupt 1                  //T0中斷用來計數(shù)器溢出,超過測距范圍
  169.   {
  170.     flag=1;                                                         //中斷溢出標(biāo)志
  171.   }
  172. /********************************************************/
  173.      void  StartModule()                          //啟動模塊
  174.   {
  175.           TX=1;                                             //啟動一次模塊
  176.           _nop_();
  177.           _nop_();
  178.           _nop_();
  179.           _nop_();
  180.           _nop_();
  181.           _nop_();
  182.           _nop_();
  183.           _nop_();
  184.           _nop_();
  185.           _nop_();
  186.           _nop_();
  187.           _nop_();
  188.           _nop_();
  189.           _nop_();
  190.           _nop_();
  191.           _nop_();
  192.           _nop_();
  193.           _nop_();
  194.           _nop_();
  195.           _nop_();
  196.           _nop_();
  197.           TX=0;
  198.   }
  199. /********************************************************/
  200. void delayms(unsigned int ms)
  201. {
  202.         unsigned char i=100,j;
  203.         for(;ms;ms--)
  204.         {
  205.                 while(--i)
  206.                 {
  207.                         j=10;
  208.                         while(--j);
  209.                 }
  210.         }
  211. }
  212. /*********************************************************/
  213. void main(void)
  214. {
  215.         unsigned char TempCyc;
  216.         Delay400Ms(); //啟動等待,等LCM講入工作狀態(tài)
  217.         LCMInit(); //LCM初始化
  218.         Delay5Ms(); //延時片刻(可不要)
  219.         DisplayListChar(0, 0, mcustudio);
  220.         DisplayListChar(0, 1, email);
  221.         ReadDataLCM();//測試用句無意義
  222.         for (TempCyc=0; TempCyc<10; TempCyc++)
  223.         Delay400Ms(); //延時
  224.         DisplayListChar(0, 1, Cls);       
  225.         while(1)
  226.         {
  227.          TMOD=0x01;                   //設(shè)T0為方式1,GATE=1;
  228.          TH0=0;
  229.          TL0=0;         
  230.          ET0=1;             //允許T0中斷
  231.          EA=1;                           //開啟總中斷                       
  232.        
  233.         while(1)
  234.           {
  235.              StartModule();
  236.                 // DisplayOneChar(0, 1, ASCII[0]);
  237.              while(!RX);                //當(dāng)RX為零時等待
  238.              TR0=1;                            //開啟計數(shù)
  239.              while(RX);                        //當(dāng)RX為1計數(shù)并等待
  240.              TR0=0;                                //關(guān)閉計數(shù)
  241.          Conut();                        //計算
  242.                  delayms(80);                //80MS
  243.                  
  244.           }
  245.         }
  246. }
復(fù)制代碼


回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区不卡视频 | 日本一区视频在线观看 | 91九色在线观看 | 亚洲午夜精品 | 亚洲v日韩v综合v精品v | 成人在线视频一区 | 最新中文字幕第一页视频 | 四虎免费视频 | 欧美a√ | 亚洲精品视频观看 | 久久精品欧美电影 | 国产精品视频一区二区三区四区国 | 在线观看免费av网 | 日韩免费激情视频 | 国产精品亚洲视频 | 久久久精品一区二区三区 | 嫩草影院网址 | 成人亚洲一区 | 日韩在线观看 | 欧美高清一区 | av在线一区二区三区 | 少妇午夜一级艳片欧美精品 | 亚洲一二三区免费 | 国产精品123区 | 久草在线 | 久久精品视频网站 | 亚洲精品中文字幕 | 国产一区二区三区在线 | 午夜男人免费视频 | 国产成人精品久久二区二区91 | 99久久久99久久国产片鸭王 | 男人视频网站 | 美女亚洲一区 | 久久精品国产一区 | 精品国产一区二区三区成人影院 | 在线视频国产一区 | 黄频免费 | 成人免费看片 | 欧美亚洲视频 | 99tv成人影院 | 中文字幕人成人 |