- void dsqcsh(void); //定时器初始化
- sbit PWM=P2^1; //接运算放大器的引脚
- bit b; //定义输出信号是否该反转的标志位(亮转暗/暗转亮)0亮1暗
- int zzq,zzqpd,sj;//zzq:正周期,随中断增加,到100清零当正周期等于正周期判断,则LED亮; zzqpd:正周期判断:占空比中亮起的时间,每500us增加一次; sj:记录中断次数的变量,每100us清零
- void main(void)
- {
- dsqcsh(); //初始化定时器
- while(1);
- }
- void dsqcsh() //初始化定时器:设定定时器0工作方式是2方式,每1us中断一次
- {
- TMOD|=0X02; //设置定时器0工作方式为2
- TH0=0XFF; //中断时间为1us
- TL0=0XFF; //中断时间为1us
- ET0=1; //允许T0定时器中断
- EA=1; //打开总中断
- TR0=1; //让定时器0工作
- }
- void dsq0() interrupt 1 //定时器0中断函数由判断是否该输出低电平,判断一个周期是否结束,减少和增加低电平时间组成
- {
- sj++; //记录进入中断的次数,到100清零
- zzq++; //增加一次正周期
- if(zzq==zzqpd) //当正周期等于判断周期时LED亮
- {
- PWM=0;
- }
- if(zzq==100) //如果经过了100us判定此周期结束关闭LED,正周期清零
- {
- zzq=0;
- PWM=1;
- }
-
- if(sj==500 && b==1) //判断是否标志位为1且经过了500us
- {
- sj=0; //记录进入中断次数清零
- if(zzqpd==1) //如果正周期被减到1(不能为0因为下次中断后已经经过1us了),标志位反转否则正周期时间减一
- {
- b=0; //标志位反转
- }else
- {
- zzqpd--; //判断正周期时间-1
- }
- }
-
- if(sj==500 && b==0) //判断是否标志位为0且经过了500us
- {
- sj=0; //记录进入中断次数清零
- if(zzqpd==100) //如果正周期被加到100,标志位反转否则正周期时间加一
- {
- b=1; //标志位反转
- }else
- {
- zzqpd++; //判断正周期时间+1
- }
- }
- }
|