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
}
}
}
|