从单片机基础到程序框架(全集 2019pdf版).pdf - 第376页

case 0: if(0==vGu1 6TimeCnt_ 2) { P0_1=0; vGu8Time Flag_2=0; vGu16Tim eCnt_2=BLIN K_TIME_2; vGu8Time Flag_2=1; Gu8Step_ 2=1; } break; case 1: if(0==vG u16TimeCnt_ 2) { P0_1=1; vGu8Time Flag_2=0; vGu16Tim eCnt_2=BLIN K_TI…

100%1 / 836
{
TMOD=0x01; //设置定时器 0 为工作方式 1
TH0=0xfc; //产生 1ms 中断的 TH0 初始
TL0=0x66; //产生 1ms 中断的 TL0 初始
EA=1; //开总中断
ET0=1; //允许定时 0 的中断
TR0=1; //启动定时 0 的中断
while(1) //主循环
{
//软件定时器 1 控制 LED 灯闪
switch(Gu8Step_1)
{
case 0:
if(0==vGu16TimeCnt_1)
{
P0_0=0;
vGu8TimeFlag_1=0;
vGu16TimeCnt_1=BLINK_TIME_1;
vGu8TimeFlag_1=1;
Gu8Step_1=1;
}
break;
case 1:
if(0==vGu16TimeCnt_1)
{
P0_0=1;
vGu8TimeFlag_1=0;
vGu16TimeCnt_1=BLINK_TIME_1;
vGu8TimeFlag_1=1;
Gu8Step_1=0;
}
break;
}
//软件定时器 2 控制 LED 灯闪
switch(Gu8Step_2)
{
case 0:
if(0==vGu16TimeCnt_2)
{
P0_1=0;
vGu8TimeFlag_2=0;
vGu16TimeCnt_2=BLINK_TIME_2;
vGu8TimeFlag_2=1;
Gu8Step_2=1;
}
break;
case 1:
if(0==vGu16TimeCnt_2)
{
P0_1=1;
vGu8TimeFlag_2=0;
vGu16TimeCnt_2=BLINK_TIME_2;
vGu8TimeFlag_2=1;
Gu8Step_2=0;
}
break;
}
//软件定时器 3 控制 LED 灯闪
switch(Gu8Step_3)
{
case 0:
if(0==vGu16TimeCnt_3)
{
P0_2=0;
vGu8TimeFlag_3=0;
vGu16TimeCnt_3=BLINK_TIME_3;
vGu8TimeFlag_3=1;
Gu8Step_3=1;
}
break;
case 1:
if(0==vGu16TimeCnt_3)
{
P0_2=1;
vGu8TimeFlag_3=0;
vGu16TimeCnt_3=BLINK_TIME_3;
vGu8TimeFlag_3=1;
Gu8Step_3=0;
}
break;
}
}
}
void T0_time() interrupt 1 //定时器 0 的中断函数,每 1ms 单片机自动执行一次此函数
{
if(1==vGu8TimeFlag_1&&vGu16TimeCnt_1>0) //在定时中断里衍生出“软件定时器 1”
{
vGu16TimeCnt_1--;
}
if(1==vGu8TimeFlag_2&&vGu16TimeCnt_2>0) //在定时中断里衍生出“软件定时器 2”
{
vGu16TimeCnt_2--;
}
if(1==vGu8TimeFlag_3&&vGu16TimeCnt_3>0) //在定时中断里衍生出“软件定时器 3”
{
vGu16TimeCnt_3--;
}
TH0=0xfc; //重装初值,不能忘
TL0=0x66; //重装初值,不能忘
}