微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > keil中的单片机模块化编程

keil中的单片机模块化编程

时间:12-03 来源:互联网 点击:

文件关系如下

main.c

Timer.c --?Timer.h

Led.c --?Led.h

在开始重新编写我们的程序之前,先给大家讲一下如何在KEIL中建立工程模板吧,这个模板是我一直沿用至今。希望能够给大家一点启发。

下面的内容就主要以图片为主了。同时辅以少量文字说明。

我们以芯片AT89S52为例。

OK ,到此一个简单的工程模板就建立起来了,以后我们再新建源文件和头文件的时候,就可以直接保存到src文件目录下面了。

下面我们开始编写各个模块文件。

首先编写Timer.c 这个文件主要内容就是定时器初始化,以及定时器中断服务函数。其内容如下。

#include

bit g_bSystemTime1Ms = 0 ; // 1MS系统时标

void Timer0Init(void)

{

TMOD &= 0xf0 ;

TMOD |= 0x01 ; //定时器0工作方式1

TH0 = 0xfc ; //定时器初始值

TL0 = 0x66 ;

TR0 = 1 ;

ET0 = 1 ;

}

void Time0Isr(void) interrupt 1

{

TH0 = 0xfc ; //定时器重新赋初值

TL0 = 0x66 ;

g_bSystemTime1Ms = 1 ; //1MS时标标志位置位

}

由于在Led.c文件中需要调用我们的g_bSystemTime1Ms变量。同时主函数需要调用Timer0Init()初始化函数,所以应该对这个变量和函数在头文件里作外部声明。以方便其它函数调用。

Timer.h 内容如下。

#ifndef _TIMER_H_

#define _TIMER_H_

extern void Timer0Init(void) ;

extern bit g_bSystemTime1Ms ;

#endif

完成了定时器模块后,我们开始编写LED驱动模块。

Led.c 内容如下:

#include

#include "MacroAndConst.h"

#include "Led.h"

#include "Timer.h"

static uint16 g_u16LedTimeCount = 0 ; //LED计数器

static uint8 g_u8LedState = 0 ; //LED状态标志, 0表示亮,1表示熄灭

#define LED P0 //定义LED接口

#define LED_ON() LED = 0x00 ; //所有LED亮

#define LED_OFF() LED = 0xff ; //所有LED熄灭

void LedProcess(void)

{

if(0 == g_u8LedState) //如果LED的状态为亮,则点亮LED

{

LED_ON() ;

}

else //否则熄灭LED

{

LED_OFF() ;

}

}

void LedStateChange(void)

{

if(g_bSystemTime1Ms) //系统1MS时标到

{

g_bSystemTime1Ms = 0 ;

g_u16LedTimeCount++ ; //LED计数器加一

if(g_u16LedTimeCount >= 500) //计数达到500,即500MS到了,改变LED的状态。

{

g_u16LedTimeCount = 0 ;

g_u8LedState = ! g_u8LedState ;

}

}

}

这个模块对外的借口只有两个函数,因此在相应的Led.h 中需要作相应的声明。

Led.h 内容:

#ifndef _LED_H_

#define _LED_H_

extern void LedProcess(void) ;

extern void LedStateChange(void) ;

#endif

这两个模块完成后,我们将其C文件添加到工程中。然后开始编写主函数里的代码。

如下所示:

#include

#include "MacroAndConst.h"

#include "Timer.h"

#include "Led.h"

sbit LED_SEG = P1^4; //数码管段选

sbit LED_DIG = P1^5; //数码管位选

sbit LED_CS11 = P1^6; //led控制位

void main(void)

{

LED_CS11 = 1 ; //74HC595输出允许

LED_SEG = 0 ; //数码管段选和位选禁止(因为它们和LED共用P0口)

LED_DIG = 0 ;

Timer0Init() ;

EA = 1 ;

while(1)

{

LedProcess() ;

LedStateChange() ;

}

}

整个工程截图如下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top