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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5458|回復: 0
打印 上一主題 下一主題
收起左側

超聲波傳感器和stc89c51單片機的c語言代碼

[復制鏈接]
跳轉到指定樓層
樓主
C:
SMC1602A(16*2)模擬口線接線方式
連接線圖:   
       ---------------------------------------------------
       |LCM-----51   |    LCM-----51   |    LCM------51      |
       --------------------------------------------------|
       |DB0-----P2.0 |    DB4-----P2.4 |    RW-------P0.6    |
       |DB1-----P2.1 |    DB5-----P2.5 |    RS-------P0.7    |
       |DB2-----P2.2 |    DB6-----P2.6 |    E--------P0.5    |
       |DB3-----P2.3 |    DB7-----P2.7 |    VLCD接1K電阻到GND|
       ---------------------------------------------------
接線:模塊TRIG接 P1.2  ECH0 接P1.1

本程序源碼只供學習參考,不得應用于商業用途,如有需要請聯系作者。

[注:AT89x51使用12M或11.0592M晶振,實測使用11.0592M]
=============================================================*/


單片機源程序如下:
  1. #include <AT89x51.H>        //器件配置文件
  2. #include <intrins.h>
  3. #define  RX  P1_1
  4. #define  TX  P1_2

  5. #define LCM_RW  P0_6 //定義LCD引腳
  6. #define LCM_RS  P0_7
  7. #define LCM_E   P0_5
  8. #define LCM_Data  P2


  9. #define Busy    0x80 //用于檢測LCM狀態字中的Busy標識

  10. void LCMInit(void);
  11. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  12. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  13. void Delay5Ms(void);
  14. void Delay400Ms(void);
  15. void Decode(unsigned char ScanCode);
  16. void WriteDataLCM(unsigned char WDLCM);
  17. void WriteCommandLCM(unsigned char WCLCM,BuysC);

  18. unsigned char ReadDataLCM(void);
  19. unsigned char ReadStatusLCM(void);
  20. unsigned char code mcustudio[] ={" WWW*QXMCU*COM  "};
  21. unsigned char code email[] =    {"863888999@QQ.COM"};
  22. unsigned char code Cls[] =      {"                "};
  23. unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

  24. static unsigned char DisNum = 0; //顯示用指針                  
  25.        unsigned int  time=0;
  26.        unsigned long S=0;
  27.        bit      flag =0;
  28.        unsigned char disbuff[4]       ={ 0,0,0,0,};


  29. //寫數據
  30. void WriteDataLCM(unsigned char WDLCM)
  31. {
  32.     ReadStatusLCM(); //檢測忙
  33.     LCM_Data = WDLCM;
  34.     LCM_RS = 1;
  35.     LCM_RW = 0;
  36.     LCM_E = 0; //若晶振速度太高可以在這后加小的延時
  37.     LCM_E = 0; //延時
  38.     LCM_E = 1;
  39. }

  40. //寫指令
  41. void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測
  42. {
  43.     if (BuysC) ReadStatusLCM(); //根據需要檢測忙
  44.     LCM_Data = WCLCM;
  45.     LCM_RS = 0;
  46.     LCM_RW = 0;   
  47.     LCM_E = 0;
  48.     LCM_E = 0;
  49.     LCM_E = 1;   
  50. }

  51. //讀數據
  52. unsigned char ReadDataLCM(void)
  53. {
  54.     LCM_RS = 1;
  55.     LCM_RW = 1;
  56.     LCM_E = 0;
  57.     LCM_E = 0;
  58.     LCM_E = 1;
  59.     return(LCM_Data);
  60. }

  61. //讀狀態
  62. unsigned char ReadStatusLCM(void)
  63. {
  64.     LCM_Data = 0xFF;
  65.     LCM_RS = 0;
  66.     LCM_RW = 1;
  67.     LCM_E = 0;
  68.     LCM_E = 0;
  69.     LCM_E = 1;
  70.     while (LCM_Data & Busy); //檢測忙信號
  71.     return(LCM_Data);
  72. }

  73. void LCMInit(void) //LCM初始化
  74. {
  75.     LCM_Data = 0;
  76.     WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
  77.     Delay5Ms();
  78.     WriteCommandLCM(0x38,0);
  79.     Delay5Ms();
  80.     WriteCommandLCM(0x38,0);
  81.     Delay5Ms();

  82.     WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
  83.     WriteCommandLCM(0x08,1); //關閉顯示
  84.     WriteCommandLCM(0x01,1); //顯示清屏
  85.     WriteCommandLCM(0x06,1); // 顯示光標移動設置
  86.     WriteCommandLCM(0x0F,1); // 顯示開及光標設置
  87. }

  88. //按指定位置顯示一個字符
  89. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  90. {
  91.     Y &= 0x1;
  92.     X &= 0xF; //限制X不能大于15,Y不能大于1
  93.     if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
  94.     X |= 0x80; //算出指令碼
  95.     WriteCommandLCM(X, 1); //發命令字
  96.     WriteDataLCM(DData); //發數據
  97. }

  98. //按指定位置顯示一串字符
  99. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  100. {
  101.     unsigned char ListLength;

  102.   ListLength = 0;
  103.     Y &= 0x1;
  104.     X &= 0xF; //限制X不能大于15,Y不能大于1
  105.     while (DData[ListLength]>0x19) //若到達字串尾則退出
  106.         {
  107.             if (X <= 0xF) //X坐標應小于0xF
  108.                 {
  109.                     DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
  110.                     ListLength++;
  111.                     X++;
  112.                 }
  113.         }
  114. }

  115. //5ms延時
  116. void Delay5Ms(void)
  117. {
  118.     unsigned int TempCyc = 5552;
  119.     while(TempCyc--);
  120. }

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

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品一区二区三区免费视频 | 国产精品一区二区av | 国产欧美精品一区二区三区 | 成人免费一区二区三区视频网站 | 综合亚洲视频 | 免费在线h视频 | 亚洲国产一区二区三区在线观看 | 91久久国产综合久久91精品网站 | 狠狠狠色丁香婷婷综合久久五月 | www.久久久久久久久 | 国产亚洲精品久久情网 | 国产福利在线视频 | 国产福利久久 | 成人h视频 | 亚洲精品一区二区在线观看 | 在线观看免费国产 | 国产精品久久久久aaaa樱花 | 国产美女一区二区 | 欧美日韩精品一区二区三区四区 | 四虎影院一区二区 | 国产精品一区二区av | 久久久国产精品视频 | 亚洲高清在线 | 国产成人精品一区二区 | 欧美日韩精品影院 | 亚洲视频 欧美视频 | 一区二区三区欧美 | 综合网在线 | 久久国产精品精品 | 中文字幕亚洲欧美日韩在线不卡 | 欧美一级大片免费观看 | 亚洲午夜精品一区二区三区 | 国产欧美一区二区三区免费 | 狠狠色狠狠色综合日日92 | 亚洲精品视频一区 | 日本中文在线视频 | 黄色一级电影在线观看 | 欧美激情第一区 | 日韩精品一二三区 | 国产福利在线 | 亚洲黄色av |