版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、模塊化編程思想模塊化編程思想原碼工作室原碼工作室模塊化編程概述模塊化編程概述為什么要引入模塊化編程?為什么要引入模塊化編程?通過以上幾講內(nèi)容,我們初步掌握了單片機(jī)通過以上幾講內(nèi)容,我們初步掌握了單片機(jī)C語言編程的基本原理與基本方法。同時(shí)我們可語言編程的基本原理與基本方法。同時(shí)我們可以觀察并體會到,隨著代碼量的增加,將所有代以觀察并體會到,隨著代碼量的增加,將所有代碼都放在同一個(gè)碼都放在同一個(gè).c文件中的做法越發(fā)使得程序結(jié)文件中的做法越發(fā)使得程序結(jié)構(gòu)混亂、可讀性與可移植性變差,而模塊化編程構(gòu)混亂、可讀性與可移植性變差,而模塊化編程是解決這個(gè)問題的常用而有效的方法。是解決這個(gè)問題的常用而有效的方法
2、。模塊化設(shè)計(jì)原則模塊化設(shè)計(jì)原則 高內(nèi)聚高內(nèi)聚:一個(gè):一個(gè)c文件里面的函數(shù),只有相互文件里面的函數(shù),只有相互之間的調(diào)用,而沒有調(diào)用其他文件里面的函數(shù),之間的調(diào)用,而沒有調(diào)用其他文件里面的函數(shù),這樣可可以視為高內(nèi)聚。盡量減少不同文件里函這樣可可以視為高內(nèi)聚。盡量減少不同文件里函數(shù)的交叉引用。數(shù)的交叉引用。 低耦合低耦合:一個(gè)完整的系統(tǒng),模塊與模塊之間,:一個(gè)完整的系統(tǒng),模塊與模塊之間,盡可能的使其獨(dú)立存在。也就是說,讓每個(gè)模塊,盡可能的使其獨(dú)立存在。也就是說,讓每個(gè)模塊,盡可能的獨(dú)立完成某個(gè)特定的子功能。模塊與模盡可能的獨(dú)立完成某個(gè)特定的子功能。模塊與模塊之間的接口,盡量的少而簡單。塊之間的接口,
3、盡量的少而簡單。模塊化編程的三種手段模塊化編程的三種手段 實(shí)現(xiàn)模塊化編程的實(shí)現(xiàn)模塊化編程的三個(gè)主要手段三個(gè)主要手段是是函數(shù)函數(shù)、宏宏定義定義與與頭文件頭文件。下面講解一下頭文件操作的詳細(xì)。下面講解一下頭文件操作的詳細(xì)步驟。步驟。第一步第一步 創(chuàng)建頭文件創(chuàng)建頭文件 建立一個(gè)建立一個(gè).c文件(源文件)和一個(gè)文件(源文件)和一個(gè).h文件文件(頭文件)。原則上文件名可以任意命名,但強(qiáng)(頭文件)。原則上文件名可以任意命名,但強(qiáng)烈推薦如下原則:烈推薦如下原則:.c文件與文件與.h文件同名;文件名文件同名;文件名要有意義,最好能夠體現(xiàn)該文件代碼的功能。例要有意義,最好能夠體現(xiàn)該文件代碼的功能。例如延時(shí)函數(shù)相
4、關(guān)的源文件與頭文件命名為如延時(shí)函數(shù)相關(guān)的源文件與頭文件命名為delay.c與與delay.h。第二步第二步防重復(fù)包含處理防重復(fù)包含處理在在.h文件中加入如下代碼:文件中加入如下代碼:l#ifndef XXXl#define XXXl./此處添加代碼此處添加代碼l#endif其中的其中的XXX原則上可以是任意字符,但同一個(gè)原則上可以是任意字符,但同一個(gè)工程中各個(gè)工程中各個(gè).h文件的文件的XXX不能相同,因此強(qiáng)烈推薦如不能相同,因此強(qiáng)烈推薦如下的規(guī)則:將下的規(guī)則:將.h文件的文件名全部大寫,文件的文件名全部大寫,“.”替換替換成下劃線成下劃線“_”,首尾各添加,首尾各添加2個(gè)下劃線個(gè)下劃線“_”作
5、為作為XXX。例如對于。例如對于delay.h文件,其內(nèi)容如下:文件,其內(nèi)容如下:l#ifndef _DELAY_H_l#define _DELAY_H_l./此處添加代碼此處添加代碼l#endif 因?yàn)樵谕粋€(gè)工程內(nèi),文件名都是唯一的,因因?yàn)樵谕粋€(gè)工程內(nèi),文件名都是唯一的,因此這種命名規(guī)則可以保證此這種命名規(guī)則可以保證XXX不會重復(fù)。之后要添不會重復(fù)。之后要添加到加到.h文件的代碼都放在第文件的代碼都放在第3行的位置。行的位置。 這樣處理之后,當(dāng)這樣處理之后,當(dāng).h文件第一次被包含時(shí),符號文件第一次被包含時(shí),符號XXX是未被定義過的,因此符合是未被定義過的,因此符合#ifndef的條件,編
6、的條件,編譯器會繼續(xù)編譯第譯器會繼續(xù)編譯第1行以后的代碼。然后編譯到第行以后的代碼。然后編譯到第2行,行,先定義一下符號先定義一下符號XXX,然后開始編譯第,然后開始編譯第3行直到最后行直到最后一行一行#endif的代碼。而此后此的代碼。而此后此.h文件再次被包含時(shí),文件再次被包含時(shí),符號符號XXX在第一次包含該在第一次包含該.h文件時(shí)已被定義過了,不文件時(shí)已被定義過了,不符合第一行符合第一行#ifndef的條件,則該的條件,則該.h文件的內(nèi)容就不會文件的內(nèi)容就不會被編譯器編譯??傊@樣處理之后既能保證被編譯器編譯??傊?,這樣處理之后既能保證.h文件文件的有效內(nèi)容被編譯,又能保證的有效內(nèi)容被
7、編譯,又能保證.h文件的有效內(nèi)容不被文件的有效內(nèi)容不被重復(fù)編譯。重復(fù)編譯。第三步第三步 代碼封裝代碼封裝 將需要模塊化的代碼封裝成函數(shù)與宏定義。函數(shù)將需要模塊化的代碼封裝成函數(shù)與宏定義。函數(shù)體放在體放在.c文件中,需要被外部調(diào)用的函數(shù)還要在文件中,需要被外部調(diào)用的函數(shù)還要在.h文文件中聲明一下;需要被外部調(diào)用的宏定義放在件中聲明一下;需要被外部調(diào)用的宏定義放在.h文件文件中,僅會被本中,僅會被本.c文件調(diào)用的宏定義放在文件調(diào)用的宏定義放在.c文件中。文件中。 第四步第四步 盡量少用或不用全局變量盡量少用或不用全局變量 必須要用的全局變量的聲明要放在必須要用的全局變量的聲明要放在.c文件中,需文
8、件中,需要被外部調(diào)用的全局變量還要在要被外部調(diào)用的全局變量還要在.h文件中重新用文件中重新用extern修飾聲明一下,用來告訴編譯器有這個(gè)變量的修飾聲明一下,用來告訴編譯器有這個(gè)變量的存在(因?yàn)榫幾g器的編譯過程是按文件來的,鏈接過存在(因?yàn)榫幾g器的編譯過程是按文件來的,鏈接過程才是各個(gè)文件的合并,如果沒有這一步程才是各個(gè)文件的合并,如果沒有這一步extern修飾修飾聲明就在另一個(gè)文件調(diào)用了這個(gè)變量,編譯器會提示聲明就在另一個(gè)文件調(diào)用了這個(gè)變量,編譯器會提示沒有此變量)。沒有此變量)。第五步第五步 添加源文件添加源文件 將將.c文件添加到工程之中,同時(shí)在需要調(diào)文件添加到工程之中,同時(shí)在需要調(diào)用用
9、.h文件中的宏或者函數(shù)(這里的函數(shù)是對應(yīng)文件中的宏或者函數(shù)(這里的函數(shù)是對應(yīng)的的.c文件中函數(shù)的聲明)的其他文件中函數(shù)的聲明)的其他.c文件中添加代文件中添加代碼將該碼將該.h文件包含進(jìn)去(例如文件包含進(jìn)去(例如#include delay.h)。)。第六步第六步 使用使用 頭文件中的函數(shù)、宏定義、全局變量可以在頭文件中的函數(shù)、宏定義、全局變量可以在包含了對應(yīng)包含了對應(yīng).h文件的文件的.c文件中自由調(diào)用使用了文件中自由調(diào)用使用了時(shí)鐘芯片時(shí)鐘芯片DS1302及其應(yīng)用及其應(yīng)用DS1302簡介簡介 時(shí)鐘計(jì)數(shù)功能,可以對秒、分鐘、小時(shí)、月、時(shí)鐘計(jì)數(shù)功能,可以對秒、分鐘、小時(shí)、月、星期、年的計(jì)數(shù)。年計(jì)數(shù)
10、可達(dá)到星期、年的計(jì)數(shù)。年計(jì)數(shù)可達(dá)到2100 年。年。 有有31*8 位的額外數(shù)據(jù)暫存寄存器位的額外數(shù)據(jù)暫存寄存器 最少最少I/O 引腳傳輸,通過三引腳控制引腳傳輸,通過三引腳控制 工作電壓:工作電壓:2.0-5.5V 工作電流小于工作電流小于320 納安(納安(2.0V) 讀寫時(shí)鐘寄存器或內(nèi)部讀寫時(shí)鐘寄存器或內(nèi)部RAM(31*8 位的額外位的額外數(shù)據(jù)暫存寄存)可以采用單字節(jié)模式和突發(fā)模式數(shù)據(jù)暫存寄存)可以采用單字節(jié)模式和突發(fā)模式 8-pin DIP封裝或封裝或8-pin SOICs 兼容兼容TTL(5.0V) 可選的工業(yè)級別,工作溫度可選的工業(yè)級別,工作溫度-40 85 攝氏度攝氏度DS130
11、2簡介簡介兼容兼容DS1202, 較較DS1202 增加的功能:增加的功能:l1. 可通過可通過Vcc1 進(jìn)行涓流充電進(jìn)行涓流充電l2. 雙重電源補(bǔ)給雙重電源補(bǔ)給l3. 備用電源可采用電池或者超級電容備用電源可采用電池或者超級電容(0.1F以以上上),可以用老式電腦主板上的,可以用老式電腦主板上的3.6V 充電電池。充電電池。如果斷電時(shí)間較短如果斷電時(shí)間較短(幾小時(shí)或幾天幾小時(shí)或幾天)時(shí),就可以時(shí),就可以用漏電較小的普通電解電容器代替。用漏電較小的普通電解電容器代替。100 F 就可以保證就可以保證1小時(shí)的正常走時(shí)。小時(shí)的正常走時(shí)。DS1302 在第一在第一次加電后,必須進(jìn)行初始化操作。初始化
12、后就次加電后,必須進(jìn)行初始化操作。初始化后就可以按正常方法調(diào)整時(shí)間。可以按正常方法調(diào)整時(shí)間。DS1302引腳引腳DS1302引腳引腳 晶體振蕩器的選擇:一個(gè)晶體振蕩器的選擇:一個(gè)32.768KHz的晶振的晶振可以直接接在可以直接接在DS1302的的2、3管腳之間,可以設(shè)管腳之間,可以設(shè)定規(guī)定載荷電容位定規(guī)定載荷電容位6pf。 電源控制:電源控制:Vcc1可提供單電源控制也可以用可提供單電源控制也可以用來作為備用電源,來作為備用電源,Vcc2為主電源。在主電源關(guān)閉為主電源。在主電源關(guān)閉的情況下,也可以保持時(shí)鐘的連續(xù)運(yùn)行。的情況下,也可以保持時(shí)鐘的連續(xù)運(yùn)行。DS1302由由Vcc1或或Vcc2兩者
13、中的較大者供電。當(dāng)兩者中的較大者供電。當(dāng)Vcc2大于大于Vcc1+0.2V時(shí),時(shí),Vcc2給給DS1302供電;當(dāng)供電;當(dāng)Vcc2小與小與Vcc1時(shí),時(shí),DS1302由由Vcc1供電。供電。DS1302功能功能 DS1302包括時(shí)鐘包括時(shí)鐘/日歷寄存器和日歷寄存器和31字節(jié)(字節(jié)(8 位)的數(shù)據(jù)暫存寄存器,數(shù)據(jù)通信僅通過一條串位)的數(shù)據(jù)暫存寄存器,數(shù)據(jù)通信僅通過一條串行輸入輸出口。實(shí)時(shí)時(shí)鐘行輸入輸出口。實(shí)時(shí)時(shí)鐘/日歷提供包括秒、分、日歷提供包括秒、分、時(shí)、日期、月份、年份和星期幾的信息。閏年可時(shí)、日期、月份、年份和星期幾的信息。閏年可自行調(diào)整,可選擇自行調(diào)整,可選擇12小時(shí)制和小時(shí)制和24小時(shí)
14、制,可以設(shè)小時(shí)制,可以設(shè)置置AM、PM。 只通過三根線(只通過三根線(SPI總線)進(jìn)行數(shù)據(jù)的控制總線)進(jìn)行數(shù)據(jù)的控制和傳遞:和傳遞:RST、I/O、SCLKSPI總線總線(serial peripheral interface)串行外圍設(shè)備接口)串行外圍設(shè)備接口SPI總線技術(shù)是總線技術(shù)是Motorola公司推出的一種同步串行接口。公司推出的一種同步串行接口。SPI用于用于CPU與各種外圍器件進(jìn)行全雙工、同步串行通訊。它與各種外圍器件進(jìn)行全雙工、同步串行通訊。它只需四條線就可以完成只需四條線就可以完成MCU與各種外圍器件的通訊,這與各種外圍器件的通訊,這四條線是:串行時(shí)鐘線(四條線是:串行時(shí)鐘線
15、(CSK)、主機(jī)輸入)、主機(jī)輸入/從機(jī)輸出數(shù)從機(jī)輸出數(shù)據(jù)線(據(jù)線(MISO)、主機(jī)輸出)、主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線(從機(jī)輸入數(shù)據(jù)線(MOSI)、)、低電平有效從機(jī)選擇線低電平有效從機(jī)選擇線CS。內(nèi)部存儲空間內(nèi)部存儲空間 DS1302的所有功能都是通過對其內(nèi)部地址的所有功能都是通過對其內(nèi)部地址進(jìn)行操作實(shí)現(xiàn)的。其內(nèi)部存儲空間分為進(jìn)行操作實(shí)現(xiàn)的。其內(nèi)部存儲空間分為2部分:部分:80H91H為功能控制單元,為功能控制單元,C0HFDH為普通存為普通存儲單元;所有單元地址中最低位為儲單元;所有單元地址中最低位為0表示將對其表示將對其進(jìn)行寫數(shù)據(jù)操作,最低位為進(jìn)行寫數(shù)據(jù)操作,最低位為1表示將對其進(jìn)行讀表示將
16、對其進(jìn)行讀數(shù)據(jù)操作。數(shù)據(jù)操作。 普通存儲單元是提供給用戶的存儲空間,而普通存儲單元是提供給用戶的存儲空間,而特殊存儲單元存放特殊存儲單元存放DS1302的時(shí)間相關(guān)的數(shù)據(jù),的時(shí)間相關(guān)的數(shù)據(jù),用戶不能用來存放自己的數(shù)據(jù)。用戶不能用來存放自己的數(shù)據(jù)。內(nèi)部存儲空間內(nèi)部存儲空間注意:注意:1、秒寄存器的、秒寄存器的CH位:置位:置1,時(shí)鐘停振,進(jìn)入低功耗態(tài);置,時(shí)鐘停振,進(jìn)入低功耗態(tài);置0,時(shí)鐘,時(shí)鐘工作。工作。2、小時(shí)寄存器的、小時(shí)寄存器的D7位:置位:置1,12小時(shí)制(小時(shí)制(D5置置1表示上午,置表示上午,置0表表示下午);置示下午);置0,24小時(shí)制(此時(shí)小時(shí)制(此時(shí)D5、D4組成小時(shí)的十位)。
17、組成小時(shí)的十位)。注意:注意:1、WP:寫保護(hù)位:置為:寫保護(hù)位:置為1時(shí),寫保護(hù);置為時(shí),寫保護(hù);置為0時(shí),未寫保護(hù)。時(shí),未寫保護(hù)。2、TCS:1010時(shí)慢充電;時(shí)慢充電;DS為為01,選一個(gè)二極管,為,選一個(gè)二極管,為10,選選2個(gè)二極管;個(gè)二極管;11或或00,禁止充電。,禁止充電。3、RS:與二極管串聯(lián)電阻選擇。:與二極管串聯(lián)電阻選擇。00,不充電;,不充電;01,2K電電阻;阻;10,4K電阻;電阻;11,8K電阻。電阻。內(nèi)部存儲空間內(nèi)部存儲空間注意:注意:1、TCS:1010時(shí)慢充電;其他時(shí)禁止充電。時(shí)慢充電;其他時(shí)禁止充電。2、DS為為01,選一個(gè)二極管;為,選一個(gè)二極管;為10
18、,選,選2個(gè)二極管;個(gè)二極管;11或或00,禁,禁止充電。止充電。 3、RS:與二極管串聯(lián)電阻選擇。:與二極管串聯(lián)電阻選擇。00,不充電;,不充電;01,2K電阻電阻;10,4K電阻;電阻;11,8K電阻電阻特殊存儲空間特殊存儲空間在突發(fā)模式下,通過連續(xù)的脈沖一次性讀寫完在突發(fā)模式下,通過連續(xù)的脈沖一次性讀寫完8個(gè)字節(jié)的個(gè)字節(jié)的時(shí)鐘時(shí)鐘/日歷寄存器(日歷寄存器(8個(gè)寄存器要全部讀寫完:時(shí)、分、秒、日、個(gè)寄存器要全部讀寫完:時(shí)、分、秒、日、月、年、星期、寫保護(hù)寄存器,充電寄存器在突發(fā)模式下不能月、年、星期、寫保護(hù)寄存器,充電寄存器在突發(fā)模式下不能操作)操作)普通存儲空間普通存儲空間在突發(fā)模式下,
19、通過連續(xù)的脈沖一次性讀寫完在突發(fā)模式下,通過連續(xù)的脈沖一次性讀寫完1-31個(gè)個(gè)字節(jié)的字節(jié)的RAM數(shù)據(jù)(可按實(shí)際情況讀寫一定數(shù)量的字節(jié),數(shù)據(jù)(可按實(shí)際情況讀寫一定數(shù)量的字節(jié),可以不必一次全部讀寫完)可以不必一次全部讀寫完)存儲空間存儲空間單字節(jié)讀操作單字節(jié)讀操作數(shù)據(jù)輸入數(shù)據(jù)輸入: 經(jīng)過經(jīng)過8個(gè)小時(shí)周期的控制字節(jié)的輸入,一個(gè)字節(jié)的輸入將在個(gè)小時(shí)周期的控制字節(jié)的輸入,一個(gè)字節(jié)的輸入將在下下8個(gè)時(shí)鐘周期的上升沿完成,數(shù)據(jù)傳輸從字節(jié)最低位開始。個(gè)時(shí)鐘周期的上升沿完成,數(shù)據(jù)傳輸從字節(jié)最低位開始。 數(shù)據(jù)輸出數(shù)據(jù)輸出:經(jīng)過經(jīng)過8個(gè)小時(shí)周期的控制讀指令的輸入,控制指令串行輸出個(gè)小時(shí)周期的控制讀指令的輸入,控制指
20、令串行輸出后,一個(gè)字節(jié)的數(shù)據(jù)將在下個(gè)后,一個(gè)字節(jié)的數(shù)據(jù)將在下個(gè)8個(gè)時(shí)鐘周期的下降沿被輸出,注個(gè)時(shí)鐘周期的下降沿被輸出,注意第一位輸出是在最后一位控制指令所在的脈沖的下降沿被輸出,意第一位輸出是在最后一位控制指令所在的脈沖的下降沿被輸出,要求要求RST保持位高電平。保持位高電平。單字節(jié)寫操作單字節(jié)寫操作CE必須在高電平時(shí),才能對必須在高電平時(shí),才能對DS1302讀讀/寫操作寫操作低位在前,高位在后,一個(gè)低位在前,高位在后,一個(gè)SCLK周期傳遞一位周期傳遞一位上升沿輸入,下降沿輸出上升沿輸入,下降沿輸出先寫地址(先寫地址(RW=0,允許寫數(shù)據(jù)的單元地址),然后寫數(shù)據(jù),允許寫數(shù)據(jù)的單元地址),然后寫
21、數(shù)據(jù)先寫地址(先寫地址(RW=1,允許讀數(shù)據(jù)的單元地址),然后讀數(shù)據(jù),允許讀數(shù)據(jù)的單元地址),然后讀數(shù)據(jù)DS1302時(shí)序圖時(shí)序圖R/W:1可以讀;可以讀;0可以寫可以寫R/C:1普通存儲器;普通存儲器;0特殊寄存器特殊寄存器地址(命令)字節(jié)格式地址(命令)字節(jié)格式R/W:1可以讀;可以讀;0可以寫可以寫R/C:1普通存儲器;普通存儲器;0特殊寄存器特殊寄存器 不管是單字節(jié)的讀寫還是突發(fā)模式的讀寫,不管是單字節(jié)的讀寫還是突發(fā)模式的讀寫,首先傳遞的是地址(命令)字節(jié),然后才是數(shù)據(jù)首先傳遞的是地址(命令)字節(jié),然后才是數(shù)據(jù)字節(jié),每個(gè)時(shí)鐘周期上升或下降沿發(fā)送字節(jié),每個(gè)時(shí)鐘周期上升或下降沿發(fā)送1位,低位
22、,低位在前,高位在后。位在前,高位在后。R/W:1可以讀;可以讀;0可以寫可以寫R/C:1普通存儲器;普通存儲器;0特殊寄存器特殊寄存器R/W:1可以讀;可以讀;0可以寫可以寫R/C:1普通存儲器;普通存儲器;0特殊寄存器特殊寄存器R/W:1可以讀;可以讀;0可以寫可以寫R/C:1普通存儲器;普通存儲器;0特殊寄存器特殊寄存器時(shí)鐘設(shè)計(jì)時(shí)鐘設(shè)計(jì) 利用利用DS1302和和LCD1602設(shè)計(jì)一個(gè)時(shí)鐘,能顯示設(shè)計(jì)一個(gè)時(shí)鐘,能顯示時(shí)間、日期及星期,還能通過按鍵進(jìn)行調(diào)節(jié):時(shí)間、日期及星期,還能通過按鍵進(jìn)行調(diào)節(jié): 分析:根據(jù)要求可知這個(gè)時(shí)鐘的軟件應(yīng)該包含分析:根據(jù)要求可知這個(gè)時(shí)鐘的軟件應(yīng)該包含3個(gè)大模塊,分
23、別是:個(gè)大模塊,分別是:DS1302模塊、模塊、LCD1602模塊和模塊和按鍵模塊,然后就是主函數(shù)的整合。按鍵模塊,然后就是主函數(shù)的整合。 因?yàn)槟K很多,而且按照前面的相關(guān)模塊的介因?yàn)槟K很多,而且按照前面的相關(guān)模塊的介紹可知道每個(gè)模塊都會有很多子函數(shù)及相關(guān)的參數(shù),紹可知道每個(gè)模塊都會有很多子函數(shù)及相關(guān)的參數(shù),所以如果放在一個(gè)所以如果放在一個(gè).c文件中會很不方便,而且文件中會很不方便,而且.c文件文件會很長,不方便閱讀和修改,所以這就可以利用前面會很長,不方便閱讀和修改,所以這就可以利用前面講解的模塊化編程思想,將每個(gè)模塊都寫成單獨(dú)的講解的模塊化編程思想,將每個(gè)模塊都寫成單獨(dú)的.c和和.h文件
24、,然后再建一個(gè)文件,然后再建一個(gè)main.c文件,進(jìn)行程序的整文件,進(jìn)行程序的整合和功能的實(shí)現(xiàn)。合和功能的實(shí)現(xiàn)。 根據(jù)前面的講解,建好工程及相關(guān)模塊的根據(jù)前面的講解,建好工程及相關(guān)模塊的.c和和.h文件后就可以開始寫代碼了,因?yàn)楣こ瘫容^大,模塊文件后就可以開始寫代碼了,因?yàn)楣こ瘫容^大,模塊比較多,所以建議單個(gè)模塊調(diào)試,比如先調(diào)試比較多,所以建議單個(gè)模塊調(diào)試,比如先調(diào)試LCD1602的程序,就先不要寫其他模塊的代碼,等的程序,就先不要寫其他模塊的代碼,等1602調(diào)試通過之后再加第二個(gè)模塊,這樣一邊寫代碼調(diào)試通過之后再加第二個(gè)模塊,這樣一邊寫代碼一邊調(diào)試,如果調(diào)試過程除了問題比較容易查出問題一邊調(diào)
25、試,如果調(diào)試過程除了問題比較容易查出問題的所在。的所在。 因?yàn)榍懊嬲{(diào)試過因?yàn)榍懊嬲{(diào)試過LCD1602,所以只需將相關(guān)的,所以只需將相關(guān)的函數(shù)拷貝到函數(shù)拷貝到LCD1602.c和和.h中即可,一般函數(shù)的實(shí)現(xiàn)中即可,一般函數(shù)的實(shí)現(xiàn)都在都在.c中完成,定義在中完成,定義在.h中,不過為了方便別的模塊中,不過為了方便別的模塊進(jìn)行調(diào)用,所以需要在進(jìn)行調(diào)用,所以需要在.h文件中進(jìn)行函數(shù)的申明,這文件中進(jìn)行函數(shù)的申明,這樣其他模塊如果需要調(diào)用樣其他模塊如果需要調(diào)用LCD1602的話,只需要包的話,只需要包含含LCD1602.h即可,如果定義的變量也可能被其他模即可,如果定義的變量也可能被其他模塊所調(diào)用的話,
26、就需要在塊所調(diào)用的話,就需要在.c文件中進(jìn)行相關(guān)變量的定文件中進(jìn)行相關(guān)變量的定義,然后在調(diào)用的義,然后在調(diào)用的.c中進(jìn)行申明即可。中進(jìn)行申明即可。 LCD1602的的.c和和.h文件寫好之后,可在文件寫好之后,可在main.c中進(jìn)中進(jìn)行測試,如果測試通過即可進(jìn)行下一個(gè)模塊的調(diào)試,行測試,如果測試通過即可進(jìn)行下一個(gè)模塊的調(diào)試,接下來調(diào)試接下來調(diào)試DS1302模塊,同模塊,同1602一樣,在一樣,在.c和和.h文件中文件中寫好相關(guān)的功能函數(shù),然后進(jìn)行測試,因?yàn)閷懞孟嚓P(guān)的功能函數(shù),然后進(jìn)行測試,因?yàn)?602的程的程序已經(jīng)調(diào)試通過,所以調(diào)試序已經(jīng)調(diào)試通過,所以調(diào)試DS1302的時(shí)候可以調(diào)用的時(shí)候可以調(diào)
27、用1602的相關(guān)函數(shù)進(jìn)行顯示,這樣就使兩個(gè)模塊有了交的相關(guān)函數(shù)進(jìn)行顯示,這樣就使兩個(gè)模塊有了交集。集。 前面已經(jīng)講過前面已經(jīng)講過DS1302的相關(guān)原理,只需將相關(guān)讀的相關(guān)原理,只需將相關(guān)讀寫函數(shù)寫對,寫函數(shù)寫對,DS1302的相關(guān)寄存器中存儲著時(shí)間及日的相關(guān)寄存器中存儲著時(shí)間及日期,所以取出進(jìn)行顯示即可,但可能需要調(diào)節(jié),這即期,所以取出進(jìn)行顯示即可,但可能需要調(diào)節(jié),這即可以通過在函數(shù)中隊(duì)可以通過在函數(shù)中隊(duì)DS1302寫入初始化的時(shí)間和日期,寫入初始化的時(shí)間和日期,也可以通過后面的按鍵模塊進(jìn)行調(diào)節(jié),原理其實(shí)一樣,也可以通過后面的按鍵模塊進(jìn)行調(diào)節(jié),原理其實(shí)一樣,只不過是想方法不同而已。只不過是想方
28、法不同而已。為了方便進(jìn)行修改,在為了方便進(jìn)行修改,在.h文件中對相關(guān)的引腳進(jìn)行文件中對相關(guān)的引腳進(jìn)行宏定義,這樣方便在移植的時(shí)候進(jìn)行修改,前面的宏定義,這樣方便在移植的時(shí)候進(jìn)行修改,前面的1602亦是如此。亦是如此。l/*向向DS1302寫入一字節(jié)數(shù)據(jù)寫入一字節(jié)數(shù)據(jù)*/lvoid DS1302InputByte(unsigned char d) l l unsigned char i;l ACC = d;l for(i=8; i0; i-)l l DS1302_IO = ACC0; /相當(dāng)于匯編中的相當(dāng)于匯編中的 RRCl DS1302_CLK = 1;l DS1302_CLK = 0;l A
29、CC = ACC 1; l ll/*從從DS1302讀出一字節(jié)數(shù)據(jù)讀出一字節(jié)數(shù)據(jù)*/lunsigned char DS1302OutputByte(void) l l unsigned char i;l for(i=8; i0; i-)l l ACC = ACC 1; /相當(dāng)于匯編中的相當(dāng)于匯編中的 RRC l ACC7 = DS1302_IO;l DS1302_CLK = 1;l DS1302_CLK = 0;l l return(ACC); ll/*向向DS302某個(gè)地址寫入數(shù)據(jù)某個(gè)地址寫入數(shù)據(jù)*/lvoid Write1302(unsigned char ucAddr, unsigned
30、 char ucDa)/ucAddr: DS1302地址地址, ucData: 要寫的數(shù)據(jù)要寫的數(shù)據(jù)ll DS1302_RST = 0;l DS1302_CLK = 0;l DS1302_RST = 1;l DS1302InputByte(ucAddr); / 地址,命令地址,命令 l DS1302InputByte(ucDa); / 寫寫1Byte數(shù)據(jù)數(shù)據(jù)l DS1302_CLK = 1;l DS1302_RST = 0;ll/*從從DS302讀出時(shí)鐘數(shù)據(jù)讀出時(shí)鐘數(shù)據(jù)*/lunsigned char Read1302(unsigned char ucAddr)/讀取讀取DS1302某地址的數(shù)
31、據(jù)某地址的數(shù)據(jù)ll unsigned char ucData;l DS1302_RST = 0;l DS1302_CLK = 0;l DS1302_RST = 1;l DS1302InputByte(ucAddr|0 x01); / 地址,命令地址,命令 l ucData = DS1302OutputByte(); / 讀讀1Byte數(shù)據(jù)數(shù)據(jù)l DS1302_CLK = 1;l DS1302_RST = 0;l return(ucData);ll/*DS302初始化函數(shù)初始化函數(shù)*/lvoid Initial_DS1302(void) /時(shí)鐘芯片初始化時(shí)鐘芯片初始化l lunsigned ch
32、ar Second=Read1302(DS1302_SECOND);lif(Second&0 x80) /判斷時(shí)鐘芯片是否關(guān)閉判斷時(shí)鐘芯片是否關(guān)閉 l lWrite1302(0 x8e,0 x00); /寫入允許寫入允許lWrite1302(0 x8c,0 x0B); /以下寫入初始化時(shí)間以下寫入初始化時(shí)間 日日期期:07/07/25.星期星期: 3. 時(shí)間時(shí)間: 23:59:55lWrite1302(0 x88,0 x05);lWrite1302(0 x86,0 x05);lWrite1302(0 x8a,0 x04);lWrite1302(0 x84,0 x23);lWrite13
33、02(0 x82,0 x59);lWrite1302(0 x80,0 x55);lWrite1302(0 x8e,0 x80); /禁止寫入禁止寫入lll/*獲取時(shí)鐘芯片的時(shí)鐘數(shù)據(jù)獲取時(shí)鐘芯片的時(shí)鐘數(shù)據(jù)*/lvoid DS1302_GetTime(SYSTEMTIME *Time) /獲取時(shí)鐘芯片的時(shí)鐘獲取時(shí)鐘芯片的時(shí)鐘數(shù)據(jù)到自定義的結(jié)構(gòu)型數(shù)組數(shù)據(jù)到自定義的結(jié)構(gòu)型數(shù)組llunsigned char ReadValue;lReadValue = Read1302(DS1302_SECOND);lTime-Second = (ReadValue&0 x70)4)*10 + (ReadVal
34、ue&0 x0F);lReadValue = Read1302(DS1302_MINUTE);lTime-Minute = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);lReadValue = Read1302(DS1302_HOUR);lTime-Hour = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);lReadValue = Read1302(DS1302_DAY);lTime-Day = (ReadValue&0 x70)4)*10 + (ReadValu
35、e&0 x0F);lReadValue = Read1302(DS1302_WEEK);lTime-Week = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);lReadValue = Read1302(DS1302_MONTH);lTime-Month = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);lReadValue = Read1302(DS1302_YEAR);lTime-Year = (ReadValue&0 x70)4)*10 + (ReadValue
36、&0 x0F);ll/*液晶顯示程序液晶顯示程序*/lvoid show_time() ll DS1302_GetTime(&CurrentTime); /獲取時(shí)鐘芯片的時(shí)間獲取時(shí)鐘芯片的時(shí)間數(shù)據(jù)數(shù)據(jù)l TimeToStr(&CurrentTime); /時(shí)間數(shù)據(jù)轉(zhuǎn)換液晶字符時(shí)間數(shù)據(jù)轉(zhuǎn)換液晶字符l DateToStr(&CurrentTime); /日期數(shù)據(jù)轉(zhuǎn)換液晶字符日期數(shù)據(jù)轉(zhuǎn)換液晶字符l GotoXY(0,1);l Print(CurrentTime.TimeString); /顯示時(shí)間顯示時(shí)間l GotoXY(0,0);l Print(CurrentTim
37、e.DateString); /顯示日期顯示日期l GotoXY(15,0);l Print(week_value); /顯示星期顯示星期l GotoXY(11,0);l Print(Week); /在液晶上顯示在液晶上顯示 字母字母 weekl Delay1302ms(400); /掃描延時(shí)掃描延時(shí)l 前面兩個(gè)模塊都測試通過之后,基本就實(shí)現(xiàn)前面兩個(gè)模塊都測試通過之后,基本就實(shí)現(xiàn)了始終計(jì)數(shù)的功能,只是不能進(jìn)行調(diào)節(jié)而已,所了始終計(jì)數(shù)的功能,只是不能進(jìn)行調(diào)節(jié)而已,所以接下來需要調(diào)試調(diào)節(jié)時(shí)間用的以接下來需要調(diào)試調(diào)節(jié)時(shí)間用的4個(gè)獨(dú)立按鍵,個(gè)獨(dú)立按鍵,基本實(shí)現(xiàn)思想跟前面一樣,因?yàn)榘存I的調(diào)節(jié)既會基本實(shí)現(xiàn)思
38、想跟前面一樣,因?yàn)榘存I的調(diào)節(jié)既會改變改變DS1302中的相關(guān)參數(shù),也會涉及到中的相關(guān)參數(shù),也會涉及到1602的的顯示內(nèi)容,所以按鍵模塊中會涉及到前面調(diào)試的顯示內(nèi)容,所以按鍵模塊中會涉及到前面調(diào)試的兩個(gè)模塊,所以兩個(gè)模塊,所以key.c文件中需要包含文件中需要包含DS1302.h和和LCD1602.h。 獨(dú)立按鍵的識別前面已經(jīng)講過,很簡單,但獨(dú)立按鍵的識別前面已經(jīng)講過,很簡單,但是在本次設(shè)計(jì)中,需要通過按鍵進(jìn)行時(shí)間和日期是在本次設(shè)計(jì)中,需要通過按鍵進(jìn)行時(shí)間和日期等的調(diào)節(jié),所以需要事先清楚相關(guān)的邏輯和自己等的調(diào)節(jié),所以需要事先清楚相關(guān)的邏輯和自己的編程思維,如果過于復(fù)雜的話可以試著畫出相的編程思維
39、,如果過于復(fù)雜的話可以試著畫出相關(guān)的流程圖,根據(jù)流程圖進(jìn)行編程會簡單明了很關(guān)的流程圖,根據(jù)流程圖進(jìn)行編程會簡單明了很多。多。 這次試用了這次試用了4個(gè)獨(dú)立按鍵,分別實(shí)現(xiàn)的功能個(gè)獨(dú)立按鍵,分別實(shí)現(xiàn)的功能是退出調(diào)試模式、減計(jì)數(shù)、增計(jì)數(shù)和調(diào)試模式。是退出調(diào)試模式、減計(jì)數(shù)、增計(jì)數(shù)和調(diào)試模式。需要了解其中的邏輯關(guān)系才能順利的進(jìn)行編程,需要了解其中的邏輯關(guān)系才能順利的進(jìn)行編程,4個(gè)案件中只要按了退出調(diào)試模式即不能進(jìn)行調(diào)個(gè)案件中只要按了退出調(diào)試模式即不能進(jìn)行調(diào)試,禁止對試,禁止對DS1302進(jìn)行寫入,按下調(diào)試模式后,進(jìn)行寫入,按下調(diào)試模式后,1602即停止對當(dāng)前時(shí)間的顯示,進(jìn)入調(diào)試模式,即停止對當(dāng)前時(shí)間的顯示,進(jìn)入調(diào)試模式,每按一次調(diào)試按鍵即改變一個(gè)參數(shù)的調(diào)節(jié),然后每按一次調(diào)試按鍵即改變一個(gè)參數(shù)的調(diào)節(jié),然后通過增計(jì)數(shù)和減計(jì)數(shù)按鍵進(jìn)行調(diào)節(jié),所以調(diào)試按通過增計(jì)數(shù)和減計(jì)數(shù)按鍵進(jìn)行調(diào)節(jié),所以調(diào)試按鍵按下一次是調(diào)節(jié)秒?yún)?shù),按下第二次是調(diào)節(jié)分鍵按下一次是調(diào)節(jié)秒?yún)?shù),按下第二次是調(diào)節(jié)分參數(shù)。以此類推。參數(shù)。以此類推。lvoid outkey() /跳出調(diào)整模式跳出調(diào)整模式,返回默認(rèn)顯示返回默認(rèn)顯示l lunsigned char Second;l if(out=0) l l GotoXY(0,0);l Print( Exit
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 4213-2024氣動控制閥
- 2024機(jī)械設(shè)備的購銷合同范本
- 二零二五版1209兩人共同投資智能家居系統(tǒng)集成合同3篇
- 2024法院簽的離婚協(xié)議算不算離婚
- 2024汽車制造技術(shù)與專利許可合同
- 二零二五版吊車租賃合同安全教育與培訓(xùn)協(xié)議3篇
- 2025年度市政設(shè)施改造出渣承包管理協(xié)議3篇
- 二零二五年度醫(yī)藥產(chǎn)品鋪貨與區(qū)域分銷合同3篇
- 西南政法大學(xué)《無機(jī)材料合成與制備》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五版LNG液化天然氣運(yùn)輸船舶改造合同3篇
- 2025年中國高純生鐵行業(yè)政策、市場規(guī)模及投資前景研究報(bào)告(智研咨詢發(fā)布)
- 2022-2024年浙江中考英語試題匯編:完形填空(學(xué)生版)
- 2025年廣東省廣州市荔灣區(qū)各街道辦事處招聘90人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 中試部培訓(xùn)資料
- 硝化棉是天然纖維素硝化棉制造行業(yè)分析報(bào)告
- 央視網(wǎng)2025亞冬會營銷方案
- 北師大版數(shù)學(xué)三年級下冊豎式計(jì)算題100道
- 計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)全套教學(xué)課件
- 屋頂分布式光伏發(fā)電項(xiàng)目施工重點(diǎn)難點(diǎn)分析及應(yīng)對措施
- 胃鏡下超聲穿刺護(hù)理配合
- 鐵路危險(xiǎn)源辨識
評論
0/150
提交評論