#include <AT89X52.h>
#define MAX 0x50 //定時上限定義
#define MIN 0x00 //定時下限定義
#define TIMELINE 11 //時間分頻常數
#define TRUE 1
#define FALSE 0 //標志位常數
unsigned int TimeCounter;
bit ArrowFlg = 0; //方向標志位
unsigned char upCounter,downCounter; //增加計數器和減少計數器
sbit LED=P2^0;
//T0的中斷服務子函數
void T0Deal() interrupt 1 using 0
{
TH0=0xf1;
TL0=0xf1;
TR0=1;
TimeCounter++; //定時計數器增加
if(TimeCounter == TIMELINE)
{
if((upCounter == MAX)&&(downCounter == MIN)) //計數方向標志位切換
{
ArrowFlg = FALSE;
}
if((upCounter == MIN)&&(downCounter == MAX))
{
ArrowFlg= TRUE;
}
if(ArrowFlg == 1) //如果是增加計數
{
upCounter++;
downCounter--;
}
else //如果是減少計數
{
upCounter--;
downCounter++;
}
TimeCounter=0;
}
}
//延時函數
void Delay(unsigned int i)
{
unsigned int j;
while(i--)
{
for(j=0;j<32;j++); //延時
}
}
void main()
{
upCounter = MIN;
downCounter = MAX; //計數器初始化
TMOD = 0x01; //設置定時器工作方式
TH0 = 0xF0;
TL0 = 0xF0 ; //T0初始化值
EA = 1;
ET0 = 1; //開中斷
TR0 = 1; //啟動T0
while(1)
{
LED=0; //輸出變化的PWM波形
Delay(downCounter);
LED=1;
Delay(upCounter);
}
}
|