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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機超聲波入門學習(新手想學的進來)有仿真

[復制鏈接]
跳轉到指定樓層
樓主
說明: 本貼仿真和源碼是使用以下貼子修改而來

單片機超聲波測距Proteus仿真與源代碼





在原基礎上做了二個版本, 一個是精簡版本, 方便理解超聲波的相關代碼
另一個是自己拓展的思路




  1. /*
  2.         注: 以下代碼真實環璄下,STC89C52最小單片機上測試成功
  3.         使用模塊:
  4.                 1.最小單片機STC89C52
  5.                 2.超聲波HC-SR04
  6.                 3.L298N調速模塊+小風扇
  7.         進階功能(利用超聲波檢測是否有人存在, 自動啟動/停止小風扇):
  8.                 1.超聲波對著人坐的位置(根據實際距離自行調整BJZ的值)
  9.                 2.當檢測到有人時(S<=BJZ 且 Someone>=5), FengShan置高電平(電扇啟動), 并進入循環檢測
  10.                 3.當檢測到無人時(Unmanned>=10), FengShan置低電平(電扇停止), 并進入循環檢測
  11.                 4.當無人時, Unmanned變量+1, Someone變量=0
  12.                 5.當有人時Someone變量+1, Unmanned變量=0
  13. */

  14. /*
  15.         大家可以自行拓展更多實用功能, 如:
  16.                 小便池自動沖水器
  17.                 放門口的來客"歡迎光臨"等等
  18. */

  19. //加載配置文件
  20. #include <reg52.H>
  21. #include <intrins.h>

  22. //類型轉義
  23. #define uchar unsigned char        
  24. #define uint unsigned int
  25. #define ulong unsigned long

  26. /**********************************************************************************************************/

  27. //超聲波接口
  28. sbit RX  = P3^2; //接超聲波的echo引腳
  29. sbit TX  = P3^3; //接超聲波的trig引腳

  30. //用蜂鳴器或Led二極管模擬測試
  31. sbit FengShan= P2^0; //負極接P2^0,正極接VCC(蜂鳴器最好是用三極管放大)

  32. //變量聲明
  33. uint time=0;
  34. uint timer=0;
  35. uchar posit=0;
  36. ulong S=0;        //超聲波檢查距離CM
  37. ulong BJZ=50; //報警距離CM
  38. uint i; //循環記次數
  39. uint Unmanned=0; //檢測到無人的次數
  40. uint Someone=0; //檢測到有人的次數

  41. bit Flag_CSB=0; //超聲波的中斷溢出標志

  42. /**********************************************************************************************************/
  43. //************ 計算 ************
  44. void Conut(void)
  45. {
  46.         time=TH0*256+TL0; //讀出T0的計時數值
  47.         TH0=0;TL0=0; //清空計時器
  48.         S=(time*1.7)/100; //算出來是CM
  49.         //聲音的速度是340m/s,時間的單位是us,計算到秒需要將時間數據/1000000,
  50.         //長度=速度*時間,340*time/1000000,長度數據單位是m轉換成cm需要乘以100得到340*time/10000,
  51.         //小數點都向左移兩位得到3.4*time/100,因為超聲波是往返了,所以再除以2,得到距離數據(time*1.7)/100
  52.         
  53.         if((S>=700) || Flag_CSB==1) //超出測量范圍
  54.         {        
  55.                 FengShan=1; //停止風扇
  56.                 Flag_CSB=0; //中斷溢出標志
  57.         }
  58.         else
  59.         {
  60.                 //距離小于報警值
  61.                 if(S<=BJZ)
  62.                 {        
  63.                         Someone+=1; //有人時+1
  64.                         Unmanned=0; //無人時置0
  65.                         if (Someone>=5) //為了判斷準確, 連續檢測5次有人才會啟動風扇
  66.                         {
  67.                                 FengShan=0; //啟動風扇
  68.                                 Someone=0;
  69.                         }                        
  70.                 }
  71.                 else  //大于
  72.                 {
  73.                         Unmanned+=1; //無人時+1
  74.                         Someone=0; //有人時置0
  75.                         if (Unmanned>=10) //為了判斷準確, 連續檢測10次無人才會停止風扇
  76.                         {
  77.                                 FengShan=1;        //停止風扇
  78.                                 Unmanned=0;
  79.                         }                        
  80.                 }
  81.         }
  82. }


  83. /**********************************************************************************************************/
  84. /***********超聲波的定時器0初始化***********/
  85. void CSB_Timer0(void)
  86. {
  87.         TMOD=0x11; //設T0為方式1
  88.         TH0=0;
  89.         TL0=0;         
  90.         TH1=0xf8; //2MS定時
  91.         TL1=0x30;
  92.         ET0=1; //允許T0中斷
  93.         ET1=1; //允許T1中斷
  94.         TR1=1; //開啟定時器
  95.         EA=1; //開啟總中斷
  96. }

  97. //************ 主函數 ************
  98. void main(void)
  99. {  
  100.         CSB_Timer0();        
  101.         FengShan=0; //啟動風扇

  102.         while(1)
  103.         {
  104.                 while(!RX); //當上次接收完波后,RX引腳是低電平,取反就是1,此while成立,反復判斷RX狀態。當RX沒有接收到返回波時是高電平,取反就是0,此while不成立,跳出
  105.                 TR0=1; //開啟計數
  106.                 while(RX); //當RX沒有接收到返回波,此while成立,程序停在這里一直判斷RX狀態。當RX接收到返回波,RX引腳變為低電平,此while不成立,跳出
  107.                 TR0=0; //停止計數
  108.                 Conut(); //計算
  109.         }
  110. }

  111. /**********************************************************************************************************/
  112. //************ 定時器0處理(超聲波) ************
  113. void dsq0() interrupt 1 //T0中斷用來計數器溢出,超過測距范圍
  114. {
  115.         Flag_CSB=1; //中斷溢出標志
  116. }

  117. //************ 定時器1(超聲波) ************
  118. void dsq1() interrupt 3 //T1中斷用于計800MS啟動模塊
  119. {
  120.         TH1=0xf8;
  121.         TL1=0x30; //定時2ms
  122.         timer++; //變量加
  123.         if(timer>=400) //400次就是800ms
  124.         {
  125.                 timer=0;
  126.                 TX=1; //800MS  啟動一次模塊
  127.                 for(i=0;i<21;i++)
  128.                 {
  129.                 _nop_();
  130.                 }
  131.                 TX=0;
  132.         }
  133. }   
