红外定距离感应


void LED_ON()
{
//    PORT->P7 = PORT->P7|0x02;
    PORT->P1 = PORT->P1|0x80;
}

void LED_OFF()
{
//    PORT->P7 = PORT->P7&0xfd;
    PORT->P1 = PORT->P1&0x7f;
}

void NPN_ON()
{
//    PORT->P7 = PORT->P7|0x02;
//    PORT->P2 = PORT->P2|0x01;
    PORT->P0 = PORT->P0|0x02;
}

void NPN_OFF()
{
//    PORT->P7 = PORT->P7&0xfd;
//    PORT->P2 = PORT->P2&0xfe;
    PORT->P0 = PORT->P0&0xfd;
}

void delay_ms(uint32_t n)
{
    while(n--)
    {
//        uint32_t ms = 3000;
        uint32_t ms = 1500;
        while(ms--)
        {
            WDT_Restart();
        }
    }
}

void delay_us(uint32_t n)
{
    while(n--)
    {
        uint32_t ms = 3;
        while(ms--);
    }
}


unsigned int cnt,oldcnt,getcnt1=20,getcnt2=20 ,sendtime=20;

void InfraredTube_Send(uint16_t val)
{
    int ii;
      for( ii=0;ii<sendtime; ii++)
        {
        //38khz
        DAC_Set_Value(DAC_CHANNEL_0, val);
        delay_us(4);
        DAC_Set_Value(DAC_CHANNEL_0, 255);
        delay_us(8);
            WDT_Restart();
        }
}

void InfraredTube_Send_Calibration(uint16_t val)
{
    int ii;
      for( ii=0;ii<sendtime; ii++)
        {
        //38khz
        DAC_Set_Value(DAC_CHANNEL_0, val);
        delay_us(4);
        DAC_Set_Value(DAC_CHANNEL_0, 255);
        delay_us(8);
            WDT_Restart();
        }
}


void GPIO_Input_Enable(__IO uint8_t *port, uint8_t pinMsk)
{
    *(port - 0x2A0) &= ~pinMsk;  /*!< PMC=0: Digital Function   */
    *(port + 0x020) |=  pinMsk;  /*!< PM =1: Input Function     */
}


void GPIO_PullUp_Enable(__IO uint8_t *port, uint8_t pinMsk)
{
    *(port - 0x2D0) |=  pinMsk;  /*!< PU =1: Pull Up enable         */
}

uint8_t GPIO_Get_Value(__IO uint8_t *port)
{
    //PORT->PMS = 0x01;        /*!< Digital output level of the pin is read */ 
    return (*port);          /*!< PL = value                              */
}

uint8_t Get_User_key()
{
    if(GPIO_Get_Value(&PORT->P0)&0x01)
            return 1;
    else return 0;
}


void user_data_save(uint8_t* buf)
{
    EraseSector(0x500000);    
    ProgramPage (0x500000, 1, buf);
}
void user_data_read(uint8_t* dat)
{
    *dat = *(uint8_t *)0x500000;
}

uint8_t led_reciver =1;
uint8_t flash_save = 0,dacvalSet=0,dacvalGet=0;
float dac_vol;
uint8_t keyvalue = 0;
uint32_t sendcount =0,recivercount=0;
uint8_t getflag=0,Calibration=0,tmp;

//uint32_t less=0,more=255,middle=128;    

void handle(uint8_t flag)
{
    if(flag == 1)
    {
        LED_ON();
        delay_ms(1000);
        LED_OFF();
    }
    else
    {
        LED_ON();
        delay_ms(500);
        LED_OFF();
        delay_ms(500);
        LED_ON();
        delay_ms(500);
        LED_OFF();
        delay_ms(500);
        LED_ON();
        delay_ms(500);
        LED_OFF();
        delay_ms(500);
        LED_ON();
        delay_ms(500);
        LED_OFF();
    }
    
}

