![單片機(jī)課程設(shè)計(jì)-計(jì)算器_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/dae67d09-64bd-4509-8a23-c5cda9b54478/dae67d09-64bd-4509-8a23-c5cda9b544781.gif)
![單片機(jī)課程設(shè)計(jì)-計(jì)算器_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/dae67d09-64bd-4509-8a23-c5cda9b54478/dae67d09-64bd-4509-8a23-c5cda9b544782.gif)
![單片機(jī)課程設(shè)計(jì)-計(jì)算器_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/dae67d09-64bd-4509-8a23-c5cda9b54478/dae67d09-64bd-4509-8a23-c5cda9b544783.gif)
![單片機(jī)課程設(shè)計(jì)-計(jì)算器_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/dae67d09-64bd-4509-8a23-c5cda9b54478/dae67d09-64bd-4509-8a23-c5cda9b544784.gif)
![單片機(jī)課程設(shè)計(jì)-計(jì)算器_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/dae67d09-64bd-4509-8a23-c5cda9b54478/dae67d09-64bd-4509-8a23-c5cda9b544785.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上課程設(shè)計(jì)說明書課程設(shè)計(jì)名稱: 單片機(jī)課程設(shè)計(jì) 課程設(shè)計(jì)題目: 四位數(shù)加法計(jì)算器的設(shè)計(jì) 學(xué) 院 名 稱: 電氣信息學(xué)院 專 業(yè) 班 級: 學(xué) 生 學(xué) 號: 學(xué) 生 姓 名: 學(xué) 生 成 績: 指 導(dǎo) 教 師: 課程設(shè)計(jì)時(shí)間: 2017.10.30 至 2017.11.5 專心-專注-專業(yè)格式說明(打印版格式,手寫版不做要求)(1)任務(wù)書三項(xiàng)的內(nèi)容用小四號宋體,1.5倍行距。(2)目錄(黑體,四號,居中,中間空四格),內(nèi)容自動生成,宋體小四號。(3)章的標(biāo)題用四號黑體加粗(居中排)。(4)章以下的標(biāo)題用小四號宋體加粗(頂格排)。(5)正文用小四號宋體,1.5倍行距;段落兩
2、端對齊,每個(gè)段落首行縮進(jìn)兩個(gè)字。(6)圖和表中文字用五號宋體,圖名和表名分別置于圖的下方和表的上方,用五號宋體(居中排)。(7)頁眉中的文字采用五號宋體,居中排。頁眉統(tǒng)一為:武漢工程大學(xué)本科課程設(shè)計(jì)。(8)頁碼:封面、扉頁不占頁碼;目錄采用希臘字母、排列,正文采用阿拉伯?dāng)?shù)字1、2、3排列;頁碼位于頁腳,居中位置。(9)標(biāo)題編號應(yīng)統(tǒng)一,如:第一章,1,1.1,;論文中的表、圖和公式按章編號,如:表1.1、表1.2;圖1.2、圖1.2;公式(1.1)、公式(1.2)。課程設(shè)計(jì)任務(wù)書一、課程設(shè)計(jì)的任務(wù)和基本要求(一) 設(shè)計(jì)任務(wù)(從“單片機(jī)課程設(shè)計(jì)題目”匯總文檔中任選1題,根據(jù)所選課題的具體設(shè)計(jì)要求來
3、填寫此欄)1. 系統(tǒng)通過4x4的矩陣鍵盤輸入數(shù)字及運(yùn)算符。2. 可以進(jìn)行4位十進(jìn)制數(shù)以內(nèi)的加法運(yùn)算,如果計(jì)算結(jié)果超過4位十進(jìn)制數(shù),則屏幕顯示E。3. 可以進(jìn)行加法以外的計(jì)算(乘、除、減)。4. 創(chuàng)新部分:使用LCD1602液晶顯示屏進(jìn)行顯示,有開機(jī)歡迎界面,計(jì)算數(shù)據(jù)與結(jié)果分兩行顯示,支持小數(shù)運(yùn)算。(二) 基本要求1. 有硬件結(jié)構(gòu)圖、電路圖及文字說明;2. 有程序設(shè)計(jì)的分析、思路說明; 3. 有程序流程框圖、程序代碼及注釋說明;4. 完成系統(tǒng)調(diào)試(硬件系統(tǒng)可以借助實(shí)驗(yàn)裝置實(shí)現(xiàn),也可在Proteus軟件中仿真模擬);5. 有程序運(yùn)行結(jié)果的截屏圖片。二、進(jìn)度安排 第9周,10.3011.5 1) 1
4、0.30 題目分析,文獻(xiàn)查閱 2) 10.31 方案比較,確定設(shè)計(jì)方案 3) 10.3111.1 硬件電路設(shè)計(jì) 4) 11.211.4 程序設(shè)計(jì),程序調(diào)試,系統(tǒng)聯(lián)調(diào),系統(tǒng)改進(jìn) 5) 11.5 課程設(shè)計(jì)說明書撰寫三、參考資料或參考文獻(xiàn)1. ,. 單片機(jī)原理及應(yīng)用基于Proteus和Keil C M.北京:電子工業(yè)出版社,20132. ,. 單片機(jī)原理與應(yīng)用設(shè)計(jì)M. 北京:電子工業(yè)出版社,20083. 馬忠梅. 單片機(jī)的C語言應(yīng)用程序設(shè)計(jì)(第5版) M.北京:北京航空航天大學(xué)出版社,20134. 樓然苗、李光飛. 51系列單片機(jī)設(shè)計(jì)實(shí)例M. 北京:北京航空航天大學(xué)出版社,2003本科生課程設(shè)計(jì)成績
5、評定表姓名專業(yè)班級學(xué)號課程設(shè)計(jì)題目:課程設(shè)計(jì)答辯記錄:(手寫)成績評定依據(jù):項(xiàng)目得分比例考勤記錄設(shè)計(jì)結(jié)果報(bào)告撰寫答辯成績備注:成績評定依據(jù)的項(xiàng)目內(nèi)容和項(xiàng)目分值比例可以由老師按指導(dǎo)的專業(yè)進(jìn)行調(diào)整,但成績評定依據(jù)的項(xiàng)目數(shù)不得少于3項(xiàng)。最終評定成績: 指導(dǎo)教師簽名: 年 月 日目 錄第一章 設(shè)計(jì)論證1.1 設(shè)計(jì)分析在方案設(shè)計(jì)過程中,我列出了兩種不同的設(shè)計(jì)方案,分別對應(yīng)于顯示模塊和單片機(jī)內(nèi)部運(yùn)算。顯示模塊在我的設(shè)計(jì)中有兩種不同的顯示方式,分別為數(shù)碼管顯示以及液晶屏顯示。對于數(shù)碼管顯示來說,優(yōu)點(diǎn)是使用簡單,反應(yīng)速度更快,由于LCD有眾多的接口,以及指令,因此在軟件上要比數(shù)碼管復(fù)雜。數(shù)碼管顯示的缺點(diǎn)也比較
6、明顯,就是需要占用過多的單片機(jī)輸出接口,同時(shí),LCD的顯示功能更多,也更直觀,對于現(xiàn)實(shí)生活中的使用也更加舒適。在綜合了以上幾點(diǎn)的考慮后,我最終選擇了LCD1602液晶顯示芯片作為顯示模塊。在單片機(jī)內(nèi)部運(yùn)算方面,我的設(shè)想也有兩種,即支持浮點(diǎn)數(shù)運(yùn)算或只支持整數(shù)運(yùn)算,若只支持整數(shù)運(yùn)算,程序設(shè)計(jì)勢必更加簡單易懂,但是出于實(shí)用性的考慮,我最終決定了使計(jì)算器支持浮點(diǎn)數(shù)運(yùn)算功能。同時(shí),這也能更好地鍛煉我的編程思維能力。1.2 設(shè)計(jì)方案按照系統(tǒng)設(shè)計(jì)的功能的要求,初步確定設(shè)計(jì)系統(tǒng)由主控模塊、顯示模塊、鍵盤掃描接口電路共四個(gè)模塊組成。主控芯片使用8051系列的AT89C52單片機(jī),其中帶有非易失性Flash程序存
7、儲器,它是一種高性能、低功耗的8位CMOS微處理芯片,市場應(yīng)用最多。顯示模塊采用LCD1602液晶顯示器為主體構(gòu)成。鍵盤電路采用4x4矩陣鍵盤電路。整個(gè)單片機(jī)的接口電路:P0用于顯示輸出或LCD1602信號輸入,P1口用于鍵盤掃描輸入,P2口用于LCD1602的控制信號輸出。為了驅(qū)動系統(tǒng)的各個(gè)模塊正常協(xié)調(diào)工作,在軟件方面我設(shè)計(jì)了四大模塊,分別為顯示、鍵盤、運(yùn)算、綜合模塊,通過綜合模塊的協(xié)調(diào)來使其它三大模塊正常運(yùn)行,使計(jì)算器能正確運(yùn)算得出正確結(jié)果。第二章 硬件設(shè)計(jì)2.1 硬件結(jié)構(gòu)與工作原理圖2.1 硬件結(jié)構(gòu)框圖 系統(tǒng)的主體部分由輸入、運(yùn)算、輸出模塊所組成,對應(yīng)于圖2.1中有,輸入模塊為鍵盤掃描輸
8、入,輸出模塊為LCD1602顯示,運(yùn)算模塊為單片機(jī)。在系統(tǒng)上電后,單片機(jī)初始化,開始運(yùn)行內(nèi)部程序,在程序運(yùn)行過程中,通過軟件功能來實(shí)現(xiàn)按下鍵盤上特定按鍵后,執(zhí)行不同的功能,例如加減乘除,并將數(shù)據(jù)輸出至顯示模塊(LCD1602)顯示。在運(yùn)算過程中顯示運(yùn)算數(shù)據(jù)及符號,運(yùn)算完成后顯示運(yùn)算結(jié)果。2.2 單元電路設(shè)計(jì)2.2.1 單片機(jī)最小系統(tǒng)單片機(jī)最小系統(tǒng)就是支持主芯片正常工作的最小電路部分,包括主控芯片、復(fù)位電路和晶振電路。 主控芯片選取AT89C52芯片,因其具有良好的性能及穩(wěn)定性,價(jià)格便宜應(yīng)用方便。 晶振選取11.0592MHz,晶振旁電容選取20pF。 采用按鍵復(fù)位電路,電阻分別選取100和10
9、K,電容選取10F。 以下為單片機(jī)最小系統(tǒng)硬件電路原理圖(圖2.2),仿真接線圖(圖2.3)。圖2.2 單片機(jī)最小系統(tǒng)硬件電路原理圖圖2.3 單片機(jī)最小系統(tǒng)仿真接線圖2.2.2 鍵盤接口電路計(jì)算器所需按鍵有: 數(shù)字鍵:1,2,3,4,5,6,7,8,9,0 。功能鍵:+, - , *, / , = , C( 清零、小數(shù)點(diǎn))共計(jì)16個(gè)按鍵,采用4*4矩陣鍵盤,鍵盤的行和列之間都有公共端相連,四行和四列的8個(gè)公共端分別接P1.0P1.7,這樣掃描P1口就可以完成對矩陣鍵盤的掃描,通過對16個(gè)按鍵進(jìn)行編碼,從而得到鍵盤的口地址,對比P1口的掃描結(jié)果和各按鍵的地址,我們就可以得到是哪個(gè)鍵按下,從而完成
10、鍵盤的功能。在Proteus仿真中,我直接使用元件庫所有的KEYPAD-SMALLCALC鍵盤,這種鍵盤直接實(shí)現(xiàn)了4*4鍵盤的功能,方便使用。如下圖2.4所示。在按下其中一個(gè)鍵時(shí),其對應(yīng)的行與列將都會變成低電平,此時(shí),即可通過判斷P1口的值來確定輸入的是哪一個(gè)按鍵,然后將所取得的按鍵通過軟件來進(jìn)行接下來的處理、運(yùn)算等工作。圖2.4 4*4矩陣鍵盤2.2.3 LCD1602顯示電路LCD1602簡介: 如圖2.5所示,1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號等的點(diǎn)陣型液晶模塊。它由若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符,每位之間
11、有一個(gè)點(diǎn)距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因?yàn)槿绱怂运荒芎芎玫仫@示圖形(用自定義CGRAM,顯示效果也不好)。1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個(gè)字符液晶模塊(顯示字符和數(shù)字)。1602采用標(biāo)準(zhǔn)的16腳接口,其中:第1引腳:GND為電源地第2引腳:VCC接5V電源正極第3引腳:V0為液晶顯示器對比度調(diào)整端,接正電源時(shí)對比度最弱,接地電源時(shí)對比度最高(對比度過高時(shí)會 產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對比度)。第4引腳:RS為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器。第5引腳:RW為讀寫信號線,高電
12、平(1)時(shí)進(jìn)行讀操作,低電平(0)時(shí)進(jìn)行寫操作。第6引腳:E(或EN)端為使能(enable)端,高電平(1)時(shí)讀取信息,負(fù)跳變時(shí)執(zhí)行指令。第714引腳:D0D7為8位雙向數(shù)據(jù)端。第1516腳:空腳或背燈電源。第15引腳背光正極,第16引腳背光負(fù)極。特性3.3V或5V工作電壓,對比度可調(diào)內(nèi)含復(fù)位電路提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能有80字節(jié)顯示數(shù)據(jù)存儲器DDRAM內(nèi)建有192個(gè)5X7點(diǎn)陣的字型的字符發(fā)生器CGROM8個(gè)可由用戶自定義的5X7的字符發(fā)生器CGRAM特征應(yīng)用微功耗、體積小、顯示內(nèi)容豐富、超薄輕巧,常用在袖珍式儀表和低功耗應(yīng)用系統(tǒng)中。操作控制注:關(guān)于
13、E=H脈沖開始時(shí)初始化E為0,然后置E為1。圖2.5 LCD1602硬件原理圖采用LCD1602顯示器對計(jì)算過程、結(jié)果以及提示信息進(jìn)行顯示,在仿真電路中,由于Proteus中并沒有LCD1602顯示芯片,故采用功能相似的LM016L進(jìn)行替代,其中LM016L的D0D7三個(gè)輸入輸出端口接至單片機(jī)的P0.0P0.7口,用來對顯示屏輸出顯示、輸出控制指令以及獲取狀態(tài)信息。單片機(jī)的P2.5P2.7分別與LM016L的RS、RW、E端口相連,用來對顯示芯片進(jìn)行控制。以下為LCD顯示電路的仿真接線圖(圖2.6)。圖2.6 LCD1602(LM016L)仿真接線圖第三章 軟件設(shè)計(jì)3.1 系統(tǒng)軟件結(jié)構(gòu)如圖3.
14、1所示,系統(tǒng)啟動后,執(zhí)行LCD初始化程序,然后調(diào)用LCD顯示程序,在屏幕上輸出歡迎信息。接下來調(diào)用鍵盤掃描處理程序,等待按鍵按下,按下任意鍵后執(zhí)行LCD清屏程序,并再次調(diào)用鍵盤掃描處理程序,等待用戶輸入數(shù)據(jù),若用戶按下數(shù)字鍵(09),則在顯示器上顯示并且將輸入數(shù)據(jù)保存至數(shù)據(jù)存儲區(qū)。 Y 圖3.1 程序流程圖本次設(shè)計(jì)采用模塊化設(shè)計(jì)思想,包括主程序和初始化子程序、延時(shí)子程序、輸出數(shù)據(jù)子程序、檢測是否有按鍵按下子程序、確定按鍵子程序、清第一行屏與顯示“Welcome”子程序、換算第一個(gè)數(shù)子程序、運(yùn)算子程序、顯示結(jié)果子程序等子程序。運(yùn)行程序后,首先調(diào)用子程序清屏第一行并顯示“Welcome”,清屏第二
15、行并顯示“ZCYs Caculator!”,然后檢測是否有按鍵按下,如果沒有,繼續(xù)檢測,如果按下,則判斷是否是加減乘除鍵被按下,如果是加減乘除被按下,則顯示相應(yīng)的字符并換算出字符前輸入的數(shù)據(jù)和字符后輸入的數(shù)字,然后檢測是否有等號按下,如果有則完成相應(yīng)的運(yùn)算并顯示相應(yīng)的結(jié)果,然后檢測是否有清屏鍵按下,如果有則清屏,相應(yīng)的流程圖如圖3.1所示。對于數(shù)字鍵的程序段進(jìn)行相應(yīng)的設(shè)計(jì),如果運(yùn)算鍵(、,*,/)相應(yīng)標(biāo)志不為一,則將輸入的數(shù)字送入第一個(gè)操作數(shù)緩存區(qū),并且清空所有響應(yīng)位。否則送入第二個(gè)操作數(shù)緩存區(qū)。其次對功能鍵的程序段進(jìn)行相應(yīng)的設(shè)計(jì)。 如果功能鍵(、,*,/)第一次被按下,則置相應(yīng)的標(biāo)志位為一,
16、并且將運(yùn)算鍵響應(yīng)標(biāo)志位置一,清空第二個(gè)操作數(shù)的緩存區(qū),為輸入操作數(shù)做準(zhǔn)備,如果是第二次按下則先調(diào)用運(yùn)算操作子程序,執(zhí)行上次按下的運(yùn)算鍵的運(yùn)算,置相應(yīng)的標(biāo)志位為一,并且將運(yùn)算鍵響應(yīng)標(biāo)志位置一,清空第二個(gè)操作數(shù)的緩存區(qū),為輸入操作數(shù)做準(zhǔn)備。程序上的具體實(shí)現(xiàn):在單片機(jī)上電后,執(zhí)行兩個(gè)函數(shù)LCD_dsp_string(4,0,"Welcome!")以及LCD_dsp_string(1,1,"ZCY's Caculator")輸出歡迎信息初始化LCD。然后執(zhí)行keyscan()函數(shù)判斷是否有按鍵輸入,若有則讀取按鍵,否則循環(huán)掃描,直到有按鍵按下。在獲取按鍵
17、后,判斷按鍵是否為數(shù)字,若是,則執(zhí)行cacul(a)函數(shù),將獲取的數(shù)字保存為數(shù),然后執(zhí)行LCD單個(gè)字符顯示函數(shù)LCD_dsp_char(x,y,dat)。若按鍵不是數(shù)字,則判斷是否為操作符,若是,則執(zhí)行LCD_dsp_char(x,y,dat)顯示操作符,然后將flag標(biāo)志位置1,代表第一個(gè)操作數(shù)輸入結(jié)束。若不是操作符,則判斷是否為=,若是,則執(zhí)行函數(shù)Caculator(x,y)函數(shù),計(jì)算結(jié)果,然后執(zhí)行LCD_dsp_string(x,y,string)函數(shù),將計(jì)算結(jié)果顯示在屏幕上,然后執(zhí)行keyscan()函數(shù),等待按下任意鍵,按下任意鍵后,再次執(zhí)行LCD初始化程序。若不是=,則判斷是否是第
18、一次按下清零鍵,若是,則顯示小數(shù)點(diǎn),并再次調(diào)用keyscan()函數(shù),獲取下一個(gè)按鍵,若不是第一次按下,則再次執(zhí)行LCD初始化程序。3.2 主要功能子程序設(shè)計(jì)開始3.2.1 LCD顯示子程序 Y N Y N圖3.2 LCD顯示子程序流程圖如圖3.2所示,當(dāng)主程序調(diào)用了LCD顯示程序后,首先判斷LCD是否處于忙碌狀態(tài),若是,則等待,若不是,則開始設(shè)置顯示位置,然后判斷顯示的是單個(gè)字符還是字符串,分別實(shí)現(xiàn)對單個(gè)字符的輸出以及對字符串的輸出。之所以對單字符和字符串設(shè)置不同的顯示函數(shù),是為了實(shí)現(xiàn)程序?qū)纹瑱C(jī)資源的最優(yōu)利用,因?yàn)閱巫址徽紦?jù)一個(gè)字節(jié)的存儲區(qū),而字符串則至少占用兩個(gè)字節(jié)。在顯示完成后,返回
19、主程序,繼續(xù)執(zhí)行下一步。LCD的顯示程序中主要的部份為LCD顯示位置的設(shè)置以及LCD顯示數(shù)據(jù)的輸出。為此,我編寫了LCD顯示位置設(shè)置函數(shù),以及LCD顯示函數(shù),如下。LCD顯示位置設(shè)置函數(shù):void LCD_set_xy( unsigned char x, unsigned char y )/設(shè)置LCD顯示的位置unsigned char address;if (y = 0) /y=0為第一行 address = 0x80 + x; /x=0為一行的第一個(gè)else /第二行 address =0xc0+ x;write_com(address);/設(shè)置數(shù)據(jù)指針位置,調(diào)用LCD寫命令函數(shù)LCD顯示
20、函數(shù):void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat)/單個(gè)字符顯示函數(shù)LCD_set_xy( x, y ); /調(diào)用LCD顯示位置設(shè)置函數(shù),設(shè)置顯示位置write_data(dat);/寫入待顯示數(shù)據(jù),調(diào)用LCD寫數(shù)據(jù)函數(shù)void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s)/字符串顯示函數(shù) LCD_set_xy( X, Y ); /調(diào)用LCD顯示位置設(shè)置函數(shù) while (*s) /當(dāng)字符串未到達(dá)結(jié)尾('0')時(shí)
21、,循環(huán)輸出單個(gè)字符 write_data(*s); s +;/指向下一個(gè)字符 3.2.2 鍵盤掃描處理子程序 N Y 圖3.3 鍵盤掃描處理子程序流程圖如圖3.3所示,當(dāng)調(diào)用了鍵盤掃描處理子程序后,首先,為P1口賦值,然后等待,判斷P1口的值是否變化,若變化,根據(jù)變化后的值,來判斷按下的鍵值為多少;若P1口的值未發(fā)生變化,則循環(huán)掃描P1口的值,直到有按鍵按下導(dǎo)致P1口的值發(fā)生變化。在掃描到按鍵值后,將按鍵值保存在全局變量n中,以便其他函數(shù)使用、處理該值。在我編寫的程序中,例如下列程序段,我定義了一個(gè)臨時(shí)變量temp來比較該值與給定值,來判斷是否有鍵按下從而導(dǎo)致P1口的值發(fā)生變化。void ke
22、y_scan(void)/鍵盤掃描處理子程序 unsigned char temp;/定義臨時(shí)變量temp保存P1的值P1=0xfe; /為P1賦值,選中第一行if(P1!=0xfe)/P1發(fā)生變化 delay(200);/延時(shí)200us if(P1!=0xfe)/再次判斷(消抖) temp=P1&0xf0;/判斷是哪一列 switch(temp) case 0xe0:n='c'break;/第一列 case 0xd0:n='0'break;/第二列 case 0xb0:n='='break;/第三列 case 0x70:n='+
23、'break;/第四列 while(P1!=0xfe); /等待,直到按鍵松掉 3.2.3 運(yùn)算子程序接收操作數(shù)a,b,fha=a+bfh=+? Ya=a-bfh=-? fh=*?a=a*ba=a/bfh=/? a>9999?輸出錯(cuò)誤提示信息輸出計(jì)算結(jié)果圖3.4 運(yùn)算子程序流程圖如圖3.4所示,在取得操作數(shù)一、操作數(shù)二、運(yùn)算符后,判斷操作符的性質(zhì),然后根據(jù)操作符來進(jìn)行加減乘除的計(jì)算,將計(jì)算結(jié)果保存在a中,并判斷計(jì)算結(jié)果的值是否超過四位數(shù),若超過,則在屏幕上輸出錯(cuò)誤提示信息,否則在屏幕上輸出正確結(jié)果。a中的值可以直接作為下次計(jì)算的第一個(gè)操作數(shù),即下次輸入的是運(yùn)算符加減乘除的話,之后
24、輸入的就是第二個(gè)操作數(shù),否則,需要清零再輸入兩個(gè)數(shù)進(jìn)行下輪計(jì)算。在我的程序中,我設(shè)置了較多的標(biāo)志位,比如fuhao為負(fù)號標(biāo)志,xsd為小數(shù)點(diǎn)標(biāo)志,dh為等號標(biāo)志,flag為操作數(shù)標(biāo)志。以下是我的計(jì)算子程序的節(jié)選。switch(fuhao) /判斷操作符是哪個(gè) case '+': a=a+b; break;/加case '-': a=a-b; break;/減case '*': a=a*b; break;/乘case '/': a=a/b; break;/除 /計(jì)算if(a>9999) /判斷結(jié)果是否超過四位數(shù)sprintf(
25、temp,"%s","Error"); LCD_dsp_string(0,1,temp); /若結(jié)果超過四位數(shù)則輸出錯(cuò)誤信息n=17;dokey_scan();while(n=17); /等待按鍵write_com(0x01); /清屏a=b=0; /操作數(shù)清零fuhao=0; /操作符清空flag=0; /第一個(gè)操作數(shù)i=0; j=0; dh=0; /等號清空xsd=0; /小數(shù)點(diǎn)清空fh=0; /將各個(gè)標(biāo)志位恢復(fù)初始化第四章 系統(tǒng)調(diào)試與分析4.1 調(diào)試過程與結(jié)果本次課程設(shè)計(jì)中,我使用了Proteus作為硬件仿真軟件,Keil作為軟件編寫編譯軟件,通過
26、兩者的協(xié)調(diào),來實(shí)現(xiàn)仿真模擬。在Keil中編寫并編譯好程序后,導(dǎo)入到Proteus中,然后開啟仿真,使單片機(jī)運(yùn)行,LCD上顯示出提示信息,如圖4.1所示。按下任意鍵后LCD清屏,如圖4.2所示。 圖4.1 歡迎界面 圖4.2 清屏在第一次計(jì)算中,我輸入了9999+1的運(yùn)算式,按照正常的要求,輸出結(jié)果應(yīng)為E,然而,我的輸出卻是一個(gè)錯(cuò)誤的計(jì)算結(jié)果,如圖4.3所示,經(jīng)過檢查后,我發(fā)現(xiàn)了程序中的錯(cuò)誤,是操作數(shù)的定義出現(xiàn)了問題,我定義的操作數(shù)是無符號字符型,所以導(dǎo)致在計(jì)算過程中發(fā)生了溢出,最后生成了錯(cuò)誤的計(jì)算結(jié)果。然后我修改了程序,將操作數(shù)的定義改為了單精度浮點(diǎn)型,然后再次運(yùn)行。 圖4.3 錯(cuò)誤輸出 圖4
27、.4 正確輸出警告信息進(jìn)行第二次運(yùn)算。在這次運(yùn)算中,我再次輸入了上次的運(yùn)算式,結(jié)果不負(fù)所望,輸出為E,如圖4.4所示。經(jīng)過修改,結(jié)果已經(jīng)正確。最后,我猜測,在我改進(jìn)程序之前,由于操作數(shù)的數(shù)據(jù)類型弄錯(cuò)了,所以可能導(dǎo)致其他運(yùn)算的結(jié)果可能也是錯(cuò)誤的。進(jìn)行第三次運(yùn)算。輸入第一個(gè)操作數(shù),我輸入的是1.25,如圖4.5所示,同時(shí),在我的設(shè)計(jì)中,將清零鍵與小數(shù)點(diǎn)鍵設(shè)置成了同一個(gè)鍵,以滿足4*4鍵盤要求。在同一個(gè)操作數(shù)中按下兩次ON/C鍵的話,會使屏幕清屏,數(shù)據(jù)清零,如圖4.2所示。然后輸入操作符,我輸入的是乘號,如圖4.5所示。然后輸入第二個(gè)操作數(shù),我輸入的是352.7,如圖4.5所示,輸入等號后,在LCD
28、的第二行輸出了計(jì)算結(jié)果,經(jīng)過驗(yàn)算,發(fā)現(xiàn)結(jié)果正確。圖4.5 正確運(yùn)行結(jié)果圖4.6 4*4鍵盤 圖4.7 上拉電阻如圖4.6所示,矩陣鍵盤的8個(gè)端口接至P1口,在按下按鍵后,按鍵對應(yīng)的行列端口均變?yōu)榈碗娖?,由此即可判斷出按下的是哪個(gè)按鍵。如圖4.7所示,為上拉電阻,在51單片機(jī)中,P0口開漏端口,因此需要外接上拉電阻來接負(fù)載,這樣才能正常的進(jìn)行輸入輸出的高低電平變化。4.2 結(jié)果分析 在輸入計(jì)算表達(dá)式后,系統(tǒng)成功得出了正確的計(jì)算結(jié)果,并且由于溢出判斷的存在,保證了計(jì)算結(jié)果不會超出四位數(shù),滿足了設(shè)計(jì)要求。第五章 設(shè)計(jì)小結(jié)課程設(shè)計(jì)是培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)知識,發(fā)現(xiàn)、提出、分析和解決實(shí)際問題,鍛煉實(shí)踐能力
29、的重要環(huán)節(jié),是對學(xué)生實(shí)際工作能力的具體訓(xùn)練和考察過程。隨著科學(xué)技術(shù)發(fā)展的日新日異,單片機(jī)已經(jīng)成為當(dāng)今計(jì)算機(jī)應(yīng)用中空前活躍的領(lǐng)域, 在生活中可以說得是無處不在。因此作為電子信息工程專業(yè)的學(xué)生來說掌握單片機(jī)的開發(fā)技術(shù)是十分重要的。 我的題目是4位加法計(jì)算器,對于我們這些實(shí)踐中的新手來說,這是一次考驗(yàn)。怎么才能找到課堂所學(xué)與實(shí)際應(yīng)用的最佳結(jié)合點(diǎn)?怎樣讓自己的業(yè)余更接近專業(yè)?怎樣讓自己的計(jì)劃更具有序性,而不會忙無一用?這都是我們所要考慮和努力的。經(jīng)過查找資料,編寫程序,加深了對單片機(jī)的了解與認(rèn)識。經(jīng)過本次的實(shí)驗(yàn)設(shè)計(jì)學(xué)習(xí),又一次深刻感受到了51單片機(jī)雖然已經(jīng)過去幾十年,現(xiàn)在也不斷地收到16位、32位低價(jià)
30、單片機(jī)的沖擊,但仍然是一款性能優(yōu)越的單片機(jī),在處理生活中常用的簡單任務(wù)時(shí),51單片機(jī)依然能夠煥發(fā)出青春般的光彩。同時(shí),51單片機(jī)也是學(xué)習(xí)和理解其他高級單片機(jī)的最好的入門平臺,本次的實(shí)驗(yàn)也將增強(qiáng)了我對學(xué)習(xí)好其他高級單片機(jī)的決心和信心。本次實(shí)驗(yàn),讓我收獲很多,感謝同學(xué)的幫助,不僅加深了知識方面,更加鍛煉了動手能力,相信以后遇到這方面問題不再會不知所措,讓我把知識和實(shí)踐結(jié)合到一起,通過這次實(shí)踐,我了解自己的不足,C語言掌握的不夠,使我更加了解以后該在哪個(gè)方面補(bǔ)充的自己的不足,總體來說本次課程設(shè)計(jì)是成功的,使我了解到更多課本上沒有的知識,最后再次感謝所有幫助過我的老師和同學(xué)們。附錄1. 計(jì)算器.c#i
31、nclude<reg51.h>#include<stdio.h>#include<stdlib.h>unsigned char n;float idata a,b;/操作數(shù)1,操作數(shù)2extern void key_scan(void);/鍵盤掃描extern void init();/LCD初始化extern void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s);/字符串顯示extern void LCD_dsp_char( unsigned x,unsigned cha
32、r y,unsigned char dat); /字符顯示extern void write_com(unsigned char com);void main()char idata temp16;/臨時(shí)存儲區(qū)char i=0,j=0,fuhao;/i,j分別為temp與LCD的數(shù)據(jù)指針bit flag=0,dh=0,fh=0,xsd=0;/flag=0:操作數(shù)1,flag=1:操作數(shù)2;dh=1時(shí)表示已輸入等號;fh負(fù)號;xsd小數(shù)點(diǎn)init();/小數(shù)點(diǎn)LCD_dsp_string(4,0,"Welcome!");LCD_dsp_string(1,1,"ZCY
33、's Caculator");/輸出歡迎信息do key_scan(); while(n=17);/等待按鍵write_com(0x01);/清屏while(1)key_scan();/等待按鍵if(dh=1)&(flag=1)&(n!=17)/一次計(jì)算完畢后執(zhí)行write_com(0x01);/清屏LCD_dsp_string(0,0,temp);/輸出上次計(jì)算的結(jié)果j=0;i=0;flag=0;fh=0;while(tempi+!='0') j+; /將temp數(shù)據(jù)指針移向后一個(gè)空位,將LCD顯示指針移向下一個(gè)空位if(i=0)&(
34、n='-')&(fh=0)/如果輸入的第一個(gè)數(shù)是負(fù)數(shù)則執(zhí)行fh=1;/表示有負(fù)號 temp0='-'/保存負(fù)號i+;LCD_dsp_char(j+,0,n);/輸出減號if(flag=0) continue;if(n>='0')&(n<='9')|(n='c')&(xsd=0)&(dh=0)if(n='c') n='.'xsd=1;/防止再次按下c后繼續(xù)出現(xiàn)小數(shù)點(diǎn)tempi+=n;/保存輸入的數(shù)字LCD_dsp_char(j+,0,n);/
35、顯示并將光標(biāo)移至下一位(光標(biāo)未顯示)if(n='+')|(n='-')|(n='*')|(n='/')&(flag=0)|(dh=1)/輸入完第一個(gè)操作數(shù)之后或者完成一次計(jì)算之后按下運(yùn)算符按鍵時(shí)執(zhí)行 flag=1;/之后輸入的操作數(shù)是第二個(gè)操作數(shù)fuhao=n;tempi='0'/表示為字符串a(chǎn)=atof(temp);/轉(zhuǎn)換為數(shù)據(jù)i=0;dh=0;xsd=0;/之后第二個(gè)操作數(shù)中可以添加一個(gè)小數(shù)點(diǎn)switch(n) case '+': LCD_dsp_char(j+,0,n); break;
36、case '-': LCD_dsp_char(j+,0,n); fh=0;break;case '*': LCD_dsp_char(j+,0,n); break;case '/': LCD_dsp_char(j+,0,n); break;/顯示運(yùn)算符if(n='=')&(flag=1)/已輸入完第二個(gè)操作數(shù)并按下等號dh=1;tempi='0'b=atof(temp);i=0;xsd=0;LCD_dsp_char(j,0,'=');/顯示等號switch(fuhao) case '+
37、': a=a+b; break;case '-': a=a-b; break;case '*': a=a*b; break;case '/': a=a/b; break;/計(jì)算if(a>9999)sprintf(temp,"%s","Error");/若計(jì)算結(jié)果超過四位數(shù)則輸出錯(cuò)誤信息LCD_dsp_string(0,1,temp);n=17;dokey_scan();while(n=17);/等待按鍵write_com(0x01);/清屏a=b=0;fuhao=0;flag=0;i=0;j=
38、0;dh=0;xsd=0;fh=0;/恢復(fù)初始化elsesprintf(temp,"%g",a);/輸出計(jì)算結(jié)果LCD_dsp_string(0,1,temp);if(n='c')/按下清除鍵write_com(0x01);/清屏a=b=0;fuhao=0;flag=0;i=0;j=0;dh=0;xsd=0;fh=0;/恢復(fù)初始化2. LCD1602.c#include<reg51.h>sbit lcden=P27;/讀寫控制輸入端sbit rw=P26;/讀寫控制端sbit rs=P25;/指令、數(shù)據(jù)選擇端sbit busy=P07;/LCD內(nèi)
39、部忙標(biāo)志void delay(unsigned int m)/延時(shí)函數(shù)unsigned int n;for(n=0;n<=m;n+);void check() /判斷LCD是否忙碌doP0=0xff;rs=0;rw=1;lcden=0;delay(100);lcden=1; while(busy=1);/當(dāng)busy=1,即LCD忙時(shí),等待void write_com(unsigned char com) /寫顯示命令P0=com;rs=0;rw=0;lcden=0;check();lcden=1;void write_data(unsigned char date) /寫顯示數(shù)據(jù)P0=d
40、ate;rs=1;rw=0;lcden=0;check();lcden=1;void init() /初始化LCDwrite_com(0x38);/16x2行顯示,5x7點(diǎn)陣,8位數(shù)據(jù)接口write_com(0x0c);/開顯示,光標(biāo)不顯示、不閃爍write_com(0x06);/光標(biāo)自增,畫面不動write_com(0x80);/選擇第一行write_com(0x01);/清屏void LCD_set_xy( unsigned char x, unsigned char y )/設(shè)置LCD顯示的位置unsigned char address;if (y = 0) /y=0為第一行 address = 0x80 + x; /x=0為一行的第一個(gè)else /第二行 address =0xc0+ x;writ
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 辦公園林綠化合同范本
- 2025年度辦事處設(shè)計(jì)及智能化辦公系統(tǒng)合同
- 兒童玩具商標(biāo)轉(zhuǎn)讓居間合同
- 玻璃制品廠出租居間合同
- 第三人房產(chǎn)抵押擔(dān)保合同
- 網(wǎng)絡(luò)故障排除與維護(hù)手冊
- 工程中介居間合同
- 三農(nóng)產(chǎn)品安全檢測技術(shù)指南
- 大數(shù)據(jù)應(yīng)用與服務(wù)平臺建設(shè)項(xiàng)目合同
- 供應(yīng)商管理與采購合同談判規(guī)定
- 2024-2025學(xué)年北師大版初一物理上冊期末質(zhì)量檢查卷及答案
- 6.2《青紗帳-甘蔗林》-【中職專用】高一語文課件(高教版2023·基礎(chǔ)模塊下冊)
- 2024-2030年中國畜牧業(yè)新質(zhì)生產(chǎn)力市場全景調(diào)研及發(fā)展前景研判報(bào)告
- 2023年開工第一課及復(fù)工復(fù)產(chǎn)考試試題(含答案)
- 宗教知識的課件
- GB/T 22849-2024針織T恤衫
- (詳盡多應(yīng)用版)鋼結(jié)構(gòu)工程合同范本(完整版)
- 設(shè)備維保的維修流程與服務(wù)流程
- 隔膜計(jì)量泵維護(hù)檢修規(guī)程培訓(xùn)
- 《生物制品技術(shù)》課程標(biāo)準(zhǔn)
- 心血管內(nèi)科高血壓一病一品
評論
0/150
提交評論