頻率20K~30K ,占空比50%,脈寬只有十幾到二十幾us,普通51單片機12T難以勝任。要想調整增減階量100Hz根本不可能。給你寫了一個示例,只是提供編程思路。如果換用1T單片機且其它任務不多可以實現。依靠外部硬件倍頻也是可選方案。
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit key1=P3^0; //定義+鍵
- sbit key2=P3^1; //定義-鍵
- sbit PWM =P3^7;
- unsigned char frequency=0;
- unsigned int code T_Value[21]={
- 50 ,//20KHz
- 49 ,//20.5KHz
- 48 ,//21KHz
- 47 ,//
- 45 ,//
- 44 ,//
- 43 ,//
- 43 ,//
- 42 ,//
- 41 ,//
- 40 ,//
- 39 ,//
- 38 ,//
- 38 ,//
- 37 ,//
- 36 ,//
- 36 ,//
- 35 ,//
- 34 ,//
- 34 ,//
- 33 };//30KHz
- void InitTimer0(void)//@24MHz晶振
- {
- TMOD= 0x02;//8位自動重裝
- TL0 = T_Value[frequency];
- TH0 = T_Value[frequency];
- TR0 = 1;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void key_scan()
- {
- static bit sign=0;
- static uchar count=0;
- if(!key1||!key2)
- {
- if(++count>=20 && sign==0)
- {
- sign=1;
- if(!key1)
- {
- if(frequency<20)
- frequency++;
- }
- if(!key2)
- {
- if(frequency>0)
- frequency--;
- }
- TH0 = T_Value[frequency];
- }
- }
- else
- {
- sign=0;
- count=0;
- }
- }
- void main(void)
- {
- InitTimer0();
- while (1)
- {
- key_scan();
- }
- }
- void Timer0Interrupt(void) interrupt 1
- {
- PWM = ~PWM;
- }
復制代碼 |