框架式编程基础概念、任务调度和数据分配
文章目录
- 框架式编程基础概念、任务调度和数据分配
- 1. 案例引入:
- 2.代码实现
- 3. 框架式编程的概念
- 4. 搭建框架式编程文件
- 任务
- 工程建立步骤
- 代码编程
1. 案例引入:
代码如下:
遇到要求简单的可以采用上述代码实现,但遇到接下来的呢?
2.代码实现
因此,采用另一种代码实现方式,while主循环里面套if分支判断
clude <STC15.H> //头文件包含,STC15W系列单片机使用(注意:使用STC15.H,需要删除下面的sfr行)
sbit LED1=P3^5; //定义3个灯
sbit LED2=P3^6;
sbit LED3=P3^7;
void main() //主函数 有且唯一
{
static unsigned short count=0; //65535,16位
P3M0 = 0;
P3M1 = 0;
while(1) //主函数死循环
{
count++;
if(count%90==0) //大循环运行90圈,最小公倍数61110=90*679
{
LED1=~LED1; //LED1每2ms 翻转一次,方波频率255Hz
}
if(count%315==0) //大循环运行315圈,最小公倍数61110=315*194
{
LED2=~LED2; //LED2每7ms 翻转一次,方波频率72Hz
}
if(count%4365==0) //大循环运行4365圈,最小公倍数61110=4365*14
{
LED3=~LED3; //LED3每97ms 翻转一次,方波频率5.15Hz
//0~61110
count=count%61110; //最小公倍数,让三颗LED周期更完美
}
}
}
注意:
用逻辑分析仪抓取LED的运行时会发现
这是因为90,315,4365的最小公约数是61110,而unsigned short
的范围最大是65535
计算器计算:65535可以被count计数到4365多少次
而
计算剩余的60即波形图1.399ms的来由
解决方法:
使count++到61110结束,再由0重新计数。
**总结:**合理利用碎片时间,避免占用资源。
3. 框架式编程的概念
要点:
根据器件特性,合理分配时间。例:数码管每秒刷新次数要大于LCD1602每秒刷新次数
框架式概念图
4. 搭建框架式编程文件
任务
以74HC595命名,建立一个框架式编程最简单的程序框架,并实现简单的数据分配
工程建立步骤
- 新建文件夹
- 新建工程
- 对工程下的源文件进行分类管理
- 新建所需源文件和头文件
- 魔术棒选项设置
- 添加新建的.c文件和.h文件
- 测试代码
至此,工程新建完毕。
代码编程
- 文件调用规范
- .h文件关联.c文件
- 为头文件新建标签
- 写HC595_Init()初始化函数
void HC595_Init()
{
P3M0 = 0;
P3M1 = 0;
P3 = 0X55;
}
- 代码执行流程分析
执行main.c
在主函数内找不到HC595_Init();
去头文件"HC595_Drive.H"
里找
因此需要在"HC595_Drive.H"
声明了该函数,同时HC595_Drive.c
也包含了"HC595_Drive.H"
,由此找到函数体本身
"HC595_Drive.H"
实现了HC595_Drive.c
和main.c
的关联和调用
- 优化
用all.h包含所有头文件
新建all.h
- 数据分配
- 简单数据分配:定义数组
2… 声明
- 赋值
注:
变量或函数遵循“先定义,再声明,最后使用”的原则。
- 框架式编程的数据分配
定义595数据分配函数,主函数内循环调用
- typedef取别名操作简化书写
使用取别名关键字
u8,u16,u32取别名的位置很关键
必须在"HC595_Drive.H"
前面
C语言不会向后找取别名的定义