从单片机基础到程序框架(全集 2019pdf版).pdf - 第380页
volatile u nsigned i nt vGu16TimeCn t_1=0; void main( ) { SystemIn itial(); //“四区 一线”的“第一 区” Delay(10 000); //“四区一线 ”的“一线 ” Peripher alInitial() ; //“四区 一线”的“第二 区” while(1) / /主循环 { LedTask( ); //“四区一线”的“第三 区” } } void T…

断函数才算完美齐全,这个中断函数提供系统的节拍时间,以及处理扫描一些跟 IO 口消抖动相关的函数,
以及跟蜂鸣器驱动相关的函数。
【88.2 switch 外加定时中断。】
提出“switch 外加定时中断”理论,主要方便初学者理解单片机程序大概的“逻辑框架”。
switch 是一个万能语句,它外加 while 与 for 循环就可以做任何复杂的算法,比如,搜索算法,运动算
法,提取关键词算法,等等。它外加定时中断,就可以搭建一个系统的基本框架。比如,做通信的程序框架,
人机界面的程序框架,按键服务的程序框架,等等。switch 的精髓在于“根据条件进行步骤的灵活切换”。
具体内容请看本节的练习程序。
【88.3 练习例程。】
根据上述的两大核心框架理论,编写 1 个 LED 灯闪烁的程序。
图 88.3.1 灌入式驱动 8 个 LED
#include "REG52.H"
void T0_time();
void SystemInitial(void) ;
void Delay(unsigned long u32DelayTime) ;
void PeripheralInitial(void) ;
void LedTask(void);
#define BLINK_TIME_1 1000
sbit P0_0=P0^0;
volatile unsigned char vGu8TimeFlag_1=0;

volatile unsigned int vGu16TimeCnt_1=0;
void main()
{
SystemInitial(); //“四区一线”的“第一区”
Delay(10000); //“四区一线”的“一线”
PeripheralInitial(); //“四区一线”的“第二区”
while(1) //主循环
{
LedTask(); //“四区一线”的“第三区”
}
}
void T0_time() interrupt 1 //“四区一线”的“第四区”
{
if(1==vGu8TimeFlag_1&&vGu16TimeCnt_1>0)
{
vGu16TimeCnt_1--;
}
TH0=0xfc;
TL0=0x66;
}
void SystemInitial(void)
{
TMOD=0x01;
TH0=0xfc;
TL0=0x66;
EA=1;
ET0=1;
TR0=1;
}
void Delay(unsigned long u32DelayTime)
{
for(;u32DelayTime>0;u32DelayTime--);
}
void PeripheralInitial(void)
{
}

void LedTask(void)
{
static unsigned char Su8Step=0; //加 static 修饰的局部变量,每次进来都会保留上一次值。
switch(Su8Step)
{
case 0:
if(0==vGu16TimeCnt_1) //时间到
{
P0_0=0;
vGu8TimeFlag_1=0;
vGu16TimeCnt_1=BLINK_TIME_1; //重装定时的时间
vGu8TimeFlag_1=1;
Su8Step=1; //切换到下一个步骤,精髓语句!
}
break;
case 1:
if(0==vGu16TimeCnt_1) //时间到
{
P0_0=1;
vGu8TimeFlag_1=0;
vGu16TimeCnt_1=BLINK_TIME_1; //重装定时的时间
vGu8TimeFlag_1=1;
Su8Step=0; //返回到上一个步骤,精髓语句!
}
break;
}
}