wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

規范化和模塊化編程

作者:佚名   來源:本站原創   點擊數:  更新時間:2012年01月02日   【字體:

0 引言

       通過一年多的編程經歷,經常會為雜亂無章的程序弄的暈頭轉向,影響編程質量和進度。同時也為了程序的可移植性和可讀性,規范化和模塊化編程應該在開始編寫的第一個程序時就要有規范化和模塊化編程的思想,并在實踐中運用,養成規范化和模塊化編程的好習慣。
1 規范化編程
       談到規范性編程這里我們是在符合c語言基本運用原理的基礎上加以說明,以下我們主要講以下幾個方面:
1.1 定義一個自己config.h文件
       首先我把我使用的config文件列出:
typedef signed char S8;
typedef signed int S16;
typedef signed long S32;
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
typedef volatile signed char vS8;
typedef volatile signed int vS16;
typedef volatile signed long vS32;
typedef volatile unsigned char vu8;
typedef volatile unsigned int vu16;
typedef volatile unsigned long vu32;
typedef const u8 FLASH;
typedef enum{FALSE=0,TRUE=!FALSE} BOOL;
       為什么要定義一個自己的這樣一個文件,主要有兩個原因:
       1節約編程時間
       2更高的可移植性
       同樣也是為本工程形成一種規范,這是一種局部規范,讀者可以定義一個適合自己的config文件。
1.2 變量名的選取
       首先要知道變量名的組成成分:字母,下劃線,數字;而且要注意的是數字不能作為開頭,并且字母區分大小寫,下劃線主要的功能用于分隔兩個有意義的單詞或者是區別形參和實參等用途。
       其次就是怎么正確選擇的問題了,在開始編程時大家都可能喜歡用a,b,c等簡單字母作為變量名,這樣只是單純的定義了一個變量,讀者并不能從中獲取很多信息量,比如這個變量的用途等。所以為了能表達的更準確并能獲得更多的信息量,應該選取有意義的英文單詞或者中文拼音,可以用下劃線作為單詞之間,也可使用首字母大寫區分,具體可根據個人編程習慣。
例:取一個關于定時器定時計數的變量,可以有以下幾種模式(僅供參考):
       1U16 TimerCounter;
       2U16 timer_counter;
這樣選取的變量名不僅達到了有意義的要求,而且更美觀。從接觸C到開始編程就要養成一個良好的習慣,選取變量名是往往程序首先要做的事,所以變量名的選取也是規范化編程的第一步,很關鍵。
1.3 與硬件資源相關用define去定義
       在說明這個問題之前,我們先看個例子:
#include <reg51.h>
#include "config.h"
sbit led = P0^0;
void fun1(void);
void delay(void);
void main(void)
{
       while(1)
       {
              delay();
              fun1();
              delay();
       }
}
void fun1(void)
{
       U8 i;
       U8 temp = 0xfe;
       led = 0;
       for(i=0;i<8;i++)
       {
              P1 = temp;
              temp = temp   << 1;
              delay();
       }
       led = 1;
}
void delay(void)
{
       U8 i,j;
       for(i=0;i<200;i++)
       {
              for(j=0;i<200;j++);
       }
}
為了能形成對比,我們再看運用規范化編程原理的程序:
#include <reg51.h>
#include "config.h"
sbit led = P0^0;
#define Led_On     led = 0
#define Led_Off     led = 1
#define LedCyclePort    P1   
void Soft_DealyTimer(void);
void LedCycleProc(void);
void main(void)
{
       while(1)
       {
              Soft_DealyTimer();
              LedCycleProc();
              Soft_DealyTimer();
       }
}
void LedCycleProc(void)
{
       U8 i;
       U8 temp = 0xfe;
       Led_On;
       for(i=0;i<8;i++)
       {
              LedCyclePort = temp;
              temp = temp   << 1;
              Soft_DealyTimer();
       }
       Led_Off;
}
void Soft_DealyTimer(void)
{
       U8 i,j;
       for(i=0;i<200;i++)
       {
              for(j=0;i<200;j++);
       }
}
通過以上兩個程序我們可以看出來具體區別是什么,程序中沒有了類似于P1這種標識,而是巧妙的利用define定義P1,以及函數名的修改,都是為了體現有意義和可移植性的要求。以上只是一個很簡單有關于define這個關鍵字的用法,巧妙運用能使程序的可讀性和可移植性大大增強,也是規范性編程不可或缺的關鍵因素。
1.4 合理選取變量的數據類型,防止掉入C陷進
       在說明之前先看一個簡單的例子:
