2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩47頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p>  2011 屆畢業(yè)設(shè)計(jì)說明書</p><p>  題 目:基于單片機(jī)的多功能計(jì)算器的設(shè)計(jì)</p><p>  2011 屆畢業(yè)設(shè)計(jì)(論文)課題任務(wù)書</p><p>  系:電氣與信息工程系 專業(yè):通信技術(shù) </p><

2、p><b>  目錄</b></p><p>  摘要…………………………………………………………………………………1</p><p>  一、系統(tǒng)設(shè)計(jì)…………………………………………………………………………2</p><p>  1.1、功能介紹….………………………………………………………………….…………2</p>&

3、lt;p>  1.1.1、基本功能…………………………………………………………………..………2</p><p>  1.1.2、擴(kuò)展功能…………………………………………………………………..………2</p><p>  1.2、總體設(shè)計(jì)方案…………………………………………………………………..………2</p><p>  1.2.1、總體設(shè)計(jì)思路………………

4、……………………………………………...……2</p><p>  1.2.2、方案論證與比較………………………………………………………...………2</p><p>  1.2.3、系統(tǒng)組成………………………………………………………………………..8</p><p>  二、重要器件的知識介紹…………………………………………………………8</p>&

5、lt;p>  2.1、單片機(jī)的知識介紹……………………………………………………………………...…8</p><p>  2.1.1、單片機(jī)的主要性能…………………………………………………………...…8</p><p>  2.1.2、單片機(jī)的功能特性描敘……………………………………………………...…9</p><p>  2.1.3、單片機(jī)的內(nèi)部結(jié)構(gòu)方框

6、圖及芯片引腳圖……………………………………….9</p><p>  2.1.4、單片機(jī)各引腳功能說明……………………………………………………...…10</p><p>  2.1.5、單片機(jī)時(shí)鐘電路……………………………………………………………...…11</p><p>  2.1.6、單片機(jī)復(fù)位電路……………………………………………………………...…12&

7、lt;/p><p>  2.1.7、單片機(jī)下載口電路…………………………………………………………...…12</p><p>  三、軟件設(shè)計(jì)………………………………………………………………………13</p><p>  3.1、液晶顯示設(shè)計(jì)…………………………………………………………………………..13</p><p>  3.2、鍵盤輸入設(shè)計(jì)

8、…………………………………………………………………………..15</p><p>  3.3、計(jì)算器函數(shù)設(shè)計(jì)………………………………………………………………………..15</p><p>  3.4、程序流程圖……………………………………………………………………………..18</p><p>  3.5、程序清單………………………………………………………………………

9、………..20</p><p>  產(chǎn)品使用說明………………………………………………………………………21</p><p>  參考文獻(xiàn)……………………………………………………………………………22</p><p>  附錄1、元器件清單………………………………………………………………23</p><p>  附錄2、系統(tǒng)原理圖…………………

10、………………………………………………24</p><p>  附錄3、實(shí)物照片…………………………………………………………………24</p><p>  附錄4、程序清單…………………………………………………………………27</p><p>  致 謝………………………………………………………………………………46</p><p><b

11、>  摘要</b></p><p>  本設(shè)計(jì)采用單片機(jī)作為控制芯片,用C語言對其進(jìn)行編程實(shí)現(xiàn),輸入由4*4行列式鍵盤控制,輸出采用人性化的SBY12864K-ZK型液晶實(shí)現(xiàn)。該計(jì)算器為多功能計(jì)算器,在未進(jìn)行計(jì)算時(shí),它是一個(gè)萬年歷時(shí)鐘,并且?guī)X鐘和星期顯示,所以數(shù)據(jù)均可隨時(shí)進(jìn)行校準(zhǔn),校準(zhǔn)數(shù)據(jù)采用的是獨(dú)立式鍵盤,是將4*4行列式鍵盤的一根線拉低,然后讀取與這根線交叉的4根線的所處狀態(tài)來判斷按鍵是否

12、被按下。</p><p>  對于計(jì)算這個(gè)部分我采用的是行列鍵盤,10個(gè)數(shù)字鍵,一個(gè)小數(shù)點(diǎn)鍵,四個(gè)符號鍵,一個(gè)多功能鍵,通過判別該多功能鍵連續(xù)按的次數(shù)來決定該鍵此時(shí)的命令。由于C語言庫函數(shù)繁多,所以我采用調(diào)用C語言庫函數(shù)來解決多種運(yùn)算類型,這樣編程更簡單,運(yùn)行起來也更可靠。。</p><p>  關(guān)鍵字:單片機(jī),點(diǎn)陣圖形液晶,行列鍵盤,C語言庫函數(shù)。</p><p>

13、;  Abstract The design uses a single-chip microcomputer as the control chip, using C programming language of its input from 4 * 4 matrix keyboard control, the output of the use of human SBY12864K-ZK-type liquid crystal

14、to achieve. Multi-function calculator for the calculator, before the calculation, it is a calendar clock and bell and weeks with the brain showed that there may at any time calibration data, calibration data is used in s

15、tand-alone keyboard, is a 4 * 4 matrix keyboard down one line, </p><p><b>  一、系統(tǒng)設(shè)計(jì)</b></p><p><b>  1.1、功能介紹</b></p><p>  1.1.1、基本功能</p><p>  根據(jù)所

