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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

2018年全國電子設計大賽(吉林賽區)B題程序源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:328014 發表于 2018-9-14 03:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
2018年全國電子設計大賽(吉林賽區)B題程序源碼基于STM32F103ZET6,圓盤懸吊裝置8路PWM輸出定時器,編碼器測速,陀螺儀

單片機源程序如下:
  1. #include "touch_key.h"
  2. #include "SysTick.h"
  3. #include "usart.h"

  4. #define Touch_ARR_MAX_VAL 0xffff  //最大的ARR值       
  5. u16 touch_default_val=0;  //為按下觸摸按鍵時的值

  6. /*******************************************************************************
  7. * 函 數 名         : TIM5_CH2_Input_Init
  8. * 函數功能                   : TIM5_CH2輸入捕獲初始化函數
  9. * 輸    入         : arr:自動重裝載值
  10.                                          psc:預分頻系數
  11. * 輸    出         : 無
  12. *******************************************************************************/
  13. void TIM5_CH2_Input_Init(u16 arr,u16 psc)
  14. {
  15.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  16.         TIM_ICInitTypeDef TIM_ICInitStructure;
  17.         GPIO_InitTypeDef GPIO_InitStructure;
  18.        
  19.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  20.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);//使能TIM5時鐘
  21.        
  22.        
  23.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                          
  24.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          //浮空輸入模式
  25.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //IO口速度為50MHz
  26.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                  // PA0
  27.        
  28.        
  29.         TIM_TimeBaseInitStructure.TIM_Period=arr;   //自動裝載值
  30.         TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分頻系數
  31.         TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  32.         TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //設置向上計數模式
  33.         TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);       
  34.        
  35.         TIM_ICInitStructure.TIM_Channel=TIM_Channel_2; //通道2
  36.         TIM_ICInitStructure.TIM_ICFilter=0x00;  //濾波
  37.         TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//捕獲極性
  38.         TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //分頻系數
  39.         TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//直接映射到TI1
  40.         TIM_ICInit(TIM5,&TIM_ICInitStructure);
  41.                
  42.         TIM_Cmd(TIM5,ENABLE); //使能定時器
  43. }

  44. /*******************************************************************************
  45. * 函 數 名         : Touch_Reset
  46. * 函數功能                   : 觸摸按鍵復位 先放電然后充電并釋放計時器內的值
  47. * 輸    入         : 無
  48. * 輸    出         : 無
  49. *******************************************************************************/
  50. void Touch_Reset(void)
  51. {
  52.         GPIO_InitTypeDef GPIO_InitStructure;
  53.        
  54.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                          
  55.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽輸出模式
  56.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //IO口速度為50MHz
  57.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  58.          
  59.         GPIO_ResetBits(GPIOA,GPIO_Pin_0);//輸出0,放電

  60.         delay_ms(5);
  61.         TIM_ClearFlag(TIM5, TIM_FLAG_CC2|TIM_FLAG_Update); //清除標志
  62.         TIM_SetCounter(TIM5,0);                //歸0
  63.        
  64.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          //浮空輸入模式       
  65.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  66. }

  67. /*******************************************************************************
  68. * 函 數 名         : Touch_Get_Val
  69. * 函數功能                   : 返回捕獲高電平值
  70. * 輸    入         : 無
  71. * 輸    出         : 捕獲高電平值
  72. *******************************************************************************/
  73. u16 Touch_Get_Val(void)
  74. {
  75.         Touch_Reset();
  76.         while(TIM_GetFlagStatus(TIM5,TIM_FLAG_CC2)==0) //等待捕獲到高電平標志
  77.         {
  78.                 if(TIM_GetCounter(TIM5)>Touch_ARR_MAX_VAL-500)  //超時了直接返回CNT值
  79.                 {
  80.                         return TIM_GetCounter(TIM5);
  81.                 }
  82.         }
  83.         return TIM_GetCapture2(TIM5); //返回捕獲高電平值
  84. }

  85. /*******************************************************************************
  86. * 函 數 名         : Touch_Key_Init
  87. * 函數功能                   : 觸摸按鍵初始化
  88. * 輸    入         : 無
  89. * 輸    出         : 0:正常
  90.                                          1:不正常
  91. *******************************************************************************/
  92. u8 Touch_Key_Init(u8 psc)  
  93. {
  94.         u8 i;
  95.         u16 buf[10];
  96.         u8 j;
  97.         u16 temp;
  98.         TIM5_CH2_Input_Init(Touch_ARR_MAX_VAL,psc);
  99.        
  100.         for(i=0;i<10;i++) //讀取10次為按下時候的觸摸值
  101.         {
  102.                 buf[i]=Touch_Get_Val();
  103.                 delay_ms(10);
  104.         }
  105.        
  106.         for(i=0;i<9;i++)   //從小到大排序
  107.         {
  108.                 for(j=i+1;j<10;j++)
  109.                 {
  110.                         if(buf[i]>buf[j])
  111.                         {
  112.                                 temp=buf[i];
  113.                                 buf[j]=buf[j];
  114.                                 buf[j]=temp;
  115.                         }
  116.                 }
  117.         }
  118.        
  119.         temp=0;
  120.         for(i=2;i<8;i++)  //取中間6個數值求和 取其平均數
  121.         {
  122.                 temp+=buf[i];
  123.         }
  124.         touch_default_val=temp/6;
  125.         printf("touch_default_val=%d \r\n",touch_default_val);
  126.         if(touch_default_val>Touch_ARR_MAX_VAL/2)
  127.         {
  128.                 return 1;//初始化遇到超過Touch_ARR_MAX_VAL/2的數值,不正常!
  129.         }
  130.         return 0;
  131. }

  132. /*******************************************************************************
  133. * 函 數 名         : Touch_Get_MaxVal
  134. * 函數功能                   : 讀取n次,取最大值
  135. * 輸    入         : n:連續獲取的次數
  136. * 輸    出         : n次讀數里面讀到的最大讀數值
  137. *******************************************************************************/
  138. u16 Touch_Get_MaxVal(u8 n)
  139. {
  140.         u16 temp=0;
  141.         u16 res=0;
  142.         while(n--)
  143.         {
  144.                 temp=Touch_Get_Val();//得到一次值
  145.                 if(temp>res)res=temp;
  146.         }
  147.         return res;
  148. }  

  149. /*******************************************************************************
  150. * 函 數 名         : Touch_Key_Scan
  151. * 函數功能                   : 觸摸按鍵掃描
  152. * 輸    入         : 0:不支持連續觸發(按下一次必須松開才能按下一次)
  153.                                          1:支持連續觸發(可以一直按下)
  154. * 輸    出         : 0:沒有按下
  155.                                          1:有按下
  156. *******************************************************************************/                                                                                  
  157. #define TOUCH_GATE_VAL         100        //觸摸的門限值,也就是必須大于tpad_default_val+TOUCH_GATE_VAL,才認為是有效觸摸.
  158. u8 Touch_Key_Scan(u8 mode)
  159. {
  160.         static u8 keyen=0;        //0,可以開始檢測;>0,還不能開始檢測         
  161.         u8 res=0;
  162.         u8 sample=3;                //默認采樣次數為3次         
  163.         u16 rval;
  164.         if(mode)
  165.         {
  166.                 sample=6;        //支持連按的時候,設置采樣次數為6次
  167.                 keyen=0;        //支持連按          
  168.         }
  169.         rval=Touch_Get_MaxVal(sample);
  170.         if(rval>(touch_default_val+TOUCH_GATE_VAL)&&rval<(10*touch_default_val))//大于touch_default_val+TPAD_GATE_VAL,且小于10倍touch_default_val,則有效
  171.         {                                                         
  172.                 if((keyen==0)&&(rval>(touch_default_val+TOUCH_GATE_VAL)))        //大于touch_default_val+TOUCH_GATE_VAL,有效
  173.                 {
  174.                         res=1;
  175.                 }          
  176.                 printf("觸摸后捕獲高電平值為:%d\r\n",rval);                                                                           
  177.                 keyen=3;                                //至少要再過3次之后才能按鍵有效   
  178. ……………………

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

所有資料51hei提供下載:
光電門測速.rar (547.93 KB, 下載次數: 14)
chengxu.rar (455.96 KB, 下載次數: 14)


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

使用道具 舉報

沙發
ID:328014 發表于 2018-9-14 04:02 | 只看該作者
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色网址大全在线观看 | 日日夜夜免费精品视频 | 国产精品美女久久久免费 | 在线免费观看黄网 | 日韩一区二区三区视频 | 国产久| 日韩欧美综合 | 国产精品美女久久久久久久久久久 | 国产精品区一区二区三 | 欧美一区二区三区在线看 | 人人看人人干 | 日韩一级电影免费观看 | 日本亚洲欧美 | 精品欧美乱码久久久久久 | 国产高清在线精品一区二区三区 | 久久久久久久久久久久久久久久久久久久 | 日本天堂视频 | 在线视频成人 | 国产中文字幕在线观看 | 中文字幕在线第一页 | 毛片a级| 亚洲国产视频一区 | 日韩高清一区 | 日韩中文字幕在线播放 | 中国一级特黄真人毛片免费观看 | 精品欧美一区二区三区久久久 | 婷婷色成人 | 2022精品国偷自产免费观看 | 国产日韩久久 | 日韩欧美中文字幕在线观看 | 久久精品91久久久久久再现 | 亚洲电影在线播放 | 在线观看中文字幕一区二区 | 日韩欧美中文字幕在线观看 | 亚洲精品乱码久久久久久久久久 | 国产精品永久免费观看 | 亚洲午夜精品 | 精品亚洲一区二区 | 国产香蕉视频在线播放 | 99re视频| 久久久久久久一区 |