菜鸟学习51单片机while(1)世界菜鸟学习菜鸟学习菜鸟学习菜鸟学习51515151单片机单片机单片机单片机----模块化编程《菜鸟学习51单片机》由while(1)世界推出的非常简单的51单片机教程。帮助刚接触单片机的童鞋快速入门。这一讲是由Admin编写!读者有什么问题的可以在while(1)世界的51版块发帖提问!在刚接触单片机,刚编写代码的时候都只是有一个.h和一个.c文件。把所有的函数都写在.c里面。这样遇到复杂的系统时,代码量就很大,一下子就是几百行。而且把所有函数写在一个.c里不利于移植,对于以后的开发有了很大的限制。为了解决这个缺点就必须学会模块化编程。将程序分解成一个一个模块。这样就有了多个.c和多个.h。下面开始讲解什么是模块化编程,怎么去模块化。菜鸟学习51单片机while(1)世界我们以《菜鸟学习51单片机之永远的流水灯》里的程序为例子讲解。在不模块化情况下:上面这个程序是全部写在了main.c一个C文件里。完成了一个流水灯功能,程序非常简单,那么下面我们将程序模块化。模块化我们就建立一个main.cled.cled.h这三个文件,那么这三个文件里分别写什么东西呢,下面一个一个的写。#includereg52.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintvoidDelay_Ms(uintxms){uinti,j;for(i=0;ixms;i++){for(j=0;j110;j++);}}voidDisplay_Led(){ucharaa,j;aa=0x7f;for(j=0;j8;j++){P1=aa;aa=_cror_(aa,1);Delay_Ms(500);}}voidmain(){while(1){Display_Led();}}菜鸟学习51单片机while(1)世界用来完成流水灯功能的模块程序已经写好了,,现在就开始主函数的编写。主函数就只需要调用一个Display_Led()函数就行了,看现在是怎么写的。led.h里内容如下#ifndef__LED_H__//理解为ifnotdefineled.h#define__LED_H__//如果没有定义led.h,这里就定义一个led.h#includereg52.h//由于led,c里面要用到51单片机寄存器P1,//所以这里包含51单片机的头文件#includeintrins.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这个头文件voidDelay_Ms(uintxms){uinti,j;for(i=0;ixms;i++){for(j=0;j110;j++);}}voidDisplay_Led(){ucharaa,j;aa=0x7f;for(j=0;j8;j++){P1=aa;aa=_cror_(aa,1);Delay_Ms(500);}}菜鸟学习51单片机while(1)世界模块化编程的时候要想到你把一个.c和.h文件给另一个人,那个人能够很轻松的运用你给的这个模块来实现效果那就算成功了。而不需要去改动很多东西。上面的例子只不过是很简单的一个小例子。对于模块化编程更深的理解要自己去编写程序。现在大家可以把以前的程序模块化试试,看有没有问题。下面给出几个模块化编程的注意点:先分模块一个个编程调试,确保无误后在一个个联合起来调试,千万不要写了一堆后再去调试,会很麻烦。一个点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里现在包含的也是led.h而不是reg52.h了voidmain(){while(1){Display_Led();//这样直接调用就行。}}