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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4422|回復: 0
收起左側

STM32紅外尋循跡小車源碼

[復制鏈接]
ID:305426 發表于 2018-11-30 16:58 | 顯示全部樓層 |閱讀模式
循跡小車源碼分享給大家。

單片機源程序如下:
  1. //連接方式 :請參考interface.h文件
  2. #include "stm32f10x.h"
  3. #include "interface.h"
  4. #include "LCD1602.h"
  5. #include "IRCtrol.h"
  6. #include "motor.h"
  7. #include "uart.h"

  8. //全局變量定義
  9. unsigned int speed_count=0;//占空比計數器 50次一周期
  10. char front_left_speed_duty=SPEED_DUTY;
  11. char front_right_speed_duty=SPEED_DUTY;
  12. char behind_left_speed_duty=SPEED_DUTY;
  13. char behind_right_speed_duty=SPEED_DUTY;

  14. unsigned char tick_5ms = 0;//5ms計數器,作為主函數的基本周期
  15. unsigned char tick_1ms = 0;//1ms計數器,作為電機的基本計數器
  16. unsigned char tick_200ms = 0;//刷新顯示

  17. char ctrl_comm = COMM_STOP;//控制指令
  18. char ctrl_comm_last = COMM_STOP;//上一次的指令
  19. unsigned char continue_time=0;
  20. unsigned char bt_rec_flag=0;//藍牙控制標志位

  21. //循跡,通過判斷三個光電對管的狀態來控制小車運動
  22. void SearchRun(void)
  23. {
  24.         //三路都檢測到
  25.         if(SEARCH_M_IO == BLACK_AREA && SEARCH_L_IO == BLACK_AREA && SEARCH_R_IO == BLACK_AREA)
  26.         {
  27.                 ctrl_comm = COMM_UP;
  28.                 return;
  29.         }
  30.        
  31.         if(SEARCH_R_IO == BLACK_AREA)//右
  32.         {
  33.                 ctrl_comm = COMM_RIGHT;
  34.         }
  35.         else if(SEARCH_L_IO == BLACK_AREA)//左
  36.         {
  37.                 ctrl_comm = COMM_LEFT;
  38.         }
  39.         else if(SEARCH_M_IO == BLACK_AREA)//中
  40.         {
  41.                 ctrl_comm = COMM_UP;
  42.         }
  43. }


  44. int main(void)
  45. {
  46.         delay_init();
  47.         GPIOCLKInit();
  48.         UserLEDInit();
  49.         LCD1602Init();
  50.         //IRCtrolInit();
  51.         TIM2_Init();
  52.         MotorInit();
  53.         ServoInit();
  54.        
  55.         RedRayInit();
  56.         //USART3Conf(9600);

  57. while(1)
  58. {         
  59.                          if(tick_5ms >= 5)
  60.                 {
  61.                         tick_5ms = 0;
  62.                         tick_200ms++;
  63.                         if(tick_200ms >= 40)
  64.                         {
  65.                                 tick_200ms = 0;
  66.                                 LEDToggle(LED_PIN);
  67.                         }
  68. //                        continue_time--;//200ms 無接收指令就停車
  69. //                        if(continue_time == 0)
  70. //                        {
  71. //                                continue_time = 1;
  72. //                                CarStop();
  73. //                        }
  74.                         //do something
  75.                         SearchRun();
  76.                         if(ctrl_comm_last != ctrl_comm)//指令發生變化
  77.                         {
  78.                                 ctrl_comm_last = ctrl_comm;
  79.                                 switch(ctrl_comm)
  80.                                 {
  81.                                         case COMM_UP:    CarGo();break;
  82.                                         case COMM_DOWN:  CarBack();break;
  83.                                         case COMM_LEFT:  CarLeft();break;
  84.                                         case COMM_RIGHT: CarRight();break;
  85.                                         case COMM_STOP:  CarStop();break;
  86.                                         default : break;
  87.                                 }
  88.                                 Delayms(10);//防抖
  89.                                 LCD1602WriteCommand(ctrl_comm);
  90.                         }
  91.                 }
  92.                
  93. }
  94. }
