找回密码
 注册会员
搜索附件  
MCU资讯论坛 附件中心 单片机论坛 51单片机论坛 5_50410_9559be008e6895b.jpg

5_50410_9559be008e6895b.jpg

 

“从单片机初学者迈向单片机工程师”之LED主题讨论周第三章----:
本部分内容设定了隐藏,需要回复后才能看到






















































































































OK ,到此一个简单的工程模板就建立起来了,以后我们再新建源文件和头文件的时候,就可以直接保存到src文件目录下面了。
下面我们开始编写各个模块文件。
首先编写Timer.c 这个文件主要内容就是定时器初始化,以及定时器中断服务函数。其内容如下。
#include <reg52.h>

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 <reg52.h>
#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 <reg52.h>
#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() ;
}
}

整个工程截图如下:




至此,第三章到此结束。
一起来总结一下我们需要注意的地方吧

[color=#FF0000]1. C语言源文件(*.c)的作用是什么
2. C语言头文件(*.h)的作用是什么
3. typedef 的作用
4. 工程模板如何组织
5. 如何创建一个多模块(多文件)的工程



[ 此贴被红金龙吸味在2009-12-28 21:04重新编辑 ]


5_50410_9559be008e6895b.jpg

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 13:38 , Processed in 0.036267 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部