模块化编程是指将大型、笨拙的编程任务分解为单独的、更小更易于管理的子任务或模块的过程。然后可以像构建块一样拼凑单个模块以创建更大的应用程序。在大型应用程序中模块化代码有以下几个优点。
(1)简单性:模块通常只关注问题的一小部分,而不是关注手头的整个问题。如果正在处理单个模块,那么将有一个较小的问题等待解决。这使得开发更容易,更不容易出错。
(2)可维护性:模块通常设计为能够在不同的问题域之间实施逻辑边界。如果以最小化相互依赖性的方式编写模块,则对单个模块的修改将对程序的其他部分产生影响的可能性降低(甚至可以在不了解该模块之外的应用程序的情况下对模块进行更改)。这使得许多程序团队在大型应用程序上协同工作更加可行。
(3)可重用性:单个模块中定义的功能可以通过应用程序的其他部分轻松地重用(通过适当定义的界面)。这消除了重新创建重复代码的需要。
(4)范围:模块通常定义一个单独的命名空间,这有助于避免程序的不同区域中的标识符之间的冲突。
函数、模块和包都是Python中用于促进代码模块化的构造。
模块化编程简单来说就是将一个复杂且繁多的程序分成若干个程序模块含有一些设备和任务的逻辑指令
在我们用51单片机或者其他的编程软件编程时都会有事半功倍的效果
用一个小车前进的模块化编程来说
main.c
#include "car.h"
void main ()
{
Timer0_Init();
while (1)
{
car_go ();
}
}
car.c
//************小车移动方向*************/
/* 向前直行【四电机正转】 */
/* 向后直行【四电机反转】 */
/* 向前左拐【右电机正转,左电机停止】*/
/* 向前右拐【右电机停止,左电机正转】*/
/* 向后左拐【右电机反转,左电机停止】*/
/* 向后右拐【右电机停止,左电机反转】*/
/* 停 止【四电机停止】 */
/************小车移动方向*************/
#include <REGX52.H>
#include "motor.h"
sbit EN1A = P0^7;//左前
sbit EN1B = P0^2;//右前
sbit EN2A = P3^7;//左后
sbit EN2B = P3^2;//右后
unsigned char counter1,speed; //计数值和比较值,用于输出PWM
void Timer0_Init() //100微秒@11.0592MHz
{
TMOD = 0x11; //设置定时器模式
TL0 = 0xA4; //设置定时初始值
TH0 = 0xFF; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //定时器0的中端允许开关
EA = 1; //定时器总开关
PT0 = 1; //设置定时器为高低控制优先级,1为高优先级,0为低优先级
}
void Timer0_Routine() interrupt 1 //中断函数
{
TL0 = 0xA4; //设置定时初始值
TH0 = 0xFF; //设置定时初始值
counter1++;
if (counter1 >= 100)
{
counter1 = 0;
}
if (counter1 < speed)
{
EN1A = 1;
EN1B = 1;
EN2A = 1;
EN2B = 1;
}
else
{
EN1A = 0;
EN1B = 0;
EN2A = 0;
EN2B = 0;
}
}
void car_go () //小车向前直行
{
speed = 20;
LF_motor_go ();
RF_motor_go ();
LR_motor_go ();
RR_motor_go ();
}
void car_back () //小车向后直行
{
speed = 18;
LF_motor_back ();
RF_motor_back ();
LR_motor_back ();
RR_motor_back ();
}
void car_stop () //小车停止
{
speed = 0;
RR_motor_stop ();
LR_motor_stop ();
RF_motor_stop ();
LF_motor_stop ();
}
void car_leftgo () //小车向前左拐
{
speed = 18;
RF_motor_go ();
RR_motor_go ();
LF_motor_stop ();
LR_motor_stop ();
}
void car_rightgo () //小车向前右拐
{
speed = 18;
LF_motor_go ();
LR_motor_go ();
RF_motor_stop ();
RR_motor_stop ();
}
void car_leftback () //小车向后左拐
{
speed = 18;
RR_motor_back ();
RF_motor_back ();
LF_motor_stop ();
LR_motor_stop ();
}
void car_rightback () //小车向后右拐
{
speed = 18;
LF_motor_back ();
LR_motor_back ();
RF_motor_stop ();
RR_motor_stop ();
}
void car_rightstop () //小车原地右拐
{
speed = 20;
LF_motor_go ();
LR_motor_go ();
RF_motor_back ();
RR_motor_back ();
}
void car_leftstop () //小车原地左拐
{
speed = 20;
LF_motor_back ();
LR_motor_back ();
RF_motor_go ();
RR_motor_go ();
}
car.h
#ifndef __CAR_H_
#define __CAR_H_
void car_go (); //小车向前直行
void car_back (); //小车向后直行
void car_stop (); //小车停止
void car_leftgo (); //小车向前左拐
void car_rightgo (); //小车向前右拐
void car_leftback (); //小车向后左拐
void car_rightback (); //小车向后右拐
void car_leftstop (); //小车原地左拐
void car_rightstop (); //小车原地右拐
#endif
motor.c
/**********电机的正反转**********/
/* */
/*LF左前 RF右前 LR左后 RR右后*/
/* */
/**********电机的正反转**********/
#include <REGX52.H>
//位定义
sbit IN11 = P0^5;//左前
sbit IN12 = P0^6;
sbit IN13 = P0^3;//右前
sbit IN14 = P0^4;
sbit IN21 = P3^5;//左后
sbit IN22 = P3^6;
sbit IN23 = P3^3;//右后
sbit IN24 = P3^4;
void LF_motor_go () //左前电机正转
{IN11 = 0;IN12 = 1;}
void LF_motor_back () //左前电机反转
{IN11 = 1;IN12 = 0;}
void LF_motor_stop () //左前电机停止
{IN11 = 1;IN12 = 1;}
void RF_motor_go () //右前电机正转
{IN13 = 0;IN14 = 1;}
void RF_motor_back () //右前电机反转
{IN13 = 1;IN14 = 0;}
void RF_motor_stop () //右前电机停止
{IN13 = 1;IN14 = 1;}
void LR_motor_go () //左后电机正转
{IN21 = 1;IN22 = 0;}
void LR_motor_back () //左后电机反转
{IN21 = 0;IN22 = 1;}
void LR_motor_stop () //左后电机停止
{IN21 = 1;IN22 = 1;}
void RR_motor_go () //右后电机正转
{IN23 = 1;IN24 = 0;}
void RR_motor_back () //右后电机反转
{IN23 = 0;IN24 = 1;}
void RR_motor_stop () //右后电机停止
{IN23 = 1;IN24 = 1;}
motor.h
#ifndef __MOTOR_H_
#define __MOTOR_H_
void LF_motor_go (); //左前电机正转
void LF_motor_back (); //左前电机反转
void RF_motor_go (); //右前电机正转
void RF_motor_back (); //右前电机反转
void LR_motor_go (); //左后电机正转
void LR_motor_back (); //左后电机反转
void RR_motor_go (); //右后电机正转
void RR_motor_back (); //右后电机反转
void LF_motor_stop (); //左前电机停止
void RF_motor_stop (); //右前电机停止
void LR_motor_stop (); //左后电机停止
void RR_motor_stop (); //右后电机停止
#endif
用模块化编程时main函数中可以不引用<regx52.h>,在car.c中包含car相关的文件,而在.h文件中只需要引用像void car_go (); //小车向前直行
void car_back (); //小车向后直行
void car_stop (); //小车停止
void car_leftgo (); //小车向前左拐
void car_rightgo (); //小车向前右拐
void car_leftback (); //小车向后左拐
void car_rightback (); //小车向后右拐
void car_leftstop (); //小车原地左拐
void car_rightstop (); //小车原地右拐
这样的头文件即可
在.h文件中有固定的格式
#ifndef __CAR_H_
#define __CAR_H_
#endif
这样就可以将这几个模块链接在一起了。