一個星期做的設計,沒加溫補,感興趣的可以自己加上,親自測試過,沒任何問題,附件里有原理圖代碼
制作出來的實物圖如下:
IMG_20220329_114241.jpg (1.86 MB, 下載次數: 31)
下載附件
2022-3-29 12:01 上傳
電路原理圖如下:
jietu .jpg (94.4 KB, 下載次數: 20)
下載附件
原理圖
2022-3-29 11:29 上傳
單片機源程序如下:
- /*************************************************
- *STC15單片機超聲波測距數碼管顯示:
- *定時器0用于測量時間
- *定時器2用于數碼管掃描
- *
- *模塊工作原理:
- *1、采用(I0觸發測距、給至少10us的高電平信號)
- *2、模塊自動發送8個40khz的方波、自動檢測是否有信號返回
- *3、有信號返回、通過I0輸出一高電平、高電平持續的時間就是超聲波從發射到返回的時間、
- * 測試距離=(高電平時間*聲速(340M/s)/2)
- *
- *
- *
- *
- */
- #include <stc15.h>
- #include <intrins.h>
- #include "oled.h"
- #define SETDISTANCE 10 //設置報警值,低于此值,蜂鳴器報警
- int count = 0,count1=0;
-
- sbit BEEP = P3^4; //蜂鳴器接口
- sbit ECHO = P0^0; //ECHO
- sbit TRIG = P0^1; //Trig
- unsigned int time=0; //用于定時時間
- unsigned int time0=0; //用于定時器計數
- unsigned long S=0; //存放計算出來的距離
-
- bit flag =0; //定時器0溢出標志位
- //bit Beepflag =0;
-
-
- /* 函數聲明 */
- void Display(void);
- void Conut(void);
- void Start_modle(void);
- //void delay_ms(int);
- void Timer0Init(void) //定時器0初始化
- {
- TMOD=0x01; //設定定時器模式
- TH0=0X00; //定時器0初值為0
- TL0=0X00;
- ET0=1; //開啟定時器0中斷
- TR0=0; //先不開啟定時器0
- EA=1; //開總中斷
- }
- void Timer2Init(void) //定時器2初始化
- {
- AUXR &= 0xFB; //定時器時鐘為12T模式
-
- T2L = 0XCD; //設定定時器初值 2Ms
- T2H = 0XF8;
- AUXR |= 0x10; //開啟定時2中斷
- IE2 =0X04; //啟動定時器2
- }
- /*************主函數*******************************************/
- void main( void )
- {
- OLED_Init(); //初始化OLED
- // OLED_On();
- // delay_ms(800);
- OLED_Clear();
- OLED_ShowCHinese(20,2,0);//
- OLED_ShowCHinese(38,2,1);//
- OLED_ShowString(56,2,"1901",16);//1901
- OLED_ShowCHinese(20,4,2);//姓
- OLED_ShowCHinese(38,4,3);//名
- OLED_ShowString(56,4,":",16);//:
- OLED_ShowCHinese(66,4,4);//
- OLED_ShowCHinese(82,4,5);//
- delay_ms(800); //清屏時間
- OLED_Clear();
- Timer0Init();
- Timer2Init();
- while(1)
- {
- Start_modle();
- while(!ECHO); //當ECHO為零時等待
- TR0=1; //開啟計數
- while(ECHO==1);//&&(flag==0)); //當ECHO為1計數并等待
- TR0=0; //關閉計數
- Conut(); //計算
- }
- }
- /**********************啟動模塊*********************************/
- void Start_modle(void)
- {
- TRIG = 1; //拉高TRIG
- _nop_(); //延時10us以上
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- TRIG = 0; //拉低TRIG
- }
-
- /**********************計算距離方法*******************************/
- void Conut(void)
- {
- unsigned char a,b,c;
- time=TH0*256+TL0; //計算高電平時間
- TH0=0; //復位定時器0的數值
- TL0=0;
-
- OLED_ShowCHinese(0,4,6);//距
- OLED_ShowCHinese(16,4,7);//離
- OLED_ShowString(32,4,":",16);//:
-
- OLED_ShowCHinese(0,2,8);//超
- OLED_ShowCHinese(16,2,9);//聲
- OLED_ShowCHinese(32,2,10);//波
- OLED_ShowCHinese(48,2,11);//測
- OLED_ShowCHinese(64,2,12);//距
-
- S=(time*1.7)/100; //換算成M
- if((S>=400)||flag==1) //如果測量超時
- {
- flag=0;
- OLED_ShowString(42,4,"-",16);
- OLED_ShowString(52,4,"-",16);
- OLED_ShowString(62,4,"-",16);
- OLED_ShowString(72,4,"-",16);
- }
- else
- {
- a=S%1000/100;
- b=S%1000%100/10;
- c=S%1000%10 %10;
- OLED_ShowNum(42,4,a,1,16);
- OLED_ShowString(52,4,".",16);
- OLED_ShowNum(62,4,b,1,16);
- OLED_ShowNum(72,4,c,1,16);
- OLED_ShowString(82,4,"M/S",16);
- }
- }
-
- /********************* 定時器0中斷函數***********************************/
- void Timer0Interrupt(void) interrupt 1
- {
- flag = 1;
- }
- /**************定時器2中斷函數*****************/
- void Timer2Interrupt(void) interrupt 12
- {
- time0++; //用于定時時間
- count++;
- if(count >=100)
- {
- count = 0;
- if(S<SETDISTANCE) //判斷距離是否小于設定值
- {
- BEEP = ~BEEP ;
- }
- else
- BEEP = 1;
- }
- if(time0>=400) //每800ms啟動一次
- {
- time0=0;
- Start_modle();
- }
- }
復制代碼
Keil代碼下載:
STC15超聲波測距OLED顯示.7z
(54.15 KB, 下載次數: 71)
2022-3-29 22:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|