久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区


曙海教育集團論壇單片機專區(qū)單片機高級 → 從單片機初學者邁向單片機工程師”之LED主題討論周第三章----模塊化編程...


  共有9826人關注過本帖樹形打印

主題:從單片機初學者邁向單片機工程師”之LED主題討論周第三章----模塊化編程...

美女呀,離線,留言給我吧!
wangxinxin
  1樓 個性首頁 | 博客 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發(fā)短信
等級:青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊:2010-11-12 11:08:23
從單片機初學者邁向單片機工程師”之LED主題討論周第三章----模塊化編程...  發(fā)帖心情 Post By:2010-12-8 10:36:00

通過上一章的學習,我想你已經掌握了如何在程序中釋放CPU了。希望能夠繼續(xù)堅持下去。一個良好的開始是成功的一半。我們今天所做的一切都是為了在單片機編程上做的更好。
在談論今天的主題之前,先說下我以前的一些經歷。在剛開始接觸到C語言程序的時候,由于學習內容所限,寫的程序都不是很大,一般也就幾百行而矣。所以所有的程序都完成在一個源文件里面。記得那時候大一參加學校里的一個電子設計大賽,調試了一個多星期,所有程序加起來大概將近1000行,長長的一個文件,從上瀏覽下來都要好半天。出了錯誤簡單的語法錯誤還好定位,其它一些錯誤,往往找半天才找的到。那個時候開始知道了模塊化編程這個東西,也嘗試著開始把程序分模塊編寫。最開始是把相同功能的一些函數(譬如1602液晶的驅動)全部寫在一個頭文件(.h)文件里面,然后需要調用的地方包含進去,但是很快發(fā)現(xiàn)這種方法有其局限性,很容易犯重復包含的錯誤。
而且調用起來也很不方便。很快暑假的電子設計大賽來臨了,學校對我們的單片機軟件編程進行了一些培訓。由于學校歷年來參加國賽和省賽,因此積累了一定數量的驅動模塊,那些日子,老師每天都會布置一定量的任務,讓我們用這些模塊組合起來,完成一定功能。而正是那些日子模塊化編程的培訓,使我對于模塊化編程有了更進一步的認識。并且程序規(guī)范也開始慢慢注意起來。此后的日子,無論程序的大小,均采用模塊化編程的方式去編寫。很長一段時間以來,一直有單片機愛好者在QQ上和我一起交流。有時候,他們會發(fā)過來一些有問題的程序源文件,讓我?guī)兔π薷囊幌隆M瑯邮情L長的一個文件,而且命名極不規(guī)范,從頭看下來,著實是痛苦,說實話,還真不如我重新給他們寫一個更快一些,此話到不假,因為手頭積累了一定量的模塊,在完成一個新的系統(tǒng)時候,只需要根據上層功能需求,在底層模塊的支持下,可以很快方便的完成。而不需要從頭到尾再一磚一瓦的重新編寫。藉此,也可以看出模塊化編程的一個好處,就是可重復利用率高。下面讓我們揭開模塊化神秘面紗,一窺其真面目。
    C語言源文件 *.c
        提到C語言源文件,大家都不會陌生。因為我們平常寫的程序代碼幾乎都在這個XX.C文件里面。編譯器也是以此文件來進行編譯并生成相應的目標文件。作為模塊化編程的組成基礎,我們所要實現(xiàn)的所有功能的源代碼均在這個文件里。理想的模塊化應該可以看成是一個黑盒子。即我們只關心模塊提供的功能,而不管模塊內部的實現(xiàn)細節(jié)。好比我們買了一部手機,我們只需要會用手機提供的功能即可,不需要知曉它是如何把短信發(fā)出去的,如何響應我們按鍵的輸入,這些過程對我們用戶而言,就是是一個黑盒子。
在大規(guī)模程序開發(fā)中,一個程序由很多個模塊組成,很可能,這些模塊的編寫任務被分配到不同的人。而你在編寫這個模塊的時候很可能就需要利用到別人寫好的模塊的借口,這個時候我們關心的是,它的模塊實現(xiàn)了什么樣的接口,我該如何去調用,至于模塊內部是如何組織的,對于我而言,無需過多關注。而追求接口的單一性,把不需要的細節(jié)盡可能對外部屏蔽起來,正是我們所需要注意的地方。
    C語言頭文件 *.h
        談及到模塊化編程,必然會涉及到多文件編譯,也就是工程編譯。在這樣的一個系統(tǒng)中,往往會有多個C文件,而且每個C文件的作用不盡相同。在我們的C文件中,由于需要對外提供接口,因此必須有一些函數或者是變量提供給外部其它文件進行調用。
