小优化:
在占空比为0或100时关闭T0中断,否则开启T0中断。
这样configpwm()可以不用分成2个函数。
- unsigned int high,low;
- unsigned char HighRH,HighRL,LowRH,LowRL;
- bit gbTR0;
- void configpwm(unsigned int fr,unsigned char dc)
- {
- //计算high,low;
- if(!TR0){//否则由T0中断刷新加载值
- HighRH=high>>8;HighRL=high;LowRH=low>>8;LowRL=low;
- TH0=LowRH;TL0=LowRL;
- }
- if(dc==100){
- gbTR0=0;
- TR0 = 0;
- pwmout=1;
- }
- else if(dc==0){
- gbTR0=0;
- if(!TR0)//否则由T0中断使pwmout=0;
- pwmout=0;
- }
- else {
- gbTR0=1;
- TR0 = 1;
- }
- }
- void T0_ISR(void)
- {
- pwmout=!pwmout;
- if(pwmout){
- TH0=HighRH;TL0=HighRL;
- }
- else{
- //仅在此更新pwm加载值
- HighRH=high>>8;HighRL=high;LowRH=low>>8;LowRL=low;
- TH0=LowRH;TL0=LowRL;
- TR0 = gbTR0;
- }
- }
- void main(void)
- {
- T0_cfg();
- configpwm(100,0);
- while(1){
- char dc=0;
- for(;dc<=100;dc+=10){
- configpwm(100,dc);
- //死等
- }
- for(;dc<=100;dc-=10){
- configpwm(100,dc);
- //死等
- }
- }
- }
复制代码 |