16、學(xué)知識,自行設(shè)計(jì)一個(gè)計(jì)算器,要求自行設(shè)計(jì)供電電源,該計(jì)算器能夠?qū)崿F(xiàn)加減乘除四則混合運(yùn)算,能夠?qū)崿F(xiàn)連續(xù)計(jì)算。</p><p>  1.1.2、擴(kuò)展功能</p><p> ?。?)、該計(jì)算器能夠?qū)崿F(xiàn)浮點(diǎn)數(shù)的運(yùn)算。</p><p>  (2)、該計(jì)算器在不進(jìn)行計(jì)算時(shí)能夠當(dāng)時(shí)鐘用,并且該時(shí)鐘可顯示星期和日歷,同時(shí)能夠修改其值。</p><p> ?。?/p>

17、3)、該計(jì)算器能夠?qū)崿F(xiàn)加減乘除以外的其他運(yùn)算。</p><p>  1.2、總體設(shè)計(jì)方案</p><p>  1.2.1、總體設(shè)計(jì)思路</p><p>  本設(shè)計(jì)主要采用以下基本模塊來實(shí)現(xiàn),控制器模塊,輸入模塊,輸出模塊和電源模塊。</p><p>  通過對控制器進(jìn)行編程。使其對輸入模塊的信號進(jìn)行處理計(jì)算,然后通過輸出模塊反饋給使用者以計(jì)算

18、結(jié)果。</p><p>  1.2.2、方案論證與比較</p><p>  1.2.2.1、控制部分的設(shè)計(jì)方案論證與選擇</p><p>  根據(jù)設(shè)計(jì)要求,控制器主要用于紅外信號的接收和辨認(rèn)、控制步進(jìn)電機(jī)的動(dòng)作,控制顯示步進(jìn)電機(jī)的轉(zhuǎn)速等。對于控制器的選擇有以下三種方案。</p><p>  方案一:采用計(jì)算器專用芯片實(shí)現(xiàn)。用計(jì)算器專用芯片進(jìn)行

19、設(shè)計(jì)并編程實(shí)現(xiàn)。這種設(shè)計(jì)方案計(jì)算效率高、速度快、而且成本也相對較低,是廠家做計(jì)算器的最佳方案。但是本人對計(jì)算器專用芯片掌握的不夠,還不足以實(shí)現(xiàn)設(shè)計(jì)計(jì)算器,所以這個(gè)方案不可去。</p><p>  方案二:采用FPGA(現(xiàn)場可編程門陣列)作為系統(tǒng)的控制器。FPGA將所有器件集成到一塊芯片上,體積小,節(jié)省空間,提高了穩(wěn)定性;直接面向用戶,具有極大的靈活性和通用性,使用方便,硬件測試和實(shí)現(xiàn)快捷,開發(fā)效率高,工作可靠性好

20、??梢詫?shí)現(xiàn)各種復(fù)雜的邏輯功能,規(guī)模大,密度高,采用并行的輸入輸出方式,系統(tǒng)處理速度高,適合作為大規(guī)模實(shí)時(shí)系統(tǒng)的控制核心。由FPGA內(nèi)部編程實(shí)現(xiàn)計(jì)算器功能,本設(shè)計(jì)對數(shù)據(jù)處理速度的要求不是很高,F(xiàn)PGA的高速處理的優(yōu)勢得不到充分的體現(xiàn),由于其集成度高,使其成本偏高,同時(shí)由于芯片的引腳較多,實(shí)物電路板布線復(fù)雜,加重了電路設(shè)計(jì)和實(shí)際焊接的工作。并且FPGA的價(jià)格相對較高,性價(jià)比太低。</p><p>  方案三、用單片機(jī)

21、實(shí)現(xiàn)。由于單片機(jī)集成了運(yùn)算器電路、控制電路、存儲(chǔ)器、中斷系統(tǒng)、定時(shí)器/計(jì)數(shù)器以及輸入/輸出口電路等,所以用單片機(jī)設(shè)計(jì)控制電路省去了很多分立元器件。由于單片機(jī)是可編程芯片,并且它可以運(yùn)用C語言編寫,對于一些復(fù)雜的計(jì)算功能,可以調(diào)用C語言庫函數(shù)。使編寫程序變得非常簡單。所以該課題用單片機(jī)實(shí)現(xiàn),不僅功能易于實(shí)現(xiàn),而且精確度高,穩(wěn)定性好,抗干擾能力強(qiáng)。并且由于其成本低、體積小、技術(shù)成熟和功耗小等優(yōu)點(diǎn),且技術(shù)比較成熟。性價(jià)比也相當(dāng)高。更重要的是本

22、人經(jīng)過幾年的學(xué)習(xí),對單片機(jī)已有深刻的理解,并且可以靈活運(yùn)用。</p><p>  綜上所述,并通過各個(gè)方面綜合比較為達(dá)到最佳效果。我們采用方案三利用單片機(jī)控制器。</p><p>  1.2.2.3、顯示電路的設(shè)計(jì)方案論證與選擇</p><p>  方案一:數(shù)碼管顯示方案。數(shù)碼管顯示使用兩個(gè)四位一體動(dòng)態(tài)數(shù)碼管顯示方案,此設(shè)計(jì)電路如圖1-1所示。采用動(dòng)態(tài)數(shù)碼管顯示,具

23、有程序簡單, 對外界環(huán)境要求低,易于維護(hù),同時(shí)其精度比較高,精確可靠,操作簡單。顯示直觀的特點(diǎn)。但只能顯示數(shù)字和一些代碼,不能顯示漢字及一些常用的符號,且硬件設(shè)計(jì)比較復(fù)雜。</p><p>  圖1-1、兩個(gè)四位一體數(shù)碼電路圖</p><p>  方案二;采用AT1602型液晶顯示</p><p><b> ?。ㄒ唬⒒咎匦?lt;/b></