假設我們有一個LCD.C文件,其提供最基本的LCD的驅動函數
    LcdPutChar(char cNewValue) ; //在當前位置輸出一個字符
而在我們的另外一個文件中需要調用此函數,那么我們該如何做呢?
    頭文件的作用正是在此。可以稱其為一份接口描述文件。其文件內部不應該包含任何實質性的函數代碼。我們可以把這個頭文件理解成為一份說明書,說明的內容就是我們的模塊對外提供的接口函數或者是接口變量。同時該文件也包含了一些很重要的宏定義以及一些結構體的信息,離開了這些信息,很可能就無法正常使用接口函數或者是接口變量。但是總的原則是:不該讓外界知道的信息就不應該出現(xiàn)在頭文件里,而外界調用模塊內接口函數或者是接口變量所必須的信息就一定要出現(xiàn)在頭文件里,否則,外界就無法正確的調用我們提供的接口功能。因而為了讓外部函數或者文件調用我們提供的接口功能,就必須包含我們提供的這個接口描述文件----即頭文件。同時,我們自身模塊也需要包含這份模塊頭文件(因為其包含了模塊源文件中所需要的宏定義或者是結構體),好比我們平常所用的文件都是一式三份一樣,模塊本身也需要包含這個頭文件。
下面我們來定義這個頭文件,一般來說,頭文件的名字應該與源文件的名字保持一致,這樣我們便可以清晰的知道哪個頭文件是哪個源文件的描述。
        于是便得到了LCD.C的頭文件LCD.h 其內容如下。
        #ifndef    _LCD_H_
         #define     _LCD_H_
         extern   LcdPutChar(char cNewValue) ;
        #endif

    這與我們在源文件中定義函數時有點類似。不同的是,在其前面添加了extern 修飾符表明其是一個外部函數,可以被外部其它模塊進行調用。
       #ifndef     _LCD_H_
         #define     _LCD_H_
         #endif

              這個幾條條件編譯和宏定義是為了防止重復包含。假如有兩個不同源文件需要調用LcdPutChar(char cNewValue)這個函數,他們分別都通過#include “Lcd.h”把這個頭文件包含了進去。在第一個源文件進行編譯時候,由于沒有定義過 _LCD_H_ 因此 #ifndef _LCD_H_ 條件成立,于是定義_LCD_H_ 并將下面的聲明包含進去。在第二個文件編譯時候,由于第一個文件包含時候,已經將_LCD_H_定義過了。因此#ifndef _LCD_H_ 不成立,整個頭文件內容就沒有被包含。假設沒有這樣的條件編譯語句,那么兩個文件都包含了extern LcdPutChar(char cNewValue) ; 就會引起重復包含的錯誤。
    不得不說的typedef
          很多朋友似乎了習慣程序中利用如下語句來對數據類型進行定義
   #define uint unsigned int
    #define uchar unsigned char

    然后在定義變量的時候 直接這樣使用
uint g_nTimeCounter = 0 ;
    不可否認,這樣確實很方便,而且對于移植起來也有一定的方便性。但是考慮下面這種情況你還會 這么認為嗎?
#define PINT unsigned int * //定義unsigned int 指針類型
PINT g_npTimeCounter, g_npTimeState ;

      那么你到底是定義了兩個unsigned int 型的指針變量,還是一個指針變量,一個整形變量呢?而你的初衷又是什么呢,想定義兩個unsigned int 型的指針變量嗎?如果是這樣,那么估計過不久就會到處抓狂找錯誤了。
    慶幸的是C語言已經為我們考慮到了這一點。typedef 正是為此而生。為了給變量起一個別名我們可以用如下的語句
    typedef unsigned int    uint16 ;    //給指向無符號整形變量起一個別名 uint16
      typedef unsigned int * puint16 ; //給指向無符號整形變量指針起一個別名 puint16

    在我們定義變量時候便可以這樣定義了:

uint16    g_nTimeCounter = 0 ; //定義一個無符號的整形變量
puint16 g_npTimeCounter ;    //定義一個無符號的整形變量的指針

在我們使用51單片機的C語言編程的時候,整形變量的范圍是16位,而在基于32的微處理下的整形變量是32位。倘若我們在8位單片機下編寫的一些代碼想要移植到32位的處理器上,那么很可能我們就需要在源文件中到處修改變量的類型定義。這是一件龐大的工作,為了考慮程序的可移植性,在一開始,我們就應該養(yǎng)成良好的習慣,用變量的別名進行定義。
如在8位單片機的平臺下,有如下一個變量定義
    uint16    g_nTimeCounter = 0 ;
        如果移植32單片機的平臺下,想要其的范圍依舊為16位。
    可以直接修改uint16 的定義,即
    typedef unsigned short int    uint16 ;
        這樣就可以了,而不需要到源文件處處尋找并修改。

