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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32之TIM2收發四路超聲波(寄存器版)

[復制鏈接]
跳轉到指定樓層
樓主
ID:250368 發表于 2017-11-17 12:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如題,采用定時器2控制。不喜勿噴。

單片機源程序如下:
  1. #include "timer.h"
  2. /**************************************************************************
  3. 函數功能:定時器3通道3輸入捕獲初始化
  4. 入口參數:入口參數:arr:自動重裝值  psc:時鐘預分頻數
  5. 返回  值:無
  6. **************************************************************************/
  7. void TIM2_Cap_Init(u16 arr,u16 psc)       
  8. {         
  9.         RCC->APB1ENR|=1<<0;     //TIM2時鐘使能     
  10.         RCC->APB2ENR|=1<<2;            //使能PORTB時鐘  
  11.        
  12.         GPIOA->CRL&=0X00000000;
  13.   GPIOA->CRL|=0X22228888;       
  14.        
  15.   TIM2->ARR=arr;                  //設定計數器自動重裝值   
  16.         TIM2->PSC=psc;                  //預分頻器
  17.        
  18.   TIM2->CCMR1|=1<<0;        //選擇輸入端  1通道配置為輸入
  19.         TIM2->CCMR1|=0<<4;         //配置輸入濾波器 不濾波
  20.         TIM2->CCMR1|=0<<2;         //配置輸入分頻,不分頻
  21.         TIM2->CCER|=1<<0;         //允許捕獲計數器的值到捕獲寄存器中       
  22.         TIM2->CCER|=0<<1;         //上升沿捕獲
  23.         TIM2->DIER|=1<<1;   //允許捕獲中斷
  24.        
  25.         TIM2->CCMR1|=1<<8;        //選擇輸入端  2通道配置為輸入
  26.         TIM2->CCMR1|=0<<12;         //配置輸入濾波器 不濾波
  27.         TIM2->CCMR1|=0<<10;         //配置輸入分頻,不分頻
  28.         TIM2->CCER|=1<<4;         //允許捕獲計數器的值到捕獲寄存器中
  29.         TIM2->CCER|=0<<5;         //上升沿捕獲
  30.         TIM2->DIER|=1<<2;   //允許捕獲中斷

  31.         TIM2->CCMR2|=1<<0;        //選擇輸入端  3通道配置為輸入
  32.         TIM2->CCMR2|=0<<4;         //配置輸入濾波器 不濾波
  33.         TIM2->CCMR2|=0<<2;         //配置輸入分頻,不分頻
  34.         TIM2->CCER|=1<<8;         //允許捕獲計數器的值到捕獲寄存器中
  35.         TIM2->CCER|=0<<9;         //上升沿捕獲
  36.         TIM2->DIER|=1<<3;   //允許捕獲中斷
  37.        
  38.         TIM2->CCMR2|=1<<8;          //0選擇輸入端  4通道配置為輸入
  39.         TIM2->CCMR2|=0<<12;          //4配置輸入濾波器 不濾波
  40.         TIM2->CCMR2|=0<<10;         //2配置輸入分頻,不分頻
  41.         TIM2->CCER|=1<<12;         //允許捕獲計數器的值到捕獲寄存器
  42.   TIM2->CCER|=0<<13;         //CH4上升沿捕獲
  43.         TIM2->DIER|=1<<4;   //允許捕獲中斷               
  44.        

  45.         TIM2->DIER|=1<<0;   //允許更新中斷       
  46.         TIM2->CR1|=0x01;    //使能定時器3
  47.         MY_NVIC_Init(1,3,TIM2_IRQn,1);
  48. }
  49. /**************************************************************************
  50. 函數功能:超聲波接收回波函數
  51. 入口參數:無
  52. 返回  值:無
  53. **************************************************************************/
  54. u16 TIM2CH1_CAPTURE_STA,TIM2CH1_CAPTURE_VAL;
  55. void ReadT2C1_Distane(void)
  56. {   
  57.        
  58.          PAout(4)=1;
  59.          delay_us(15);  
  60.          PAout(4)=0;       
  61.                         if(TIM2CH1_CAPTURE_STA&0X80)//成功捕獲到了一次高電平
  62.                         {
  63.                         DisT2C1=TIM2CH1_CAPTURE_STA&0X3F;
  64.                         DisT2C1*=65536;                                                //溢出時間總和
  65.                         DisT2C1+=TIM2CH1_CAPTURE_VAL;                //得到總的高電平時間
  66.       DisT2C1=DisT2C1*170/1000;
  67.                         printf("DIST2C1:%d\n",DisT2C1);
  68.                         TIM2CH1_CAPTURE_STA=0;                        //開啟下一次捕獲
  69.                   }                               
  70. }

  71. u16 TIM2CH2_CAPTURE_STA,TIM2CH2_CAPTURE_VAL;
  72. void ReadT2C2_Distane(void)
  73. {   
  74.          PAout(5)=1;
  75.          delay_us(15);  
  76.          PAout(5)=0;       
  77.                         if(TIM2CH2_CAPTURE_STA&0X80)//成功捕獲到了一次高電平
  78.                         {
  79.                         DisT2C2=TIM2CH2_CAPTURE_STA&0X3F;
  80.                         DisT2C2*=65536;                                                //溢出時間總和
  81.                         DisT2C2+=TIM2CH2_CAPTURE_VAL;                //得到總的高電平時間
  82.                         DisT2C2=DisT2C2*170/1000;
  83.                         printf("DIST2C2:%d\n",DisT2C2);
  84.                         TIM2CH2_CAPTURE_STA=0;                        //開啟下一次捕獲
  85.                   }                               
  86. }

  87. u16 TIM2CH3_CAPTURE_STA,TIM2CH3_CAPTURE_VAL;
  88. void ReadT2C3_Distane(void)
  89. {   
  90.          PAout(6)=1;
  91.          delay_us(15);  
  92.          PAout(6)=0;       
  93.                         if(TIM2CH3_CAPTURE_STA&0X80)//成功捕獲到了一次高電平
  94.                         {
  95.                         DisT2C3=TIM2CH3_CAPTURE_STA&0X3F;
  96.                         DisT2C3*=65536;                                                //溢出時間總和
  97.                         DisT2C3+=TIM2CH3_CAPTURE_VAL;                //得到總的高電平時間
  98.                         DisT2C3=DisT2C3*170/1000;
  99.                         printf("DIST2C3:%d\n",DisT2C3);
  100.                         TIM2CH3_CAPTURE_STA=0;                        //開啟下一次捕獲
  101.                   }                               
  102. }

  103. u16 TIM2CH4_CAPTURE_STA,TIM2CH4_CAPTURE_VAL;
  104. void ReadT2C4_Distane(void)
  105. {   
  106.        
  107.          PAout(7)=1;
  108.          delay_us(15);  
  109.          PAout(7)=0;       
  110.                         if(TIM2CH4_CAPTURE_STA&0X80)//成功捕獲到了一次高電平
  111.                         {
  112.                         DisT2C4=TIM2CH4_CAPTURE_STA&0X3F;
  113.                         DisT2C4*=65536;                                                //溢出時間總和
  114.                         DisT2C4+=TIM2CH4_CAPTURE_VAL;                //得到總的高電平時間
  115.                         DisT2C4=DisT2C4*170/1000;
  116.                         printf("DIST2C4:%d\n",DisT2C4);
  117.                         TIM2CH4_CAPTURE_STA=0;                        //開啟下一次捕獲
  118.                   }                               
  119. }
  120. /**************************************************************************
  121. 函數功能:超聲波回波脈寬讀取中斷
  122. 入口參數:無
  123. 返回  值:無
  124. 作    者:平衡小車之家
  125. **************************************************************************/
  126. void TIM2_IRQHandler(void)
  127. {                                                                   
  128.         u16 tsr;
  129.         tsr=TIM2->SR;
  130.        
  131. /*******************************************************************
  132.        
  133. ********************************************************************/
  134.         if((TIM2CH1_CAPTURE_STA&0X80)==0)//還未成功捕獲       
  135.                                 {
  136.                                                                 if(tsr&0X01)//溢出
  137.                                                                 {            
  138.                                                                                 if(TIM2CH1_CAPTURE_STA&0X40)//已經捕獲到高電平了
  139.                                                                                 {
  140.                                                                                         if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高電平太長了
  141.                                                                                         {
  142.                                                                                                 TIM2CH1_CAPTURE_STA|=0X80;//標記成功捕獲了一次
  143.                                                                                                 TIM2CH1_CAPTURE_VAL=0XFFFF;
  144.                                                                                         }else TIM2CH1_CAPTURE_STA++;
  145.                                                                                 }         
  146.                                                                 }
  147.                                                            if(tsr&0x02)//捕獲1發生捕獲事件
  148.                                             {       
  149.                                                                                         if(TIM2CH1_CAPTURE_STA&0X40)                //捕獲到一個下降沿                
  150.                                                                                         {                                 
  151.                                                                                         TIM2CH1_CAPTURE_STA|=0X80;                //標記成功捕獲到一次高電平脈寬
  152.                                                                                         TIM2CH1_CAPTURE_VAL=TIM2->CCR1;        //獲取當前的捕獲值.
  153.                                                                                         TIM2->CCER&=~(1<<1);                        //CC1P=0 設置為上升沿捕獲
  154.                                                                                   }else                                                                  //還未開始,第一次捕獲上升沿
  155.                                            {
  156.                                                                                         TIM2CH1_CAPTURE_STA=0;                        //清空
  157.                                                                                         TIM2CH1_CAPTURE_VAL=0;
  158.                                                                                         TIM2CH1_CAPTURE_STA|=0X40;                //標記捕獲到了上升沿
  159.                                                                                         TIM2->CNT=0;                                        //計數器清空
  160.                                                                                         TIM2->CCER|=1<<1;                                 //CC1P=1 設置為下降沿捕獲
  161.                                                         }                    
  162.                                                     }                                                                                   
  163.                    }
  164.                                
  165. /*************************************************************************/
  166.                          
  167. /*************************************************************************/

  168.         if((TIM2CH2_CAPTURE_STA&0X80)==0)//還未成功捕獲       
  169.                                 {
  170.                                                                 if(tsr&0X01)//溢出
  171.                                                                 {            
  172.                                                                                 if(TIM2CH2_CAPTURE_STA&0X40)//已經捕獲到高電平了
  173.                                                                                 {
  174.                                                                                         if((TIM2CH2_CAPTURE_STA&0X3F)==0X3F)//高電平太長了
  175.                                                                                         {
  176.                                                                                                 TIM2CH2_CAPTURE_STA|=0X80;//標記成功捕獲了一次
  177.                                                                                                 TIM2CH2_CAPTURE_VAL=0XFFFF;
  178.                                                                                         }else TIM2CH2_CAPTURE_STA++;
  179.                                                                                 }         
  180.                                                                 }
  181.                                                            if(tsr&0x04)//捕獲2發生捕獲事件
  182.                                             {       
  183.                                                                                         if(TIM2CH2_CAPTURE_STA&0X40)                //捕獲到一個下降沿                
  184.                                                                                         {                                 
  185.                                                                                         TIM2CH2_CAPTURE_STA|=0X80;                //標記成功捕獲到一次高電平脈寬
  186.                                                                                         TIM2CH2_CAPTURE_VAL=TIM2->CCR2;        //獲取當前的捕獲值.
  187.                                                                                         TIM2->CCER&=~(1<<5);                        //CC1P=0 設置為上升沿捕獲
  188.                                                                                   }else                                                                  //還未開始,第一次捕獲上升沿
  189.                                            {
  190.                                                                                         TIM2CH2_CAPTURE_STA=0;                        //清空
  191.                                                                                         TIM2CH2_CAPTURE_VAL=0;
  192.                                                                                         TIM2CH2_CAPTURE_STA|=0X40;                //標記捕獲到了上升沿
  193.                                                                                         TIM2->CNT=0;                                        //計數器清空
  194.                                                                                         TIM2->CCER|=1<<5;                                 //CC1P=1 設置為下降沿捕獲
  195.                                                         }                    
  196.                                                     }                                                                                   
  197.                    }
  198. /***************************************************************************************
  199.                          
  200. ****************************************************************************************/

  201.         if((TIM2CH3_CAPTURE_STA&0X80)==0)//還未成功捕獲       
  202.                                 {
  203.                                                                 if(tsr&0X01)//溢出
  204.                                                                 {            
  205.                                                                                 if(TIM2CH3_CAPTURE_STA&0X40)//已經捕獲到高電平了
  206.                                                                                 {
  207.                                                                                         if((TIM2CH3_CAPTURE_STA&0X3F)==0X3F)//高電平太長了
  208.                                                                                         {
  209.                                                                                                 TIM2CH3_CAPTURE_STA|=0X80;//標記成功捕獲了一次
  210.                                                                                                 TIM2CH3_CAPTURE_VAL=0XFFFF;
  211.                                                                                         }else TIM2CH3_CAPTURE_STA++;
  212.                                                                                 }         
  213.                                                                 }
  214.                                                            if(tsr&0x08)//捕獲1發生捕獲事件
  215.                                             {       
  216.                                                                                         if(TIM2CH3_CAPTURE_STA&0X40)                //捕獲到一個下降沿                
  217.                                                                                         {                                 
  218.                                                                                         TIM2CH3_CAPTURE_STA|=0X80;                //標記成功捕獲到一次高電平脈寬
  219.                                                                                         TIM2CH3_CAPTURE_VAL=TIM2->CCR3;        //獲取當前的捕獲值.
  220.                                                                                         TIM2->CCER&=~(1<<9);                        //CC1P=0 設置為上升沿捕獲
  221.                                                                                   }else                                                                  //還未開始,第一次捕獲上升沿
  222.                                            {
  223.                                                                                         TIM2CH3_CAPTURE_STA=0;                        //清空
  224.                                                                                         TIM2CH3_CAPTURE_VAL=0;
  225.                                                                                         TIM2CH3_CAPTURE_STA|=0X40;                //標記捕獲到了上升沿
  226.                                                                                         TIM2->CNT=0;                                        //計數器清空
  227.                                                                                         TIM2->CCER|=1<<9;                                 //CC1P=1 設置為下降沿捕獲
  228.                                                         }                    
  229.                                                     }                                                                                   
  230.                    }
  231. /***************************************************************************
  232.                          
  233. ****************************************************************************/

  234.         if((TIM2CH4_CAPTURE_STA&0X80)==0)//還未成功捕獲       
  235.                                 {
  236.                                                                 if(tsr&0X01)//溢出
  237. ……………………

  238. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
USART_TIM2.rar (110.91 KB, 下載次數: 42)


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

使用道具 舉報

沙發
ID:276828 發表于 2019-4-9 08:30 | 只看該作者
你好,你這程序超聲波引腳沒有定義?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美二区在线 | 国产视频在线观看一区二区三区 | 在线中文一区 | 亚洲性人人天天夜夜摸 | 国产精品久久久久久久一区探花 | 欧美1区 | 国产精品成人一区二区三区夜夜夜 | 九九久久99 | 久久精品国产一区 | 午夜爱爱毛片xxxx视频免费看 | 男人电影天堂 | 久久精品免费观看 | 雨宫琴音一区二区在线 | 中文字幕精品一区二区三区精品 | 日韩精品一区二区三区视频播放 | 日韩成人在线免费视频 | 日日夜夜91| 中文字幕第十一页 | 精品久久久久久久久久久 | 日韩精品一区二 | 二区久久| 天天操天天干天天爽 | 国产一区二区精 | 91精品观看| 欧美国产精品一区二区三区 | 亚洲激情专区 | 欧美精品综合在线 | 久久久爽爽爽美女图片 | 久久国产成人精品国产成人亚洲 | 国产精品a久久久久 | 成人羞羞国产免费视频 | 99欧美精品 | 国产精品久久久久久久久久久免费看 | 91精品国产综合久久福利软件 | 色www精品视频在线观看 | 91 在线| 伊人春色成人网 | 亚洲免费视频网站 | 91xxx在线观看 | 99色综合| 亚洲毛片在线观看 |