電路原理圖如下:
原理圖.png (52.08 KB, 下載次數: 42)
下載附件
2020-9-21 10:34 上傳
單片機源程序如下:
- const uint Tab_vdd_data[];
- //const uchar Tab_out_vol_3V7[];
- const uchar Tab_out_vol_3V3[];
- //const uchar Tab_out_vol_1V85[];
- //const uchar LED_Colours[7];
- //============================================
- // interrupt function
- //============================================
- void INT_FUNCTION(void) interrupt
- {
- if(TM2IF)
- {
- TM2IF=0;
-
- B_200US_INT=1;
- R_TIME_INT++;
- if(R_TIME_INT>=50)
- {
- R_TIME_INT=0;
- B_10MS_INT=1;
- }
- }
- else
- {
- INTF=0;
- INTF2=0;
- }
- }
- //============================================
- // program start
- //============================================
- //---------------------------------------------------------------
- //===============================================================
- void main()
- {
- MCK=0xa0;
- delay(3);
-
- INTE=0;
- INTE2=0;
- INTF=0;
- INTF2=0;
-
- IO_INIT();
- //CLR_RAM();
- SYS_INIT();
- // DATA_INIT();
-
- led_flash_init(3,0x07);
-
- //r_r0=read_ad_cur();
-
- GIE=1;
- //--------------------------------------------------------------------------------------------------------------------------------
- while(1)
- {
- asm("CLRWDT");
- time_up();
-
- out_vol();
-
- disp_led();
-
- key_scan();
- key_handle();
-
- USB_charge();
-
- sleep_handle();
-
- }
- }
- //--------------------------------------------------------------------------------------------------------------------------------
- void IO_INIT(void)
- {
- PT1=0xFF;
- PT1EN=0xC7;
- PT1PU=0x20;
- PT1CON=0x00;
-
- PT3=0xFF;
- PT3EN=0xFE;
- PT3PU=0x00;
- PT3CON=0x01; //
- PT1W_1=0;//PT1_3
-
- PT5=0xFF; //
- PT5EN=0xFE; //
- PT5PU=0x00; //
- PT5CON=0x00; //
-
- VTHSEL=1;
- }
- //--------------------------------------------------------------------------------------------------------------------------------
- void IO_INIT_sleep(void)
- {
- PT1=0xFF; //
- PT1EN=0xC7; //
- PT1PU=0x20; //
- PT1CON=0x70;
-
- PT3=0xFF;
- PT3EN=0xFE;
- PT3PU=0x00;
- PT3CON=0x01;
- PT1W_1=1;
-
- PT5=0xFF;
- PT5EN=0xFE;
- PT5PU=0x00;
- PT5CON=0x00;
-
- VTHSEL=1;
- }
- //--------------------------------------------------------------------------------------------------------------------------------
- void SYS_INIT(void)
- {
- WDTCON=0x04;
- WDTIN=0xff;
- WDTEN=1;
- CST_WDT=0;
- asm("CLRWDT");
- TM2CON=0xb0;
- TM2IN=99;
- TM2INH=0; //
- TM2IE=1; //
-
- SRADCON0=0x03; //
-
- SRADCON1=0x80;
- REF_SEL_0=1;
- REF_SEL_1=0;
- REF_SEL_2=1;
- SRADCON2=0x60;
-
- }
- //--------------------------------------------------------------------------------------------------------------------------------
- /*
- void DATA_INIT(void)
- {
- // Colours_Cnt=0;
- // ColoursFlag=1;
- }*/
- //--------------------------------------------------------------------------------------------------------------------------------
- uint read_ad_vdd(void)
- {
- uint i=0;
- uchar j;
-
- PT3CON=0x01;
-
- SRADCON0=0x03;
-
- SRADCON1=0x80;
- REF_SEL_0=1;
- REF_SEL_1=0;
- REF_SEL_2=1;
- SRADCON2=C_vdd_ad_chs;
-
- SRADS=1;
- asm("nop");
- while(SRADS);
- asm("nop");
- i=SRADH&0x0f;
- i=i<<8;
- i+=SRADL;
- return i;
- }
- //--------------------------------------------------------------------------------------------------------------------------------
- uint read_ad_short(void)
- {
- uint i=0;
-
- PT3CON=0x01;
- P_out_AD_con=1;
-
- SRADCON0=0x03;
-
- SRADCON1=0x80;
- REF_SEL_0=1;
- REF_SEL_1=0;
- REF_SEL_2=1;
- SRADCON2=C_out_ad_chs;
-
- SRADS=1;
- asm("nop");
- while(SRADS);
- asm("nop");
- i=SRADH&0x0f;
- i=i<<8;
- i+=SRADL;
- return i;
- }
- //--------------------------------------------------------------------------------------------------------------------------------
- void delay(uint i)
- {
- while(i--);
- }
- //--------------------------------------------------------------------------------------------------------------------------------
- void time_up(void)
- {
- B_1s=0;
- B_10ms=0;
- B_200us=0;
-
- if(B_200US_INT)
- {
- B_200US_INT=0;
- B_200us=1;
- }
-
- if(B_10MS_INT)
- {
- B_10MS_INT=0;
- B_10ms=1;
-
- R_time++;
- if(R_time>=100)
- {
- R_time=0;
- B_1s=1;
- }
- }
- }
- //--------------------------------------------------------------------------------------------------------------------------------
- void out_init(void)
- {
- uint i;
- uint j;
-
- P_out=0;
- delay(100);
- i=read_ad_short();
- if(i<C_out_short)
- {
- out_short();
- return;
- }
-
- j=read_ad_vdd();
- for(i=0;i<22;i++)
- {
- if(j>=Tab_vdd_data[i])
- break;
- }
- R_out_vol=Tab_out_vol_3V3[i];
- /* switch(R_out_mode)
- {
- case 0:
- R_out_vol=Tab_out_vol_3V4[i];
- break;
- case 1:
- R_out_vol=Tab_out_vol_3V7[i];
- break;
- case 2:
- R_out_vol=150;
- break;
- default :
- break;
- }*/
- /*
- if(KeyFlag_2)
- R_out_vol=Tab_out_vol_1V85[i];
- */
-
- R_out_count=0;
- B_out=1;
- B_out_b=0;
- }
- //---------------------------------------------------------------
- void out_off(void)
- {
- P_out=1;
- B_out=0;
- B_led_pwm=0;
-
- }
- //---------------------------------------------------------------
- void out_short(void)
- {
- out_off();
- // KeyFlag_2=0;
- // Colours_Cnt=0;
- B_key_handle=1;
- B_led_pwm_bk=0;
- led_flash_init(3,0x07);
- }
- //---------------------------------------------------------------
- void out_vol(void)
- {
- uint i;
-
- if(!B_out)
- return;
- if(!B_200us)
- return;
- R_out_count++;
- if(R_out_count>=C_out_vol_period) //#define C_out_vol_period 150 //3s
- {
- R_out_count=0;
- }
- if(R_out_vol>=R_out_count)
- {
- if(B_out_b)
- {
- i=read_ad_short();
- if(i<C_out_short)
- {
- out_short();
- return;
- }
- else if(read_ad_vdd()>C_vdd_low1)
- {
- out_off();
- led_flash_init(10,0x07);
- B_key_handle=1;
- // B_key_lock=~B_key_lock;
- return;
- }
- }
-
- B_out_b=1;
- P_out=0;
- }
- else
- {
-
- B_out_b=0;
- P_out=1;
- }
-
- }
- //--------------------------------------------------------------------------------------------------------------------------------
- void led_on(void)
- {
- B_led_bright_ing=1;
-
- if(R_led_color&0x01)
- P_led1=0;
- else
- P_led1=1;
-
- if(R_led_color&0x02)
- P_led2=0;
- else
- P_led2=1;
-
- if(R_led_color&0x04)
- P_led3=0;
- else
- P_led3=1;
-
- }
- //---------------------------------------------------------------
- void led_off(void)
- {
- B_led_bright_ing=0;
-
- P_led1=1;
- P_led2=1;
- P_led3=1;
- }
- //---------------------------------------------------------------
- void disp_led(void)
- {
- if(!B_200us)
- return;
-
- if(B_led_flashing)
- {
- if(B_10ms)
- R_led_count++;
-
- B_have_action=1;
- if(R_led_count>=25)
- {
- R_led_count=0;
- if(B_led_bright_ing)
- {
- led_off();
- }
- else
- {
- if(R_led_fn)
- {
- R_led_fn--;
- led_on();
- }
- else
- {
- B_led_flashing=0;
- }
- }
- }
-
- }
- else if(B_led_pwm||B_led_pwm_bk)
- {
- B_have_action=1;
- R_led_count++;
- if(R_led_count>=C_led_pwm_period)
- {
- R_led_count=0;
- if(B_led_pwm)
- {
- if(R_led_duty<C_led_pwm_period)
- {
- R_led_duty++;
- }
-
- B_led_pwm_bk=1;
- }
- else
- {
- if(R_led_duty)
- {
- R_led_duty--;
- }
- else
- {
- B_led_pwm_bk=0;
- out_off();
- }
-
- }
- }
- if(R_led_count<R_led_duty)
- led_on();
- else
- {
- led_off();
-
- }
-
- }
-
- else if(B_USB_charge)
- {
- if(B_USB_ch_full)
- {
- B_have_action=1;
- led_off();
- }
- else
- {
- B_have_action=1;
- R_led_color=0x07;
- led_on();
- }
- }
- else
- {
- led_off();
- }
- }
- //---------------------------------------------------------------
- void led_flash_init(uchar r_fn,uchar r_color)
- {
- R_led_fn=r_fn;
- R_led_color=r_color;
- R_led_count=0;
- B_led_flashing=1;
- }
- //---------------------------------------------------------------
- void led_pwm_init(void)
- {
- R_led_count=0;
- R_led_duty=0;
- B_led_pwm=1;
- }
- //--------------------------------------------------------------------------------------------------------------------------------
- void key_scan(void)
- {
- if(!B_10ms)
- return;
-
- if(R_key_time<0xff)
- R_key_time++;
-
- if(R_key_time==50)
- {
- B_key_short=1;
- }
-
- if(!P_MIC)
- {
- if(B_key_hold)
- {
- B_have_action=1;
-
- R_key_tremble--;
- if(R_key_tremble==0)
- {
- B_key_hold=0;
- B_key_handle=0;
- R_smoke_time=0;
- }
- }
- else
- {
- R_key_tremble=0;
- if(R_key_time>50)
- R_key_much=0;
- }
- }
- else
- {
- if(B_key_hold)
- {
- R_key_tremble=4;
-
- if(R_key_time>25)
- R_key_much=0;
- }
- else
- {
- B_have_action=1;
-
- R_key_tremble++;
- if(R_key_tremble>=4)
- {
- B_key_hold=1;
- R_key_much++;
- R_key_time=0;
- }
- }
- }
- }
- //--------------------------------------------------------------------------------------------------------------------------------
- void key_handle(void)
- {
- if(B_key_handle)
- return;
- if(B_USB_charge)
- return;
- if(B_led_flashing)
- return;
-
- if(B_key_hold)
- {
-
-
- /* if(B_key_lock)
- return;
- */
- if(B_out)
- {
- if(B_10ms)
- {
- R_smoke_time++;
- if(R_smoke_time>=800)
- {
- R_smoke_time=0;
- out_off();
- B_led_pwm_bk=0;
- R_led_duty=0;
- led_flash_init(3,0X07);
- B_key_handle=1;
- }
-
- }
-
- B_have_action=1;
- }
- else
- {
- B_have_action=1;
-
- if(read_ad_vdd()>C_vdd_low)
- {
- led_flash_init(10,0x07);
- B_key_handle=1;
- // B_key_lock=~B_key_lock;
- out_off();
- return;
- }
-
- out_init();
- // B_out=1;
- if(B_out)
- {
- R_led_color=0X07;
- led_pwm_init();
- }
- }
-
-
- }
- else
- {
- if(B_out)
- {
- out_off();
- }
- }
- /*
- if(B_key_short&&(!B_key_lock))
- {
- if(R_key_much==3)
- {
- R_out_mode++;
- if(R_out_mode>=3)
- R_out_mode=0;
-
- led_flash_init(3,Tab_out_mode_color[R_out_mode]);
- }
-
- if(R_key_much==2)
- {
- KeyFlag_2=1;
- out_init();
- led_flash_init(30,LED_Colours[0]);
-
- }
- B_have_action=1;
- B_key_short=0;
- }*/
- }
- //----------------------------------------------------------
- void USB_charge(void)
- {
- if(!B_10ms)
- return;
-
- if(P_ChgON)
- {
- B_have_action=1;
-
- if(B_USB_charge)
- {
- R_USB_count=50;
- if(P_ChgOK)
- {
- if(B_USB_ch_full)
- {
- R_USB_count2=50;
- }
- else
- {
- R_USB_count2++;
- if(R_USB_count2>=50)
- {
- B_USB_ch_full=1;
- }
- }
- }
- else
- {
- if(B_USB_ch_full)
- {
- R_USB_count2--;
- if(R_USB_count2==0)
- {
- B_USB_ch_full=0;
- }
- }
- else
- {
- R_USB_count2=0;
- }
- }
-
-
- }
- else
- {
- R_USB_count++;
- if(R_USB_count>=50)
- {
- B_USB_charge=1;
- B_USB_ch_full=0;
- led_flash_init(5,0x07);
- out_off();
- }
- }
- }
- //--------------------------
- else
- {
- if(B_USB_charge)
- {
- B_have_action=1;
-
- R_USB_count--;
- if(R_USB_count==0)
- {
- B_USB_charge=0;
- B_USB_ch_full=0;
- // B_full_lf=0;
- led_flash_init(2,0x07);
- // chk_led_delayON=1;
- // led_raceCnt1=0;
- // R_led_race=0;
- }
- }
- else
- {
- R_USB_count=0;
-
-
- }
- }
- }
- //--------------------------------------------------------------------------------------------------------------------------------
- void sleep_handle(void)
- {
- if(!B_10ms)
- return;
-
- if(B_have_action)
- {
- B_have_action=0;
- R_sleep_delay=0;
-
- }
- else
- {
- R_sleep_delay++;
- if(R_sleep_delay>=100)
- {
- SRADEN=0;
- T2EN=0;
- TM2IE=0;
-
- IO_INIT_sleep();
- delay(10000);
-
- asm("CLRWDT");
- WDTEN=0; //
- CST_WDT=1; //
-
- E1IF=0;
- E1IE=1;
-
- asm("SLEEP");
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
-
- E1IE=0;
-
- T2EN=1;
- TM2IE=1;
-
- WDTEN=1; //
- CST_WDT=0; //
-
- IO_INIT();
-
-
- R_sleep_delay=0;
-
- }
- }
復制代碼
|