將常用的數據類型全部采用此種方法定義,形成一個頭文件,便于我們以后編程直接調用。
文件名 MacroAndConst.h
其內容如下:
#ifndef   _MACRO_AND_CONST_H_
#define   _MACRO_AND_CONST_H_

typedef    unsigned int    uint16;
typedef    unsigned int   UINT;
typedef    unsigned int   uint;
typedef    unsigned int   UINT16;
typedef    unsigned int   WORD;
typedef    unsigned int   word;
typedef      int        int16;
typedef      int        INT16;
typedef    unsigned long uint32;

typedef    unsigned long     UINT32;
typedef    unsigned long    DWORD;
typedef    unsigned long    dword;
typedef    long            int32;
typedef    long            INT32;
typedef    signed char     int8;
typedef    signed char     INT8;
typedef    unsigned char      byte;
typedef    unsigned char     BYTE;
typedef    unsigned char     uchar;
typedef    unsigned char     UINT8;
typedef    unsigned char    uint8;
typedef    unsigned char    BOOL;

#endif

至此,似乎我們對于源文件和頭文件的分工以及模塊化編程有那么一點概念了。那么讓我們趁熱打鐵,將上一章的我們編寫的LED閃爍函數進行模塊劃分并重新組織進行編譯。

在上一章中我們主要完成的功能是P0口所驅動的LED以1Hz的頻率閃爍。其中用到了定時器,以及LED驅動模塊。因而我們可以簡單的將整個工程分成三個模塊,定時器模塊,LED模塊,以及主函數
對應的文件關系如下

main.c
Timer.c --?Timer.h
Led.c      --?Led.h
在開始重新編寫我們的程序之前,先給大家講一下如何在KEIL中建立工程模板吧,這個模板是我一直沿用至今。希望能夠給大家一點啟發(fā)。
下面的內容就主要以圖片為主了。同時輔以少量文字說明。
我們以芯片AT89S52為例。


