韓靜
摘 要:目前市面上的單片機應用技術教材大多將重點集中在單片機結構原理、接口電路與編程方面,沒有更好地體現單片機程序的可移植、可復用及其實現方法。文中提出基于構件化的單片機程序設計方法,以推動單片機應用技術教材建設與改革,提高教材的教學效果,同時為高校單片機應用技術教學提供一種可行的因材施教途徑。
關鍵詞:單片機;構件化;可移植與可復用;教材建設與改革;因材施教;計算機應用技術
中圖分類號: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.