韩静
摘 要:目前市面上的单片机应用技术教材大多将重点集中在单片机结构原理、接口电路与编程方面,没有更好地体现单片机程序的可移植、可复用及其实现方法。文中提出基于构件化的单片机程序设计方法,以推动单片机应用技术教材建设与改革,提高教材的教学效果,同时为高校单片机应用技术教学提供一种可行的因材施教途径。
关键词:单片机;构件化;可移植与可复用;教材建设与改革;因材施教;计算机应用技术
中图分类号:TP311文献标识码:A文章编号:2095-1302(2019)03-0-04
0 引 言
单片机应用技术是电子信息、物联网、自动化等专业的核心课程。经市场调研,从单片机编程语言角度出发,目前单片机应用技术教材主要包括汇编语言、C语言、汇编语言和C语言并存的三种类型,不论哪种类型的教材,都将重点集中于讲述单片机结构原理、接口电路与编程,而没有体现单片机程序的可移植、可复用及其实现方法。为此,提出基于构件化的单片机程序设计方法。
1 基于构件的单片机程序设计方法
现给出keil环境下51单片机的定时器应用构件化程序设计框架如图1所列。以此说明单片机构件化程序设计方法[1-2]。
由图1可以看出,03底层驱动构件、04应用外设构件、05通用软件构件、06工程源程序都是由本构件的.h和.c文件组成。在此框架下可通过添加其他构件和修改应用层程序(工程源程序)而完成不同功能的软件设计。因此,基于构件化的单片机程序设计方法,可很好地实现单片机程序的移植和复用[3-5]。
在教学中,MCU底层驱动构件和应用外设构件可先由老师设计好,引导学生将学习重点放在以下方面:
(1)掌握MCU底层驱动构件头文件和应用外设构件头文件的使用方法,熟悉相关宏定义,掌握对外接口函数的调用方法;
(2)根据系统功能,进行工程源程序設计和优化。在此基础上,引导基础较好的学生进行MCU底层驱动构件和应用外设驱动构件设计,进一步提高其单片机程序设计水平。可见,基于构件化的单片机程序设计方法,为高校单片机应用技术教学提供了一种有效的因材施教途径[6-8]。
下面给出其中定时器TIMER底层驱动构件文件夹的程序代码,以说明构件化程序的设计思想和设计方法。
1.1 定时器TIMER底层驱动构件头文件
//==========================================
//文件名称:timer.h
//功能概要:定时器TIMER底层驱动构件头文件
//芯片类型:STC89C52
//版权所有:CMP-HJ
//版本更新:2018-10-18 V1.0
//==========================================
#ifndef _TIMER_H//防止重复定义(_TIMER_H开头)
#define _TIMER_H
//1.文件包含
#include “common.h”//包含公共要素头文件
//2.宏定义
//(1)定时器号0、1
#define TIMER_0 0//TIMER 0
#define TIMER_1 1//TIMER 1
//3.对外接口函数声明
//==========================================
//函数名称:timer_init
//函数功能:定时器初始化
//函数参数:timer_No: 定时器号TIMER_0、TIMER_1
// int_ms:定时时间,单位ms,推荐最大值50ms
//函数返回:无
//==========================================
void timer_init(uint_8 timer_No, uint_8 int_ms);
//==========================================
//函数名称:timer_start
//函数功能:定时器启动运行
//函数参数:timer_No:定时器号TIMER_0、TIMER_1
//函数返回:无
//==========================================
void timer_start(uint_8 timer_No);
//==========================================
//函数名称:timer_stop
//函数功能:定时器停止运行
//函数参数:timer_No: 定时器号TIMER_0、TIMER_1
//函数返回:无
//==========================================
void timer_stop(uint_8 timer_No);
//==========================================
//函数名称:timer_int_enable
//函数功能:开定时器中断
//函数参数:timer_No: 定时器号TIMER_0、TIMER_1
//函数返回:无
//==========================================
void timer_int_enable(uint_8 timer_No);
//==========================================
//函数名称:timer_int_disable
//函数功能:关定时器中断
//函数参数:timer_No: 定时器号TIMER_0、TIMER_1
//函数返回:无
//==========================================
void timer_int_disable(uint_8 timer_No);
#endif//防止重復定义(_TIMER_H 结尾)
//==========================================
1.2 定时器TIMER底层驱动构件源文件
//==========================================
//文件名称:timer.c
//功能概要:定时器TIMER底层驱动构件源文件
//芯片类型:STC89C52
//版权所有:CMP-HJ
//版本更新:2018-10-18 V1.0
//==========================================
//1.包含本构件头文件
#include “timer.h”
//2.对仅用于本文件的全局变量和内部函数的声明
//3.对外接口函数的定义与实现
//==========================================
//函数名称:timer_init
//函数功能:定时器初始化
//函数参数:timer_No: 定时器号TIMER_0、TIMER_1
// int_ms:定时时间,推荐最大值50 ms单位ms
//函数返回:无
//==========================================
void timer_init(uint_8 timer_No, uint_8 int_ms)
{
uint_16 timer_value;//存放定时器初值
switch(timer_No)
{
case TIMER_0:
TMOD &= ~0x0f;//TIMER_0工作方式1
TMOD |= 0x01;
timer_value=65536-(uint_16)(int_ms*(CLK_KHZ/12));
TH0 = timer_value>>8;//定时器初值高8位
TL0 = (uint_8)timer_value;//定时器初值低8位
break;
case TIMER_1:
TMOD &= ~0xf0;//TIMER_0工作方式1
TMOD |= 0x10;
timer_value=65536-(uint_16)(int_ms*(CLK_KHZ/12));
TH1 = timer_value>>8;//定时器初值高8位
TL1 = (uint_8)timer_value;//定时器初值低8位
break;
default:
break;
}
}
//==========================================
//函数名称:timer_start
//函数功能:定时器启动运行
//函数参数:timer_No: 定时器号TIMER_0、TIMER_1
//函数返回:无
//==========================================
void timer_start(uint_8 timer_No)
{
switch(timer_No)
{
case TIMER_0:
TR0 = 1;//TIMER_0启动
break;
case TIMER_1:
TR1 = 1;//TIMER_1启动
break;
default:
break;
}
}
//==========================================
//函数名称:timer_stop
//函数功能:定时器停止运行
//函数参数:timer_No:定时器号TIMER_0、TIMER_1
//函数返回:无
//==========================================
void timer_stop(uint_8 timer_No)
{
switch(timer_No)
{
case TIMER_0:
TR0 = 0;//TIMER_0停止
break;
case TIMER_1:
TR1 = 0;//TIMER_1停止
break;
default:
break;
}
}
//==========================================
//函數名称:timer_int_enable
//函数功能:开定时器中断
//函数参数:timer_No:定时器号TIMER_0、TIMER_1
//函数返回:无
//==========================================
void timer_int_enable(uint_8 timer_No)
{
switch(timer_No)
{
case TIMER_0:
ET0 = 1;//TIMER_0定时中断允许
break;
case TIMER_1:
ET1 = 1;//TIMER_1定时中断允许
break;
default:
break;
}
}
//==========================================
//函数名称:timer_int_disable
//函数功能:关定时器中断
//函数参数:timer_No: 定时器号TIMER_0、TIMER_1
//函数返回:无
//==========================================
void timer_int_disable(uint_8 timer_No)
{
switch(timer_No)
{
case TIMER_0:
ET0 = 0;//TIMER_0定时中断允许
break;
case TIMER_1:
ET1 = 0;//TIMER_1定时中断允许
break;
default:
break;
}
}
2 结 语
实践证明,在上述基于构件化的单片机程序设计框架下,通过搭积木的方式添加其他MCU底层驱动构件和应用外设驱动构件,并根据实际需要编写工程源程序文件夹中的程序,可快速实现不同的应用功能。同时,基于构件化的单片机程序设计方法,为高校单片机应用技术教学提供一种可行的因材施教、分层教学的途径。因此采用构件化的单片机应用技术教材将会推动单片机应用技术教学改革,提高教材的教学效果[9-10]。
参 考 文 献
[1]王宜怀.嵌入式技术基础与实践[M].北京:清华大学出版社,2017.
[2]蔡伯峰,王宜怀.基于ARM Cortex-M4的构件化汇编框架的研究[J].计算机测量与控制,2016,24(10):138-141.
[3]曹国平,王宜怀,凌云.基于KL25的RFID构件化工程框架研究[J].电子技术应用,2015,41(8):20-23.
[4]张天飞,龙海燕,丁娇,等.基于项目化教学的单片机课程改革[J].物联网技术,2018,8(4):119-120.
[5]王静霞.单片机应用技术(C语言版)[M].北京:清华大学出版社,2015.
[6]聂森.《单片机原理及应用》课程教学改革研究[J].教育教学论坛,2018(52):85-86.
[7]段凌飞,黄健全,张宏桥.单片机课程实践与理论教学的深入分析与改革应用[J].中国现代教育装备,2018(23):80-82.
[8]李波.《单片机原理与应用》实验教学改革与实践[J].电子世界,2018(23):101.
[9]金国华,毕胜,王璐,等.单片机实践教学体系构建与实施[J].电气电子教学学报,2018,40(06):129-133.
[10]刘长荣,丁勤.基于嵌入式构件技术的教学具设计[J].信息与电脑,2016(16):45-46.