找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
楼主: 无量寿经
收起左侧

好书推荐《51单片机轻松入门—基于STC15W4K系列》

  [复制链接]
ID:60379 发表于 2016-2-15 21:46 | 显示全部楼层
 
《51单片机轻松入门—基于STC15W4K系列》内容节选
2.5 模块化编程
2.5.1  头文件的编写
   执行菜单File→New新建一个空白文件,然后保存,保存路径选择当前工程所在文件夹,为方便阅读程序,文件名尽量与对应的*.c文件名相同,后缀名为*.h,模块化编程通常是一个*.c文件对应一个*.h文件,头文件编写中首先要使用条件编译命令防止头文件重包含错误,例如:
#ifndef __STDIO_H__   //__ 是2个下划线
#define __STDIO_H__   
……头文件代码块
#endif
   一般格式是这样的:
    #ifndef <标识>
    #define <标识>
……头文件代码块
    #endif
    <标识>在理论上来说可以是自由命名的,为便于理解程序,实际使用一般是用头文件名并且全部大写,前后各加2个下划线,并把文件名中的“.”变成一个下划线。
2.5.2  条件编译
一般情况下,源程序中所有的行都参加编译,但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”,条件编译功能也可用条件语句来实现,但条件编译可以节省程序存储器空间,需要注意的是条件编译命令行结尾没有分号。
第1种条件编译格式
    #ifdef 标识符
        语句段1;
#else
        语句段2
#endif
功能说明:如果标识符已被#define命令定义过,则编译语句段1; 否则编译语句段2。
示例: #define MASTER 1
           ┅┅
          #ifdef MASTER
               SPCTL=0xf0;
          #else
               SPCTL=0xe0;
          #endif
第2种条件编译格式
     #ifndef  标识符
          语句段1;
#else
          语句段2
#endif
功能说明:如果标识符未被#define命令定义过,则编译语句段1; 否则编译语句段2。
第3种条件编译格式
#if  常数表达式
语句段1;
#else
语句段2;
#endif
功能说明:若#if指令后的常数表达式为真(随便什么数字,只要不是0),则编译语句段1,否则编译语句段2。
例如:
#define MAX 200
#if MAX>999
printf("compiled for bigger\n");
#else
printf("compiled for small\n");
#endif
2.5.3  多文件程序(模块化编程)
我们第一章介绍的所有程序都很简单,只需要编写一个*.c文件,main()函数和普通函数都放在同一个*.c文件中,就是单文件程序,当程序量比较大时,我们应该对代码进行分类,不同类型的代码放到不同的*.c文件中,这就是多文件程序,也就是模块化编程的方式,采用模块化编程可以使整个工程脉络清晰,代码规划合理,有利于代码积累,重复利用,快速建立大型工程,在这里,我们把一个*.c或*.h文件就称为一个模块,模块化编程主要注意以下几点:
① 变量定义与初始化,函数体都放在 *.c文件中,类型定义、宏、端口定义、SFR声明、函数声明等都放在*.h文件中,若某个函数声明不放在.H文件中,则其它程序无法调用这个函数。
② 一个*.c文件配套一个*.h文件,由于*.c文件中用到的宏定义等可能都是在*.h文件中,所以*.c文件中要使用 #include "*.h"将自己对应的头文件包含进来,假设a.c文件需要调b.c文件中的函数,a.c除了包含自己对应的头文件外还需要包含b.c对应的头文件。
③ *.h中的所有内容都可以放在*.c中,但*.c中的变量定义初始化等不能放在*.h中。
④ 整个工程只能有一个main()函数。
多文件程序能够实现的根本原理是C51将所有函数都认为是全局性的,而且是外部的, 可以被另一个文件中的任何一个函数调用,但是另一个文件调用该函数之前,则应在文件的开头(即所有函数外的最上端)声明被调函数,又因为声明的被调函数可能会很多,所以有了包含头文件的需要。
接下来看一个流水灯程序采用模块化编程例子。
例2.35  完整的多文件程序
//*************** A模块包含下面2个文件 **********************
// 文件a.h  声明定义
#include "STC15W4K.H"
#define PORT P0
#define DelayTime 50000
void fun1(void);
void fun2(void);
// 文件a.c        // 具体实现
#include "b.h"     // 因为要用到"b.c"中delay(),所以必须有此命令
#include "a.h"     // 因为要用到"a.h"中的符号PORT和DelayTime,所以必须有此命令
void fun1(void)   // 流水灯(从左到右)
{
    unsigned char i=0,temp=0x80;
    for(i=0;i<8;i++)
    {
        PORT=~temp;
        temp>>=1;
        delay(DelayTime);
    }
}
void fun2(void)   // 流水灯(从右到左)
{
    unsigned chari=0,temp=0x01;
    for(i=0;i<8;i++)
    {
        PORT=~temp;
        temp<<=1;
        delay(DelayTime);
    }
}
//*************** B模块包含下面2个文件 **********************
// 文件b.h   // 声明定义
void delay(unsigned int time);
// 文件b.c   //具体实现
void delay(unsigned int time)
{
    while(time--);
}
//*************** 主文件main.c **********************
#include "a.h"    // 因为要用到"a.c"中fun1()、fun2(),所以必须有此命令
#include "b.h"    // 因为要用到"b.c"中delay(),所以必须有此命令
void main()
{
    while(1)
    {
        fun1();
        delay(10000);
        fun2();
        delay(10000);
    }
}

