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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機超聲波車位系統Proteus仿真程序

[復制鏈接]
跳轉到指定樓層
樓主
在proteus中通過3個超聲波檢測距離實現對車位剩余數量的檢測

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


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

  3. #define uchar unsigned char        // 以后unsigned char就可以用uchar代替
  4. #define uint  unsigned int       

  5. uint dis_temp=50;
  6. uint Margin;
  7. uint cwA,cwP,cwS;

  8. sbit LcdRs_P   = P2^7;                // 1602液晶的RS管腳      
  9. sbit LcdRw_P   = P2^6;                // 1602液晶的RW管腳
  10. sbit LcdEn_P   = P2^5;                // 1602液晶的EN管腳
  11. sbit Trig_P    = P2^2;                // 超聲波模塊的Trig管腳
  12. sbit Echo_P    = P2^3;                // 超聲波模塊的Echo管腳
  13. sbit Trig_A    = P2^0;                // 超聲波模塊的Trig管腳
  14. sbit Echo_A    = P2^1;                // 超聲波模塊的Echo管腳
  15. sbit Trig_S    = P1^6;                // 超聲波模塊的Trig管腳
  16. sbit Echo_S    = P1^7;                // 超聲波模塊的Echo管腳


  17. /*********************************************************/
  18. // 毫秒級的延時函數,time是要延時的毫秒數
  19. /*********************************************************/
  20. void DelayMs(uint time)
  21. {
  22.         uint i,j;
  23.         for(i=0;i<time;i++)
  24.                 for(j=0;j<112;j++);
  25. }


  26. /*********************************************************/
  27. // 1602液晶寫命令函數,cmd就是要寫入的命令
  28. /*********************************************************/
  29. void LcdWriteCmd(uchar cmd)
  30. {
  31.         LcdRs_P = 0;
  32.         LcdRw_P = 0;
  33.         LcdEn_P = 0;
  34.         P0=cmd;
  35.         DelayMs(2);
  36.         LcdEn_P = 1;   
  37.         DelayMs(2);
  38.         LcdEn_P = 0;       
  39. }


  40. /*********************************************************/
  41. // 1602液晶寫數據函數,dat就是要寫入的數據
  42. /*********************************************************/
  43. void LcdWriteData(uchar dat)
  44. {
  45.         LcdRs_P = 1;
  46.         LcdRw_P = 0;
  47.         LcdEn_P = 0;
  48.         P0=dat;
  49.         DelayMs(2);
  50.         LcdEn_P = 1;   
  51.         DelayMs(2);
  52.         LcdEn_P = 0;
  53. }


  54. /*********************************************************/
  55. // 1602液晶初始化函數
  56. /*********************************************************/
  57. void LcdInit()
  58. {
  59.         LcdWriteCmd(0x38);        // 16*2顯示,5*7點陣,8位數據口
  60.         LcdWriteCmd(0x0C);        // 開顯示,不顯示光標
  61.         LcdWriteCmd(0x06);        // 地址加1,當寫入數據后光標右移
  62.         LcdWriteCmd(0x01);        // 清屏
  63. }


  64. /*********************************************************/
  65. // 液晶光標定位函數
  66. /*********************************************************/
  67. void LcdGotoXY(uchar line,uchar column)
  68. {
  69.         // 第一行
  70.         if(line==0)        
  71.                 LcdWriteCmd(0x80+column);
  72.         // 第二行
  73.         if(line==1)        
  74.                 LcdWriteCmd(0x80+0x40+column);
  75. }



  76. /*********************************************************/
  77. // 液晶輸出字符串函數
  78. /*********************************************************/
  79. void LcdPrintStr(uchar *str)
  80. {
  81.         while(*str!='\0')
  82.                         LcdWriteData(*str++);
  83. }


  84. /*********************************************************/
  85. // 液晶輸出數字
  86. /*********************************************************/
  87. void LcdPrintNum(uint num)
  88. {
  89.         LcdWriteData(num/100+0x30);                                // 百位
  90.         LcdWriteData(num%100/10+0x30);                // 十位
  91.         LcdWriteData(num%10+0x30);                                // 個位
  92. }


  93. /*********************************************************/
  94. // 計算測到的距離
  95. /*********************************************************/
  96. uint GetDistanceP(void)
  97. {
  98.         uint sp;                                        // 用于記錄測得的距離

  99.         TH0=0;
  100.         TL0=0;

  101.         Trig_P=1;                                        // 給超聲波模塊一個開始脈沖
  102.         DelayMs(1);
  103.         Trig_P=0;

  104.         while(!Echo_P);                // 等待超聲波模塊的返回脈沖
  105.         TR0=1;                                                // 啟動定時器,開始計時
  106.         while(Echo_P);                // 等待超聲波模塊的返回脈沖結束
  107.         TR0=0;                                                // 停止定時器,停止計時

  108.         sp=((TH0*256+TL0)*0.034)/2;                // 距離cm=(時間us * 速度cm/us)/2

  109.         return sp;
  110. }
  111. uint GetDistanceS(void)
  112. {
  113.         uint ss;                                        // 用于記錄測得的距離

  114.         TH0=0;
  115.         TL0=0;

  116.         Trig_S=1;                                        // 給超聲波模塊一個開始脈沖
  117.         DelayMs(1);
  118.         Trig_S=0;

  119.         while(!Echo_S);                // 等待超聲波模塊的返回脈沖
  120.         TR0=1;                                                // 啟動定時器,開始計時
  121.         while(Echo_S);                // 等待超聲波模塊的返回脈沖結束
  122.         TR0=0;                                                // 停止定時器,停止計時

  123.         ss=((TH0*256+TL0)*0.034)/2;                // 距離cm=(時間us * 速度cm/us)/2

  124.         return ss;
  125. }
  126. uint GetDistanceA(void)
  127. {
  128.         uint sa;                                        // 用于記錄測得的距離

  129.         TH0=0;
  130.         TL0=0;

  131.         Trig_A=1;                                        // 給超聲波模塊一個開始脈沖
  132.         DelayMs(1);
  133.         Trig_A=0;

  134.         while(!Echo_A);                // 等待超聲波模塊的返回脈沖
  135.         TR0=1;                                                // 啟動定時器,開始計時
  136.         while(Echo_A);                // 等待超聲波模塊的返回脈沖結束
  137.         TR0=0;                                                // 停止定時器,停止計時

  138.         sa=((TH0*256+TL0)*0.034)/2;                // 距離cm=(時間us * 速度cm/us)/2

  139.         return sa;
  140. }
  141. void detection(uint dis,uchar buf)
  142. {
  143. if(dis>=dis_temp)
  144. {
  145. switch(buf)
  146.    {
  147.           case'S':RD = 0;cwS=1;break;     
  148.           case'P':WR = 0;cwP=1;break;
  149.           case'A':T1 = 0;cwA=1;break;                  

  150.    }
  151. }
  152. if(dis<dis_temp)
  153. {
  154.         switch(buf)
  155.    {
  156.           case'S':RD = 1;cwS=0;break;     
  157.           case'P':WR = 1;cwP=0;break;
  158.           case'A':T1 = 1;cwA=0;break;                  

  159.    }
  160. }
  161.   Margin=cwS+cwP+cwA;
  162.   LcdGotoXY(1,13);                                                          // 定位到第1行第11列
  163.         LcdWriteData(Margin%10+0x30);                                // 顯示車位余量

  164. }
  165. /*********************************************************/
  166. // 主函數
  167. /*********************************************************/
  168. void main()
  169. {
  170. //        uchar dat1,dat2;
  171.         uint distP,distA,distS;
  172.        
  173.         Trig_P=0;
  174.         Trig_A=0;
  175.         Trig_S=0;
  176.        
  177.         LcdInit();                                                                                                // 執行液晶初始化
  178.         TMOD = 0x01;                                                                                        // 選擇定時器0,并且確定是工作方式1(為了超聲波模塊測量距離計時用的)

  179.         LcdGotoXY(0,0);                                                                    // 定位到第0行第0列
  180.         LcdPrintStr("S=   cm");        // 第0行顯示“HC-SR04 System”
  181.         LcdGotoXY(0,9);                                                                    // 定位到第0行第0列
  182.         LcdPrintStr("P=   cm");        // 第0行顯示“HC-SR04 System”
  183.         LcdGotoXY(1,0);                                                                    // 定位到第1行第0列
  184.         LcdPrintStr("A=   cm");        // 第1行顯示“S=   cm”
  185.         LcdGotoXY(1,9);                                                                    // 定位到第1行第0列
  186.         LcdPrintStr("KY:  /3");        // 第1行顯示“S=   cm”



  187.         while(1)
  188.         {
  189.             distS=GetDistanceS();                                                        // 通過超聲波模塊獲取距離
  190.                   LcdGotoXY(0,2);                                                           // 定位到第1行第2列
  191.                   LcdPrintNum(distS);                                                        // 將獲取到的距離在液晶上面顯示
  192.                   detection(distS,'S');
  193.                
  194.                   distP=GetDistanceP();                                                        // 通過超聲波模塊獲取距離
  195.                   LcdGotoXY(0,11);                                                          // 定位到第1行第11列
  196.                   LcdPrintNum(distP);                                                        // 將獲取到的距離在液晶上面顯示
  197.                          detection(distP,'P');
  198.                
  199.             distA=GetDistanceA();                                                       
  200.                   LcdGotoXY(1,2);                                                            // 定位到第2行第11列
  201.                   LcdPrintNum(distA);                                                       
  202.                          detection(distA,'A');
  203.                


  204.         }
  205. }
