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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5000|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STM32超聲波測距程序原理圖PCB資料

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:890577 發(fā)表于 2021-3-11 10:18 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)

單片機源程序如下:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"
  4. #include "timer.h"
  5. #include "HCSR04.h"
  6. #include "led.h"
  7. #include "beep.h"
  8. #include "key.h"
  9. #include "lcd1602.h"
  10. #include "stmflash.h"  //包含頭文件

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

  15. extern u8  TIM3CH1_CAPTURE_STA;                //輸入捕獲狀態(tài)                                                   
  16. extern u16        TIM3CH1_CAPTURE_VAL;        //輸入捕獲值        
  17. u16 fls[4];
  18. u8 k=0;
  19. u32 TL=50;
  20. u8 beep1;
  21. u8 t=0;        
  22. void key() //按鍵函數(shù)
  23. {
  24.         k=KEY_Scan(1); //按鍵掃描的值給K
  25.         if(k == KEY0_PRES) //如果K等于  KEY0_PRES,就說明是按下加按鍵
  26.         {
  27.                 TL++;     //數(shù)據(jù)加一,如果大于400,則減一,保持最大400
  28.                 if(TL>400)
  29.                         TL--;
  30.                 fls[0]=TL;
  31.                 STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)fls,1); //存儲
  32.         }
  33.         
  34.         if(k == KEY1_PRES)//同上,不過是減
  35.         {
  36.                 TL--;
  37.                 if(TL<5)
  38.                         TL++;
  39.                 fls[0]=TL;
  40.                 STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)fls,1);
  41.         }
  42.         
  43. }

  44. void ceju()
  45. {

  46.         Trig=1;                  
  47.         delay_us(20);                                    
  48.         Trig=0;              //啟動信號

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

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

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

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

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

  60. }

  61. void show()
  62. {        
  63.         LCD1602_Show_Str(0,0,"Distance:");    //顯示
  64.         if(S>=100&&S<=400) LCD1602_Write_Dat(S/100%10+0x30); //這里是測速數(shù)據(jù)
  65.         else LCD1602_Show_Str(9,0," ");
  66.         if(S>=10) LCD1602_Write_Dat(S/10%10+0x30);
  67.         else LCD1602_Show_Str(10,0," ");
  68.         LCD1602_Write_Dat(S%10+0x30);
  69.         LCD1602_Show_Str(12,0,"cm      ");
  70.         
  71.         LCD1602_Show_Str(0,1,"alarm  :"); //這里開始顯示報警數(shù)據(jù),下面這三段,其實就是判斷閾值數(shù)據(jù)是百位數(shù)還是十位數(shù)還是個位數(shù),如果是個位數(shù),顯示個位數(shù)據(jù),百位十位顯示空
  72.         if(TL>=100&&TL<=400)
  73.         {
  74.                 LCD1602_Write_Dat(TL/100%10+0x30);
  75.                 LCD1602_Write_Dat(TL/10%10+0x30);
  76.                 LCD1602_Write_Dat(TL%10+0x30);
  77.                 LCD1602_Show_Str(12,1,"cm      ");
  78.         }
  79.         
  80.    if(TL>=10&&TL<100)                  
  81.         {
  82.                 LCD1602_Show_Str(9,1," ");
  83.                 LCD1602_Write_Dat(TL/10%10+0x30);
  84.                 LCD1602_Write_Dat(TL%10+0x30);
  85.                 LCD1602_Show_Str(12,1,"cm      ");
  86.         }
  87.         if(TL>0&&TL<10)
  88.         {
  89.                 LCD1602_Show_Str(9,1," ");
  90.                 LCD1602_Show_Str(10,1," ");
  91.                 LCD1602_Write_Dat(TL%10+0x30);
  92.                 LCD1602_Show_Str(12,1,"cm      ");
  93.         }
  94. }
  95. void problem()  //報警函數(shù)
  96. {
  97.         if(S<TL)     //小于閾值,蜂鳴器開始響,對應(yīng)指示燈亮,否則蜂鳴器不響
  98.         {
  99.                 beep1=1;
  100.                 LED1=1;
  101.         }
  102.         else
  103.         {
  104.                 beep1=0;
  105.                 LED1=0;
  106.                 LED0=1;
  107.         }
  108. }

  109. int main(void)
  110. {               
  111.         u16 datatemp[1];
  112.         BEEP_Init();
  113.         KEY_Init();
  114.         delay_init();                     //延時函數(shù)初始化         
  115.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
  116.         uart_init(115200);         //串口初始化為115200
  117.         LED_Init();                             //LED端口初始化
  118.         UltrasonicWave_Configuration();  //初始化超聲IO
  119.         TIM3_Cap_Init(1,72-1);        //以1Mhz的頻率計數(shù),第一個選項,最小只能是1
  120.         LCD1602_Init();
  121.         STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,1);
  122.         TL=datatemp[0];
  123.         if(TL<5||TL>400)
  124.         TL=50;
  125.         ceju();
  126.         printf("Distance"); //串口打印一下,調(diào)試用
  127.   while(1)
  128.         {
  129.                 if(beep1==1) //如果蜂鳴器標志等于1,則開始滴滴叫,指示燈也是閃爍
  130.                 {
  131.                         BEEP=!BEEP;
  132.                         LED0=!LED0;
  133.                         
  134.                 }
  135.                         else
  136.                                 BEEP=0;
  137.                 show();   //調(diào)用顯示函數(shù)
  138.                 key();    //調(diào)用按鍵函數(shù)
  139.                 problem();//調(diào)用報警處理函數(shù)
  140.                 t++;      //變量自加,加到5的時候,對5取余會等于0,則啟動一次測距函數(shù)
  141.                 if(t%5==0)
  142.                 {
  143.                         t=0;
  144.                         ceju();
  145.                 }
  146.         }
  147. }
復(fù)制代碼

全部資料51hei下載地址:
STM32 超聲波測距完整資料.7z (343.7 KB, 下載次數(shù): 116)

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

使用道具 舉報

沙發(fā)
ID:1083442 發(fā)表于 2023-6-28 20:41 | 只看該作者
只有初始距離0和鬧鐘5cm,超聲波無作用
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩国产一区二区三区 | 91综合在线观看 | 久久精品国产免费看久久精品 | 中文字幕一区二区三区四区五区 | 日本午夜精品一区二区三区 | 国产不卡在线 | 日韩久久久久久 | 色婷婷狠狠| 国产一极毛片 | 成年人免费看的视频 | 欧美黄色一区 | 国产精品一区视频 | 亚洲日本欧美日韩高观看 | 亚洲精品电影在线观看 | 黄色一级免费看 | 国产真实乱对白精彩久久小说 | 欧美激情精品久久久久久 | 伊人网综合在线 | 成人免费视频在线观看 | 久久久久久久一区二区三区 | 性色av网站 | 久久久福利 | 亚洲视频区 | 亚洲一区二区电影在线观看 | 影音先锋久久 | 妞干网福利视频 | 婷婷丁香激情 | 国产精品视频免费看 | www亚洲成人| 一区二区三区在线播放视频 | 精久久久 | 日韩精品久久久久 | h视频免费在线观看 | 99久久精品一区二区毛片吞精 | 亚洲精品一二区 | av手机免费在线观看 | 国产成人在线视频 | 欧美日韩久 | 亚洲视频在线观看 | 国产精品久久久久999 | a级在线免费视频 |