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 */
}