版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、單片機(jī)原理及應(yīng)用課程設(shè)計(jì)報(bào)告設(shè)計(jì)題目: D題 計(jì)算器 系 別 : 電子信息工程 學(xué)生姓名: 李 慶 班 級(jí): 1202014 學(xué) 號(hào): 29 成 績(jī): 指導(dǎo)教師: 李壽強(qiáng)、傅林 開課時(shí)間: 2014-2015 學(xué)年第 一 學(xué)期目錄摘 要21.引言22.系統(tǒng)方案22.1方案論證與選擇22.2單片機(jī)及其它器件選型22.3系統(tǒng)整體框圖22.4主要技術(shù)指標(biāo)33.硬件設(shè)計(jì)33.1整個(gè)單片機(jī)的接口電路33.2最小系統(tǒng)原理圖33.3數(shù)碼管接口電路43.4矩陣鍵盤接口電路64.軟件設(shè)計(jì)74.1數(shù)碼管顯示程序設(shè)計(jì)74.2讀鍵輸入程序84.3主程序設(shè)計(jì)84.4Proteus仿真圖:105.系統(tǒng)原理圖:106.雙層
2、PCB制版圖117.C程序清單117.1主函數(shù):117.2數(shù)碼管顯示函數(shù):157.3鍵盤反轉(zhuǎn)掃描函數(shù)178.總結(jié)體會(huì)199.參考文獻(xiàn)20摘 要本文運(yùn)用MCS51單片機(jī)系統(tǒng)設(shè)計(jì)的簡(jiǎn)易計(jì)算器,實(shí)現(xiàn)了通過檢測(cè)不同數(shù)字鍵、功能鍵的按下,可以進(jìn)行加減乘除運(yùn)算。對(duì)應(yīng)每一個(gè)數(shù)字鍵按下的同時(shí),數(shù)碼管顯示按下鍵所對(duì)應(yīng)的值,并顯示最后的運(yùn)算結(jié)果。 關(guān)鍵詞:簡(jiǎn)易計(jì)算器, 89c51單片機(jī),數(shù)碼管1. 引言計(jì)算器因其功能強(qiáng)大而早已成為人們?nèi)粘I钪斜夭豢缮俚墓ぞ?,最?jiǎn)單的計(jì)算器就能實(shí)現(xiàn)簡(jiǎn)單的加減乘除運(yùn)算,這讓人們免去了復(fù)雜的計(jì)算過程,大大提高了工作效率。隨著社會(huì)科技的發(fā)展和進(jìn)步,計(jì)算器的功能更加完善,不僅能實(shí)現(xiàn)簡(jiǎn)單的
3、運(yùn)算,還能對(duì)復(fù)雜的數(shù)學(xué)問題進(jìn)行求解。2. 系統(tǒng)方案2.1 方案論證與選擇本設(shè)計(jì)是基于52系列單片機(jī)來進(jìn)行的數(shù)字計(jì)算器系統(tǒng)設(shè)計(jì),可以完成計(jì)算器的鍵盤輸入,鍵盤電路采用4*4矩陣鍵盤電路,進(jìn)行加、減、乘、除基本四則運(yùn)算,并在4位共陰極數(shù)碼管顯示相應(yīng)的結(jié)果;設(shè)計(jì)電路采用STC89C52單片機(jī)為主要控制芯片,利用軟件方面使用C語言編程,并用Protues仿真。2.2 單片機(jī)及其它器件選型本系統(tǒng)選用以STC89C52C單片機(jī)為主控機(jī)。通過擴(kuò)展必要的外圍接口電路,實(shí)現(xiàn)對(duì)計(jì)算器的設(shè)計(jì)。系統(tǒng)模塊圖如下圖2圖2-2系統(tǒng)模塊圖2.3 系統(tǒng)整體框圖圖2-3 系統(tǒng)模塊圖2.4 主要技術(shù)指標(biāo)本文利用MCS51單片機(jī)系統(tǒng)
4、設(shè)計(jì)的簡(jiǎn)易計(jì)算器,能夠?qū)崿F(xiàn)以下功能:1)、利用鍵盤及8位數(shù)碼管作為計(jì)算器的輸入及顯示模塊;2)、能進(jìn)行加、減、乘、除的基本運(yùn)算;3)、有清零、數(shù)據(jù)溢出錯(cuò)誤處理3. 硬件設(shè)計(jì)單片機(jī)微型計(jì)算機(jī)是微型計(jì)算機(jī)的一個(gè)重要分支,也是頗具生命力的機(jī)種。單片機(jī)微型計(jì)算機(jī)簡(jiǎn)稱單片機(jī),特別適用于控制領(lǐng)域,故又稱為微控制器。通常,單片機(jī)由單塊集成電路芯片構(gòu)成,內(nèi)部包含有計(jì)算機(jī)的基本功能部件:中央處理器、存儲(chǔ)器和I/O接口電路等。因此,單片機(jī)只需要和適當(dāng)?shù)能浖巴獠吭O(shè)備相結(jié)合,便可成為一個(gè)單片機(jī)控制系統(tǒng)。通常,單片機(jī)由單個(gè)集成電路芯片構(gòu)成,內(nèi)部包含有計(jì)算機(jī)的基本功能部件,中央處理器,存儲(chǔ)器和I/O接口電路等。因此,單
5、片機(jī)只需要和適當(dāng)?shù)能浖巴獠吭O(shè)備相結(jié)合,便可成為一個(gè)單片機(jī)控制系統(tǒng)。隨著社會(huì)的發(fā)展,科學(xué)的進(jìn)步,人們的生活水平在逐步的提高,尤其是微電子技術(shù)的發(fā)展,猶如雨后春筍般的變化。單片機(jī)的應(yīng)用已經(jīng)越來越貼近生活,用單片機(jī)來實(shí)現(xiàn)一些電子設(shè)計(jì)也變得容易起來。計(jì)算器在人們的日常中是比較的常見的電子產(chǎn)品之一??墒撬€在發(fā)展之中,以后必將出現(xiàn)功能更加強(qiáng)大的計(jì)算器,基于這樣的理念,本次專周設(shè)計(jì)是用單片機(jī)來設(shè)計(jì)的計(jì)算器。3.1 整個(gè)單片機(jī)的接口電路P0口通過兩個(gè)74LS573鎖存器用于數(shù)碼管顯示輸出以及數(shù)碼管位選控制;P1口用于4*4矩陣鍵掃描輸入;P22位定義鎖存使能端口的段鎖存;P23位定義鎖存使能端口的位鎖存。
6、3.2 最小系統(tǒng)原理圖最小系統(tǒng)由震蕩電路、復(fù)位電路、輸入輸出設(shè)備、電源和單片機(jī)芯片組成。圖4 最小系統(tǒng)原理圖n 復(fù)位電路單片機(jī)復(fù)位電路就好比電腦的重啟部分,當(dāng)電腦在使用中出現(xiàn)死機(jī),按下重啟按鈕電腦內(nèi)部的程序從頭開始執(zhí)行。單片機(jī)也一樣,當(dāng)單片機(jī)系統(tǒng)在運(yùn)行中,受到環(huán)境干擾出現(xiàn)程序跑飛的時(shí)候,按下復(fù)位按鈕內(nèi)部的程序自動(dòng)從頭開始。復(fù)位原理單片機(jī)復(fù)位時(shí)只要保持RST引腳接大于兩個(gè)機(jī)器周期的高電平即可。在單片機(jī)啟動(dòng)0.1S后,電容C兩端的電壓持續(xù)充電為5V,這是時(shí)候10K電阻兩端的電壓接近于0V,RST處于低電平所以系統(tǒng)正常工作。當(dāng)按鍵按下的時(shí)候,開關(guān)導(dǎo)通,這個(gè)時(shí)候電容兩端形成了一個(gè)回路,電容被短路,所以
7、在按鍵按下的這個(gè)過程中,電容開始釋放之前充的電量。隨著時(shí)間的推移,電容的電壓在0.1S內(nèi),從5V釋放到變?yōu)榱?.5V,甚至更小。根據(jù)串聯(lián)電路電壓為各處之和,這個(gè)時(shí)候10K電阻兩端的電壓為3.5V,甚至更大,所以RST引腳又接收到高電平。單片機(jī)系統(tǒng)自動(dòng)復(fù)位。圖3-2-1 單片機(jī)復(fù)位電路n 單片機(jī)振蕩電路外接晶振引腳XTAL1和TXAL2接外部晶振和微調(diào)電容的一端。振蕩電路的頻率就是晶體的固有頻率。晶振電路結(jié)合單片機(jī)內(nèi)部電路產(chǎn)生單片機(jī)所需的時(shí)鐘頻率。晶振提高頻率越高,單片機(jī)運(yùn)行速度越快。單片機(jī)一切指令的執(zhí)行都是建立在晶振提供的時(shí)鐘頻率上。圖3-2-2 單片機(jī)振蕩電路3.3 數(shù)碼管接口電路數(shù)碼管按段
8、數(shù)分為七段數(shù)碼管和八段數(shù)碼管,八段數(shù)碼管比七段數(shù)碼管多一個(gè)發(fā)光二極管單元(即多一個(gè)小數(shù)點(diǎn)顯示);按能顯示多少個(gè)“8”可分為1位、2位、4位等等數(shù)碼管;按發(fā)光二極管單元連接方式分為共陽極數(shù)碼管和共陰極數(shù)碼管。共陽數(shù)碼管是指將所有發(fā)光二極管的陽極接到一起形成公共陽極(COM)的數(shù)碼管。共陽數(shù)碼管在應(yīng)用時(shí)應(yīng)將公共極COM接到+5V,當(dāng)某一字段發(fā)光二極管的陰極為低電平時(shí),相應(yīng)字段就點(diǎn)亮。當(dāng)某一字段的陰極為高電平時(shí),相應(yīng)字段就不亮。共陰數(shù)碼管是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數(shù)碼管。共陰數(shù)碼管在應(yīng)用時(shí)應(yīng)將公共極COM接到地線GND上,當(dāng)某一字段發(fā)光二極管的陽極為高電平時(shí),相應(yīng)字段
9、就點(diǎn)亮。當(dāng)某一字段的陽極為低電平時(shí),相應(yīng)字段就不亮。陰極數(shù)碼管是把所有LED的陰極連接到共同接點(diǎn)com,而每個(gè)LED的陽極分別為a、b、c、d、e、f、g及dp(小數(shù)點(diǎn)),如下圖所示。圖中的8個(gè)LED分別和上面那個(gè)圖中的ADP各段相對(duì)應(yīng),通過控制各個(gè)LED的亮滅來顯示數(shù)字。當(dāng)某一字段發(fā)光二極管的陽極為高電平時(shí),相應(yīng)字段就點(diǎn)亮。當(dāng)某一字段的陽極為低電平時(shí),相應(yīng)字段就不亮。圖3-3-1 共陰極數(shù)碼管引腳接線l 數(shù)碼管顯示部分的實(shí)現(xiàn):數(shù)碼管通過PO口輸入高低電平控制每個(gè)LED燈的亮滅,公共端接地線P0口接1K的上拉電阻。由于并未用到小數(shù)點(diǎn)顯示,所以DP引腳懸空。圖3-3-2 共陰極數(shù)碼管原理l 數(shù)碼
10、管與單片機(jī)連接圖(通過兩個(gè)74HC573鎖存器擴(kuò)展P0口并驅(qū)動(dòng)數(shù)碼管段碼和位碼):圖3-3-3 數(shù)碼管與單片機(jī)連接圖3.4 矩陣鍵盤接口電路計(jì)算器輸入數(shù)字和其他功能按鍵要用到很多按鍵,如果采用獨(dú)立按鍵的方式,在 這種情況下,編程會(huì)很簡(jiǎn)單,但是會(huì)占用大量的I/O 口資源,因此在很多情況下都不采用這種方式。為此,我們引入了矩陣鍵盤的應(yīng)用,采用四條I/O 線作為行線,四條I/O 線作為列線組成鍵盤。在行線和列線的每個(gè)交叉點(diǎn)上設(shè)置一個(gè)按鍵。這樣鍵盤上按鍵的個(gè)數(shù)就為44個(gè)。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機(jī)系統(tǒng)中I/O口的利用率。每個(gè)按鍵都有它的行值和列值,行值和列值的組合就是識(shí)別這個(gè)按鍵的編碼。矩陣
11、的行線和列線分別通過兩并行接口和CPU通信。鍵盤的一端(列線)通過電阻接VCC,而接地是通過程序輸出數(shù)字“0”實(shí)現(xiàn)的。鍵盤處理程序的任務(wù)是:確定有無鍵按下,判斷哪一個(gè)鍵按下,鍵的功能是什么?還要消除按鍵在閉合或斷開時(shí)的抖動(dòng)。兩個(gè)并行口中,一個(gè)輸出掃描碼,使按鍵逐行動(dòng)態(tài)接地;另一個(gè)并行口輸入按鍵狀態(tài),由行掃描值和回饋信號(hào)共同形成鍵編碼而識(shí)別按鍵,通過軟件查表,查出該鍵的功能。用戶設(shè)計(jì)行列鍵盤接口,一般常采用3 種方法讀取鍵值。一種是中斷式,外兩種是掃描法和反轉(zhuǎn)法。中斷式:在鍵盤按下時(shí)產(chǎn)生一個(gè)外部中斷通知CPU,并由中斷處理程序通過不同的地址讀取數(shù)據(jù)線上的狀態(tài),判斷哪個(gè)案件被按下。掃描法:對(duì)鍵盤上
12、的某一行送低電平,其他行為高電平,然后讀取列值。若列值中有一位是低,則表明該行與低電平對(duì)應(yīng)列的鍵被按下;否則,掃描下一行。反轉(zhuǎn)法:先將所有行掃描線輸出低電平,讀列值。若列值有一位是低,則表明有鍵按下,讀列值;然后所有列掃描線輸出低電平,再讀行值。根據(jù)讀到的值組合就可以查表得到的鍵碼。本次專周我們利用了反轉(zhuǎn)法來對(duì)電路進(jìn)行設(shè)計(jì),電路圖設(shè)計(jì)如下:圖3-4 4*4矩陣鍵盤電路圖將LED數(shù)碼管顯示電路和鍵盤接口電路結(jié)合起來就是計(jì)算器邏輯電路,總體結(jié)構(gòu)如下:51系列單片機(jī)系統(tǒng)4*4鍵盤LCD顯示 晶振電路復(fù)位電路總體線路原理框圖4. 軟件設(shè)計(jì)4.1 數(shù)碼管顯示程序設(shè)計(jì)數(shù)碼管由七段發(fā)光二極管組成,排列成8字
13、形狀,因此也稱為七段數(shù)碼管。為了顯示數(shù)字或符號(hào),要為數(shù)碼管提供代碼,即字形代碼。七段發(fā)光二極管,再加上一個(gè)小數(shù)點(diǎn)位,共計(jì)8段,因此提供的字形代碼的長(zhǎng)度正好是一個(gè)字節(jié)。簡(jiǎn)易計(jì)算器用到的數(shù)字09的共陰極字形代碼如下表:圖4-1 數(shù)字09的共陰極字形代碼4.2 讀鍵輸入程序?yàn)榱藢?shí)現(xiàn)鍵盤的數(shù)據(jù)輸入功能和命令處理功能,每個(gè)鍵都有其處理子程序,為此每個(gè)鍵都對(duì)應(yīng)一個(gè)碼鍵碼。為了得到被按鍵的鍵碼,現(xiàn)使用行列反轉(zhuǎn)掃描法識(shí)別按鍵,掃描原理如下:1、列線輸出全為0; 2、讀入行線值; 3、行線輸出上次讀入的值;4、讀入列線值; 5、組合 2 種讀入值。優(yōu)點(diǎn):m*n個(gè)按鍵值需要一次反轉(zhuǎn)(2 次輸入輸出)就可以檢測(cè)到結(jié)
14、果不管鍵盤矩陣的規(guī)模大小,均進(jìn)行兩次讀鍵,比逐行掃描法簡(jiǎn)單方便。將各特征編碼按希望的順序排成一張表,然后用當(dāng)前讀得的特征碼來查表。當(dāng)表中有該特征碼時(shí),它的位置就是對(duì)應(yīng)的順序編碼;當(dāng)表中沒有該特征碼時(shí),說明這是一個(gè)沒有定義的鍵碼,與沒有按鍵(0xff)同等看待。各按鍵返回值對(duì)應(yīng)表如下所示: | 1 | 2 | 3 | + | 4 | 5 | 6 | - | 7 | 8 | 9 | * | 0 | C | = | / |4.3 主程序設(shè)計(jì)首先初始化參數(shù),送LED第一位顯示“0”,其他位不顯示。然后掃描鍵盤看是否有鍵輸入,若有,讀取鍵碼。判斷鍵碼是數(shù)字鍵、清零鍵還是功能鍵(“+”“-”“*”“/”“
15、=” ),是數(shù)值鍵則送LED顯示并保存數(shù)值,是清零鍵則做清零處理,是功能鍵則又判斷是“=”還是運(yùn)算鍵,若是“=”則計(jì)算最后結(jié)果并送LED顯示,若是運(yùn)算鍵則保存相對(duì)運(yùn)算程序的鍵值。運(yùn)算主程序流程圖如下所示:初始化參數(shù)清零鍵LED顯示輸入數(shù)值讀取鍵值狀態(tài)清零數(shù)值送顯示緩存開始按鍵輸入?分析鍵值數(shù)字鍵等待數(shù)值輸入結(jié)果送顯示緩存保存結(jié)果和功能鍵根據(jù)上次功能鍵和輸入的數(shù)據(jù)計(jì)算結(jié)果功能鍵否是是數(shù)字鍵是清零鍵是功能鍵4.4 Proteus仿真圖:5. 系統(tǒng)原理圖:6. 雙層PCB制板圖7. C程序清單7.1 主函數(shù):/*- 名稱:數(shù)碼管顯示計(jì)算器-*/#include /包含頭文件 #include#inc
16、ludedisplay.h#includedelay.h#includekeyboard.h/*- 主程序-*/main() unsigned char num,i=0,sign; unsigned char temp8; /最大輸入8個(gè) bit firstflag; long a=0,b=0; unsigned char s; TempData0=DuanMa0; Init_Timer0(); /初始化定時(shí)器0while (1) /主循環(huán) num=KeyPro(); /掃描鍵盤 if(num!=0xff) /如果掃描是按鍵有效值則進(jìn)行處理 if(i=0) /輸入是第一個(gè)字符的時(shí)候需要把數(shù)碼管
17、清空,方便觀看 for(s=0;s8;s+) /賦值完成后把緩沖區(qū)清零,防止下次輸入影響結(jié)果 TempDatas=0; if(num =C) sign=0;a=b=0; /所有數(shù)據(jù)清零firstflag=0; i=0; /計(jì)數(shù)器復(fù)位for(s=0;s8;s+) temps=0;TempDatas=0; TempData0=DuanMa0; else if(+=num)| (i=8) | (-=num) | (x=num)| (/=num) | (=num)/輸入數(shù)字最大值8,輸入符號(hào)表示輸入結(jié)束 i=0; /計(jì)數(shù)器復(fù)位 if(firstflag=0) /如果是輸入的第一個(gè)數(shù)據(jù),賦值給a,并把標(biāo)
18、志位置1,到下一個(gè)數(shù)據(jù)輸入時(shí)可以跳轉(zhuǎn)賦值給b sscanf(temp,%ld,&a);/從一個(gè)字符串輸入到變量-格式化輸入 /將變量temp的值以整型數(shù)格式寫入到變量a中 / %d 是格式化符號(hào),其他類似的還有 /%f 浮點(diǎn)數(shù) %c 字符型 %s 字符串 firstflag=1; else sscanf(temp,%ld,&b); for(s=0;s=100000000|a=-10000000) /數(shù)據(jù)溢出錯(cuò)誤處理 TempData0=0x79;TempData1=0x77;TempData2=0x77;TempData3=0x3f;TempData4=0x77; /顯示“ERROR”Temp
19、Data5=0x40;TempData6=0x40;TempData7=0x71; /低位顯示出“F” else sprintf(temp,%ld,a); /打印十進(jìn)制到臨時(shí)緩沖區(qū)for(s=0;s8;s+) /由于打印的是ASCII碼值 if(temps=0) /所以需要轉(zhuǎn)換,如果為0表示null 數(shù)碼管上則不能顯示,所以賦值0TempDatas=0;else if(temps=0x2d)/表示負(fù)號(hào),數(shù)碼管顯示負(fù)號(hào) 0x40TempDatas=0x40;else TempDatas=DuanMatemps-0;/其他0-9負(fù)號(hào)則進(jìn)行ASCII 到 數(shù)字處理,如當(dāng)前是3,用3-0=3 /3的1
20、6進(jìn)制是0x33,0的16進(jìn)制是0x30 sign=0;a=b=0; /用完后所有數(shù)據(jù)清零 for(s=0;s8;s+) temps=0; elseif(i16) tempi=num+0; TempDatai=DuanManum;/輸出數(shù)據(jù) i+; /輸入數(shù)值累加 7.2 數(shù)碼管顯示函數(shù):#includedisplay.h#includedelay.h#define DataPort P0 /定義數(shù)據(jù)端口 程序中遇到DataPort 則用P0 替換/sbit LATCH1=P22;/定義鎖存使能端口 段鎖存/sbit LATCH2=P23;/ 位鎖存unsigned char code Dua
21、nMa20=0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF; / 顯示段碼值09 和 帶小數(shù)點(diǎn)的段碼值09 unsigned char code WeiMa=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/分別對(duì)應(yīng)相應(yīng)的數(shù)碼管點(diǎn)亮,即位碼unsigned char TempData8; /存儲(chǔ)顯示值的全局變量/*- 顯示函數(shù),用于動(dòng)態(tài)掃描數(shù)碼管 輸入?yún)?shù) FirstBit 表示需要顯示的第一位,如賦值2表示從第三
22、個(gè)數(shù)碼管開始顯示 如輸入0表示從第一個(gè)顯示。 Num表示需要顯示的位數(shù),如需要顯示99兩位數(shù)值則該值輸入2-*/void Display(unsigned char FirstBit,unsigned char Num) static unsigned char i=0; DataPort=0; /清空數(shù)據(jù),防止有交替重影 LATCH1=1; /段鎖存 LATCH1=0; DataPort=WeiMai+FirstBit; /取位碼 LATCH2=1; /位鎖存 LATCH2=0; DataPort=TempDatai; /取顯示數(shù)據(jù),段碼 LATCH1=1; /段鎖存 LATCH1=0; i
23、+; if(i=Num) i=0;/*- 定時(shí)器初始化子程序-*/void Init_Timer0(void) TMOD |= 0x01; /使用模式1,16位定時(shí)器,使用|符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響 /TH0=0x00; /給定初值 /TL0=0x00; EA=1; /總中斷打開 ET0=1; /定時(shí)器中斷打開 TR0=1; /定時(shí)器開關(guān)打開/*- 定時(shí)器中斷子程序-*/void Timer0_isr(void) interrupt 1 TH0=(65536-2000)/256; /重新賦值 2ms TL0=(65536-2000)%256; Display(0,8);7.3 鍵盤反
24、轉(zhuǎn)掃描函數(shù)/*- 名稱:矩陣鍵盤-*/#include /包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義#includekeyboard.h#includedelay.h#define KeyPort P1/*-按鍵掃描函數(shù),返回掃描鍵值-*/unsigned char KeyScan(void) /鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法 unsigned char cord_h,cord_l;/行列值中間變量 KeyPort=0x0f; /行線輸出全為0 cord_h=KeyPort&0x0f; /讀入列線值 &0xf0;/與,將低四位屏蔽 if(cord_h!=0x0f) /先檢
25、測(cè)有無按鍵按下 DelayMs(10); /去抖 if(KeyPort&0x0f)!=0x0f) cord_h=KeyPort&0x0f; /讀入列線值 KeyPort=cord_h|0xf0; /輸出當(dāng)前列線值 cord_l=KeyPort&0xf0; /讀入行線值 while(KeyPort&0xf0)!=0xf0);/等待松開并輸出 return(cord_h+cord_l);/鍵盤最后組合碼值 return(0xff); /返回該值/*- 按鍵值處理函數(shù),返回掃鍵值 可以根據(jù)需要改變返回值 | 1 | 2 | 3 | + | | 4 | 5 | 6 | - | | 7 | 8 | 9
26、| * | | 0 | C | = | / | -*/unsigned char KeyPro(void) switch(KeyScan() case 0x7e:return +;break;/0 按下相應(yīng)的鍵顯示相對(duì)應(yīng)的碼值 case 0x7d:return -;break;/1 case 0x7b:return x;break;/2 case 0x77:return /;break;/3 case 0xbe:return 3 ;break;/4 case 0xbd:return 6 ;break;/5 case 0xbb:return 9 ;break;/6 case 0xb7:retur
27、n =;break;/7 case 0xde:return 2 ;break;/8 case 0xdd:return 5 ;break;/9 case 0xdb:return 8 ;break;/a case 0xd7:return C;break;/b . C case 0xee:return 1 ;break;/c case 0xed:return 4 ;break;/d case 0xeb:return 7 ;break;/e case 0xe7:return 0 ;break;/f default:return 0xff;break; 8. 總結(jié)體會(huì)為期一周多的單片機(jī)課程設(shè)計(jì)終于結(jié)束了
28、,通過緊張的工作,完成了我們的設(shè)計(jì)任務(wù)-51單片機(jī)計(jì)算器??偟膩碚f,這次課程設(shè)計(jì)是比較成功的。當(dāng)然,這其中也經(jīng)歷了許多坎坷,但是在我們小組的堅(jiān)持不懈下,在老師的細(xì)心指導(dǎo)下,在同學(xué)們的熱情幫助下,最終克服了種種困難,取得了成功。剛開始接到這個(gè)計(jì)算器的課程設(shè)計(jì)任務(wù)時(shí),因?yàn)橐郧白鲞^類似的題目,于是在腦海中初步構(gòu)建了編寫程序的一些控制程序。但是由于缺乏編寫大量程序的經(jīng)驗(yàn),不能如行云流水般的將全部的各部分代碼寫出,于是去網(wǎng)上查找相關(guān)資料,了解計(jì)算器的輸入控制原理、運(yùn)算處理以及顯示的原理。了解之后自己嘗試編寫程序,在此過程中,其中鍵盤掃描和動(dòng)態(tài)掃描顯示掃描程序困擾了我很久,經(jīng)過兩三天的辛苦工作,終于初步把
29、所需要的程序編好了,于是就用Keil uversion4進(jìn)行仿真,在仿真期間也發(fā)現(xiàn)了許多錯(cuò)誤,基本上都是平日容易犯的錯(cuò)誤,比如忘記了子程序標(biāo)號(hào)、死循環(huán)程序、標(biāo)點(diǎn)符號(hào)的漏寫等。經(jīng)過反復(fù)的編譯差錯(cuò),仿真編譯通過后,于是開始在Proteus中連接電路,全部接完電路之后將Keil生成的.Hex文件導(dǎo)入進(jìn)行仿真,發(fā)現(xiàn)軟件與硬件不能夠?qū)?yīng)協(xié)調(diào)工作,于是分別對(duì)軟件和硬件進(jìn)行檢查,經(jīng)過反復(fù)的仿真調(diào)試,并且在同學(xué)的幫助和自己對(duì)每個(gè)子程序進(jìn)行仿真觀察下,終于把初步的程序調(diào)試出來了。這就是我調(diào)試的經(jīng)過,看似簡(jiǎn)單,過程卻曲折艱辛:編寫軟件時(shí)我用的是數(shù)字和字符串之間的轉(zhuǎn)換來實(shí)現(xiàn)數(shù)碼管各位的分別顯示,即把按鍵掃描到的鍵值
30、numt加0放到tempi中:tempi=num+0,當(dāng)數(shù)字錄入完畢就把字符串將變量temp的值以整型數(shù)格式寫入到變量a和變量b中:sscanf(temp,%d,&a);sscanf(temp,%d,&b);進(jìn)行計(jì)算后(如:a=a+b),再把十進(jìn)制數(shù)a打印到臨時(shí)緩沖區(qū): sprintf(temp,%d,a); 方便存儲(chǔ)顯示值的全局變量TempDatai進(jìn)行賦值:for(s=0;s8;s+)TempDatas=DuanMatemps-0; /進(jìn)行ASCII 到 數(shù)字 處理但是我們的數(shù)碼管是8位的,當(dāng)數(shù)據(jù)大于65536時(shí),計(jì)算結(jié)果就會(huì)顯示不正常,我把a(bǔ)和b的數(shù)據(jù)類型從int改為long長(zhǎng)整型還是不行,最后我把所有的%d
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版企業(yè)破產(chǎn)重整合同
- 2024年度無息個(gè)人婚禮籌備借款協(xié)議書下載3篇
- 2025年日喀則貨運(yùn)資格證模擬考試
- 2024年停薪留職期間員工社會(huì)保險(xiǎn)及福利協(xié)議合同3篇
- 2025購(gòu)房合同的范本 購(gòu)房合同樣本
- 2025年柳州貨運(yùn)從業(yè)資格證考試卷
- 洛陽理工學(xué)院《內(nèi)科護(hù)理學(xué)2》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年墓地環(huán)境優(yōu)化協(xié)議3篇
- 汽車俱樂部噴泉建設(shè)合同
- 2024年度家電品牌全國(guó)巡回展銷合同范本3篇
- 【MOOC】法理學(xué)-西南政法大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 遼寧省普通高中2024-2025學(xué)年高一上學(xué)期12月聯(lián)合考試語文試題(含答案)
- 儲(chǔ)能運(yùn)維安全注意事項(xiàng)
- 2024蜀繡行業(yè)市場(chǎng)趨勢(shì)分析報(bào)告
- 電力法律法規(guī)培訓(xùn)
- 2024年世界職業(yè)院校技能大賽“智能網(wǎng)聯(lián)汽車技術(shù)組”參考試題庫(含答案)
- 【課件】校園安全系列之警惕“死亡游戲”主題班會(huì)課件
- 化工企業(yè)冬季安全生產(chǎn)檢查表格
- 2024年工程勞務(wù)分包聯(lián)合協(xié)議
- 蜜雪冰城員工合同模板
- 廣東省深圳市龍崗區(qū)2024-2025學(xué)年三年級(jí)上學(xué)期11月期中數(shù)學(xué)試題(含答案)
評(píng)論
0/150
提交評(píng)論