void DoCalibration(void)
{
    printf("开始校准程序\n");
    
    Calibration=1;
    led_reciver=1;
    LED_ON();
    delay_ms(500);
    LED_OFF();
    for(dacvalSet=255;dacvalSet>0;dacvalSet--) 
        {
            printf("***校准 %d \n",dacvalSet);
                LED_ON();
                InfraredTube_Send_Calibration(dacvalSet);
                LED_OFF();
            //delay_ms(20);
            
            if(led_reciver==0)
            {
                    for(;dacvalSet<255;dacvalSet++) 
                {
                    led_reciver=1;
                    unsigned int time = 0;
                    while(1)
                            {
                                
                                
                                LED_ON();
                                InfraredTube_Send(dacvalSet);
                                LED_OFF();
                                delay_ms(50);
                                printf("*****************重复测试%d\r\n",time);
                                time++;
                                if(time>=getcnt2)
                                {
                                    break;
                                }
                                
                                
                            }
                            if(led_reciver==0)
                            {
                                printf("dacvalSet %d 需要继续变小\r\n",dacvalSet);
                            }
                            else 
                            {
                                flash_save = dacvalSet-1;
                                //flash_save = dacvalSet;
                                user_data_save(&flash_save);
                                printf("-------校准成功flash_save=%d\r\n",flash_save);
                                
                                handle(1);
                                goto ok;
                            }
                }
            }
        }
        
        
                printf("-------校准失败,关闭输出\r\n");
                handle(0);
                flash_save = 255;
                user_data_save(&flash_save);
                        
                ok:    Calibration=0;
            
}


int main()
{
    MD_STATUS status;
    uint32_t i;
    
//-----------------------------------------------------------------------
// Init UART0 for retarget printf/scanf etc. 
//----------------------------------------------------------------------- 
#if 1
    SystemCoreClockUpdate();
    status = UART0_Init(SystemCoreClock, 19200);
    if(status == MD_ERROR)
    {
        while(1);
    }
    
    printf("红外接触感应传感器kd200\n");
#endif
    
//-----------------------------------------------------------------------
// LED blinky on target board 
// P71 and P72 drives LED on EVB
//----------------------------------------------------------------------- 

    PORT->PM1  &= ~(1<<7); // P71/LED, P72/LED
    
    PORT->PM2  &= ~(1<<0); 
    
//-----------------------------------------------------------------------
// Enable KR0 falling edge interrupt request to wakeup system
//-----------------------------------------------------------------------   
    KEY_Init(1 << 0);               // Initializes P70/KR0
    KEY_Start();                    // Enable KEY Interrupt

    GPIO_Input_Enable(&PORT->P0, 1 << 0);
    GPIO_PullUp_Enable(&PORT->P0, 1 << 0);
    
            
    DAC_Init(DAC_CHANNEL_0);
    DAC_Start(DAC_CHANNEL_0); 
    
    user_data_read(&flash_save);
    

    

    while(1)
    {

        
//----------------检测任务
        InfraredTube_Send(flash_save);
//        delay_ms(10);

        if(cnt>getcnt1)
        {
            
            
                if(led_reciver==0) printf(" 切换off******\n");
                led_reciver =1;
            
            
            cnt=0;
            
        }
        else
        {
            cnt++;
            printf("start%dend\n",cnt);
        }
        
        if(led_reciver == 0)
        {
            LED_ON();
            NPN_ON();
        }
        else{
            LED_OFF();
            NPN_OFF();
        }
        
        
//-----------------按键任务        
        if(Get_User_key()==0)
        {
            //delay_ms(100);
            if(Get_User_key()==0) 
            {
                DoCalibration();//校准程序
            }
        }
        
        


//-----------------看门狗任务    

        WDT_Restart();
        
        
        
    }
    
    

    

}

void key_interrupt(void)
{
    INTC_ClearPendingIRQ(KEY_IRQn);     /* clear KEY interrupt flag */
    /* Start user code. Do not edit comment generated here */
   // printf("key_interrupt\n");
    
    WDT_Restart();


        if(Calibration==1)
        {
                printf("校准得到数据\r\n");
                led_reciver=0;
        }
        else
        {
            
                printf("led_reciver 0000 \r\n" );
            
                //printf("start%dend\n",cnt);
            if(led_reciver==1 && cnt<2) 
        //        if(led_reciver==1 ) 
            {
                printf(" 切换on*******\n");
            led_reciver=0;
                
            }
            cnt=0;

        }


    /* End user code. Do not edit comment generated here */
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值