24、p><p><b>  a、顯示特性</b></p><p><b>  b、物理特性</b></p><p>  c外形尺寸如圖1-2所示</p><p>  圖1-2、液晶的外形尺寸</p><p><b> ?。ǘ?、接口定義</b></p>

25、;<p>  AT1602與單片機(jī)的接口電路如圖1-3所示,該液晶有16個(gè)引腳,它能顯示32個(gè)字符,并且硬件電路設(shè)計(jì)簡單,顯示美觀,但驅(qū)動(dòng)程序相對數(shù)碼管來說要復(fù)雜一些,其次穩(wěn)定性也不如數(shù)碼管。而且它只能顯示ASCII碼,不能夠顯示漢字,人機(jī)交互能力較差。</p><p>  圖1-3、AT1602與單片機(jī)接口電路</p><p>  方案三:采用漢字圖形點(diǎn)陣液晶顯示器RT12

26、864M顯示方案。RT12864M漢字圖形點(diǎn)陣液晶顯示模塊,可顯示漢字及圖形。供電電源為3.3V~+5V(內(nèi)置升壓電路,無需負(fù)壓),能采用并行和串行兩種通信方式。并有光標(biāo)顯示、畫面移位、自定義字符、睡眠模式等功能。</p><p>  綜上所敘,12864的顯示效果好、功能齊全,所以我們選用12864液晶顯示。其與單片機(jī)的接口電路如圖1-4所示。</p><p>  圖1-4、12864與

27、單片機(jī)的接口電路</p><p>  1.2.2.4、單片機(jī)電源部分的設(shè)計(jì)方案論證與選擇</p><p>  由于本次設(shè)計(jì)中單片機(jī)工作電源為5V,所以需要穩(wěn)壓,對于5V電源這里有以下兩種方案。</p><p>  方案一:用固定式三端穩(wěn)壓器7805。如圖1-5,7805系列穩(wěn)壓器輸出固定的正電壓5V,輸入端接電容C1可以進(jìn)一步濾除紋波,輸出端接電容C2能改變負(fù)載的瞬

28、態(tài)影響,使電路穩(wěn)定工作C1、C2最好采用漏電流小的鉭電容。如果采用電解電容,則電容要比圖中數(shù)值增加10倍。</p><p>  圖1-5、固定式三端穩(wěn)壓器</p><p>  方案二:用7805加一些外圍器件。雖然7805三端集成穩(wěn)壓管內(nèi)部有過流、過熱和安全區(qū)的保護(hù)電路,但其輸出仍有可能發(fā)生過壓的危險(xiǎn)。因此本電路加了過壓保護(hù)電路,電路如圖1-6所示,該電路由穩(wěn)壓管VD3、電阻R3和晶閘管V

29、S組成。</p><p>  另外由于7805的最大輸出電流為1.5A,可以通過在7805的1腳與VT1的基極相連,7805的2腳與VT1的集電極相連,這樣就可輸出1.6A~2A的電流。如需更大的電流,可再并聯(lián)幾個(gè)大功率三極管。</p><p>  圖1-6、可擴(kuò)流過壓保護(hù)5V穩(wěn)壓電源</p><p>  綜上所述,方案一電路簡單,而且已符合本次設(shè)計(jì)的要求,再加上第

30、二種方案所用元件較多,性能價(jià)格比不高,所以我們選擇方案一,基于本次設(shè)計(jì)我們需要5V和12V電源,12V應(yīng)用于步進(jìn)電機(jī)。其電路如圖1-7所示。</p><p>  圖1-7、電源模塊電路</p><p>  1.2.2.5、鍵盤設(shè)計(jì)方案與選擇</p><p>  方案一:獨(dú)立鍵盤。獨(dú)立鍵盤為一端接地,另一端接I/O口,并且要接上拉電阻。這種鍵盤的硬件都很容易實(shí)現(xiàn),但每

31、一個(gè)按鍵就要用一個(gè)I/O口,非常的浪費(fèi)單片機(jī)的I/O口資源,不適合本次設(shè)計(jì)。</p><p>  方案二:通過PS2協(xié)義,用鍵盤同單片機(jī)相接,從而實(shí)現(xiàn)單片機(jī)與鍵盤通信。其電路如圖1-8所示。現(xiàn)在PC機(jī)廣泛采用的PS/2接口為miniDIN 6引腳的連接器。</p><p>  1—數(shù)據(jù)線(DATA);—未用;3—電源地(GND);4—電源(+5 V);5—時(shí)鐘(CLK);6—未用。<

32、/p><p>  圖1-8、鍵盤與單片機(jī)接口圖</p><p>  由此圖可知,使用鍵盤硬件結(jié)構(gòu)比較簡單,但鍵盤的體積太大,所以此系統(tǒng)不采用此方案。</p><p>  方案三:自制編碼鍵盤。編碼鍵盤的電路如圖1-9所示,這種鍵盤有編程簡單,占用資源少,但其硬件比較復(fù)雜,要用很多的二極管,不是很理想。</p><p>  圖1-9、自制編碼鍵盤電

33、路圖</p><p>  方案四:4*4行列式鍵盤。其電路圖如圖圖1-10所示,這種鍵盤的硬件簡單,使用的I/O口也不多,而且這種鍵盤的編程方法已很成熟。所以本次設(shè)計(jì)采用這種行列式鍵盤。其電路圖如圖</p><p>  圖1-10、4*4行列式鍵盤電路圖</p><p>  1.2.3、系統(tǒng)組成</p><p>  經(jīng)過方案比較與論證,最終確

