频率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;
- }
复制代码 |