回复

使用道具 举报

ID:113610 发表于 2016-4-11 22:57 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:57211 发表于 2016-4-12 11:30 | 显示全部楼层
比较系统,学习的好教材
回复

使用道具 举报

ID:114233 发表于 2016-4-14 17:19 | 显示全部楼层
好想要黑币。。。
回复

使用道具 举报

ID:115104 发表于 2016-4-19 00:04 | 显示全部楼层
好东西啊
回复

使用道具 举报

ID:115164 发表于 2016-4-19 11:47 | 显示全部楼层
只是50页的广告而已,大家不要下了
回复

使用道具 举报

ID:60379 发表于 2016-4-21 19:47 | 显示全部楼层
未命名.JPG
回复

使用道具 举报

ID:116762 发表于 2016-4-26 11:19 | 显示全部楼层
mark!!!!!!!!!!!!!
回复

使用道具 举报

ID:117752 发表于 2016-5-1 00:30 | 显示全部楼层
不错,下来看看……
回复

使用道具 举报

ID:73957 发表于 2016-5-1 12:27 | 显示全部楼层
感谢你的好东西
回复

使用道具 举报

ID:108066 发表于 2016-5-5 17:21 | 显示全部楼层
很不错 内容很详实
回复

使用道具 举报

ID:37356 发表于 2016-5-5 23:02 | 显示全部楼层
多谢楼主分享。!
回复

使用道具 举报

ID:80736 发表于 2016-5-7 11:25 | 显示全部楼层
好像不是完整版
回复

使用道具 举报

ID:119402 发表于 2016-5-8 23:50 | 显示全部楼层
哪里有完整的pdf呢
回复

使用道具 举报

ID:111874 发表于 2016-5-8 23:55 | 显示全部楼层
让我瞅瞅
回复

使用道具 举报

ID:11064 发表于 2016-5-9 15:54 | 显示全部楼层
好书多谢了
回复

使用道具 举报

ID:119969 发表于 2016-5-11 09:43 | 显示全部楼层
谢谢
回复

使用道具 举报

ID:120162 发表于 2016-5-12 12:42 | 显示全部楼层
怎吗玩
回复

使用道具 举报

ID:120549 发表于 2016-5-13 16:40 | 显示全部楼层
好书,顶起
回复

使用道具 举报

ID:121556 发表于 2016-5-17 21:43 | 显示全部楼层
haoshu
回复

使用道具 举报

ID:76927 发表于 2016-5-19 16:18 | 显示全部楼层
楼主真给力啊
回复

使用道具 举报

ID:122109 发表于 2016-5-20 09:04 | 显示全部楼层
帮助很大         
回复

使用道具 举报

ID:122177 发表于 2016-5-20 14:45 | 显示全部楼层
51单片机轻松入门—基于STC15W4K系列
回复

使用道具 举报

ID:82792 发表于 2016-5-20 16:28 | 显示全部楼层
STC15单片机STC15单片机STC15单片机
回复

使用道具 举报

ID:124449 发表于 2016-6-1 13:50 | 显示全部楼层
有配套的视频下载吗?
回复

使用道具 举报

ID:125296 发表于 2016-6-5 18:54 | 显示全部楼层
haoshu a
回复

使用道具 举报

ID:111520 发表于 2016-6-5 21:19 | 显示全部楼层
好东西,谢谢分享
回复

使用道具 举报

ID:126465 发表于 2016-6-13 09:47 | 显示全部楼层
找了好久了,这个论坛还不错。
回复

使用道具 举报

ID:126488 发表于 2016-6-13 11:08 | 显示全部楼层
不错哦
回复

使用道具 举报

ID:110032 发表于 2016-6-14 14:47 | 显示全部楼层
按时发生大发发
回复

使用道具 举报

ID:124395 发表于 2016-6-23 15:57 | 显示全部楼层
怎么还是目录?
回复

使用道具 举报

ID:60379 发表于 2016-6-26 16:08 | 显示全部楼层
视频已更新到30讲
回复

使用道具 举报

ID:116662 发表于 2016-6-26 18:01 | 显示全部楼层
好全的资料,学习一下,谢谢分享
回复

使用道具 举报

ID:107352 发表于 2016-6-26 19:20 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:128386 发表于 2016-6-28 11:14 | 显示全部楼层
这个资源是全本书吗,听名字不错
回复

使用道具 举报

ID:127881 发表于 2016-6-28 20:42 | 显示全部楼层
mark一下
回复

使用道具 举报

ID:129066 发表于 2016-7-3 17:08 | 显示全部楼层
好东西,谢谢分享
回复

使用道具 举报

ID:22936 发表于 2016-7-17 16:39 | 显示全部楼层
请问楼主,您的开发板为什么用两颗芯片,有什么特殊的吗?
回复

使用道具 举报

ID:123875 发表于 2016-7-17 23:51 来自手机 | 显示全部楼层
二号机
回复

使用道具 举报

ID:129314 发表于 2016-7-18 20:06 | 显示全部楼层
有关于温湿度控制器的教程吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表