34、定的系統(tǒng)組成框圖如圖1-11所示。其中單片機(jī)作為主控設(shè)備對采集輸入信號后并進(jìn)行處理,最后通過輸出設(shè)備輸出給使用者。,該系統(tǒng)的結(jié)構(gòu)框圖如圖。</p><p>  圖1-11、系統(tǒng)組成方框圖</p><p>  二、重要器件的知識介紹</p><p>  2.1、單片機(jī)的知識介紹</p><p>  由于ATMEL公司生產(chǎn)的AT89S52型單片機(jī)

35、是即便于下載又好用,而且能夠滿足本設(shè)計(jì)的要求。所以我選擇AT89S52型單片機(jī)。</p><p>  2.1.1、單片機(jī)的主要性能</p><p>  2.1.2、單片機(jī)的功能特性描敘</p><p>  2.1.3、單片機(jī)的內(nèi)部結(jié)構(gòu)方框圖及芯片引腳圖如圖2-1和圖2-2所示</p><p>  圖2-1、單片機(jī)的內(nèi)部結(jié)構(gòu)方框圖及</p

36、><p>  2.1.4、單片機(jī)各引腳功能說明</p><p><b>  VCC:供電電壓。</b></p><p><b>  GND:接地。</b></p><p>  P0口:P0口為一個(gè)8位漏級開路雙向I/O口,每腳可吸收8TTL門流。當(dāng)P1口的管腳第一次寫1時(shí),被定義為高阻輸入。P0能夠用于

37、外部程序數(shù)據(jù)存儲(chǔ)器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時(shí),P0 口作為原碼輸入口,當(dāng)FIASH進(jìn)行</p><p>  校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必須被拉高。</p><p>  P1口:P1口是一個(gè)內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時(shí),將輸出電流,這是由

38、于內(nèi)部上拉的緣故。在FLASH編程和校驗(yàn)時(shí),P1口作為第八位地址接收。 </p><p>  P2口:P2口為一個(gè)內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個(gè)TTL門電流,當(dāng)P2口被寫“1”時(shí),其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時(shí),P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲(chǔ)器或16位地址外部數(shù)據(jù)存儲(chǔ)器進(jìn)行存取時(shí),P2口輸出地址的高八位。在

39、給出地址“1”時(shí),它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲(chǔ)器進(jìn)行讀寫時(shí),P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗(yàn)時(shí)接收高八位地址信號和控制信號。</p><p>  P3口:P3口管腳是8個(gè)帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個(gè)TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。P3口

40、也可作為AT89S52的一些特殊功能口,如表3-1所示。</p><p>  表2.1 AT89S52的一些特殊功能口</p><p>  P3口同時(shí)為閃爍編程和編程校驗(yàn)接收一些控制信號。</p><p>  RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時(shí),要保持RST腳兩個(gè)機(jī)器周期的高電平時(shí)間。</p><p>  ALE/PROG:當(dāng)訪問外部存儲(chǔ)

41、器時(shí),地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時(shí),ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時(shí)目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲(chǔ)器時(shí),將跳過一個(gè)ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時(shí), ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行

42、狀態(tài)ALE禁止,置位無效。</p><p>  /PSEN:外部程序存儲(chǔ)器的選通信號。在由外部程序存儲(chǔ)器取指期間,每個(gè)機(jī)器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲(chǔ)器時(shí),這兩次有效的/PSEN信號將不出現(xiàn)。</p><p>  /EA/VPP:當(dāng)/EA保持低電平時(shí),則在此期間外部程序存儲(chǔ)器(0000H-FFFFH),不管是否有內(nèi)部程序存儲(chǔ)器。注意加密方式1時(shí),/EA將內(nèi)部鎖定為RESET

43、;當(dāng)/EA端保持高電平時(shí),此間內(nèi)部程序存儲(chǔ)器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。</p><p>  XTAL1:反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入。</p><p>  XTAL2:來自反向振蕩器的輸出。</p><p>  2.1.5、單片機(jī)時(shí)鐘電路</p><p>  時(shí)鐘電路用于產(chǎn)生單片機(jī)工作所

44、需要的時(shí)鐘信號,單片機(jī)本身就是一個(gè)復(fù)雜的同步時(shí)序電路,為了保證同步工作方式的實(shí)現(xiàn),電路應(yīng)在唯一的時(shí)鐘信號控制下嚴(yán)格地按時(shí)序進(jìn)行工作。</p><p>  在MCS-51芯片內(nèi)部有一個(gè)高增益反相放大器,其輸入端為芯片引腳X1,輸出端為引腳X2,在芯片的外部跨接晶體振蕩器和微調(diào)電容,形成反饋電路,就構(gòu)成了一個(gè)穩(wěn)定的自激振蕩器。 此電路采用12MHz的石英晶體。時(shí)鐘電路如下圖2-2:</p><p

45、><b>  圖2.2時(shí)鐘電路</b></p><p>  2.1.6、單片機(jī)復(fù)位電路</p><p>  復(fù)位是單片機(jī)的初始化操作,其主要功能是把PC初始化為0000H,使單片機(jī)從0000H單元開始執(zhí)行程序。除了進(jìn)入系統(tǒng)的正常初始化之外,當(dāng)由于程序運(yùn)行出錯(cuò)或操作錯(cuò)誤是系統(tǒng)處于死鎖狀態(tài)時(shí),為擺脫困境,也需要按復(fù)位鍵以重新啟動(dòng)。</p><p&