支持(0中立(0反對(0單帖管理 | 引用 | 回復 回到頂部

返回版面帖子列表

從單片機初學者邁向單片機工程師”之LED主題討論周第三章----模塊化編程...








簽名
久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
欧美疯狂做受xxxx富婆| 欧美影视一区二区| 另类调教123区| 青娱乐精品在线视频| 日韩黄色免费电影| 久久不见久久见免费视频7| 日韩av网站在线观看| 免费欧美高清视频| 国产成人精品免费视频网站| 成人理论电影网| 国产精品三区www17con| 国产在线精品一区二区三区》 | 91精品久久久久久蜜桃| www.日韩在线| 韩国成人动漫在线观看| 水蜜桃亚洲精品| 欧美色老头old∨ideo| 日韩精品一区二区三区在线播放| 久久久高清一区二区三区| 亚洲色图一区二区| 日韩av网站免费在线| 国产.欧美.日韩| 久久精品五月婷婷| 欧美午夜一区二区| 久久精品亚洲精品国产欧美| 一区二区三区在线视频观看58| 日产国产欧美视频一区精品| 成人免费观看男女羞羞视频| 久久久久网址| 6080亚洲精品一区二区| 国产人久久人人人人爽| 午夜不卡在线视频| 不卡在线视频中文字幕| 视频一区国产精品| 欧美xxx久久| 一区二区三区精品在线观看| 国产一区二区网址| 鲁丝一区二区三区免费| 欧美丰满美乳xxx高潮www| 成人欧美一区二区三区1314| 精品一区二区在线免费观看| 97人人澡人人爽| 欧美中文字幕一区二区三区亚洲| 日韩精品在线网站| 首页国产欧美日韩丝袜| 波多野结衣视频一区| 亚洲国产欧美不卡在线观看| 精品人在线二区三区| 亚洲国产中文字幕| 91在线精品一区二区三区| 在线成人性视频| 国产午夜精品一区二区| 美腿丝袜亚洲三区| 久久99精品久久久久子伦| 91麻豆精品91久久久久久清纯| 一区二区视频在线| 999在线免费观看视频| 欧美三级电影在线看| 一区二区三区 在线观看视频| 成人动漫视频在线| 色噜噜偷拍精品综合在线| 中文字幕中文字幕在线一区| 国产999精品久久| 色网综合在线观看| 亚洲欧美国产三级| 成人资源av| 2014亚洲片线观看视频免费| 韩国女主播成人在线观看| 亚洲一二区在线| 一区二区三区四区五区视频在线观看| av网站一区二区三区| 91.com视频| 久久aⅴ国产欧美74aaa| 在线观看一区二区三区三州| 国产精品亲子乱子伦xxxx裸| 成人丝袜18视频在线观看| 欧美色老头old∨ideo| 亚洲一二三四在线| 精品乱子伦一区二区三区| 欧美不卡激情三级在线观看| 久久99最新地址| 91官网在线免费观看| 一区二区欧美在线观看| 国产一区二区三区黄| 国产日韩精品一区二区三区在线| 国产一区 二区| 这里只有精品电影| 精品一区二区三区在线观看国产| 亚洲一区二区在线看| 亚洲成人福利片| 日韩电影大全在线观看| 亚洲欧美日韩电影| 欧美一区二区三区四区夜夜大片 | 色综合激情五月| 亚洲国产日韩一级| 色综合久久久久久久久五月| 亚洲柠檬福利资源导航| 免费精品视频一区| 亚洲日本va午夜在线影院| 精品日韩欧美| 亚洲精品视频在线观看网站| 久久青青草原| 亚洲国产精品久久人人爱蜜臀| 免费不卡亚洲欧美| 一区二区三区在线观看欧美| 午夜精品美女久久久久av福利| 亚洲高清一区二区三区| 影音先锋亚洲视频| 美女mm1313爽爽久久久蜜臀| 欧美日本韩国一区二区三区视频 | 久久精品水蜜桃av综合天堂| 91久色porny| 成人欧美一区二区三区在线播放| 黑人另类av| 一个色综合av| 日本精品免费观看高清观看| 裸体一区二区三区| 欧美一区二区在线视频| 91欧美一区二区| 亚洲品质自拍视频| 中文字幕免费在线不卡| 国产一区二区中文字幕| 26uuu国产在线精品一区二区| 国产91精品一区二区绿帽| 一区二区国产视频| 欧美日韩久久不卡| 爱情岛论坛亚洲入口| 亚洲在线视频一区| 欧美日韩免费一区二区三区视频| a在线欧美一区| 亚洲男人的天堂在线aⅴ视频 | 在线视频综合导航| 国产91丝袜在线播放0| 中文字幕乱码久久午夜不卡| 欧美一卡2卡3卡4卡无卡免费观看水多多 | 激情综合色播激情啊| 精品少妇一区二区三区免费观看| 91麻豆产精品久久久久久| 夜夜嗨av一区二区三区四季av| 欧美在线一二三| 91在线视频观看| 天天色综合成人网| 久久视频一区二区| 亚洲精品在线观看免费| 成人黄色免费短视频| 一区二区三区四区不卡在线 | 欧美蜜桃一区二区三区| 成人三级在线| 久久国产婷婷国产香蕉| 国产片一区二区| 色哟哟一区二区三区| 成人一区二区三区在线观看| 亚洲尤物视频在线| 日韩免费电影网站| 亚洲精品一区二区毛豆| 91视频观看免费| 久久精品国产99| 国产精品国产三级国产aⅴ原创| 正在播放91九色| 99r国产精品视频| 久久国产尿小便嘘嘘尿| 国产精品久久久久久久岛一牛影视 | 成人污污视频在线观看| 午夜视频在线观看一区二区| 久久一留热品黄| 欧美性生活大片视频| 国内精品视频免费| 国产91精品露脸国语对白| 亚洲不卡av一区二区三区| 久久免费美女视频| 在线观看91精品国产入口| 久久久av水蜜桃| 95精品视频在线| 国产美女在线观看一区| 亚洲电影中文字幕在线观看| 国产欧美一区视频| 日韩欧美一区在线| 欧美影视一区二区三区| 欧美日韩大片一区二区三区| yourporn久久国产精品| 久久69国产一区二区蜜臀| 亚洲午夜成aⅴ人片| 国产精品免费人成网站| 日韩久久久精品| 欧美午夜精品免费| 亚洲精品中文字幕乱码三区不卡| 高清av免费一区中文字幕| 国产成人在线视频播放| 免费成人性网站| 亚洲一区二区欧美日韩| 国产精品福利在线播放| 国产亚洲成aⅴ人片在线观看| 欧美一区三区二区| 欧美日韩中文字幕精品| 一区二区三视频| 日日夜夜精品网站| 日本黑人久久| 黑人中文字幕一区二区三区| 波多野结衣在线aⅴ中文字幕不卡| 久久99国产精品尤物|