欢迎来到天天文库
浏览记录
ID:52242341
大小:112.28 KB
页数:4页
时间:2020-03-25
《特别讲解模块化编程.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、51单片机lzh电子论坛模块化编程这一讲是由Admin编写!有什么问题的可以在lzh电子论坛的51版块发帖提问!在刚接触单片机,刚编写代码的时候都只是有一个.h和一个.c文件。把所有的函数都写在.c里面。这样遇到复杂的系统时,代码量就很大,一下子就是几百行。而且把所有函数写在一个.c里不利于移植,对于以后的开发有了很大的限制。为了解决这个缺点就必须学会模块化编程。将程序分解成一个一个模块。这样就有了多个.c和多个.h。下面开始讲解什么是模块化编程,怎么去模块化。我们以《菜鸟学习51单片机之永远的流水灯》里的程序为例子讲解。在不模块化情况下:51单片机lzh电子论坛#include2、2.h>#include"intrins.h"#defineucharunsignedchar#defineuintunsignedintvoidDelay_Ms(uintxms){uinti,j;for(i=0;i3、灯功能,程序非常简单,那么下面我们将程序模块化。模块化我们就建立一个main.cled.cled.h这三个文件,那么这三个文件里分别写什么东西呢,下面一个一个的写。用来完成流水灯功能的模块程序已经写好了,,现在就开始主函数的编写。主函数就只需要调用一个Display_Led()函数就行了,看现在是怎么写的。51单片机lzh电子论坛led.h里内容如下#ifndef__LED_H__//理解为ifnotdefineled.h#define__LED_H__//如果没有定义led.h,这里就定义一个led.h#include"reg52.h"//由于led,c里面要用到51单片机寄存器P1,/4、/所以这里包含51单片机的头文件#include"intrins.h"//循环移位用到#defineucharunsignedchar#defineuintunsignedint//这些宏定义都可以在头文件.h里定义voidDelay_Ms(uintxms);voidDisplay_Led();//将led.c里的函数在led.h里面申明#endif//定义结束led.c里内容如下,将流水灯的主要程序放在这个.c里面。作为单独的流水灯模块,在以后的程序中如果要用到这个流水灯程序就直接把led.c和led.h移植过去。#include“led.h”//这里包含led.h这个头文件voidDe5、lay_Ms(uintxms){uinti,j;for(i=0;i6、有问题。下面给出几个模块化编程的注意点:先分模块一个个编程调试,确保无误后在一个个联合起来调试,千万不要写了一堆后再去调试,会很麻烦。一个点c文件对应的一个点h文件#ifndef_LED_H#define_LED_H/*内容*/endif全局变量前面加extern如externcharNum;数组申明不能带数组的大小如:externcharNum[];正确externcharNum[8];错误二维数组externcharNum[][8];正确externcharNum[6][8];错误externcharNum[][];错误#include“led.h”//在main.c里现在包含的也是l7、ed.h而不是reg52.h了voidmain(){while(1){Display_Led();//这样直接调用就行。}}
2、2.h>#include"intrins.h"#defineucharunsignedchar#defineuintunsignedintvoidDelay_Ms(uintxms){uinti,j;for(i=0;i3、灯功能,程序非常简单,那么下面我们将程序模块化。模块化我们就建立一个main.cled.cled.h这三个文件,那么这三个文件里分别写什么东西呢,下面一个一个的写。用来完成流水灯功能的模块程序已经写好了,,现在就开始主函数的编写。主函数就只需要调用一个Display_Led()函数就行了,看现在是怎么写的。51单片机lzh电子论坛led.h里内容如下#ifndef__LED_H__//理解为ifnotdefineled.h#define__LED_H__//如果没有定义led.h,这里就定义一个led.h#include"reg52.h"//由于led,c里面要用到51单片机寄存器P1,/4、/所以这里包含51单片机的头文件#include"intrins.h"//循环移位用到#defineucharunsignedchar#defineuintunsignedint//这些宏定义都可以在头文件.h里定义voidDelay_Ms(uintxms);voidDisplay_Led();//将led.c里的函数在led.h里面申明#endif//定义结束led.c里内容如下,将流水灯的主要程序放在这个.c里面。作为单独的流水灯模块,在以后的程序中如果要用到这个流水灯程序就直接把led.c和led.h移植过去。#include“led.h”//这里包含led.h这个头文件voidDe5、lay_Ms(uintxms){uinti,j;for(i=0;i6、有问题。下面给出几个模块化编程的注意点:先分模块一个个编程调试,确保无误后在一个个联合起来调试,千万不要写了一堆后再去调试,会很麻烦。一个点c文件对应的一个点h文件#ifndef_LED_H#define_LED_H/*内容*/endif全局变量前面加extern如externcharNum;数组申明不能带数组的大小如:externcharNum[];正确externcharNum[8];错误二维数组externcharNum[][8];正确externcharNum[6][8];错误externcharNum[][];错误#include“led.h”//在main.c里现在包含的也是l7、ed.h而不是reg52.h了voidmain(){while(1){Display_Led();//这样直接调用就行。}}
3、灯功能,程序非常简单,那么下面我们将程序模块化。模块化我们就建立一个main.cled.cled.h这三个文件,那么这三个文件里分别写什么东西呢,下面一个一个的写。用来完成流水灯功能的模块程序已经写好了,,现在就开始主函数的编写。主函数就只需要调用一个Display_Led()函数就行了,看现在是怎么写的。51单片机lzh电子论坛led.h里内容如下#ifndef__LED_H__//理解为ifnotdefineled.h#define__LED_H__//如果没有定义led.h,这里就定义一个led.h#include"reg52.h"//由于led,c里面要用到51单片机寄存器P1,/
4、/所以这里包含51单片机的头文件#include"intrins.h"//循环移位用到#defineucharunsignedchar#defineuintunsignedint//这些宏定义都可以在头文件.h里定义voidDelay_Ms(uintxms);voidDisplay_Led();//将led.c里的函数在led.h里面申明#endif//定义结束led.c里内容如下,将流水灯的主要程序放在这个.c里面。作为单独的流水灯模块,在以后的程序中如果要用到这个流水灯程序就直接把led.c和led.h移植过去。#include“led.h”//这里包含led.h这个头文件voidDe
5、lay_Ms(uintxms){uinti,j;for(i=0;i6、有问题。下面给出几个模块化编程的注意点:先分模块一个个编程调试,确保无误后在一个个联合起来调试,千万不要写了一堆后再去调试,会很麻烦。一个点c文件对应的一个点h文件#ifndef_LED_H#define_LED_H/*内容*/endif全局变量前面加extern如externcharNum;数组申明不能带数组的大小如:externcharNum[];正确externcharNum[8];错误二维数组externcharNum[][8];正确externcharNum[6][8];错误externcharNum[][];错误#include“led.h”//在main.c里现在包含的也是l7、ed.h而不是reg52.h了voidmain(){while(1){Display_Led();//这样直接调用就行。}}
6、有问题。下面给出几个模块化编程的注意点:先分模块一个个编程调试,确保无误后在一个个联合起来调试,千万不要写了一堆后再去调试,会很麻烦。一个点c文件对应的一个点h文件#ifndef_LED_H#define_LED_H/*内容*/endif全局变量前面加extern如externcharNum;数组申明不能带数组的大小如:externcharNum[];正确externcharNum[8];错误二维数组externcharNum[][8];正确externcharNum[6][8];错误externcharNum[][];错误#include“led.h”//在main.c里现在包含的也是l
7、ed.h而不是reg52.h了voidmain(){while(1){Display_Led();//这样直接调用就行。}}
此文档下载收益归作者所有