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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

2018年全國電子設(shè)計(jì)大賽(吉林賽區(qū))B題程序源碼

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

單片機(jī)源程序如下:
  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;  //為按下觸摸按鍵時(shí)的值

  6. /*******************************************************************************
  7. * 函 數(shù) 名         : TIM5_CH2_Input_Init
  8. * 函數(shù)功能                   : TIM5_CH2輸入捕獲初始化函數(shù)
  9. * 輸    入         : arr:自動(dòng)重裝載值
  10.                                          psc:預(yù)分頻系數(shù)
  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時(shí)鐘
  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;   //自動(dòng)裝載值
  30.         TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分頻系數(shù)
  31.         TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  32.         TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //設(shè)置向上計(jì)數(shù)模式
  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; //分頻系數(shù)
  39.         TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//直接映射到TI1
  40.         TIM_ICInit(TIM5,&TIM_ICInitStructure);
  41.                
  42.         TIM_Cmd(TIM5,ENABLE); //使能定時(shí)器
  43. }

  44. /*******************************************************************************
  45. * 函 數(shù) 名         : Touch_Reset
  46. * 函數(shù)功能                   : 觸摸按鍵復(fù)位 先放電然后充電并釋放計(jì)時(shí)器內(nèi)的值
  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); //清除標(biāo)志
  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. * 函 數(shù) 名         : Touch_Get_Val
  69. * 函數(shù)功能                   : 返回捕獲高電平值
  70. * 輸    入         : 無
  71. * 輸    出         : 捕獲高電平值
  72. *******************************************************************************/
  73. u16 Touch_Get_Val(void)
  74. {
  75.         Touch_Reset();
  76.         while(TIM_GetFlagStatus(TIM5,TIM_FLAG_CC2)==0) //等待捕獲到高電平標(biāo)志
  77.         {
  78.                 if(TIM_GetCounter(TIM5)>Touch_ARR_MAX_VAL-500)  //超時(shí)了直接返回CNT值
  79.                 {
  80.                         return TIM_GetCounter(TIM5);
  81.                 }
  82.         }
  83.         return TIM_GetCapture2(TIM5); //返回捕獲高電平值
  84. }

  85. /*******************************************************************************
  86. * 函 數(shù) 名         : Touch_Key_Init
  87. * 函數(shù)功能                   : 觸摸按鍵初始化
  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次為按下時(shí)候的觸摸值
  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個(gè)數(shù)值求和 取其平均數(shù)
  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的數(shù)值,不正常!
  129.         }
  130.         return 0;
  131. }

  132. /*******************************************************************************
  133. * 函 數(shù) 名         : Touch_Get_MaxVal
  134. * 函數(shù)功能                   : 讀取n次,取最大值
  135. * 輸    入         : n:連續(xù)獲取的次數(shù)
  136. * 輸    出         : n次讀數(shù)里面讀到的最大讀數(shù)值
  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. * 函 數(shù) 名         : Touch_Key_Scan
  151. * 函數(shù)功能                   : 觸摸按鍵掃描
  152. * 輸    入         : 0:不支持連續(xù)觸發(fā)(按下一次必須松開才能按下一次)
  153.                                          1:支持連續(xù)觸發(fā)(可以一直按下)
  154. * 輸    出         : 0:沒有按下
  155.                                          1:有按下
  156. *******************************************************************************/                                                                                  
  157. #define TOUCH_GATE_VAL         100        //觸摸的門限值,也就是必須大于tpad_default_val+TOUCH_GATE_VAL,才認(rèn)為是有效觸摸.
  158. u8 Touch_Key_Scan(u8 mode)
  159. {
  160.         static u8 keyen=0;        //0,可以開始檢測;>0,還不能開始檢測         
  161.         u8 res=0;
  162.         u8 sample=3;                //默認(rèn)采樣次數(shù)為3次         
  163.         u16 rval;
  164.         if(mode)
  165.         {
  166.                 sample=6;        //支持連按的時(shí)候,設(shè)置采樣次數(shù)為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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

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


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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品国产成人 | 国产成人精品一区二区三区视频 | www国产成人免费观看视频,深夜成人网 | 婷婷毛片| 欧美三级视频在线观看 | 亚洲欧美精品 | av一区在线观看 | 久久久久亚洲精品 | 区一区二区三在线观看 | 超碰一区二区 | 久久成人精品一区二区三区 | 91久久久久久 | 欧美精品一区二区三区蜜桃视频 | 久久国产三级 | 日韩在线不卡视频 | 国产激情偷乱视频一区二区三区 | 亚洲精品成人免费 | 久久国内精品 | 久久乐国产精品 | 久久网一区二区 | 国产伊人精品 | 91综合在线视频 | 一区二区免费高清视频 | 国产成人精品一区二区三区 | 精品中文在线 | 成人婷婷 | 免费h在线 | 91美女在线观看 | 亚洲欧洲在线观看视频 | 中文字幕一区二区三区四区五区 | 日韩精品在线视频免费观看 | 久久国产精品偷 | 久久久视频在线 | 亚洲综合二区 | 久久久久久亚洲精品 | 1级黄色大片 | 亚洲精品国产综合区久久久久久久 | 日韩不卡一区二区 | www.日本在线 | 成人在线播放 | 成人免费看片又大又黄 |