从单片机基础到程序框架(全集 2019pdf版) - 第375页
{ TMOD=0x01; / /设置定时器 0 为工 作方式 1 TH0=0xfc; //产生 1m s 中断的 TH0 初始 值 TL0=0x66; //产生 1m s 中断的 TL0 初始 值 EA=1; //开总 中断 ET0=1; //允许定时 0 的中断 TR0=1; //启动定时 0 的中断 while(1) / /主循环 { //软件定时器 1 控制 的 LED 灯闪 烁 switch(G u8Step_1) { case…

图 87.2.1 灌入式驱动 8 个 LED
#include "REG52.H"
#define BLINK_TIME_1 1000 //时间是 1000ms
#define BLINK_TIME_2 500 //时间是 500ms
#define BLINK_TIME_3 250 //时间是 250ms
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
//“软件定时器 1”的相关变量
volatile unsigned char vGu8TimeFlag_1=0;
volatile unsigned int vGu16TimeCnt_1=0;
//“软件定时器 2”的相关变量
volatile unsigned char vGu8TimeFlag_2=0;
volatile unsigned int vGu16TimeCnt_2=0;
//“软件定时器 3”的相关变量
volatile unsigned char vGu8TimeFlag_3=0;
volatile unsigned int vGu16TimeCnt_3=0;
unsigned char Gu8Step_1=0; //软件定时器 1 的 switch 切换步骤
unsigned char Gu8Step_2=0; //软件定时器 2 的 switch 切换步骤
unsigned char Gu8Step_3=0; //软件定时器 3 的 switch 切换步骤
void main()

{
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)