c++頭文件_51單片機C語言編程知多少:幾人不知頭文件,你要的干貨在這里了

近期寫了一些比較大的單片機程序,找了很多參考資料,看了大量別人的程序。我從中發現了自己對于C語言編程還只是知道如何實現功能,但對編程規范掌握的不好,編程習慣也沒有很好的養成。

4edb816033554a5c931bf9ce40381d9e.png

學了這么久的單片機,還真是挺難為情的

由此我將一些經驗分享出來,供大家參考及修正。

說一說起因,為什么標題叫“幾人不知頭文件“。

當我在寫一些代碼量較大的程序時,因為沒有合理的規劃代碼結構,導致代碼順序很混亂,當要查找一些功能函數時,只能打開Functions窗口。但我常常忘了有這么個工具,就使勁在一篇長長的代碼中去翻閱。這讓我很是頭疼。

56e1f0cb7e458c6fd439f7bac2a55a91.png

一陣頭疼

為啥會這樣呢?

還不是因為學的不好,用四川話來說就是“二十九天的徒弟”。

8903b95a9c932f0bb687109f3aeded54.png

超級難受

只掌握了個皮毛。雖然有時候看著自己的代碼很厲害,但仔細一看,爛的過分,偶爾都會想,這是我寫的嗎?雖然自己清楚的知道,這就是我寫的,但始終不想承認。

c608cfb2822d23d31098f2669b9bff30.png

還是要承認才行

當我在閱讀別人的代碼時,發現他們的代碼調理清晰,功能明確。有時候看到功能一樣的代碼,為啥自己的就是很丑呢。

db95c4dec4e5c8583ea404157542e39e.gif

拒絕接受

還不是因為沒有使用頭文件來分開功能代碼,所有的功能代碼都在一個.c文件下,能不丑嗎?玩著玩著就幾百行代碼了。各種功能函數看的眼花繚亂。于是我決定痛改前非。做一下功能分類。相信自己一定可以。

4777ddb82ead918a5d760b8cf3775d13.png

不敢相信啊,我居然會痛改前非

于是我便開始去學習怎么使用頭文件,怎么在文件外定義函數調用。

4eb9a84ed6dad40c7508b06294ae3b17.gif

感覺自己好厲害

這里就要講干貨了

1、什么是頭文件(.h)

在單片機C程序設計中,那些啥項目一般都按照功能進行結構化設計,將一個項目劃分為多個功能,每一個功能的相關程序代碼放在一個.c文件中,稱之為一個模塊,xxx.c的xxx就是功能名。但光有一個.c肯定是不夠的,是不能被主函數所調用的。還需要一個.h文件,自然這個頭文件就出來了。

一個模塊由兩個文件組成,一個*.h文件,對模塊中的數據結構,函數原型,I/O端口進行描述和聲明;另一個則是*.c文件,對數據實例或對象定義,以及函數算法具體實現。

咱還是舉個例子,具體說明一下吧。

c8a70c68923a146f864dbde9b0d711c7.gif

舉個栗子實際說明一下啥是.h文件

上代碼:

DS1302.H

#ifndef __DS1302_H_#define __DS1302_H_//---包含頭文件---//#include#include//---重定義關鍵詞---//#ifndef uchar#define uchar unsigned char#endif#ifndef uint #define uint unsigned int#endif//---定義ds1302使用的IO口---//sbit DSIO=P3^4;sbit RST=P3^5;sbit SCLK=P3^6;//---定義全局函數---//void Ds1302Write(uchar addr, uchar dat);uchar Ds1302Read(uchar addr);void Ds1302Init();void Ds1302ReadTime();//---加入全局變量--//extern uchar TIME[7];//加入全局變量#endif 

這里重新定義了關鍵字,定義了I/O端口,以及進行了函數聲明。我們在主函數中只需要包含這個頭文件就可以調用DS1302.c中的函數。這里未貼出代碼,太長了呀。

2、.h文件的作用

作為項目設計,除了對項目總體功能進行詳細描述外,激素hi對內閣模塊進行詳細定義,也就是給出所有模塊的頭文件。通常.h頭文件要定義模塊中個函數的功能,以及輸入輸出參數的要求。也可以在頭文件中先規劃一下相應的功能函數,再根據.h文件進行設計、編程、調試。我們個人編程最主要的作用還是進行模塊化管理,方便自己進行開發和設計。