復制代碼
  1. #include "IRCtrol.h"
  2. #include "interface.h"

  3. unsigned char ir_rec_flag=0;//接收數據標志位 1 有新數據 0 沒有
  4. unsigned char IRCOM[4];

  5. //use time3 realize delay systick已經在main函數中使用了,在中斷中不能重復使用
  6. void Time3Init(void)
  7. {
  8.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  9.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  10.     TIM_TimeBaseStructure.TIM_Period = 1;
  11.     TIM_TimeBaseStructure.TIM_Prescaler = (72 - 1);//72M / 72 = 1us
  12.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
  13.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  14. }

  15. //1us 延時
  16. void DelayUs(vu32 nCount)
  17. {
  18.   u16 TIMCounter = nCount;
  19.   TIM_Cmd(TIM3, ENABLE);
  20.   TIM_SetCounter(TIM3, TIMCounter);
  21.   while (TIMCounter>1)
  22.   {
  23.     TIMCounter = TIM_GetCounter(TIM3);
  24.   }
  25.   TIM_Cmd(TIM3, DISABLE);
  26. }

  27. //外部中斷配置 紅外遙控配置
  28. void IRCtrolInit(void)
  29. {
  30.         GPIO_InitTypeDef  GPIO_InitStructure;
  31.         EXTI_InitTypeDef         EXTI_InitStructure;//定義一個外部中斷相關的結構體
  32.         NVIC_InitTypeDef NVIC_InitStructure; //定義一個中斷的結構體
  33.        
  34.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
  35.         GPIO_InitStructure.GPIO_Pin = IRIN_PIN;//配置使能GPIO管腳
  36.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置GPIO模式,輸入上拉
  37.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//配置GPIO端口速度
  38.         GPIO_Init(IRIN_GPIO , &GPIO_InitStructure);
  39.                
  40.         GPIO_EXTILineConfig(IRIN_PORTSOURCE , IRIN_PINSOURCE);
  41.         EXTI_InitStructure.EXTI_Line = IRIN_EXITLINE;//將對應的GPIO口連接到中斷線上
  42.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//中斷事件類型,下降沿
  43.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//選擇模式,中斷型
  44.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能該中斷
  45.         EXTI_Init(&EXTI_InitStructure);//將配置好的參數寫入寄存器
  46.                        
  47.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);         //階級為0,不可嵌套
  48.         NVIC_InitStructure.NVIC_IRQChannel =         IRIN_IRQCH;//打開PINA_8的外部中斷
  49.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//主優先級0,最高
  50.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //子優先級,最低
  51.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能該模塊中斷
  52.         NVIC_Init(&NVIC_InitStructure);        //中斷初始化,將結構體定義的數據執行
  53.        
  54.         Time3Init();
  55. }

  56. /*******************************************************************************
  57. * 函 數 名 :DelayIr
  58. * 函數功能 :0.14MS 延時
  59. * 輸    入 :無
  60. * 輸    出 :無
  61. *******************************************************************************/
  62. void DelayIr(unsigned char x)  
  63. {
  64.   while(x--)
  65. {
  66.   DelayUs(140);
  67. }
  68. }

  69. void IRIntIsr(void)
  70. {
  71.   unsigned char j,k,N=0;
  72.          DelayIr(15);
  73.          if (IRIN==1)
  74.      {
  75.            return;
  76.           }
  77.                  continue_time = 40;//連發信號,表示指令持續 40*5 = 200ms 無指令停車
  78.                            //確認IR信號出現
  79.   while (!IRIN)            //等IR變為高電平,跳過9ms的前導低電平信號。
  80.     {DelayIr(1);}

  81. for (j=0;j<4;j++)         //收集四組數據
  82. {
  83.   for (k=0;k<8;k++)        //每組數據有8位
  84.   {
  85.    while (IRIN)            //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
  86.      {DelayIr(1);}
  87.     while (!IRIN)          //等 IR 變為高電平
  88.      {DelayIr(1);}
  89.      while (IRIN)           //計算IR高電平時長
  90.       {
  91.     DelayIr(1);
  92.     N++;           
  93.     if (N>=30)
  94.          {
  95.          return;}                  //0.14ms計數過長自動離開。
  96.       }                        //高電平計數完畢               
  97.      IRCOM[j]=IRCOM[j] >> 1;                  //數據最高位補“0”
  98.      if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //數據最高位補“1”
  99.      N=0;
  100.   }//end for k
  101. }//end for j
  102.    
  103.         k = ~IRCOM[3];
  104.    if (IRCOM[2] != k)
  105.    {
  106.      return; }
  107.          
  108.                  //指令轉換
  109.                  
  110.                  switch(IRCOM[2])
  111.                  {
  112.                          case 0x46: ctrl_comm = COMM_UP;break;
  113.                          case 0x15: ctrl_comm = COMM_DOWN;break;
  114.                          case 0x44: ctrl_comm = COMM_LEFT;break;
  115.                          case 0x43: ctrl_comm = COMM_RIGHT;break;
  116.                          case 0x40: ctrl_comm = COMM_STOP;break;
  117.                          default :  return;
  118.                  }
  119.                  ir_rec_flag = 1;
  120.        
  121. }
復制代碼

所有資料51hei提供下載:
紅外黑線循跡.rar (272.46 KB, 下載次數: 31)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费一区 | 亚洲高清av在线 | 久久青 | 日本成人在线观看网站 | 国产精品九九九 | 国产一级片在线观看视频 | 久久久91| 91新视频 | 国产高清性xxxxxxxx | 99久久精品一区二区成人 | 国产精品7777777 | 特级丰满少妇一级aaaa爱毛片 | 色综合中文| 国产免费av在线 | 中文字幕一区二区三区不卡 | 国内精品视频在线观看 | 成人免费视频网址 | 欧美一区二区三区在线观看 | 一区二区三区av | 日本福利在线观看 | 国产欧美日韩一区二区三区 | 亚洲欧美日韩电影 | 久久久精品一区 | 亚州精品天堂中文字幕 | 91中文视频| 91国内精精品久久久久久婷婷 | 日韩不卡在线观看 | 国产一区二区三区在线 | 中文字幕在线一区二区三区 | 国产偷久久一级精品60部 | 亚洲综合大片69999 | 欧美综合一区二区三区 | 日韩综合在线播放 | 一级特黄色毛片 | 欧美激情欧美激情在线五月 | 国产一区二区欧美 | 特级做a爰片毛片免费看108 | aaaa日韩 | 在线男人天堂 | 欧美国产大片 | 国产免费一区二区三区网站免费 |