46、gt;  RST引腳是單片機(jī)復(fù)位信號的輸入端,復(fù)位信號是高電平有效,其有效時(shí)間應(yīng)持續(xù)24個(gè)振蕩周期(即2個(gè)機(jī)器周期)以上,若使用頻率為12MHz的晶振,則復(fù)位信號持續(xù)時(shí)間應(yīng)超過4s才能完成復(fù)位操作。復(fù)位操作有上電自動(dòng)復(fù)位和按鍵手動(dòng)復(fù)位兩種方式。上電自動(dòng)復(fù)位是通過外部復(fù)位電路的電容充電來實(shí)現(xiàn)的。按鍵電平復(fù)位是通過使復(fù)位端經(jīng)電阻與Vcc電源接通而實(shí)現(xiàn)的。在本設(shè)計(jì)中采用了按鍵電平復(fù)位方式,其復(fù)位電路如下圖2-3。</p><

47、;p><b>  圖2-3、復(fù)位電路</b></p><p>  2.1.7、單片機(jī)下載口電路</p><p>  下載口電路以一塊74HC373芯片為主,電路原理圖如圖2-4所示。由于電路中只用了一片74HC373所以完全可以把電路裝在DB25插針式并口插頭內(nèi)部,這個(gè)可以做到很小巧,可以很方便的使用。為了穩(wěn)定也可以芯片外圍加一些電阻、電容等元件,具體電路網(wǎng)上有

48、提供下載。</p><p>  光是做好下載線是不行的,S51系統(tǒng)的ISP下載方式還要求要下載程序單片機(jī)運(yùn)行在最小化系統(tǒng)中。只要把的相應(yīng)引腳連接起來就可以對S51進(jìn)行ISP下載了。要接的引線是S51的6,7,8,9,20,40引腳。晶振可以在3M-24M間選用,當(dāng)然是看你的目標(biāo)板而選擇。</p><p>  為了方便使用我們需要做一個(gè)下載頭,電路簡單接線正確的話一般無需要調(diào)整就可以正常使用

49、,如有問題可以用軟件中的IspTest.exe(下載線調(diào)試程序) </p><p>  檢查你的74HC373芯片是否正常和你的電腦并口是否正常。</p><p>  圖2-4、下載口電路原理圖</p><p><b>  三、軟件設(shè)計(jì)</b></p><p>  本設(shè)計(jì)中采用C語言對單片機(jī)進(jìn)行編程。采用的是自下而上的設(shè)

50、計(jì)方式,先設(shè)計(jì)出每一個(gè)模塊(子程序),然后再慢慢擴(kuò)大,最后組成整個(gè)系統(tǒng)。</p><p>  3.1、液晶顯示設(shè)計(jì)</p><p>  本次設(shè)計(jì)我采用SYB12864K-ZK型液晶來作顯示模塊。對這種器件只要會(huì)看時(shí)序圖,那么所有的問題都會(huì)迎難而解。其時(shí)序圖如圖3-1。</p><p>  圖3-1 (a)、液晶讀時(shí)序圖</p><p>  圖

51、3-1 (b)、液晶寫時(shí)序圖</p><p>  由時(shí)序圖我們可以寫出液晶的初始化函數(shù)、功能設(shè)置函數(shù)、清屏函數(shù)、寫指令函數(shù)、寫數(shù)據(jù)函數(shù)。</p><p>  //LCD初始化//</p><p>  void lcd_int()</p><p><b>  {</b></p><p><b&

52、gt;  ret=0;</b></p><p>  delay(10);</p><p><b>  ret=1;</b></p><p><b>  _nop_();</b></p><p>  psb=1; //將PSB置1,通信方式

53、為8BIT數(shù)據(jù)并口//</p><p><b>  _nop_();</b></p><p><b>  }</b></p><p>  //LCD功能設(shè)置//</p><p>  void lcd_set()</p><p><b>  {</b>&l

54、t;/p><p>  command=0x30; //基本指令集//</p><p>  write_command(command);</p><p>  command=0x01;</p><p>  write_command(command);</p><p>

55、;  command=0x06;</p><p>  write_command(command);</p><p>  command=0x0c;</p><p>  write_command(command);</p><p><b>  }</b></p><p><b>  /

56、/清屏程序//</b></p><p>  void clear_lcd ()</p><p><b>  {</b></p><p>  command=0x01;</p><p>  write_command(command);</p><p>  command=0x34;&l

57、t;/p><p>  write_command(command);</p><p>  command=0x30;</p><p>  write_command(command);</p><p><b>  } </b></p><p><b>  //寫指令程序//</b>

58、;</p><p>  void write_command(uchar command)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p><b>  rs=0;</b></p><p>&

59、lt;b>  rw=0;</b></p><p>  P0=command;</p><p><b>  en=1;</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p>&l

60、t;p><b>  en=0;</b></p><p><b>  }</b></p><p><b>  //寫數(shù)據(jù)程序//</b></p><p>  void write_data(uchar data0)</p><p><b>  { </b&g

61、t;</p><p><b>  delay(5);</b></p><p><b>  rs=1;</b></p><p><b>  rw=0;</b></p><p><b>  P0=data0;</b></p><p>&

62、lt;b>  en=1;</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  en=0;</b></p><p><b>  }</b></

63、p><p>  3.2、鍵盤輸入設(shè)計(jì)</p><p>  這里我先用4*4行列式鍵盤。鍵盤掃描函數(shù)如下:</p><p><b>  //鍵掃描程序//</b></p><p>  uchar keyscan()</p><p>  {uchar scancode,tmpcode;</p>