復制代碼

全部資料51hei下載地址:
51超聲波學習.zip (94.74 KB, 下載次數: 26)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲免费网址 | 欧美一级特黄aaa大片在线观看 | 成年人在线观看视频 | 福利视频一区二区 | 成人免费淫片aa视频免费 | 日韩国产免费 | 国产福利视频导航 | 亚洲精彩视频 | 大乳boobs巨大吃奶挤奶 | 日本成人在线观看网站 | 亚洲精品1区 | 91av视频在线 | 欧美三级在线 | 国产欧美一区二区三区久久 | 亚洲福利网 | 亚洲 欧美 另类 综合 偷拍 | 久久精品91久久久久久再现 | 成人在线观看免费视频 | 一区二区三区影院 | 99久久精品一区二区毛片吞精 | 日韩精品av一区二区三区 | 国产精品国产三级国产aⅴ中文 | 99av成人精品国语自产拍 | 国产成人小视频 | 99视频免费在线观看 | 一级做a| 99色综合 | 亚洲精品不卡 | 一区二区三区国产精品 | 亚洲福利在线观看 | 精品欧美一区二区三区免费观看 | 成人福利电影 | av网站在线看 | a级黄色网 | 国产成人精品一区二区三区视频 | 欧美二区乱c黑人 | 岛国av免费在线观看 | 91大片| 欧美一区二区免费 | 在线观看视频中文字幕 | 91在线导航|