从单片机基础到程序框架(全集 2019pdf版).pdf - 第377页
{ P0_2=1; vGu8Time Flag_3=0; vGu16Tim eCnt_3=BLIN K_TIME_3; vGu8Time Flag_3=1; Gu8Step_ 3=0; } break; } } } void T0_ti me() inte rrupt 1 / /定时器 0 的中断函数 ,每 1ms 单片 机自动执行一 次此函数 { if(1==vG u8TimeFlag_ 1&&vGu16Ti meCn…

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; //重装初值,不能忘
}

第八十八节: 两大核心框架理论(四区一线,switch 外加定时中断)。
【88.1 四区一线。】
提出“四区一线”理论,主要方便初学者理解单片机程序大概的“空间分区”。
“四区”代表四大主流函数,分别是:系统初始化函数,外设初始化函数,主程序的任务函数,定时中
断函数。
“一线”是指“系统初始化函数”与“外设初始化函数”的“分割线”,这个“分割线”是一个 delay
的延时函数。
“四区一线”的布局如下:
void main()
{
SystemInitial(); //“四区一线”的“第一区”
Delay(10000); //“四区一线”的“一线”
PeripheralInitial(); //“四区一线”的“第二区”
while(1) //主循环
{
LedTask(); //“四区一线”的“第三区”
KeyTask(); //“四区一线”的“第三区”
UsartTask(); //“四区一线”的“第三区”
... //凡是在主循环里的函数都是属于“第三区”
}
}
void T0_time() interrupt 1 //“四区一线”的“第四区”
{
}
“第一区”的函数 SystemInitial(),是一个系统的初始化函数,专门用来初始化单片机自己的寄存器
以及个别外围要求响应速度快的输出设备,防止刚上电之后,由于输出 IO 口电平状态不确定而导致外围设
备误动作,比如驱动继电器的误动作等等。
“一线”的函数 Delay(10000),是一个延时函数,为什么这里要插入一个延时函数?主要目的是为接下
来的 PeripheralInitial()做准备的。上电后先延时一段时间,再执行 PeripheralInitial()函数,因为
PeripheralInitial()函数专门用来初始化不要求上电立即处理的外设芯片和模块。比如液晶模块,AT24C02
存储芯片,DS1302 时钟芯片,等等。这些芯片在上电的瞬间,内部自身的复位需要一点时间,以及外部电压
稳定也需要一点时间,只有过了这一点时间,这些芯片才处于正常的工作状态,这个时候单片机才能跟它正
常通信,所以“一线”函数 Delay(10000)的意义就在这里。
“第二区”的函数 PeripheralInitial(),是一个外设的初始化函数。专门用来初始化不要求上电立即
处理的外设芯片和模块。
“第三区”的函数 LedTask(),KeyTask(),UsartTask(),等等,是一些在主循环里不断扫描的任务函
数。
“第四区”的函数 void T0_time() interrupt 1,是一个定时中断函数,一个系统必须标配一个定时中