64、<p>  P1=0xf0; // 行全為0</p><p>  if((P1&0xf0)!=0xf0) //有鍵按下</p><p>  {delay(100); //延時(shí)去抖動(dòng)</p><p>  if((P1&0xf0)!=0xf

65、0) //判是否真的有鍵按下</p><p>  {scancode=0xfe; //諑行掃描</p><p>  while((scancode&0x10)!=0)</p><p>  {P1=scancode;</p><p>  if((P1&0xf0)!=0xf0) //本行有鍵按

66、下</p><p>  {tmpcode=(P1&0xf0)|0x0f;</p><p>  //返回特征字節(jié)碼,為1的位即對應(yīng)于行和列</p><p>  return((~scancode)+(~tmpcode));</p><p><b>  }</b></p><p>  else

67、 scancode=(scancode<<1)|0x01; //行掃描碼左移一位</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  return(0);

68、 //無鍵按下,返回值為0</p><p><b>  }</b></p><p>  3.3、計(jì)算器函數(shù)設(shè)計(jì)</p><p>  計(jì)算器的設(shè)計(jì)是本次設(shè)計(jì)的重點(diǎn)。因?yàn)榭紤]到該硬件中只有16個(gè)按鍵,所以我采用了按鍵復(fù)用的方式來解決這一難題。這16個(gè)鍵分別是0~9十個(gè)數(shù)字鍵。四個(gè)運(yùn)算符號鍵,一個(gè)小數(shù)點(diǎn)鍵,一個(gè)多功能鍵

69、。這個(gè)多功能鍵單擊時(shí)為“=”,雙擊時(shí)為請零鍵,三擊時(shí)為運(yùn)算類型選擇鍵。在待機(jī)時(shí),該計(jì)算器顯示萬年歷,如果要進(jìn)行計(jì)算則按任意鍵即可進(jìn)入計(jì)算界面。默認(rèn)的計(jì)算是加減乘除,如果說要進(jìn)行加減乘除以外的運(yùn)算,那么就三鍵等號鍵,就可進(jìn)入運(yùn)算類型選擇模式。選擇好相應(yīng)的類型就可以進(jìn)行運(yùn)算啦。</p><p>  下面我來介紹幾個(gè)重要的函數(shù)。</p><p> ?。?)、函數(shù)名: sin 

70、 功  能: 正弦函數(shù)  用  法: double sin(double x);  #include   int main(void)  {      double result, x = 0.5; 

71、;     result = sin(x);      printf("The sin() of %lf is %lf\n", x, result);      return 0;  }

72、60;</p><p> ?。?)、函數(shù)名: cos 功 能: 余弦函數(shù) 用 法: double cos(double x); #include <math.h> int main(void) { double result; double x = 0.5; result = cos(x); printf("The cosine of %lf is %lf\

73、n", x, result); return 0; }</p><p> ?。?)、函數(shù)名: tan  功  能: 正切函數(shù)  用  法: double tan(double x);  #include   int main(void)&#

74、160; {     double result, x;     x = 0.5;     result = tan(x);     printf("The tan of 

75、;%lf is %lf\n", x, result);     return 0;  }  </p><p> ?。?)函數(shù)名: asin 功 能: 反正弦函數(shù) 用 法: double asin(double x); #include <stdio.h> #include

76、 <math.h> int main(void) { double result; double x = 0.5; result = asin(x); printf("The arc sin of %lf is %lf\n", x, result); return(0); }</p><p> ?。?)、函數(shù)名: acos 功 能: 反余弦函數(shù)

77、 用 法: double acos(double x); #include <math.h> int main(void) { double result; double x = 0.5; result = acos(x); printf("The arc cosine of %lf is %lf\n", x, result); return 0; }</p&

78、gt;<p> ?。?)、函數(shù)名: atan 功 能: 反正切函數(shù) 用 法: double atan(double x); #include <math.h> int main(void) { double result; double x = 0.5; result = atan(x); printf("The arc tangent of %lf is %lf\n

79、", x, result); return(0); }</p><p> ?。?)、函數(shù)名: exp 功 能: 指數(shù)函數(shù) 用 法: double exp(double x); #include <math.h> int main(void) { double result; double x = 4.0; result = exp(x); print

80、f("'e' raised to the power \ of %lf (e ^ %lf) = %lf\n", x, x, result); return 0; }</p><p><b>  3.4、程序流程圖</b></p><p><b>  主程序流程圖</b></p><p

81、><b>  顯示程序流程圖</b></p><p><b>  鍵掃程序流程圖</b></p><p><b>  3.5、程序清單</b></p><p><b>  程序清單見附錄4。</b></p><p><b>  產(chǎn)品使用說明

82、</b></p><p>  該產(chǎn)品16個(gè)按鍵作為輸入信號,液晶為顯示器,按鍵功能如下圖所示。</p><p>  0~9為數(shù)字鍵,其中0~3有第二功能,一個(gè)小數(shù)點(diǎn)鍵,一個(gè)等號鍵,該鍵為四功能鍵,四個(gè)運(yùn)算符號鍵。</p><p>  如果要使用計(jì)算器功能,則直接按3鍵即可進(jìn)入計(jì)算器模式,等號鍵單鍵為“=”,雙鍵為清除,默認(rèn)計(jì)算類型為加減乘除,若要進(jìn)行其他

