从单片机基础到程序框架(全集 2019pdf版).pdf - 第366页
{ case 0: Gu32CycleC nt++; if(Gu32Cyc leCnt>=CY CLE_SUM) { Gu32Cycl eCnt=0; P0_0=0; //主循 环的 LED 灯亮。 Gu8Cycle Step=1; } break; case 1: Gu32CycleC nt++; if(Gu32Cyc leCnt>=CY CLE_SUM) { Gu32Cycl eCnt=0; P0_0=1; //主循 环…

图 85.9.1 灌入式驱动 8 个 LED
#include "REG52.H"
#define CYCLE_SUM 5000 //主循环的次数
#define INTERRUPT_SUM 500 //中断的次数
sbit P0_0=P0^0; //在主循环里的 LED 灯
sbit P0_1=P0^1; //在定时中断里的 LED 灯
unsigned char Gu8CycleStep=0;
unsigned long Gu32CycleCnt=0; //累计主循环的计数器
unsigned char Gu8InterruptStep=0;
unsigned long Gu32InterruptCnt=0; //累计定时中断次数的计数器
void main()
{
TMOD=0x01; //设置定时器 0 为工作方式 1
TH0=0xfc; //产生 1ms 中断的 TH0 初始值
TL0=0x66; //产生 1ms 中断的 TL0 初始值
EA=1; //开总中断
ET0=1; //允许定时 0 的中断
TR0=1; //启动定时 0 的中断
while(1) //主循环
{
switch(Gu8CycleStep)

{
case 0:
Gu32CycleCnt++;
if(Gu32CycleCnt>=CYCLE_SUM)
{
Gu32CycleCnt=0;
P0_0=0; //主循环的 LED 灯亮。
Gu8CycleStep=1;
}
break;
case 1:
Gu32CycleCnt++;
if(Gu32CycleCnt>=CYCLE_SUM)
{
Gu32CycleCnt=0;
P0_0=1; //主循环的 LED 灯灭。
Gu8CycleStep=0;
}
break;
}
}
}
void T0_time() interrupt 1 //定时器 0 的中断函数,每 1ms 单片机自动执行一次此函数
{
switch(Gu8InterruptStep)
{
case 0:
Gu32InterruptCnt++; //累计中断次数的次数
if(Gu32InterruptCnt>=INTERRUPT_SUM) //次数达到设定值就跳到下一步骤
{
Gu32InterruptCnt=0; //及时清零计数器,为下一步骤的新一轮计数准备
P0_1=0; //定时中断的 LED 灯亮。
Gu8InterruptStep=1; //跳到下一步骤
}
break;
case 1:
Gu32InterruptCnt++; //累计中断次数的次数
if(Gu32InterruptCnt>=INTERRUPT_SUM) //次数达到设定值就返回上一步骤
{
Gu32InterruptCnt=0; //及时清零计数器,为返回上一步骤的新一轮计数准备

P0_1=1; //定时中断的 LED 灯灭。
Gu8InterruptStep=0; //返回到上一个步骤
}
break;
}
TH0=0xfc; //重装初值,不能忘。
TL0=0x66; //重装初值,不能忘。
}