#include <reg51.h>
#include "config.h"
sbit led = P0^0;
#define Led_On     led = 0
#define Led_Off     led = 1
void Soft_DealyTimer(void);
void main(void)
{
       while(1)
       {
              Led_On
              Soft_DealyTimer();
              Led_Off
              Soft_DealyTimer();
       }
}
void Soft_DealyTimer(void)
{
       U8 i,j;
       for(i=0;i<=256;i++)
       {
              for(j=0;i<=200;j++);
       }
}
初看覺得沒什么問題,可是當你下載到MCU運行時,你會發現燈永遠是亮的,不會熄滅,為什么呢?我們來分析一下,燈亮說明至少運行到了while(1)中的Led_On語句,說明應該問題就出在軟件延時函數,細看我們發現i的取值大了,因為U8 i的范圍是0~255,雖然我們知道unsigned char 是無符號8位,28值是256,但是要注意的是單片機初始值都是從0開始的,所以要注意這些細節問題。
有些人看了上面的例子會想,我都用long型或者int型就不是沒有問題了嗎?但是你這樣的話就增大了MCU內存的開銷,不利于程序快速運行,所以合理選擇變量數據類型也是很重要的。
1.5 在結構體中按變量從小到大排列
       先看個例子:
       Struct
       {
              Int s    //占用第0和第1個字節
              Char c1; //占用第2個字節,由于對其原因,第3個字節為空
              Long l;    //占用第4,5,6,7個共四個字節
              Char c2; //占用第8個字節,第9個字節為空
}s;
由此可以看出浪費了2個字節空間,所以我們應該調整變量順序,如下:
Struct
       {
              Int s    //占用第0和第1個字節
              Char c1; //占用第2個字節
              Char c2; //占用第3個字節
Long l;    //占用第4,5,6,7個共四個字節
}s;
為什么會有上述情況出現,原因是結構體變量是字對齊,但是在有些單片機中可以軟件設置為字節對齊,這樣也可以解決上述問題,但是按順序存放明顯是規范性編程中的一員,一個好習慣不會因為疏忽造成內存開銷增大。
2 模塊化編程
       為什么要模塊化編程,主要原因當然也是可讀性和可移植性。
       模塊化編程思路:
       1分析系統項目功能模塊,一般的系統可能有以下幾個模塊:最小系統模塊(能讓MCU工作的編程模塊),鍵盤和顯示模塊(一般會用譯碼鎖存器件,如智能調節儀所使用的是CH452),AD模塊(采集傳感器信號),繼電器模塊(控制一些器件工作,相當于開關),通訊模塊(UART)等。
       2將每個模塊分別用.c和.h建立模塊編程,.h文件用來存放模塊相關資源定義,以及函數聲明等功能,.c文件用于存放該模塊功能程序代碼。
       3用main.c將各個模塊串結成一個完整的系統,在main函數中代碼要簡潔,最好只有兩三個函數,比如:
Void main(void)
{
      System_Init();
       While(1)
{
       If(Key_Value)
              Key_Handle();
       else
              System_Handle();
}
}
以上分析了模塊化編程的基本思路,然后我們再來具體看個例子,以通訊模塊為例:
先看.h文件:
#ifndef __uart_H
#define __uart_H
 
