#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED1 = P2^0; sbit LED = P2^1; //定义LED灯,通过LED显示调光效果 sbit LED2 = P2^2;
unsigned char CYCLE; //定义周期该数字X基准定时时间如果是10 则周期是10x 0.1ms unsigned char PWM_ON ; //定义高电平时间 /* 延时函数*/ void delay(unsigned int cnt) { while(--cnt); }
/******************************************************************/ /* 主函数 */ /******************************************************************/ void main() { bit Flag; TMOD |=0x01; //定时器设置 0.1ms in 12M crystal TH0=(65536-100)/256; TL0=(65536-100)%6; //定时0.1mS IE= 0x82; //打开中断 TR0=1; CYCLE = 50; // 时间可以调整这个是10调整8位PWM就是256步 while(!Flag) { delay(20000); //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果 PWM_ON++; //这个使用较长延时,以便能看清楚变化过程 if(PWM_ON == CYCLE) { //这个里可以添加其他程序如到最亮时候控制设备 Flag=1; } } while(Flag) //亮度递减同上,是个相反的过程 { delay(20000); //延迟时间为20000*0.4=8000us PWM_ON--; if(PWM_ON == 0) { Flag=0; } } } /******************************************************************/ /* 定时器中断函数 */ /******************************************************************/ void tim(void) interrupt 1 using 1 { static unsigned char count; TH0=(65536-100)/256; TL0=(65536-100)%6; //定时0.1mS if (count==PWM_ON) { LED1 = 1; LED = 1; //灯灭 LED2 = 1; } count++; if(count == CYCLE) { count=0; if(PWM_ON!=0) //如果开启时间是0 保持原来状态 { LED1 = 0; LED = 0; //灯亮 LED2 = 0; } } }