![]() |
來51學習1 發表于 2019-11-15 10:31 方波的脈寬啊 |
你是想根據方波的什么特征開控制PWM? |
我這個程序能實現這個功能嗎??? #include "define.h" #include "delay.h" #include "play.h" #include "motor.h" #include "mic.h" /********請先在define.h中調整晶振頻率與周期配置**************/ u8 mode = 0; //速度級別 void change_mode() { static u8 i=0,j=0; //計時變量約為8ms if(mic_flag==2) { i++; if(i>10&&mic_flag==2) { //開機確認 if(mode==0) { Play_music(PCM8sfkj,sizeof(PCM8sfkj)); j=50; mic_flag=0; while(j--) { delay_ms(100); if(mic_flag==2) { Play_music(PCM8zstz,sizeof(PCM8zstz)); mode=1; mic_flag=0; break; } } } else if(mode==1) { mode=2; } else if(mode==2) { Play_music(PCM8zstz,sizeof(PCM8zstz)); mode=1; } mic_flag=0; i=0; } } else if(mic_flag==3) { i++; if(i>15&&mic_flag==3) { mode=0; mic_flag=0; i=0; } } } void change_PWM() { if(mode==0) { PCA_PWM0 = 0x03; CCAP0H = CCAP0L = 0xff; } else if(mode==1) { PCA_PWM0 = 0x00; CCAP0H = CCAP0L = CCAP0L-1; } else if(mode==2) { PCA_PWM0 = 0x00; CCAP0H = CCAP0L = CCAP0L; } } void main() { Timer1Init(); IT0Init(); PWMInit(); Play_init(); delay_ms(1000); while(1) { change_mode(); change_PWM(); Digital_Display_One(CCAP0L/16); delay_ms(50); } } void delay_ms(uint ms) { unsigned char i, j; do { i = TIME_I; j = TIME_J; do { while (--j); } while (--i); }while(--ms); } #if Machine_Cycle==12UL void delay5us() //@12.000MHz { _nop_(); } #elif Machine_Cycle==2UL void delay5us() //@12.000MHz { unsigned char i; i = 12; while (--i); } void IT0Init(void) //100微秒@11.0592MHz { IT0=1; EX0=1; EA=1; } void Timer1Init(void) //50毫秒@11.0592MHz { AUXR &= 0xBF; //定時器時鐘12T模式 TMOD &= 0x0F; //設置定時器模式 TMOD |= 0x10; //設置定時器模式 TL1 = 0x66; //設置定時初值 TH1 = 0xFC; //設置定時初值 TF1 = 0; //清除TF1標志 TR1 = 1; //定時器1開始計時 EA = 1; ET1 = 1; } u32 times=0; void T1INT() interrupt 3 { TL1 = 0x66; //設置定時初值 TH1 = 0xFC; //設置定時初值 times++; } u8 mic_flag=0; void EX0INT(void) interrupt 0 { static u32 last_time=0; u32 differ; differ=times-last_time; last_time=times; if(differ>1000) { mic_flag=1; } else if(mic_flag>0&&differ>100&&differ<500) { mic_flag++; } } void PWMInit() { CCON = 0; //清除PCA控制寄存器 CL = 0; //復位PCA定時器計數值 CH = 0; CMOD=0x0a; //工作模式:頻率=Sysclk/4/256=10800Hz 無中斷 CCAP0H = CCAP0L = 0xff; //PWM0設置占空比50% PCA_PWM0 = 0x03; CCAPM0 = 0x42; //PCA模塊0 工作在8比特方式 無中斷 CR = 1; //PCA定時器運行 } |