當然如果是企業開發,為了安全需要保密,模塊實現后可以鏈接文件obj或庫文件lib的方式提供給項目其他成員使用。因為不用提供源代碼,就可以進行公開發行,保證我們程序員和公司的所有權。同時也可以防止別人有意無意修改產生非一致性,造成版本或功能混亂。

如果要引用模塊內的數據或算法函數,只要用include包含指定模塊的.h文件即可。

42e1f78ad21a7ecb8e376e4c2e04de25.png

下一個:繼續

3、.h文件的基本組成

我們從上面的DS1302.h文件中可以看出.h文件有哪些組成嗎?

61e4c6af5e07cfdfaebc597971a69a33.png

我覺得可以

仔細看,來分析一下。

#ifndef __DS1302_H_ // 這一句是防止重復引用,如果沒有定義過__DS1302_H_這個 文件就編譯下一句#define __DS1302_H_ // 此符號唯一,表示只要引用過一次,即#include,則定義符號__DS1302_H_#include // 這句沒啥好說的,就是包含51單片機的特殊寄存器#ifndef uchar // 這一句還是和上面的是一樣的,為了防止重復引用定義各種功能函數原型聲明///#endif // 這句是整個文件的結束標志
d348cab3928d9e849770de3c06e062ef.png

那怎么可能嘛

最后寫點

第一次嘗試加入表情包,不知道效果怎么樣。

對于頭文件暫時就說這么多,以后想起來再補充吧。

對于大型項目的設計編寫,模塊化設計的這種思想很重要,使用頭文件這種方式是比較方便的,讓代碼管理起來更加方便,設計起來更加方便。對于設計思路也有一定的幫助,只需要想我這個模塊該怎么寫。怎么樣去設計。這也就是模塊化程序設計的思想所在。

50a7f7cfe07d106a9cf665ccbc11ad5b.png

我覺得下面的更重要

分享更多單片機編程方面的知識,用自己踩過的坑給大家展示如何躲避他們。

關注并私信我,發送“08”即可獲取文中實例的完整程序及仿真文件。

關注+點贊+評論,在評論區說出你的想法,和我一起交流,你的支持是我創作的動力,一枚科技仔感謝您的閱讀。

49188f9b4db66bbe77be5fc6af5c7096.png

期待你的評論喲

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271478.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271478.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271478.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

最常問的MySQL面試題集合

除了基礎題部分,本文還收集整理的MySQL面試題還包括如下知識點或題型:MySQL高性能索引SQL語句MySQL查詢優化MySQL高擴展高可用MySQL安全性問題1:char、varchar的區別是什么?varchar是變長而char的長度是固定的。如果你的內容是固定…

計算機打印機共享失敗,局域網共享打印機連接失敗怎么辦

在局域網中由于辦公需要,經常要連接網絡打印機,但是有時候就無法連接,提示各種連接失敗,下面是學習啦小編給大家整理的一些有關局域網共享打印機連接失敗的解決方法,希望對大家有幫助!局域網共享打印機連接失敗的解決方…

高斯模糊java代碼_OpenCV3 Java圖形圖像上的高斯模糊(Imgproc.GaussianBlur)

