說明: 本貼仿真和源碼是使用以下貼子修改而來
單片機超聲波測距Proteus仿真與源代碼
51hei截圖20201028204210544.jpg (159.69 KB, 下載次數: 52)
下載附件
2020-10-28 20:42 上傳
在原基礎上做了二個版本, 一個是精簡版本, 方便理解超聲波的相關代碼
另一個是自己拓展的思路
無標題.png (10.9 KB, 下載次數: 51)
下載附件
2020-10-28 20:44 上傳
- /*
- 注: 以下代碼真實環璄下,STC89C52最小單片機上測試成功
- 使用模塊:
- 1.最小單片機STC89C52
- 2.超聲波HC-SR04
- 3.L298N調速模塊+小風扇
- 進階功能(利用超聲波檢測是否有人存在, 自動啟動/停止小風扇):
- 1.超聲波對著人坐的位置(根據實際距離自行調整BJZ的值)
- 2.當檢測到有人時(S<=BJZ 且 Someone>=5), FengShan置高電平(電扇啟動), 并進入循環檢測
- 3.當檢測到無人時(Unmanned>=10), FengShan置低電平(電扇停止), 并進入循環檢測
- 4.當無人時, Unmanned變量+1, Someone變量=0
- 5.當有人時Someone變量+1, Unmanned變量=0
- */
- /*
- 大家可以自行拓展更多實用功能, 如:
- 小便池自動沖水器
- 放門口的來客"歡迎光臨"等等
- */
- //加載配置文件
- #include <reg52.H>
- #include <intrins.h>
- //類型轉義
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- /**********************************************************************************************************/
- //超聲波接口
- sbit RX = P3^2; //接超聲波的echo引腳
- sbit TX = P3^3; //接超聲波的trig引腳
- //用蜂鳴器或Led二極管模擬測試
- sbit FengShan= P2^0; //負極接P2^0,正極接VCC(蜂鳴器最好是用三極管放大)
- //變量聲明
- uint time=0;
- uint timer=0;
- uchar posit=0;
- ulong S=0; //超聲波檢查距離CM
- ulong BJZ=50; //報警距離CM
- uint i; //循環記次數
- uint Unmanned=0; //檢測到無人的次數
- uint Someone=0; //檢測到有人的次數
- bit Flag_CSB=0; //超聲波的中斷溢出標志
- /**********************************************************************************************************/
- //************ 計算 ************
- void Conut(void)
- {
- time=TH0*256+TL0; //讀出T0的計時數值
- TH0=0;TL0=0; //清空計時器
- S=(time*1.7)/100; //算出來是CM
- //聲音的速度是340m/s,時間的單位是us,計算到秒需要將時間數據/1000000,
- //長度=速度*時間,340*time/1000000,長度數據單位是m轉換成cm需要乘以100得到340*time/10000,
- //小數點都向左移兩位得到3.4*time/100,因為超聲波是往返了,所以再除以2,得到距離數據(time*1.7)/100
-
- if((S>=700) || Flag_CSB==1) //超出測量范圍
- {
- FengShan=1; //停止風扇
- Flag_CSB=0; //中斷溢出標志
- }
- else
- {
- //距離小于報警值
- if(S<=BJZ)
- {
- Someone+=1; //有人時+1
- Unmanned=0; //無人時置0
- if (Someone>=5) //為了判斷準確, 連續檢測5次有人才會啟動風扇
- {
- FengShan=0; //啟動風扇
- Someone=0;
- }
- }
- else //大于
- {
- Unmanned+=1; //無人時+1
- Someone=0; //有人時置0
- if (Unmanned>=10) //為了判斷準確, 連續檢測10次無人才會停止風扇
- {
- FengShan=1; //停止風扇
- Unmanned=0;
- }
- }
- }
- }
- /**********************************************************************************************************/
- /***********超聲波的定時器0初始化***********/
- void CSB_Timer0(void)
- {
- TMOD=0x11; //設T0為方式1
- TH0=0;
- TL0=0;
- TH1=0xf8; //2MS定時
- TL1=0x30;
- ET0=1; //允許T0中斷
- ET1=1; //允許T1中斷
- TR1=1; //開啟定時器
- EA=1; //開啟總中斷
- }
- //************ 主函數 ************
- void main(void)
- {
- CSB_Timer0();
- FengShan=0; //啟動風扇
- while(1)
- {
- while(!RX); //當上次接收完波后,RX引腳是低電平,取反就是1,此while成立,反復判斷RX狀態。當RX沒有接收到返回波時是高電平,取反就是0,此while不成立,跳出
- TR0=1; //開啟計數
- while(RX); //當RX沒有接收到返回波,此while成立,程序停在這里一直判斷RX狀態。當RX接收到返回波,RX引腳變為低電平,此while不成立,跳出
- TR0=0; //停止計數
- Conut(); //計算
- }
- }
- /**********************************************************************************************************/
- //************ 定時器0處理(超聲波) ************
- void dsq0() interrupt 1 //T0中斷用來計數器溢出,超過測距范圍
- {
- Flag_CSB=1; //中斷溢出標志
- }
- //************ 定時器1(超聲波) ************
- void dsq1() interrupt 3 //T1中斷用于計800MS啟動模塊
- {
- TH1=0xf8;
- TL1=0x30; //定時2ms
- timer++; //變量加
- if(timer>=400) //400次就是800ms
- {
- timer=0;
- TX=1; //800MS 啟動一次模塊
- for(i=0;i<21;i++)
- {
- _nop_();
- }
- TX=0;
- }
- }
復制代碼
全部資料51hei下載地址:
51超聲波學習.zip
(94.74 KB, 下載次數: 26)
2020-10-28 20:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|