找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1987|回復: 0
打印 上一主題 下一主題
收起左側(cè)

STM32單片機超聲波測距程序 原理圖PCB文件

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:396474 發(fā)表于 2022-11-18 15:36 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
STM32超聲波測距protel99se畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機源程序如下:
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "HCSR04.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "lcd1602.h"
#include "stmflash.h"  //包含頭文件

unsigned long S=0; //定義超聲數(shù)據(jù)
#define FLASH_SAVE_ADDR  0X0800FF00                //設置FLASH 保存地址(必須為偶數(shù),且其值要大于本代碼所占用FLASH的大小+0X08000000)
extern unsigned long Clock_time;   
unsigned char Send_flag=0;

extern u8  TIM3CH1_CAPTURE_STA;                //輸入捕獲狀態(tài)                                                   
extern u16        TIM3CH1_CAPTURE_VAL;        //輸入捕獲值        
u16 fls[4];
u8 k=0;
u32 TL=50;
u8 beep1;
u8 t=0;        
void key() //按鍵函數(shù)
{
        k=KEY_Scan(1); //按鍵掃描的值給K
        if(k == KEY0_PRES) //如果K等于  KEY0_PRES,就說明是按下加按鍵
        {
                TL++;     //數(shù)據(jù)加一,如果大于400,則減一,保持最大400
                if(TL>400)
                        TL--;
                fls[0]=TL;
                STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)fls,1); //存儲
        }
        
        if(k == KEY1_PRES)//同上,不過是減
        {
                TL--;
                if(TL<5)
                        TL++;
                fls[0]=TL;
                STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)fls,1);
        }
        
}

void ceju()
{

        Trig=1;                  
        delay_us(20);                                    
        Trig=0;              //啟動信號

        S=0;                     //清零距離數(shù)據(jù)
        Clock_time=0;
        TIM_Cmd(TIM3, DISABLE);  //關定時器,清零計時變量        

        while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)); //等待檢測到高電平

        Clock_time=0;
        TIM_Cmd(TIM3, ENABLE);  //開定時器

        while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1&&Clock_time<47058);  //只要是高,一直算時間,如果時間計數(shù)超過 47058,所說有問題,直接跳過,47058不一定精確,是一個大概值,

        S=((Clock_time*2)*340/10000)/2;   //時間變量是2us加一,乘以速度,因為時間是us,換成秒是除以1000000,保留兩位小數(shù),所以除以 10000,然后除以二得到單方面距離
        TIM_Cmd(TIM3, DISABLE);  //關定時器        
        Clock_time=0;            //清零數(shù)據(jù)
        printf("Distance:%d cm\r\n",S);//打印總的高點平時間

}

void show()
{        
        LCD1602_Show_Str(0,0,"Distance:");    //顯示
        if(S>=100&&S<=400) LCD1602_Write_Dat(S/100%10+0x30); //這里是測速數(shù)據(jù)
        else LCD1602_Show_Str(9,0," ");
        if(S>=10) LCD1602_Write_Dat(S/10%10+0x30);
        else LCD1602_Show_Str(10,0," ");
        LCD1602_Write_Dat(S%10+0x30);
        LCD1602_Show_Str(12,0,"cm      ");
        
        LCD1602_Show_Str(0,1,"alarm  :"); //這里開始顯示報警數(shù)據(jù),下面這三段,其實就是判斷閾值數(shù)據(jù)是百位數(shù)還是十位數(shù)還是個位數(shù),如果是個位數(shù),顯示個位數(shù)據(jù),百位十位顯示空
        if(TL>=100&&TL<=400)
        {
                LCD1602_Write_Dat(TL/100%10+0x30);
                LCD1602_Write_Dat(TL/10%10+0x30);
                LCD1602_Write_Dat(TL%10+0x30);
                LCD1602_Show_Str(12,1,"cm      ");
        }
        
   if(TL>=10&&TL<100)                  
        {
                LCD1602_Show_Str(9,1," ");
                LCD1602_Write_Dat(TL/10%10+0x30);
                LCD1602_Write_Dat(TL%10+0x30);
                LCD1602_Show_Str(12,1,"cm      ");
        }
        if(TL>0&&TL<10)
        {
                LCD1602_Show_Str(9,1," ");
                LCD1602_Show_Str(10,1," ");
                LCD1602_Write_Dat(TL%10+0x30);
                LCD1602_Show_Str(12,1,"cm      ");
        }
}
void problem()  //報警函數(shù)
{
        if(S<TL)     //小于閾值,蜂鳴器開始響,對應指示燈亮,否則蜂鳴器不響
        {
                beep1=1;
                LED1=1;
        }
        else
        {
                beep1=0;
                LED1=0;
                LED0=1;
        }
}

int main(void)
{               
        u16 datatemp[1];
        BEEP_Init();
        KEY_Init();
        delay_init();                     //延時函數(shù)初始化         
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
        uart_init(115200);         //串口初始化為115200
        LED_Init();                             //LED端口初始化
        UltrasonicWave_Configuration();  //初始化超聲IO
        TIM3_Cap_Init(1,72-1);        //以1Mhz的頻率計數(shù),第一個選項,最小只能是1
        LCD1602_Init();
        STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,1);
        TL=datatemp[0];
        if(TL<5||TL>400)
        TL=50;
        ceju();
        printf("Distance"); //串口打印一下,調(diào)試用
  while(1)
        {
                if(beep1==1) //如果蜂鳴器標志等于1,則開始滴滴叫,指示燈也是閃爍
                {
                        BEEP=!BEEP;
                        LED0=!LED0;
                        
                }
                        else
                                BEEP=0;
                show();   //調(diào)用顯示函數(shù)
                key();    //調(diào)用按鍵函數(shù)
                problem();//調(diào)用報警處理函數(shù)
                t++;      //變量自加,加到5的時候,對5取余會等于0,則啟動一次測距函數(shù)
                if(t%5==0)
                {
                        t=0;
                        ceju();
                }
        }
}

下載: STM32 超聲波測距程序和protel99格式的PCB原理圖.7z (343.72 KB, 下載次數(shù): 41)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表