代碼案例:package com.what21.opencv.demo;import org.opencv.core.Core;import org.opencv.core.Mat;import org.opencv.core.Size;import org.opencv.imgcodecs.Imgcodecs;import org.opencv.imgproc.Imgproc;public class GaussianBlur {public static void main…

實時數據集成

企業應用集成 面向服務的體系結構 (SOA) 目前應該是一個很受歡迎的名詞,中間件技術人員幾乎到了言必稱SOA的程度,數據集成當然也不例外,在Oracle openworld2008大會上,就推出了一堆數據集成的專場演講,其中和SOA結合最…

idea 中代碼大小寫切換快捷鍵

idea用使用 CTRL SHIFT U 使用前: 使用后:

nginx做服務器入口_Nginx實現http反向代理

什么是反向代理?反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器…

操作系統基礎:進程知識筆記(二)

一、管程 1、管道概念概念 管道是用于連接一個讀進程和一個寫進程。用來實現它們之間通信的共享文件。 2、管程的概念 管程是由一些共享數據、一組能為并發進程所執行的作用在共享數據上的操作集合、初始代碼、以及存取權組成。管程提供了一種可以允許多線程安全、有效地共享抽…

怎樣保護計算機連接線,一根網線把電腦燒了:雷雨天如何保護家電?

記得在小時候,每逢遇到雷雨天氣,爸媽總會讓我們關掉電視機、電腦等家電,雖然很不情愿,但為了避免電器遭受雷擊造成損壞,我們還是會照做。現在長大了,除了知其然,還更要知其所以然,那…

HDU5697 刷題計劃 dp+最小乘積生成樹

分析:就是不斷遞歸尋找靠近邊界的最優解 學習博客(必須先看這個): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog.csdn.net/u013849646/article/details/51524748 注:這…

pos加盟申請php_ThinkPHP萬能表單程序源碼 報名預約加盟申請調查表單程序源碼

平臺聲明:本商品由平臺商家發布,如果本商品源碼侵犯了您的利益請在上方價格右側或聯系平臺客服舉報。微信表單-實現各行業的報名、預約、加盟申請、問卷調查等應用01.自定義表單模型(自定義字段支持字符串、數字、單選、多選、下拉、日歷、時間、郵件、省…

分析Java中的三種不同變量的區別

1、首先分析Java中的三種不同變量的區別,如下表所示 概念默認值其他類變量 也叫靜態變量,是類中獨立于方法之外的變量 用static 修飾 有默認初始值,系統自動初始化。 如boolean默認為false. 可以被public,protect,pr…

分享我常用的5個免費的在線 SQL 數據庫環境,簡直太方便了!

大今天給大家分享幾個在線的免費 SQL 運行環境,也就是在線數據庫。這些網站可以幫助我們快速運行一些 SQL 語句的測試或者驗證,同時還可以在網絡上進行分享,關鍵不需要自己安裝數據庫。SQL FiddleSQL Fiddle 提供了 MySQL、Oracle、PostgreSQ…

python刷題用leet_GitHub - Yolymaker/leetcode-python: 利用python分類刷leetcode題目

leetcode分類高效刷題 leetcode是一個很好的學習算法的一個online judge的網站,通過刷題能夠快速提升自己的算法能力。但是令大家都頭疼的就是,怎么能夠高效的通過leetcode刷題掌握算法的做題技巧,并且順利通過面試。 刷題的時候千萬不要懷疑…

36歲 計算機博士,36歲考博士

博士生在學習期間,須在國內外核心期刊上正式發表與學位論文緊密相關(構成學位論文的主要組成部分)的學術論文且積分必須在6分(含6分)以上方可申請授予學位。以上發表的論文應以**大學商學院為第一署名單位,博士生為第一作者或導師為第一作者、博士生為第…

OPTIMIZE TABLE

INNODB 不支持mysql> OPTIMIZE TABLE t; ----------------------------------------------------------------------------------------------- | Table | Op | Msg_type | Msg_text | ------------------…

r語言 面板數據回歸_R語言_018回歸

回歸分析是統計學的核心。它其實是一個廣義的概念,指那些用一個或多個預測變量來預測響應變量的方法。通常,回歸分析可以用來挑選與響應變量相關的解釋變量,可以描述兩者的關系,也可以生成一個等式,通過解釋變量來預測…

Integer對象范圍(-128-127)之間(Integer. valueOf()方法)

1.Integer. valueOf()方法的作用 Integer. valueOf()可以將基本類型int轉換為包裝類型Integer,或者將String轉換成Integer,String如果為Null或“”都會報錯 看下面代碼示例 取值為127時 取值為128時 為什么會是這樣呢? 首先,我們…

操作系統基礎:進程知識筆記(三)

1、死鎖概念知識 計算機中存在許多互斥資源(打印機)、軟件資源(進程表、臨界區)如果兩個進程同時調用打印機,或同時進入臨界區必然會出現問題。 死鎖:指兩個以上的進程互相要求對方已經占有的資源導致無法繼…

垂直梯形校正畫質損失多少_梯形校正功能是怎么實現的?其中可大有學問

梯形校正這個概念,想必大部分投影儀用戶早已耳熟能詳。所謂的梯形校正,指的是當我們的投影儀位置擺放不正時,投射出來的畫面會是一個梯形,這時候需要通過投影儀的梯形校正功能將畫面調整為可以正常觀看的矩形。雖然目前市場上的大…

操作系統基礎:存儲管理知識筆記(一)

1、存儲器基礎知識 存儲器管理的對象是主存或內存,存儲器是計算機系統中非常關鍵的資源,用來存放各種信息的主要場所。存 儲器管理功能主要包括:主存空間的分配和回收、提供主存利用率、擴充主存、主存信息的保護。 2、存儲器結構 存儲器結構…