復制代碼

所有資料51hei提供下載:
超聲波車位檢測Y.zip (82.03 KB, 下載次數: 73)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:89286 發表于 2020-3-3 22:10 | 只看該作者
thanks for sharing
回復

使用道具 舉報

板凳
ID:708403 發表于 2020-3-24 16:46 | 只看該作者
這個超聲波測距是怎么畫出來的,為啥我找不到啊

回復

使用道具 舉報

地板
ID:404470 發表于 2020-3-26 14:06 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品一区二区三区在线视频 | 国产精品一区二区三区久久久 | 色站综合| a级在线| 日本欧美在线 | 国产精品久久久久久久久久免费看 | 亚洲欧洲在线看 | 蜜桃久久 | 成人精品一区 | 9色网站 | 国产精品成人国产乱 | 亚洲成人二区 | 日韩视频免费在线 | 超碰男人天堂 | 天堂精品视频 | 久久久综合久久 | 国产精品国产三级国产aⅴ原创 | 亚洲国产成人av好男人在线观看 | 99爱免费 | 久久久国产精品一区 | 在线视频一区二区 | 国产欧美精品一区二区色综合朱莉 | 亚洲欧美在线观看视频 | 天天草天天干天天 | 欧美综合在线观看 | 日本午夜视频 | 成人免费在线视频 | 黄色香蕉视频在线观看 | 午夜爽爽男女免费观看hd | 国产福利在线视频 | 91视频日本| 懂色中文一区二区三区在线视频 | 国产精品国产成人国产三级 | 成人一区二区三区在线 | av免费看片| www.色综合| 国产成人99久久亚洲综合精品 | 免费视频99| 欧美视频三区 | 97视频成人 | 欧洲精品一区 |