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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、lt;p>  1.1.1、基本功能…………………………………………………………………..………2</p><p>  1.1.2、擴展功能…………………………………………………………………..………2</p><p>  1.2、總體設計方案…………………………………………………………………..………2</p><p>  1.2.1、總體設計思路………………

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、單片機的知識介紹……………………………………………………………………...…8</p><p>  2.1.1、單片機的主要性能…………………………………………………………...…8</p><p>  2.1.2、單片機的功能特性描敘……………………………………………………...…9</p><p>  2.1.3、單片機的內(nèi)部結(jié)構(gòu)方框

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

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

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

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

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

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

12、被按下。</p><p>  對于計算這個部分我采用的是行列鍵盤,10個數(shù)字鍵,一個小數(shù)點鍵,四個符號鍵,一個多功能鍵,通過判別該多功能鍵連續(xù)按的次數(shù)來決定該鍵此時的命令。由于C語言庫函數(shù)繁多,所以我采用調(diào)用C語言庫函數(shù)來解決多種運算類型,這樣編程更簡單,運行起來也更可靠。。</p><p>  關鍵字:單片機,點陣圖形液晶,行列鍵盤,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)設計</b></p><p><b>  1.1、功能介紹</b></p><p>  1.1.1、基本功能</p><p>  根據(jù)所

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

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

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

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

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

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

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

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

24、p><p><b>  a、顯示特性</b></p><p><b>  b、物理特性</b></p><p>  c外形尺寸如圖1-2所示</p><p>  圖1-2、液晶的外形尺寸</p><p><b> ?。ǘ⒔涌诙x</b></p>

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

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

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

28、態(tài)影響,使電路穩(wěn)定工作C1、C2最好采用漏電流小的鉭電容。如果采用電解電容,則電容要比圖中數(shù)值增加10倍。</p><p>  圖1-5、固定式三端穩(wěn)壓器</p><p>  方案二:用7805加一些外圍器件。雖然7805三端集成穩(wěn)壓管內(nèi)部有過流、過熱和安全區(qū)的保護電路,但其輸出仍有可能發(fā)生過壓的危險。因此本電路加了過壓保護電路,電路如圖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)幾個大功率三極管。</p><p>  圖1-6、可擴流過壓保護5V穩(wěn)壓電源</p><p>  綜上所述,方案一電路簡單,而且已符合本次設計的要求,再加上第

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

51、3-1 (b)、液晶寫時序圖</p><p>  由時序圖我們可以寫出液晶的初始化函數(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功能設置//</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、鍵盤輸入設計</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); //延時去抖動</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的位即對應于行和列</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、計算器函數(shù)設計</p><p>  計算器的設計是本次設計的重點。因為考慮到該硬件中只有16個按鍵,所以我采用了按鍵復用的方式來解決這一難題。這16個鍵分別是0~9十個數(shù)字鍵。四個運算符號鍵,一個小數(shù)點鍵,一個多功能鍵

69、。這個多功能鍵單擊時為“=”,雙擊時為請零鍵,三擊時為運算類型選擇鍵。在待機時,該計算器顯示萬年歷,如果要進行計算則按任意鍵即可進入計算界面。默認的計算是加減乘除,如果說要進行加減乘除以外的運算,那么就三鍵等號鍵,就可進入運算類型選擇模式。選擇好相應的類型就可以進行運算啦。</p><p>  下面我來介紹幾個重要的函數(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>  (5)、函數(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個按鍵作為輸入信號,液晶為顯示器,按鍵功能如下圖所示。</p><p>  0~9為數(shù)字鍵,其中0~3有第二功能,一個小數(shù)點鍵,一個等號鍵,該鍵為四功能鍵,四個運算符號鍵。</p><p>  如果要使用計算器功能,則直接按3鍵即可進入計算器模式,等號鍵單鍵為“=”,雙鍵為清除,默認計算類型為加減乘除,若要進行其他

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

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

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

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

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

88、t;  附錄2、系統(tǒng)原理圖</b></p><p><b>  原理圖</b></p><p><b>  附錄3、實物照片</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>  //延時//</b></p><p>  void delay(uint ms) //延時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功能設置//</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); //延時去抖動</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的位即對應于行和列</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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論