循跡小車源碼分享給大家。
單片機源程序如下:
- #include "IRCtrol.h"
- #include "interface.h"
- unsigned char ir_rec_flag=0;//接收數據標志位 1 有新數據 0 沒有
- unsigned char IRCOM[4];
- //use time3 realize delay systick已經在main函數中使用了,在中斷中不能重復使用
- void Time3Init(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- TIM_TimeBaseStructure.TIM_Period = 1;
- TIM_TimeBaseStructure.TIM_Prescaler = (72 - 1);//72M / 72 = 1us
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
- }
- //1us 延時
- void DelayUs(vu32 nCount)
- {
- u16 TIMCounter = nCount;
- TIM_Cmd(TIM3, ENABLE);
- TIM_SetCounter(TIM3, TIMCounter);
- while (TIMCounter>1)
- {
- TIMCounter = TIM_GetCounter(TIM3);
- }
- TIM_Cmd(TIM3, DISABLE);
- }
- //外部中斷配置 紅外遙控配置
- void IRCtrolInit(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;//定義一個外部中斷相關的結構體
- NVIC_InitTypeDef NVIC_InitStructure; //定義一個中斷的結構體
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
- GPIO_InitStructure.GPIO_Pin = IRIN_PIN;//配置使能GPIO管腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置GPIO模式,輸入上拉
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//配置GPIO端口速度
- GPIO_Init(IRIN_GPIO , &GPIO_InitStructure);
-
- GPIO_EXTILineConfig(IRIN_PORTSOURCE , IRIN_PINSOURCE);
- EXTI_InitStructure.EXTI_Line = IRIN_EXITLINE;//將對應的GPIO口連接到中斷線上
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//中斷事件類型,下降沿
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//選擇模式,中斷型
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能該中斷
- EXTI_Init(&EXTI_InitStructure);//將配置好的參數寫入寄存器
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //階級為0,不可嵌套
- NVIC_InitStructure.NVIC_IRQChannel = IRIN_IRQCH;//打開PINA_8的外部中斷
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//主優先級0,最高
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子優先級,最低
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能該模塊中斷
- NVIC_Init(&NVIC_InitStructure); //中斷初始化,將結構體定義的數據執行
-
- Time3Init();
- }
- /*******************************************************************************
- * 函 數 名 :DelayIr
- * 函數功能 :0.14MS 延時
- * 輸 入 :無
- * 輸 出 :無
- *******************************************************************************/
- void DelayIr(unsigned char x)
- {
- while(x--)
- {
- DelayUs(140);
- }
- }
- void IRIntIsr(void)
- {
- unsigned char j,k,N=0;
- DelayIr(15);
- if (IRIN==1)
- {
- return;
- }
- continue_time = 40;//連發信號,表示指令持續 40*5 = 200ms 無指令停車
- //確認IR信號出現
- while (!IRIN) //等IR變為高電平,跳過9ms的前導低電平信號。
- {DelayIr(1);}
- for (j=0;j<4;j++) //收集四組數據
- {
- for (k=0;k<8;k++) //每組數據有8位
- {
- while (IRIN) //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
- {DelayIr(1);}
- while (!IRIN) //等 IR 變為高電平
- {DelayIr(1);}
- while (IRIN) //計算IR高電平時長
- {
- DelayIr(1);
- N++;
- if (N>=30)
- {
- return;} //0.14ms計數過長自動離開。
- } //高電平計數完畢
- IRCOM[j]=IRCOM[j] >> 1; //數據最高位補“0”
- if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //數據最高位補“1”
- N=0;
- }//end for k
- }//end for j
-
- k = ~IRCOM[3];
- if (IRCOM[2] != k)
- {
- return; }
-
- //指令轉換
-
- switch(IRCOM[2])
- {
- case 0x46: ctrl_comm = COMM_UP;break;
- case 0x15: ctrl_comm = COMM_DOWN;break;
- case 0x44: ctrl_comm = COMM_LEFT;break;
- case 0x43: ctrl_comm = COMM_RIGHT;break;
- case 0x40: ctrl_comm = COMM_STOP;break;
- default : return;
- }
- ir_rec_flag = 1;
-
- }
復制代碼
所有資料51hei提供下載:
紅外黑線循跡.rar
(272.46 KB, 下載次數: 31)
2018-12-1 03:21 上傳
點擊文件名下載附件
|