83、類型的計(jì)算,則可使用等號鍵三鍵,然后選擇運(yùn)算類型進(jìn)行運(yùn)算,此時(shí)符號鍵所對應(yīng)的運(yùn)算符號也有相應(yīng)的變化。該計(jì)算器的計(jì)算功能可實(shí)現(xiàn)加減乘除、正弦余弦正切余切、反正弦反余弦反正切反余切、平方、立方、m的k次方(m和k均由鍵盤輸入)、e為底的m次方、自然對數(shù)、常用對數(shù)、開平方根。可謂功能齊全,操作簡單,給使用帶來極大方便。</p><p><b>  參考文獻(xiàn)</b></p><p

84、>  [1] 李廣弟 《單片機(jī)原理及應(yīng)用》 北京航天航空大學(xué)出版社 2008.2</p><p>  [2] 潘新民 《微型計(jì)算機(jī)控制技術(shù)》 電子工業(yè)出版社 2008.5</p><p>  [3] 梅麗鳳 《單片機(jī)原理及接口技術(shù)》 清華大學(xué)出版社 2004.6</p><

85、;p>  [4] 戴佳 《51單片機(jī)C語言應(yīng)用程序設(shè)計(jì)實(shí)例精講》 電子工業(yè)出版社 2006.4</p><p>  [5] 趙秀珍.單片微型計(jì)算機(jī)原理及其應(yīng)用[M].北京:中國水利水電出版社,2001 </p><p>  [6] 胡如龍,胡彪,鄧湘鳳.一種基于AT89C51 單片機(jī)嵌入式系統(tǒng)的溫濕度檢測控制系統(tǒng)[J]. 中國科技論文在線,</p><p&

86、gt;  [7] 張毅剛.MCS-51單片機(jī)應(yīng)用設(shè)計(jì)[M].哈爾濱:哈爾濱工大學(xué)出版社,1990 </p><p>  [8] 馬忠梅,張凱,馬巖,單片機(jī)的C語言應(yīng)用程序設(shè)計(jì),[M],北京:北京航空航天大學(xué)出版社,2003.11 </p><p>  [9] 李華.MCS-51 系列單片機(jī)實(shí)用接口技術(shù)[M].北京:北京航空航天大學(xué)出版社,1993</p><p> 

87、 [10] 馬忠梅.單片機(jī)的C語言Windows環(huán)境編程寶典[M]. 北京:北京航空航天大學(xué)出版社,2003    </p><p>  [11] 李光飛.單片機(jī)C程序設(shè)計(jì)指導(dǎo)[M].北京:北京航空航天大學(xué)出版社,2003</p><p>  [12 ] 陳景初.單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)與實(shí)踐[M].北京:北京航空航天大學(xué)出版社,2004</p><p><b&g

88、t;  附錄2、系統(tǒng)原理圖</b></p><p><b>  原理圖</b></p><p><b>  附錄3、實(shí)物照片</b></p><p><b>  附錄4、程序清單</b></p><p>  #include <reg52.h></

89、p><p>  #include <stdio.h></p><p>  #include <intrins.h></p><p>  #include <math.h></p><p>  #define uchar unsigned char</p><p>  #define ui

90、nt unsigned int</p><p>  #define ulong unsigned long </p><p>  sbit rs=P2^0;</p><p>  sbit rw=P2^1;</p><p>  sbit en=P2^2;</p><p>  sbit psb=P2^3;</p>

91、;<p>  sbit ret=P2^5;</p><p>  sbit rd=P3^7; </p><p>  sbit s=P1^0;</p><p>  sbit s1=P1^4;</p><p>  sbit s2=P1^5;</p><p>  sbit s3=P1^6;</p>

92、<p>  sbit s4=P1^7;</p><p>  uchar count,s1num;</p><p>  unsigned int nin,ss;</p><p>  char yue,re,qi,shi,fen,miao;</p><p>  uchar dshi,dfen,dmiao,ling,aa,t1,p;&l

93、t;/p><p>  uchar command,data0,data1,data2,com0,j,l;</p><p>  unsigned char command,data1,data2,com0,bb,bb0,aa,cc,i,yun;//</p><p>  uchar lcdH,lcdL,key; </p><p>  float

94、 ds,m,k;</p><p>  ulong ds0;</p><p>  bit flag,flag1,flag2,flag3,flag4;</p><p>  uchar disbuf[9]={0}; //定義顯示緩沖區(qū)//</p><p>  uchar code table[]={0x30,0x31,

95、0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e};</p><p>  uchar code table1[]={0xc8,0xd5,0xd2,0xbb,0xb6,0xfe,0xc8,0xfd,0xcb,0xc4,0xce,0xe5,0xc1,0xf9};//日~六//</p><p>  uchar code table2[]={0x32,0x3

96、0,0x30,0x39,0xc4,0xea,0x30,0x35,0xd4,0xc2,0x30,0x31,0xc8,0xd5}; //年月日//</p><p>  uchar code table4[]={0xd0,0xc7,0xc6,0xda,0xc1,0xf9}; //星期六//</p><p>  uchar code tabping[]={32,29,32,

97、31,32,31,32,32,31,32,31,32};</p><p>  uchar code tabrun[]={32,30,32,31,32,31,32,32,31,32,31,32};</p><p>  uchar code xing1[]={3,6,0,3,5,1,3,6,2,4,0,2};</p><p>  uchar code xing2[]={

98、4,0,0,3,5,1,3,6,2,4,0,2};</p><p>  uchar xing[12]={0};</p><p>  uchar tab[12]={0};</p><p><b>  //延時(shí)//</b></p><p>  void delay(uint ms) //延時(shí)250us</p&g