#include "config.h"
#define Buf_Max_Len 32
#define UART0_TX_ENABLE
#define UART0_TX_DISABLE
#define UART0_RX_ENABLE
#define UART0_RX_DISAbLE
typedef enum
{
       Select_Uart0 = 0,
       Select_Uart1
}UART_SelectTypeDef;
 
typedef enum
{
       B9600_Freuency,
       B2400_Freuency
}UART_CommMode;
 
typedef volatile struct
{
       VU8 ReadIndex;
       VU8 SendIndex;
       VU8 CharCount;
       VU8 Buffer[Buf_Max_Len]; 
}UART_TypeDef;
 
#endif
還有.c文件:
#include <reg51.h>
#include "uart.h"
void UART_Init(UART_TypeDef *self,UART_SelectTypeDef in_sel,UART_CommMode in_mode)
{
       switch(in_mode)//波特率設置
       {
              case B9600_Freuency:
                 // 相應設置代碼
              break;
              case B2400_Freuency:
                 // 相應設置代碼
              break;
              default:
              break;
       }
       switch(in_sel)//串口選擇0或1
       {
              case Select_Uart0:
 
              break;
              case Select_Uart1:
 
              break;
              default:break;
       }
}
void Buffer_Init(UART_TypeDef *self)
{
       self->ReadIndex = self->SendIndex = self->CharCount = 0;
}
void UART_SendType(UART_TypeDef *self,U8 in_char)
{
       if(self->CharCount < Buf_Max_Len)
       {
              self->Buffer[self->SendIndex] = in_char;
              self->SendIndex++;
              self->CharCount++;
       }
}
void UART_GetType(UART_TypeDef *self)
{
       U8 ctmp = 0;
       if(self->CharCount)
       {
              ctmp = self->Buffer[self->ReadIndex];
              self->ReadIndex--;
              self->CharCount--;        
       }
}
void UART_SendChar(UART_TypeDef *self,U8 in_char)
{
       UART0_TX_ENABLE;
       SBUF = UART_SendType(&self->Buffer,in_char);
       UART0_TX_DISABLE;
}
 
void UART_GetChar(UART_TypeDef *self,U8 in_char)
{
       U8 ctmp;
       UART0_RX_ENABLE;
       UART_SendType(&self->Buffer,SBUF);
       UART0_RX_DISABLE;
}
以上的例子只是簡單的說明了模塊化編程原理及一般流程,可能我們已經注意到形參使用的是指針結構體,如此可以節約系統時間并減少系統內存開銷。
3 總結
       編程習慣很重要,由于面對大型的工程和團隊合作,養成一個規范化編程和模塊化編程的好習慣相當重要,也可以說是直接影響團隊的工程進程和新代碼成員的跟進進度,所以在開始學習編寫程序代碼前必須養成一個良好的編程習慣,規范化和模塊化編程是其精髓。
       以上所有程序是我零時編寫,可能有一些欠妥之處,請指正。謝謝大家。
關閉窗口

相關文章

