当前位置: 首页 > news >正文

专门做简历的网站软件拓者设计吧app

专门做简历的网站软件,拓者设计吧app,网站怎么连接微信支付,大连机械加工网1. 基于proteus的51单片机开发实例30-模块化程序设计1.1. 实验目的模块化程序设计不知不觉我们的51单片机开发实例已经进行到第三十篇了#xff0c;是时候进行一个总结和反思了#xff0c;总结什么#xff1f;反思什么呢#xff1f;我们先从程序结构开始吧。总结在前面的29…1. 基于proteus的51单片机开发实例30-模块化程序设计1.1. 实验目的模块化程序设计不知不觉我们的51单片机开发实例已经进行到第三十篇了是时候进行一个总结和反思了总结什么反思什么呢我们先从程序结构开始吧。总结在前面的29个例子中的程序我们会发现所有的程序都在一个main.c文件中第一个程序只有不到20行电脑屏幕上直接能够从头看到尾这个程序看起来非常直观所有程序语句都是一目了然的。随着学习的深入我们编写的程序是越来越复杂了程序的长度是疯狂地增加。到了第29个实例我们的程序量已经接近500行了假设我们要找最后一个函数的内容那就要用鼠标拨拉好一会才能找到这个函数是不是会有“好长啊”的感慨更为致命的是我们这个程序中既有延时程序、又有液晶显示程序、还有DS18B20的读写程序。所有这个程序都挤在一个main.c文件中即使我们已经按照延时、显示、读写进行了划分整体感觉是不是有些乱现在我们看看DS18B20学习实验的第三个程序这个程序里面有很多函数这些函数的声明和定义在整个程序里面占了很大的比例。我们在编写和使用这些函数的时候需要不停的翻找相关的程序部分。显得很麻烦。而且整个程序显得有些乱。那么能不能把程序精简一下能不能把具有相关功能的函数放在一起能不能向我们使用头文件的时候直接使用一个包含命令就把一些相关功能包含到程序里而我们在程序里只要调用我们用到的函数就能够实现我们想要达到的目的呢答案是肯定的那么该怎么办今天我们就学习一下模块化程序设计把程序进行合理的规划本实例的目的了解模块化程序设计的思路和方法。 1.2. 设计思路本实例的设计思路是将《基于proteus的51单片机开发实例29-单总线DS18B20的读写》中的程序代码按照延时功能、LCD1602液晶显示功能、DS18B20的读写控制功能这三个部分使用模块化程序设计的方法将这三个部分分别封装为三个.c和.h文件然后在main.c文件中使用宏定义语句调用。从而完成模块化程序设计。 模块化程序设计1.3. 基础知识现在我们看看《基于proteus的51单片机开发实例29-单总线DS18B20的读写》中的程序代码这个程序里面有很多函数这些函数的声明和定义在整个程序里面占了很大的比例。我们在编写和使用这些函数的时候因为很多函数都不是独立需要不停的翻找相关的程序部分。显得很麻烦。而且整个程序显得有些乱。那么能不能把程序精简一下能不能把具有相关功能的函数放在一起能不能像我们使用头文件的时候直接使用一个包含命令就把一些相关功能包含到程序里而我们在程序里只要调用我们用到的函数就能够实现我们想要达到的目的呢答案是肯定的解决方法是化整为零把负载的程序按照功能分解成不同的小模块分别实现。1.3.1. 模块化程序设计简介模块化程序设计是指将实现同一功能的程序整合起来封装到一个程序模块中这样在使用该功能的时候可以直接调用该模块中的相关函数进行操作。在进行程序设计时把一个大的程序按照功能划分为若干小的程序每个小的程序完成一个确定的功能在这些小的程序之间建立必要的联系互相协作完成整个程序要完成的功能。通常我们称这些小的程序为程序的模块。模块化程序设计具体到程序来说模块通常是指可以用一个名字调用的一个程序段。对于不同的程序设计语言模块的实现和名称也不相同在BASICFORTRAN语言中的模块称作子程序C语言中的模块叫函数1.3.2. 2、模块化程序设计思路模块化程序设计的思路是这样的将一个大的程序按功能分割成一些小模块。即把具有相同功能的函数放在一个文件中然后在主程序里面用#include指令把这个文件包含到主程序文件中那么在主程序中就可以直接调用这个文件中定义好的函数来实现特定的功能而在主程序中不用声明和定义这些函数。这样就使主程序显得更加精炼可读性也会增强。同时我们把具有相同功能的函数放在同一个文件中这样有一个很大的优点是便于移植可以将这个模块化的函数文件很轻松的移植到别的程序中。综合上述模块化程序设计的优点是●各模块相对独立,功能单一,结构清晰,接口简单.●控制了程序设计的复杂性.●缩短了开发周期.●避免程序开发的重复劳动.●易于维护和功能扩充.模块化程序设计3、模块化程序设计的实现 模块化程序的实现是一般的做法是将不同模块(如LCD1602,DS18B20等)都封装成一个文件然后在主程序中包含这些文件。 将具有相同功能的函数声明以及该模块涉及的端口定义、初始化设置、宏定义等内容编写成一个xxx.h文件文件将函数的定义、变量的声明及初始化等内容编写为一个xxx.c文件注意最好把xxx.c文件和xxx.h文件的名称定义成相同的名称。然后在主程序文件中使用#include预编译命令包含xxx.h文件这样在主程序中就可以调用这个文件中的函数了同样的在其它.c文件中也可以使用#include预编译命令包含xxx.h文件。(就像我们调用编译器中的各种应用库文件一样比如在keil c51中要调用I/O定义头文件是我们要使用“#include 这样做的优点是我们可以直接在“.h”文件中查找到我们需要的函数名称从而在主程序里面直接调用而不用去关心“.c”文件中的具体内容。如果我们要将该程序移植到不同型号的单片机上我们同样只需在“.h”文件中修改相应的端口定义即可。1.3.3. 不同模块之间的函数调用一般情况下程序中定义的函数和变量是有一定的作用域的也就是说我们在一个模块中定义的变量和函数它的作用域只限于本模块文件和调用它的程序文件范围内而在没有调用它的模块程序里面如果调用它编译器是会提示错误的它的函数是不能被使用的。在对较为复杂的程序进行模块化设计的时候经常会遇到这样一种情况一个函数在不同的模块之间都会用到举例来说几乎每一个程序中都会用到延时函数也就是说一般的程序中都需要调用延时函数。出现这种情况该怎么办难道需要在每个模块中都定义相同的函数但是我们都知道程序中不同的变量和函数只能使用不同的名称如果一个程序中有两个名称相同的变量或者函数的话那程序编译的时候会提示我们有重复定义的函数。难道要在不同的模块中为相同功能的函数(功能相同函数体的内容也相同)起不同的名字这样岂不是做了很多重复劳动这样的重复劳动还会造成程序的可读性变得很差。怎么办模块化程序设计同样的情况也会出现在不同模块程序之间传递数据变量的时候。在这样的情况下一种比较好的解决办法是使用文件包含命令“#include”将一个模块的文件包含到另一个模块文件中这种方法在只包含很少的模块文件的时候是很方便的对于比较大的、很复杂的包含很多模块文件的单片机应用程序中在每一个模块里面都使用包含命令就很麻烦了并且很容易出错。出现这种情况的原因是我们在编写单片机程序的时候我们所定义的函数和变量都被默认为是局部函数和变量那么它们的作用范围当然是在调用他们的程序之间了。如果我们将这些函数和变量定义为全局的函数和变量那么在整个单片机系统程序中所有的模块之间都可以使用这些函数和变量。所以针对这种情况最好的解决方法是将需要在不同模块之间互相调用的文件声明为外部函数、变量(或者全局函数、变量)。将函数和变量声明为全局函数和变量的方法是在该函数和变量前面加“extern”修饰符。“extern”的英文意思就是“全局”这样我们就可以将加了“extern”修饰符的函数和变量声明为全局函数和变量那么在整个单片机系统程序的任何地方我们都可以随意调用这些全局函数和变量。例如extern void Usart0_Init(void); //USART寄存器设置extern void Usart0_PutString(unsigned char *pcString);在这里我们将这4个函数都定义成为全局函数那么在一个单片机系统中在整个程序的任何地方我们都可以直接调用这些函数。注意在调用的时候直接使用函数名称即可“extern”这个修饰符不必再调用的时候写上。同样的对于变量的定义我们可以使用同样的方法extern int second; 在这里我们定义了一个全局的整形变量second1.4. 电路设计本实例沿用实例29的电路。1.5. 程序设计本实例中我们分别按照功能划分将程序中的延时程序中的函数声明封装在Delay.h文件中变量声明和函数定义封装在Delay.c文件中液晶显示程序中的端口定义、函数声明封装在LCD1602.h文件中变量声明和函数定义封装在LCD1602.c文件中DS18B20读写程序中的端口定义、函数声明封装在DS18B20.h文件中变量声明和函数定义封装在DS18B20.c文件中。按照我们说的步骤建好上面程序文件后按照下图进行操作。添加.c文件的方法在主程序以及各个.c文件中使用下面的预编译命令将不同程序模块中的函数“包含”进来。#includeLCD1602.h  //#includeDS18B20.h  //#includeDelay.h  // 也许有细心的朋友会发现不同的#include与编译指令还有细微的差别例如调用51单片机头文件和C语言库函数使用的是下面的语句#include    //包含单片机寄存器的头文件#include  //包含_nop_()函数定义的头文件而针对我们自己编写的.h文件使用的是下面的语句#includeLCD1602.h  //#includeDS18B20.h  //#includeDelay.h  //看出来了吧调用keil里面自带的头文件时文件名是用尖括号括起来的而调用我们自己编写的头文件时文件名是用括起来的。这是为什么呢简单说使用尖括号括起来的头文件编译器在编译时先从编译器安装的目录下开始搜索这个文件而用括起来的头文件编译的时候先从我们建立的单片机项目文件中搜索该文件。下面是Delay.h文件的代码。 //Delay.h/*****************************************************函数功能延时1ms(3j2)*i(3×332)×101010(微秒)可以认为是1毫秒***************************************************/void delay1ms();/*****************************************************函数功能延时若干毫秒入口参数n***************************************************/ void delaynms(unsigned int n);下面是Delay.c文件的代码。//Delay.c#include //包含单片机寄存器的头文件#include //包含_nop_()函数定义的头文件#includeLCD1602.h //#includeDS18B20.h //#includeDelay.h ///*****************************************************函数功能延时1ms(3j2)*i(3×332)×101010(微秒)可以认为是1毫秒***************************************************/void delay1ms(){ unsigned char i,j; for(i0;i10;i) for(j0;j33;j) ; }/*****************************************************函数功能延时若干毫秒入口参数n***************************************************/ void delaynms(unsigned int n) { unsigned int i;for(i0;i下面是LCD1602.h文件的代码。 /*****************************************************函数功能判断液晶模块的忙碌状态返回值result。result1忙碌;result0不忙***************************************************/bit BusyTest(void);/*****************************************************函数功能将模式设置指令或显示地址写入液晶模块入口参数dictate***************************************************/void WriteInstruction (unsigned char dictate);/*****************************************************函数功能指定字符显示的实际地址入口参数x***************************************************/ void WriteAddress(unsigned char x); /*****************************************************函数功能将数据(字符的标准ASCII码)写入液晶模块入口参数y(为字符常量)***************************************************/ void WriteData(unsigned char y); /*****************************************************函数功能对LCD的显示模式进行初始化设置***************************************************/void LcdInitiate(void);/******************************************************************************以下是与温度有关的显示设置 ******************************************************************************/ /*****************************************************函数功能显示没有检测到DS18B20***************************************************/ void display_error(void);/*****************************************************函数功能显示说明信息***************************************************/ void display_explain(void);/*****************************************************函数功能显示温度符号***************************************************/ void display_symbol(void);/*****************************************************函数功能显示温度的小数点***************************************************/ void display_dot(void);/*****************************************************函数功能显示温度的单位(Cent)***************************************************/ void display_cent(void);/*****************************************************函数功能显示温度的整数部分入口参数x***************************************************/ void display_temp1(unsigned char x); /*****************************************************函数功能显示温度的小数数部分入口参数x***************************************************/ void display_temp2(unsigned char x);下面是LCD1602.c文件的代码。//LCD1602.c#include //包含单片机寄存器的头文件#include //包含_nop_()函数定义的头文件#includeLCD1602.h //#includeDS18B20.h //#includeDelay.h //unsigned char code digit[10]{0123456789}; //定义字符数组显示数字unsigned char code Str[]{laomashitu MCU}; //说明显示的是温度unsigned char code Error[]{Check Error!}; //说明没有检测到DS18B20unsigned char code Temp[]{wendu:}; //说明显示的是温度unsigned char code Cent[]{du}; //温度单位/*******************************************************************************以下是对液晶模块的操作程序*******************************************************************************/sbit RSP2^4; //寄存器选择位将RS位定义为P2.0引脚sbit RWP2^5; //读写选择位将RW位定义为P2.1引脚sbit EP2^6; //使能信号位将E位定义为P2.2引脚sbit BFP0^7; //忙碌标志位将BF位定义为P0.7引脚/*****************************************************函数功能判断液晶模块的忙碌状态返回值result。result1忙碌;result0不忙***************************************************/bit BusyTest(void) { bit result;RS0; //根据规定RS为低电平RW为高电平时可以读状态 RW1; E1; //E1才允许读写 _nop_(); //空操作 _nop_(); _nop_(); _nop_(); //空操作四个机器周期给硬件反应时间 resultBF; //将忙碌标志电平赋给result E0; //将E恢复低电平 return result; }/*****************************************************函数功能将模式设置指令或显示地址写入液晶模块入口参数dictate***************************************************/void WriteInstruction (unsigned char dictate){ while(BusyTest()1); //如果忙就等待 RS0; //根据规定RS和R/W同时为低电平时可以写入指令 RW0; E0; //E置低电平(根据表8-6写指令时E为高脉冲 // 就是让E从0到1发生正跳变所以应先置0 _nop_(); _nop_(); //空操作两个机器周期给硬件反应时间 P0dictate; //将数据送入P0口即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期给硬件反应时间 E1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期给硬件反应时间 E0; //当E由高电平跳变成低电平时液晶模块开始执行命令 }/*****************************************************函数功能指定字符显示的实际地址入口参数x***************************************************/ void WriteAddress(unsigned char x) { WriteInstruction(x|0x80); //显示位置的确定方法规定为80H地址码x }/*****************************************************函数功能将数据(字符的标准ASCII码)写入液晶模块入口参数y(为字符常量)***************************************************/ void WriteData(unsigned char y) { while(BusyTest()1); RS1; //RS为高电平RW为低电平时可以写入数据 RW0; E0; //E置低电平(根据表8-6写指令时E为高脉冲 // 就是让E从0到1发生正跳变所以应先置0 P0y; //将数据送入P0口即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期给硬件反应时间 E1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期给硬件反应时间 E0; //当E由高电平跳变成低电平时液晶模块开始执行命令 }/*****************************************************函数功能对LCD的显示模式进行初始化设置***************************************************/void LcdInitiate(void){ delaynms(15); //延时15ms首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38); //显示模式设置16×2显示5×7点阵8位数据接口delaynms(5); //延时5ms 给硬件一点反应时间 WriteInstruction(0x38);delaynms(5); //延时5ms 给硬件一点反应时间WriteInstruction(0x38); //连续三次确保初始化成功delaynms(5); //延时5ms 给硬件一点反应时间WriteInstruction(0x0c); //显示模式设置显示开无光标光标不闪烁delaynms(5); //延时5ms 给硬件一点反应时间WriteInstruction(0x06); //显示模式设置光标右移字符不移delaynms(5); //延时5ms 给硬件一点反应时间WriteInstruction(0x01); //清屏幕指令将以前的显示内容清除delaynms(5); //延时5ms 给硬件一点反应时间 } /******************************************************************************以下是与温度有关的显示设置 ******************************************************************************/ /*****************************************************函数功能显示没有检测到DS18B20***************************************************/ void display_error(void) { unsigned char i; WriteAddress(0x00); //写显示地址将在第1行第1列开始显示 i 0; //从第一个字符开始显示while(Error[i] ! 0) //只要没有写到结束标志就继续写{WriteData(Error[i]); //将字符常量写入LCDi; //指向下一个字符delaynms(100); //延时100ms较长时间以看清关于显示的说明}while(1) //进入死循环等待查明原因 ;}/*****************************************************函数功能显示说明信息***************************************************/ void display_explain(void) { unsigned char i; WriteAddress(0x00); //写显示地址将在第1行第1列开始显示 i 0; //从第一个字符开始显示while(Str[i] ! 0) //只要没有写到结束标志就继续写{WriteData(Str[i]); //将字符常量写入LCDi; //指向下一个字符delaynms(100); //延时100ms较长时间以看清关于显示的说明}}/*****************************************************函数功能显示温度符号***************************************************/ void display_symbol(void) { unsigned char i; WriteAddress(0x40); //写显示地址将在第2行第1列开始显示 i 0; //从第一个字符开始显示while(Temp[i] ! 0) //只要没有写到结束标志就继续写{WriteData(Temp[i]); //将字符常量写入LCDi; //指向下一个字符delaynms(50); //延时1ms给硬件一点反应时间}}/*****************************************************函数功能显示温度的小数点***************************************************/ void display_dot(void){ WriteAddress(0x49); //写显示地址将在第2行第10列开始显示 WriteData(.); //将小数点的字符常量写入LCD delaynms(50); //延时1ms给硬件一点反应时间}/*****************************************************函数功能显示温度的单位(Cent)***************************************************/ void display_cent(void){ unsigned char i; WriteAddress(0x4c); //写显示地址将在第2行第13列开始显示 i 0; //从第一个字符开始显示 while(Cent[i] ! 0) //只要没有写到结束标志就继续写{WriteData(Cent[i]); //将字符常量写入LCDi; //指向下一个字符delaynms(50); //延时1ms给硬件一点反应时间}}/*****************************************************函数功能显示温度的整数部分入口参数x***************************************************/ void display_temp1(unsigned char x){ unsigned char j,k,l; //j,k,l分别储存温度的百位、十位和个位jx/100; //取百位k(x%100)/10; //取十位lx%10; //取个位 WriteAddress(0x46); //写显示地址,将在第2行第7列开始显示WriteData(digit[j]); //将百位数字的字符常量写入LCDWriteData(digit[k]); //将十位数字的字符常量写入LCDWriteData(digit[l]); //将个位数字的字符常量写入LCDdelaynms(50); //延时1ms给硬件一点反应时间 } /*****************************************************函数功能显示温度的小数数部分入口参数x***************************************************/ void display_temp2(unsigned char x){ WriteAddress(0x4a); //写显示地址,将在第2行第11列开始显示WriteData(digit[x]); //将小数部分的第一位数字字符常量写入LCDdelaynms(50); //延时1ms给硬件一点反应时间} 下面是DS18B20.h文件的代码。//DS18B20.hsbit DQP3^3;/*****************************************************函数功能将DS18B20传感器初始化读取应答信号出口参数flag ***************************************************/bit Init_DS18B20(void);/*****************************************************函数功能从DS18B20读取一个字节数据出口参数dat***************************************************/ unsigned char ReadOneChar(void);/*****************************************************函数功能向DS18B20写入一个字节数据入口参数dat***************************************************/ WriteOneChar(unsigned char dat);/*****************************************************函数功能做好读温度的准备***************************************************/ void ReadyReadTemp(void); 下面是DS18B20.c文件的代码。//DS18B20.c#include //包含单片机寄存器的头文件#include //包含_nop_()函数定义的头文件#includeLCD1602.h //#includeDS18B20.h //#includeDelay.h //extern unsigned char time; //设置全局变量专门用于严格延时/*****************************************************函数功能将DS18B20传感器初始化读取应答信号出口参数flag ***************************************************/bit Init_DS18B20(void){ bit flag; //储存DS18B20是否存在的标志flag0表示存在flag1表示不存在 DQ 1; //先将数据线拉高 for(time0;time2;time) //略微延时约6微秒 ; DQ 0; //再将数据线从高拉低要求保持480~960us for(time0;time200;time) //略微延时约600微秒 ; //以向DS18B20发出一持续480~960us的低电平复位脉冲 DQ 1; //释放数据线(将数据线拉高) for(time0;time10;time) ; //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲) flagDQ; //让单片机检测是否输出了存在脉冲(DQ0表示存在) for(time0;time200;time) //延时足够长时间等待存在脉冲输出完毕 ; return (flag); //返回检测成功标志}/*****************************************************函数功能从DS18B20读取一个字节数据出口参数dat***************************************************/ unsigned char ReadOneChar(void) {unsigned char i0;unsigned char dat; //储存读出的一个字节数据for (i0;i8;i) { DQ 1; // 先将数据线拉高 _nop_(); //等待一个机器周期 DQ 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序dat1; _nop_(); //等待一个机器周期 DQ 1; //将数据线人为拉高,为单片机检测DS18B20的输出电平作准备 for(time0;time2;time) ; //延时约6us使主机在15us内采样 if(DQ1) dat|0x80; //如果读到的数据是1则将1存入datelsedat|0x00;//如果读到的数据是0则将0存入dat //将单片机检测到的电平信号DQ存入r[i] for(time0;time8;time) ; //延时3us,两个读时序之间必须有大于1us的恢复期 } return(dat); //返回读出的十进制数据}/*****************************************************函数功能向DS18B20写入一个字节数据入口参数dat***************************************************/ WriteOneChar(unsigned char dat){unsigned char i0;for (i0; i8; i) { DQ 1; // 先将数据线拉高 _nop_(); //等待一个机器周期 DQ0; //将数据线从高拉低时即启动写时序 DQdat0x01; //利用与运算取出要写的某位二进制数据, //并将其送到数据线上等待DS18B20采样 for(time0;time10;time) ;//延时约30usDS18B20在拉低后的约15~60us期间从数据线上采样 DQ1; //释放数据线 for(time0;time1;time) ;//延时3us,两个写时序间至少需要1us的恢复期 dat1; //将dat中的各二进制位数据右移1位 } for(time0;time4;time) ; //稍作延时,给硬件一点反应时间}/************************************************函数功能做好读温度的准备***************************************************/ void ReadyReadTemp(void){ Init_DS18B20(); //将DS18B20初始化WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换 for(time0;time100;time) ; //温度转换需要一点时间Init_DS18B20(); //将DS18B20初始化WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位}下面是主程序文件的代码。 //实例72DS18B20温度检测及其液晶显示#include //包含单片机寄存器的头文件#include //包含_nop_()函数定义的头文件#includeLCD1602.h //#includeDS18B20.h //#includeDelay.h //unsigned char time; //设置全局变量专门用于严格延时/*****************************************************函数功能主函数***************************************************/ void main(void) { unsigned char TL; //储存暂存器的温度低位 unsigned char TH; //储存暂存器的温度高位 unsigned char TN; //储存温度的整数部分 unsigned int TD; //储存温度的小数部分 LcdInitiate(); //将液晶初始化 delaynms(5); //延时5ms给硬件一点反应时间if(Init_DS18B20()1) display_error();display_explain(); display_symbol(); //显示温度说明 display_dot(); //显示温度的小数点 display_cent(); //显示温度的单位 while(1) //不断检测并显示温度 {ReadyReadTemp(); //读温度准备 TLReadOneChar(); //先读的是温度值低位THReadOneChar(); //接着读的是温度值高位TNTH*16TL/16; //实际温度值(TH*256TL)/16,即TH*16TL/16 //这样得出的是温度的整数部分,小数部分被丢弃了 TD(TL%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整 //这样得到的是温度小数部分的第一位数字(保留1位小数) display_temp1(TN); //显示温度的整数部分 display_temp2(TD); //显示温度的小数部分 delaynms(10); } }1.6. 实例仿真根据前面的说明按照步骤建立起模块化程序结构。编译后按照上一实例的方法进行仿真观察非模块化方法编写的程序以及用模块化方法编写的程序在运行结果上是完全一样的。1.7. 总结通过本实例我们学习了如何将功能众多程序量大的单片机程序分成不同的模块从而使单片机程序看起来结构清晰可读性强可移植性强。
http://www.pierceye.com/news/73116/