99、t;<p><b>  {</b></p><p><b>  uchar i;</b></p><p>  while(ms--)</p><p><b>  {</b></p><p>  for(i=0;i<125;i++);</p>&

100、lt;p><b>  }</b></p><p><b>  }</b></p><p>  //LCD初始化//</p><p>  void lcd_int()</p><p><b>  {</b></p><p><b>  re

101、t=0;</b></p><p><b>  delay(3);</b></p><p><b>  ret=1;</b></p><p><b>  _nop_();</b></p><p>  psb=1;

102、 //將PSB置1,通信方式為8BIT數(shù)據(jù)并口//</p><p><b>  _nop_();</b></p><p><b>  }</b></p><p><b>  //寫指令程序//</b></p><p>  void write_command(uc

103、har command)</p><p><b>  {</b></p><p><b>  delay(3);</b></p><p><b>  rs=0;</b></p><p><b>  rw=0;</b></p><p>

104、;  P0=command;</p><p><b>  en=1;</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  en=0;</b></p>

105、<p><b>  }</b></p><p><b>  //寫數(shù)據(jù)程序//</b></p><p>  void write_data(uchar data0)</p><p><b>  { </b></p><p><b>  delay(3);&l

106、t;/b></p><p><b>  rs=1;</b></p><p><b>  rw=0;</b></p><p><b>  P0=data0;</b></p><p><b>  en=1;</b></p><p>

107、;<b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  en=0;</b></p><p><b>  }</b></p><p>  //LCD功能設(shè)置//</p><

108、p>  void lcd_set()</p><p><b>  {</b></p><p>  command=0x30; //基本指令集//</p><p>  write_command(command);</p><p>  command=0x01;

109、</p><p>  write_command(command);</p><p>  command=0x06;</p><p>  write_command(command);</p><p>  command=0x0c;</p><p>  write_command(command);</p>

110、<p><b>  }</b></p><p><b>  //清屏程序//</b></p><p>  void clear_lcd ()</p><p><b>  {</b></p><p>  command=0x01;</p><p&

111、gt;  write_command(command);</p><p>  command=0x34;</p><p>  write_command(command);</p><p>  command=0x30;</p><p>  write_command(command);</p><p><b&g

112、t;  }</b></p><p>  void display()</p><p><b>  {</b></p><p>  command=com0;</p><p>  write_command(command);</p><p>  data2=lcdH;</p>

113、;<p>  write_data(data2);</p><p>  data1=lcdL;</p><p>  write_data(data1);</p><p><b>  }</b></p><p>  void display1(uchar y, uchar x, uchar *p) </

114、p><p><b>  { </b></p><p>  switch (y)</p><p><b>  { </b></p><p>  case 1:write_command(0x7f+x); break; //液晶第一行</p><p>  case 2:write_c

115、ommand(0x8f+x); break; //0x90+(x-1)</p><p>  case 3:write_command(0x87+x);break;</p><p>  case 4:write_command(0x97+x);break;</p><p>  default:break;</p><p><b>  

116、}</b></p><p>  while(*p) </p><p>  write_data(*p++); </p><p><b>  }</b></p><p>  void xiaoshu()//先判斷k是否為小數(shù),如果k為小數(shù),就將k轉(zhuǎn)化為小數(shù)//</p><p>&l

117、t;b>  {</b></p><p><b>  uchar i;</b></p><p>  uint mg=1;</p><p><b>  if(flag1)</b></p><p><b>  {</b></p><p>  

118、for(i=0;i<cc;i++)mg*=10;</p><p>  k=k/(mg*1.0);</p><p><b>  }</b></p><p><b>  cc=0;</b></p><p><b>  flag1=0;</b></p><

119、p><b>  }</b></p><p><b>  //鍵掃描程序//</b></p><p>  uchar keyscan()</p><p>  {uchar scancode,tmpcode;</p><p>  P1=0xf0; //

120、行全為0</p><p>  if((P1&0xf0)!=0xf0) //有鍵按下</p><p>  {delay(100); //延時(shí)去抖動(dòng)</p><p>  if((P1&0xf0)!=0xf0) //判是否真的有鍵按下</p><p>  {s

121、cancode=0xfe; //諑行掃描</p><p>  while((scancode&0x10)!=0)</p><p>  {P1=scancode;</p><p>  if((P1&0xf0)!=0xf0) //本行有鍵按下</p><p>  {tmpcode=(P1&0xf0)|

122、0x0f;</p><p>  //返回特征字節(jié)碼,為1的位即對應(yīng)于行和列</p><p>  return((~scancode)+(~tmpcode));</p><p><b>  }</b></p><p>  else scancode=(scancode<<1)|0x01; //行掃描碼左移一位

123、</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  return(0); //無鍵按下,返回值為0</p><p>

124、;<b>  }</b></p><p><b>  disjia()</b></p><p><b>  {</b></p><p>  com0=0x83;lcdH=0xbc;lcdL=0xd3;display();</p><p>  com0++; lcdH=0x

125、b7;lcdL=0xa8;display();</p><p>  com0=0x87;</p><p><b>  }</b></p><p><b>  disjian()</b></p><p><b>  {</b></p><p>  com0

126、=0x83;lcdH=0xbc;lcdL=0xf5;display();</p><p>  com0++; lcdH=0xb7;lcdL=0xa8;display();</p><p>  com0=0x87;</p><p><b>  }</b></p><p>  discheng()</p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論