本帖最后由 samsunghellome 于 2013-8-16 16:21 编辑
求高手解释一下该程序的编程思想,运行顺序,定时器中断函数,何时进入,何时跳出,谢谢
#include"reg52.h" //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED=P1^7; //定义LED灯,通过LED显示调光效果
unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms
unsigned char PWM_ON=0 ;//定义高电平时间,当PWM_ON非0时为点亮LED,反之熄灭.
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
void main()
{
bit Flag=0;
TMOD=0x01; //定时器设置 0.1ms in 12M crystal
TH0=(65536-100)/256;
TL0=(65536-100)%256; //定时0.1mS
IE=0x82; //打开中断 EA / ET2 ES ET1 EX1 ET0 EX0
TR0=1;
CYCLE =10; // 时间可以调整 这个是10调整 8位PWM就是256步
while(!Flag) //Flag=0
{
delay(1000); //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果
//这个使用较长延时,以便能看清楚变化过程
PWM_ON++;
if(PWM_ON==CYCLE)
{ //这个里可以添加其他程序 如到最亮时候控制设备
Flag=1;
}
}
while(Flag) //亮度递减 同上,是个相反的过程
{
delay(5000);
PWM_ON--;
if(PWM_ON == 1)
{
Flag=0;
}
}
}
/******************************************************************/
/* 定时器中断函数 */
/******************************************************************/
void time0(void) interrupt 1 using 1
{
static unsigned char count;
TH0=(65536-100)/256;
TL0=(65536-100)%256; //定时0.1mS
if(count==PWM_ON) //count=0,第1次中断时PWM_ON=0;
{
LED=1; //灯灭
}
count++;
if(count==CYCLE)
{
count=0;
if(PWM_ON!=0)
{LED=0;} //如果左右时间是0,保持原来状态
}
}
|