相关文章:

  • html做网站例子廊坊建站模板系统
  • 永久建站平台阿里云服务器建立网站
  • 淘客网站自己做网站模板全屏
  • 手机端关键词排名优化石家庄seo报价
  • 有哪些网站能够免费找到素材如何利用电商平台推广
  • 网站联系方式设置要求郑州 做网站
  • 专做投放广告网站网站配色案例
  • 公司制作网站需要电影网站cpa怎么做
  • 文明网站建设方案苏州网站建设培训学校
  • 广西网站建设服务好wordpress建个人博客
  • 做黑网站吗wordpress注册文件
  • 做网站的框架遵义市建设厅网站
  • 购物网站策划案营销方案论文
  • 定期更新网站中国做的电脑系统下载网站
  • 做安全题目是哪个网站wordpress商城主体
  • 网站建设公司基本流程我想建网站
  • 网站怎么做背景nginx wordpress 404.php
  • 做网站准备材料做网站市场价格多少
  • 山东网站设计公司广州网络公关公司
  • 网站建设体会中国建设劳动协会网站
  • 如何做一个简单的网站代练中介网站有得做吗
  • 建个公司网站需要多少钱注册会计师报名条件
  • 怎样用自己的电脑做网站wordpress设置登陆口
  • 房地产培训网站建设wordpress 注册密码
  • 单位门户网站是什么建设电商网站流程
  • 先建网站还是先做网页东坑镇网站建设
  • 李沧网站建设电话网站开发合同官司
  • 可以提供排版的网站app开发需要哪些知识
  • asp网站设计代做空壳网站主体注销
  • 陵水媒体建站哪家好wordpress最大文件