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 總結
       編程習慣很重要,由于面對大型的工程和團隊合作,養成一個規范化編程和模塊化編程的好習慣相當重要,也可以說是直接影響團隊的工程進程和新代碼成員的跟進進度,所以在開始學習編寫程序代碼前必須養成一個良好的編程習慣,規范化和模塊化編程是其精髓。
       以上所有程序是我零時編寫,可能有一些欠妥之處,請指正。謝謝大家。
關閉窗口

相關文章

av高清在线观看| 荡女精品导航| 一级黄色在线| av最新地址| 成人网免费看| 麻豆电影在线| 亚洲а∨精品天堂在线| 在线观看你懂| 国产视频三级在线观看播放| 欧美另类自拍| 国产二区视频在线观看| 1pondo在线播放免费| 福利在线视频网站| www.综合网.com| 国精产品一区二区三区有限公司| av在线日韩| 亚洲日本视频在线| 任你弄精品视频免费观看| 免费av一区二区三区四区| 日韩中文欧美| 亚洲三级影院| 狠狠色2019综合网| 97久久精品人人做人人爽| 欧美国产在线观看| 亚洲一区在线看| 欧美性感美女h网站在线观看免费| 精品久久久国产| 欧美军同video69gay| 精品国产免费人成电影在线观看四季| 亚洲激情视频网站| 精品国产依人香蕉在线精品| 午夜精品久久久久久久男人的天堂| 日本高清+成人网在线观看| 国产精品美女在线观看| 国产成人一区二区三区免费看| 九色视频成人porny| 手机看片日韩国产| 国产成人久久婷婷精品流白浆| 五月婷婷狠狠操| 中文字幕人妻一区| 日韩三级久久久| 人人爽人人爽人人片av| 亚洲精品久久久久久动漫器材一区| 中文字幕亚洲日本岛国片| 少妇bbbb搡bbbb| 在线观看黄色小视频| 日韩精品亚洲人成在线观看| 日韩一区中文| 欧美日韩一区二区三区视频播放| 亚洲欧洲一区二区天堂久久| 精品一区二区在线视频| 国产欧美日韩在线| 欧洲一区二区三区免费视频| 激情深爱一区二区| 国产亚洲一区二区三区在线观看 | 亚洲欧美成人一区| 欧美精品一区二区三区免费播放| 性欧美18—19sex性高清| 日韩精品一区二区三区在线视频| 六月丁香婷婷综合| 影音先峰男人站| 天天干天天舔| a级在线观看| 日韩激情综合| 99成人精品| 久久久久久久久伊人| 日本韩国精品在线| 中文字幕亚洲一区二区三区五十路| 国产精品av在线播放| 亚洲成人第一| 国产九九九视频| 久草视频免费在线播放| 午夜国产在线观看| 四虎国产精品成人免费4hu| 老司机在线永久免费观看| 国产精品一区免费在线 | 免费毛片在线不卡| 日韩福利电影在线| 亚洲蜜桃精久久久久久久| 日韩欧美国产综合| 欧美亚洲日本网站| 午夜精品美女久久久久av福利| 欧美伦理片在线看| 久草视频手机在线| 无码h黄肉3d动漫在线观看| 97看剧电视剧大全| 偷拍自拍在线看| 欧美岛国激情| 91亚洲男人天堂| 欧美美女网站色| 国外成人性视频| 一区二区三区电影| 亚洲久久久久久| 国产美女自慰在线观看| 2018狠狠干| av岛国在线| 欧美在线免费| 国产精品丝袜在线| 日韩www在线| 99视频日韩| 午夜啪啪小视频| 中文字幕+乱码+中文乱码www| 狠狠干狠狠插| 欧美xxxhd| 亚洲久色影视| 亚洲欧美色图小说| 日韩专区在线播放| 日本视频一区在线观看| 青青草视频网站| 亚洲h视频在线观看| 最新四虎影在线在永久观看www | 搞黄网站在线看| 涩爱av在线播放一区二区| 亚洲一二三四| 国产精品久久久久久久久久妞妞| 亚洲一区在线视频| 性欧美暴力猛交69hd| 日韩精品在线观看av| 一级黄色录像视频| 污视频网站入口| 日本在线影院| 久久久久久黄| 欧美性猛片xxxx免费看久爱| 国产精品精品久久久| 国产熟人av一二三区| 国产真人无遮挡作爱免费视频| 小次郎av收藏家| 欧美韩国日本| 国产激情一区二区三区桃花岛亚洲| 欧美日韩国产天堂| 91色视频在线导航| 久久久精品人妻一区二区三区| 国产熟女精品视频| 国产黄色在线| 天天射综合网视频| 亚洲国产你懂的| 欧美在线性爱视频| 成人性生生活性生交12| 国产又粗又猛又爽又黄视频| 午夜在线a亚洲v天堂网2018| 91偷拍与自偷拍精品| 欧美三级在线视频| 九九热r在线视频精品| 国模精品娜娜一二三区| 日韩一级片播放| 九九九久久久久| 97一区二区三区| 最新精品视频在线| 一区在线不卡| 久久免费高清| 亚洲成av人片| 国产jzjzjz丝袜老师水多| 在线观看h视频| 五月精品视频| 特级西西人体www高清大胆| 国产免费一区二区三区网站免费| 国产尤物在线观看| 午夜丝袜av电影| 伊人久久大香伊蕉在人线观看热v| 亚洲精品1234| 亚洲一区二区免费视频| 色爱av美腿丝袜综合粉嫩av| 乱色588欧美| 亚洲欧美色图视频| 天天操天天干天天操| 欧美性孕妇孕交| 亚洲深夜福利在线观看| 免费无码av片在线观看| 日韩成人一区二区三区| 可以在线观看的av网站| 国产日韩亚洲欧美精品| 亚洲国产精品嫩草影院久久| 精品免费久久久久久久| 国产毛片毛片毛片毛片毛片| 在线中文字幕视频观看| 国产一区二区福利视频| 亚洲小视频网站| 亚洲精品久久久久avwww潮水| 香蕉影院在线| 国内精品久久久久久99蜜桃| 国产精品网站在线| 欧美精品做受xxx性少妇| 亚洲国产精品无码观看久久| 中文字幕在线观看免费视频| 一区二区三区欧美| 91精品国产乱码久久久久久蜜臀| 师生出轨h灌满了1v1| 黄色高清视频| 亚洲视频电影在线| 亚洲精品一区二区三区精华液 | 欧美性猛交xxxx黑人交| 久久资源亚洲| 无码日韩精品一区二区| a天堂中文在线官网在线| 国产91精品精华液一区二区三区 | 可以免费看毛片的网站| 成人黄色免费短视频| 国产欧美日韩在线| 成人免费福利在线| 国产在线欧美在线| 黄色在线观看网站| www.成人网.com| 国产精品女人网站| 欧美丰满艳妇bbwbbw| www.亚洲.com| 成人污视频在线观看| 国产成人亚洲综合| 岛国毛片在线观看| 国产最新在线| 久久久天堂av| 波多野结衣成人在线| 成人毛片一区二区三区| 中日韩脚交footjobhd| 国产精品美女久久福利网站| 国产精品一区二区三区在线观| 久久久久久不卡| 自拍偷拍亚洲视频| 亚洲码欧美码一区二区三区| 欧美在线你懂得| 色欲色香天天天综合网www| 尤物在线精品视频| 精品高清在线| 亚洲老头老太hd| 稀缺呦国内精品呦| 在线免费激情视频| 韩国成人在线视频| 国产不卡av在线免费观看| 三级在线观看免费大全| 日韩毛片久久久| 久久久精品中文字幕麻豆发布| 亚洲最大福利网| 国产又粗又猛又爽| 一区二区三区高清在线观看| 欧美日韩国产一二三| 九九热免费精品视频| 成人亚洲成人影院| 免费人成黄页网站在线一区二区| 国产+人+亚洲| 国产一级久久久| 一区二区精品伦理...| 午夜视频在线观看一区二区三区 | 欧美黑人xxxxx| 无码精品黑人一区二区三区| 国际精品欧美精品| 中文亚洲视频在线| 欧美人与禽zoz0善交| 欧洲美女少妇精品| 一区二区在线免费观看| 91麻豆天美传媒在线| 性生活视频网址| 久久中文欧美| 国产精品色视频| 国产精品乱码一区二区| 欧美电影在线观看完整版| 精品偷拍各种wc美女嘘嘘| 中文字幕丰满乱子伦无码专区| 91caoporn在线| 亚洲精品一二三| 男人c女人视频| wwwxx在线观看| 国产在线精品视频| 国产日韩精品推荐| 亚洲国产日韩在线人成电影| 999在线观看精品免费不卡网站| 国自产精品手机在线观看视频| www欧美在线| aaa国产精品| 中文字幕av一区中文字幕天堂| 最新av电影网站| 97精品国产综合久久久动漫日韩 | 综合精品久久| 欧美一级片在线播放| 做爰无遮挡三级| 亚洲97av| 久久成人精品一区二区三区| 日本三级中文字幕| www.爱久久| 视频直播国产精品| 好吊妞视频一区二区三区| 97精品久久| 日韩网站免费观看| 国产av熟女一区二区三区| 美女免费黄色| 成人小视频免费观看| 在线精品日韩| 男女午夜刺激视频| 久久毛片高清国产| 青青草国产免费| 久草视频在线播放| 亚洲精品国产成人久久av盗摄| 欧美s码亚洲码精品m码| 亚洲一区二区三区成人| 亚洲视频在线一区二区| 青青青在线视频免费观看| 超碰免费97在线观看| 日韩欧美aⅴ综合网站发布| av在线天堂网| 成人性生活av| 亚洲欧美激情另类校园| 精品成人av一区二区在线播放| 天堂成人娱乐在线视频免费播放网站| 久久在线视频在线| 亚洲天堂2021av| 亚洲精品二区三区| 亚洲一区精品电影| 国产成人夜间影院在线观看| 国产老肥熟一区二区三区| 色乱码一区二区三区熟女| eeuss一区| 亚洲大片在线观看| 中文字幕第3页| 88xx成人永久免费观看| 永久免费毛片在线播放不卡| 中文字幕精品视频在线观看| 99久久99久久精品国产片桃花| 国产日韩av在线播放| 国产激情小视频| 久久午夜色播影院免费高清| 无遮挡又爽又刺激的视频 | 久久99国产精品久久99小说| 亚洲高清不卡| 91精品国产综合久久男男| 色呦呦中文字幕| 欧美激情自拍| 国产精品久久久久久久久久久不卡| 国产免费高清视频| 天天操夜夜操国产精品| 国产成人aa精品一区在线播放| 性一交一乱一乱一视频| 午夜精品免费| 国产伊人精品在线| 色se01短视频永久免费| 爽爽淫人综合网网站| 高清一区二区三区视频| 国产麻豆精品入口在线观看| 久久精品国产色蜜蜜麻豆| 久久久国产精品一区二区三区| 一个人看的www免费观看视频| 国内久久婷婷综合| 亚洲一区影院| 国产精品影视| 亚洲精品视频在线| 亚洲涩涩在线观看| 亚洲第一图区| 日韩欧美在线综合网| www.97视频| 激情亚洲另类图片区小说区| 欧美成人在线免费视频| 中文字幕日日夜夜| 一区二区三区午夜视频| 亚洲一区二区日本| 91网站观看| 91浏览器在线视频| 免费观看日韩毛片| 成人video亚洲精品| 91精品视频网| 免费在线观看一级片| 日韩美脚连裤袜丝袜在线| 77777少妇光屁股久久一区| 亚洲av激情无码专区在线播放| 日本成人中文字幕| 色乱码一区二区三区熟女| 日本大臀精品| 欧洲精品视频在线观看| 国产精品酒店视频| 欧美久久精品| 国产成人精品亚洲精品| 国产字幕在线看| 久久久亚洲欧洲日产国码αv| 久久精品.com| wwww亚洲| 俺也去精品视频在线观看| 亚洲精品成人电影| 在线三级中文| 猫咪成人官网| 久久久精品免费观看| 欧美裸体bbwbbwbbw| 久久精品国产亚洲5555| 国产成人精品视频在线观看| 91精品国产高久久久久久五月天| 欧美日韩一区 二区 三区 久久精品 | 中文字幕精品在线播放| 97人澡人人添人人爽欧美| 久久久久久久久国产精品| 黄瓜视频网站| 欧美男男青年gay1069videost| 中文字幕无线码一区| 国产成人av一区二区| 亚洲国产第一区| 亚洲影视一区| 免费av手机在线观看| 日韩黄色三级| 高清日韩一区| 日本一级理论片在线大全| 欧美一级免费视频| 四虎永久在线| 色一情一乱一区二区| 免费看片黄色| 日韩欧美精品在线| 亚洲精品自拍区在线观看|