国产在线日韩在线| 深爱五月综合网| 色视频www在线播放国产成人| 99久久精品国产毛片| 亚洲欧美tv| gogogogo高清视频在线| 男女啪啪a级毛片| 欧美日韩在线视频免费| 不卡的av中文字幕| 日本不卡一区二区三区在线观看| 中文字幕在线观看亚洲| 欧美性大战久久久久久久蜜臀| 精品伊人久久久久7777人| 国产香蕉精品| 超级碰碰不卡在线视频| av天天在线| 亚洲成色在线综合网站2018站| 草视频在线观看| 亚洲一区在线不卡| 日本在线观看一区| 国产精品18久久久久久首页狼 | 欧美日本一区二区视频在线观看 | 九九热在线播放| 精品国自产在线观看| 久久av红桃一区二区禁漫| 三级视频中文字幕| 一本久久a久久精品vr综合| 国产精品都在这里| 九九热精品视频在线播放| 91精品国产综合久久久久久漫画| 亚洲一区二区三区视频在线播放 | 欧美一区二区三区四区在线| 在线亚洲欧美视频| 精品国产99国产精品| 欧日韩精品视频| 亚洲综合成人在线视频| 国产三级久久久| 懂色av一区二区三区蜜臀| 日韩电影网1区2区| 一本色道88久久加勒比精品| 欧美激情欧美| 日韩av字幕| 国产美女自拍| 精品免费久久久| 欧美一区免费看| 一本一本久久a久久| 日本免费福利视频| 伊人久久久久久久久| 亚洲色图久久久| 欧洲精品在线播放| 特级西西444| 黄色网址在线免费看| 视频在线99| 欧美少妇一区| 日本一区二区精品| 蜜桃精品久久久久久久免费影院| 成人自拍爱视频| 99久久99久久精品国产片| 成人免费观看a| 欧美激情第三页| 欧美精品做受xxx性少妇| 在线播放国产精品| 亚洲精选一区二区| 亚洲欧洲在线免费| 中国人与牲禽动交精品| 精品国产一区二区三区久久久狼| 亚洲色图13p| 亚洲欧美色综合| 中文子幕无线码一区tr| 欧美国产激情二区三区| 国产精品国产三级国产aⅴ中文| 中文字幕av一区二区三区免费看 | 精品国产不卡| 日韩一区二区中文| 偷拍欧美精品| 国自产拍偷拍福利精品免费一| 伊人激情综合| 国产精品社区| 奇米精品一区二区三区在线观看 | 中文字幕久久久久| 国产成人一区二区三区别| 亚洲一区三区| 国产真人做爰毛片视频直播| 久久久免费视频网站| 激情综合网俺也去| 特黄视频免费观看| 亚洲最大免费视频| 国产精品免费人成网站酒店| 国产无遮挡免费视频| 亚洲在线视频播放| 寂寞护士中文字幕mp4| 国产偷窥老熟盗摄视频| 成年大片免费视频播放二级| 91网页版在线登录入口| 国产特黄在线| 嗯~啊~轻一点视频日本在线观看| 中文字幕21页在线看| 久久av网站| 色小子综合网| 日本伊人色综合网| www国产成人| 亚洲国产另类精品专区| 6080日韩午夜伦伦午夜伦| 亚洲日韩欧美视频| 日本精品久久电影| 美女黄毛**国产精品啪啪| 国产免费裸体视频| 黑人无套内谢中国美女| 久久精品第九区免费观看| 欧美人与动牲交xxxxbbbb| 国产91色在线观看| 91社区视频在线观看| 欧美成人一区二区三区四区| 亚洲欧美一区二区三| jizz18日本| 国产尤物视频在线| 久久91导航| 日韩精品一区二区三区免费观看| 日韩av高清在线观看| 久久久精品蜜桃| 欧美综合亚洲图片综合区| 在线播放亚洲激情| 91亚洲一区精品| 国产毛片久久久久久国产毛片| 欧美一级大片免费看| 久久精品视频国产| 一区二区三区小视频| 4虎在线播放1区| 免费看电影在线| 日韩欧美黄色| 蜜臀精品一区二区三区在线观看 | 国产日韩在线看片| 亚洲免费视频播放| 久久久久国产精品区片区无码| 日本高清不卡码| 激情欧美成人久久综合小说| 尤物视频网站在线观看| 日韩免费电影| 欧美成人首页| 国产视频911| 欧美一卡2卡三卡4卡5免费| 国模吧一区二区| 亚洲精品高清在线| 91精品国产综合久久精品麻豆 | 91免费视频污| 亚洲s码欧洲m码国产av| 国产精品久久久精品a级小说| 四虎影视在线播放| 精品国产亚洲一区二区在线观看| 亚洲欧美网站| 亚洲成精国产精品女| 国产亚洲精品久久久久久牛牛 | 亚洲欧美日韩爽爽影院| 亚洲xxx自由成熟| 国产精品拍拍拍| 日产精品久久久| 嫩草影院一二三| 91福利在线尤物| 狠狠爱www人成狠狠爱综合网| 国产欧美一二三区| 亚洲精品国产福利| 国产精品国产亚洲精品看不卡15 | 国产xxx免费观看| 国产黄色在线观看| 欧美精选一区二区三区| 久久婷婷一区二区三区| 亚洲第一网站男人都懂| 99re视频在线播放| 亚洲av无一区二区三区久久| 在线播放亚洲精品| 日本夜爽爽一二区| swag国产精品一区二区| 国产91在线观看丝袜| 欧美哺乳videos| 产国精品偷在线| 深田咏美中文字幕| 亚洲人成影院在线| 免费黄色在线看| 欧美在线二区| 亚洲成人资源在线| 人人做人人澡人人爽欧美| 国产一区亚洲二区三区| √资源天堂中文在线| 黄色福利视频网站| 加勒比色老久久爱综合网| 久久综合给合久久狠狠狠97色69| 亚洲区免费影片| 亚洲欧洲精品在线| 青青草手机在线视频| www.青草| 亚洲精品在线播放| 久久亚洲综合av| 中文字幕视频一区二区在线有码| 综合久久国产| 国产精品一区二区6| 电影天堂最新网址| 色婷婷综合久久久久久| 最新国产成人在线观看| 7777kkkk成人观看| 91热视频在线观看| 中文av字幕| 欧美xxxhd| 国产精品亚洲视频| 亚洲性夜色噜噜噜7777| 久青草视频在线播放| 夜夜嗨av禁果av粉嫩avhd| 大乳在线免费观看| 99成人在线| 日韩精品一区二区三区在线播放 | 丰满岳乱妇国产精品一区| 久久久久久久久免费视频| 亚洲黄色大片| 欧美高清hd18日本| 色综合视频二区偷拍在线| 免费在线看黄网址| 久草影视在线| 欧美黄免费看| 欧美老肥妇做.爰bbww| 奇米精品在线| 亚洲AV无码成人精品区东京热| 日本人妖在线| 欧美中文字幕| 亚洲精品一区二区网址| 国产中文字幕在线免费观看| 天天色综合av| 日韩不卡免费高清视频| 久久女同互慰一区二区三区| 91精品国产91久久久久久不卡| 肉色超薄丝袜脚交| 国产麻豆精品高清在线播放 | 午夜伦全在线观看| 蜜桃免费网站一区二区三区| 国产一区二区三区免费视频| 成人黄色片视频| 久久九九热视频| 午夜精品久久久久久毛片| 国产精品久久久一本精品| 国产精品视频久久久| 香蕉久久久久久久| 色佬视频在线观看| 亚洲欧美日韩国产| 日韩中文字幕视频| 丰满人妻一区二区三区免费视频棣| 国产污视频在线看| 天堂a中文在线| 日本中文在线一区| 日韩一区二区福利| 久久久久亚洲av片无码v| 你懂的免费网站| 91精品一区二区三区综合在线爱| 欧美人体做爰大胆视频| 男人的天堂视频在线| 亚洲三级中文字幕| 伊人www22综合色| 色哦色哦哦色天天综合| 亚洲日本精品国产第一区| 精品人妻一区二区三区浪潮在线| 日韩精品麻豆| 亚洲综合一二区| 色涩成人影视在线播放| 亚洲经典一区二区三区| 欧美不卡在线观看| 欧美色图片你懂的| 毛片在线播放视频| 香蕉视频网页版| 午夜影院欧美| 国产婷婷成人久久av免费高清| 欧美日本亚洲视频| 久久久久亚洲av无码麻豆| 四虎精品一区二区永久在线观看| 亚洲高清成人| 久久精品久久久久久国产 免费| 网站免费在线观看| 一级片在线观看| 国产成人在线视频免费播放| 国产精品视频自拍| 69视频免费在线观看| 欧美黑人粗大| 欧美日韩精品国产| 国产女大学生av| 成年女人毛片| 日本成人在线一区| 国产精品吹潮在线观看| 中文字幕亚洲高清| 欧美日韩视频免费观看| 在线中文字幕一区| 亚洲人成无码www久久久| 成人看片app| 久久国产精品区| 国产精品久久不能| 无码aⅴ精品一区二区三区| 国产精品亲子伦av一区二区三区| 色婷婷国产精品久久包臀| 国产精品免费观看久久| а√最新版在线天堂| 国产精品 日产精品 欧美精品| 亚洲伊人久久综合| 国产叼嘿视频在线观看| 亚洲色图丝袜| 最好看的2019的中文字幕视频| 特级西西人体高清大胆| 白浆在线视频| 91官网在线免费观看| 国产精品自在自线| 国产在线小视频| 亚洲同性同志一二三专区| 91传媒免费视频| 成人午夜剧场免费观看完整版| 国产在线精品一区二区不卡了| 97神马电影| 免费视频中文字幕| 亚洲欧洲综合| 国产精品亚洲网站| 乱色精品无码一区二区国产盗| 99久久久国产精品美女| 欧美风情在线观看| 久操视频在线免费观看| 老司机成人在线| 久久精品视频播放| www.伊人久久| 红杏aⅴ成人免费视频| 精品久久久网站| 18啪啪污污免费网站| 老司机成人影院| 3atv一区二区三区| 国产一线在线观看| 国产乱码在线| 在线精品视频一区二区| 国内精品免费视频| 免费电影视频在线看 | 国产精品欧美一区二区三区奶水| 一级片一区二区三区| 98精品视频| 久久久欧美精品| 亚洲网站免费观看| 欧美a级片一区| 日本视频久久久| 黄色av小说在线观看| 希岛爱理一区二区三区| 奇米影视亚洲狠狠色| 性少妇videosexfreexxx片| 欧美日本三区| 国产精品久久久久久久一区探花| 性欧美8khd高清极品| 综合久久十次| 成人高清视频观看www| 欧美另类黑人巨大videos| 日韩在线a电影| 欧美日韩国产三区| 免费污片软件| 97国产一区二区| 成人一对一视频| 国产精品一区二区三区四区色| 亚洲视频小说图片| 三级黄色片播放| 国产羞羞视频在线播放| 日韩视频在线永久播放| 精品爆乳一区二区三区无码av| 东京久久高清| 欧美一级大片在线观看| 五月婷婷在线播放| 久久综合综合久久综合| 深夜福利成人| 成片免费观看视频| 亚洲欧美一区二区三区极速播放| 欧美成人黄色网址| 男人添女人下部高潮视频在线观看| 欧美色图免费看| 91 在线视频| 奇米亚洲欧美| 国产99视频精品免视看7| 欧美女人天堂| 成人aaaa免费全部观看| 欧美日韩一道本| 91xxx在线观看| 欧美精品色一区二区三区| 久草视频在线资源站| 日韩精品水蜜桃| 国产日韩av高清| 日日干天天草| 国产精品第一页第二页第三页| 国产精品91av| 亚洲高清国产拍精品26u| 欧美成人久久久| 色综合久久久久久| 国产黄色成人av| 中国黄色片免费看| 国产成人久久精品麻豆二区| 久久精品视频一| 日日悠悠久久| 91性感美女视频| 国产一级免费大片| 久久综合偷偷噜噜噜色| 日本精品免费观看| xfplay资源站夜色先锋| 亚洲免费伊人电影| 国产传媒视频在线| 日韩精品1区| 青青草原成人| 1769在线观看|