




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、單片機原理及應用課程設計報告設計題目: D題 計算器 系 別 : 電子信息工程 學生姓名: 李 慶 班 級: 1202014 學 號: 29 成 績: 指導教師: 李壽強、傅林 開課時間: 2014-2015 學年第 一 學期目錄摘 要21.引言22.系統方案22.1方案論證與選擇22.2單片機及其它器件選型22.3系統整體框圖22.4主要技術指標33.硬件設計33.1整個單片機的接口電路33.2最小系統原理圖33.3數碼管接口電路43.4矩陣鍵盤接口電路64.軟件設計74.1數碼管顯示程序設計74.2讀鍵輸入程序84.3主程序設計84.4Proteus仿真圖:105.系統原理圖:106.雙層
2、PCB制版圖117.C程序清單117.1主函數:117.2數碼管顯示函數:157.3鍵盤反轉掃描函數178.總結體會199.參考文獻20摘 要本文運用MCS51單片機系統設計的簡易計算器,實現了通過檢測不同數字鍵、功能鍵的按下,可以進行加減乘除運算。對應每一個數字鍵按下的同時,數碼管顯示按下鍵所對應的值,并顯示最后的運算結果。 關鍵詞:簡易計算器, 89c51單片機,數碼管1. 引言計算器因其功能強大而早已成為人們日常生活中必不可少的工具,最簡單的計算器就能實現簡單的加減乘除運算,這讓人們免去了復雜的計算過程,大大提高了工作效率。隨著社會科技的發展和進步,計算器的功能更加完善,不僅能實現簡單的
3、運算,還能對復雜的數學問題進行求解。2. 系統方案2.1 方案論證與選擇本設計是基于52系列單片機來進行的數字計算器系統設計,可以完成計算器的鍵盤輸入,鍵盤電路采用4*4矩陣鍵盤電路,進行加、減、乘、除基本四則運算,并在4位共陰極數碼管顯示相應的結果;設計電路采用STC89C52單片機為主要控制芯片,利用軟件方面使用C語言編程,并用Protues仿真。2.2 單片機及其它器件選型本系統選用以STC89C52C單片機為主控機。通過擴展必要的外圍接口電路,實現對計算器的設計。系統模塊圖如下圖2圖2-2系統模塊圖2.3 系統整體框圖圖2-3 系統模塊圖2.4 主要技術指標本文利用MCS51單片機系統
4、設計的簡易計算器,能夠實現以下功能:1)、利用鍵盤及8位數碼管作為計算器的輸入及顯示模塊;2)、能進行加、減、乘、除的基本運算;3)、有清零、數據溢出錯誤處理3. 硬件設計單片機微型計算機是微型計算機的一個重要分支,也是頗具生命力的機種。單片機微型計算機簡稱單片機,特別適用于控制領域,故又稱為微控制器。通常,單片機由單塊集成電路芯片構成,內部包含有計算機的基本功能部件:中央處理器、存儲器和I/O接口電路等。因此,單片機只需要和適當的軟件及外部設備相結合,便可成為一個單片機控制系統。通常,單片機由單個集成電路芯片構成,內部包含有計算機的基本功能部件,中央處理器,存儲器和I/O接口電路等。因此,單
5、片機只需要和適當的軟件及外部設備相結合,便可成為一個單片機控制系統。隨著社會的發展,科學的進步,人們的生活水平在逐步的提高,尤其是微電子技術的發展,猶如雨后春筍般的變化。單片機的應用已經越來越貼近生活,用單片機來實現一些電子設計也變得容易起來。計算器在人們的日常中是比較的常見的電子產品之一。可是它還在發展之中,以后必將出現功能更加強大的計算器,基于這樣的理念,本次專周設計是用單片機來設計的計算器。3.1 整個單片機的接口電路P0口通過兩個74LS573鎖存器用于數碼管顯示輸出以及數碼管位選控制;P1口用于4*4矩陣鍵掃描輸入;P22位定義鎖存使能端口的段鎖存;P23位定義鎖存使能端口的位鎖存。
6、3.2 最小系統原理圖最小系統由震蕩電路、復位電路、輸入輸出設備、電源和單片機芯片組成。圖4 最小系統原理圖n 復位電路單片機復位電路就好比電腦的重啟部分,當電腦在使用中出現死機,按下重啟按鈕電腦內部的程序從頭開始執行。單片機也一樣,當單片機系統在運行中,受到環境干擾出現程序跑飛的時候,按下復位按鈕內部的程序自動從頭開始。復位原理單片機復位時只要保持RST引腳接大于兩個機器周期的高電平即可。在單片機啟動0.1S后,電容C兩端的電壓持續充電為5V,這是時候10K電阻兩端的電壓接近于0V,RST處于低電平所以系統正常工作。當按鍵按下的時候,開關導通,這個時候電容兩端形成了一個回路,電容被短路,所以
7、在按鍵按下的這個過程中,電容開始釋放之前充的電量。隨著時間的推移,電容的電壓在0.1S內,從5V釋放到變為了1.5V,甚至更小。根據串聯電路電壓為各處之和,這個時候10K電阻兩端的電壓為3.5V,甚至更大,所以RST引腳又接收到高電平。單片機系統自動復位。圖3-2-1 單片機復位電路n 單片機振蕩電路外接晶振引腳XTAL1和TXAL2接外部晶振和微調電容的一端。振蕩電路的頻率就是晶體的固有頻率。晶振電路結合單片機內部電路產生單片機所需的時鐘頻率。晶振提高頻率越高,單片機運行速度越快。單片機一切指令的執行都是建立在晶振提供的時鐘頻率上。圖3-2-2 單片機振蕩電路3.3 數碼管接口電路數碼管按段
8、數分為七段數碼管和八段數碼管,八段數碼管比七段數碼管多一個發光二極管單元(即多一個小數點顯示);按能顯示多少個“8”可分為1位、2位、4位等等數碼管;按發光二極管單元連接方式分為共陽極數碼管和共陰極數碼管。共陽數碼管是指將所有發光二極管的陽極接到一起形成公共陽極(COM)的數碼管。共陽數碼管在應用時應將公共極COM接到+5V,當某一字段發光二極管的陰極為低電平時,相應字段就點亮。當某一字段的陰極為高電平時,相應字段就不亮。共陰數碼管是指將所有發光二極管的陰極接到一起形成公共陰極(COM)的數碼管。共陰數碼管在應用時應將公共極COM接到地線GND上,當某一字段發光二極管的陽極為高電平時,相應字段
9、就點亮。當某一字段的陽極為低電平時,相應字段就不亮。陰極數碼管是把所有LED的陰極連接到共同接點com,而每個LED的陽極分別為a、b、c、d、e、f、g及dp(小數點),如下圖所示。圖中的8個LED分別和上面那個圖中的ADP各段相對應,通過控制各個LED的亮滅來顯示數字。當某一字段發光二極管的陽極為高電平時,相應字段就點亮。當某一字段的陽極為低電平時,相應字段就不亮。圖3-3-1 共陰極數碼管引腳接線l 數碼管顯示部分的實現:數碼管通過PO口輸入高低電平控制每個LED燈的亮滅,公共端接地線P0口接1K的上拉電阻。由于并未用到小數點顯示,所以DP引腳懸空。圖3-3-2 共陰極數碼管原理l 數碼
10、管與單片機連接圖(通過兩個74HC573鎖存器擴展P0口并驅動數碼管段碼和位碼):圖3-3-3 數碼管與單片機連接圖3.4 矩陣鍵盤接口電路計算器輸入數字和其他功能按鍵要用到很多按鍵,如果采用獨立按鍵的方式,在 這種情況下,編程會很簡單,但是會占用大量的I/O 口資源,因此在很多情況下都不采用這種方式。為此,我們引入了矩陣鍵盤的應用,采用四條I/O 線作為行線,四條I/O 線作為列線組成鍵盤。在行線和列線的每個交叉點上設置一個按鍵。這樣鍵盤上按鍵的個數就為44個。這種行列式鍵盤結構能有效地提高單片機系統中I/O口的利用率。每個按鍵都有它的行值和列值,行值和列值的組合就是識別這個按鍵的編碼。矩陣
11、的行線和列線分別通過兩并行接口和CPU通信。鍵盤的一端(列線)通過電阻接VCC,而接地是通過程序輸出數字“0”實現的。鍵盤處理程序的任務是:確定有無鍵按下,判斷哪一個鍵按下,鍵的功能是什么?還要消除按鍵在閉合或斷開時的抖動。兩個并行口中,一個輸出掃描碼,使按鍵逐行動態接地;另一個并行口輸入按鍵狀態,由行掃描值和回饋信號共同形成鍵編碼而識別按鍵,通過軟件查表,查出該鍵的功能。用戶設計行列鍵盤接口,一般常采用3 種方法讀取鍵值。一種是中斷式,外兩種是掃描法和反轉法。中斷式:在鍵盤按下時產生一個外部中斷通知CPU,并由中斷處理程序通過不同的地址讀取數據線上的狀態,判斷哪個案件被按下。掃描法:對鍵盤上
12、的某一行送低電平,其他行為高電平,然后讀取列值。若列值中有一位是低,則表明該行與低電平對應列的鍵被按下;否則,掃描下一行。反轉法:先將所有行掃描線輸出低電平,讀列值。若列值有一位是低,則表明有鍵按下,讀列值;然后所有列掃描線輸出低電平,再讀行值。根據讀到的值組合就可以查表得到的鍵碼。本次專周我們利用了反轉法來對電路進行設計,電路圖設計如下:圖3-4 4*4矩陣鍵盤電路圖將LED數碼管顯示電路和鍵盤接口電路結合起來就是計算器邏輯電路,總體結構如下:51系列單片機系統4*4鍵盤LCD顯示 晶振電路復位電路總體線路原理框圖4. 軟件設計4.1 數碼管顯示程序設計數碼管由七段發光二極管組成,排列成8字
13、形狀,因此也稱為七段數碼管。為了顯示數字或符號,要為數碼管提供代碼,即字形代碼。七段發光二極管,再加上一個小數點位,共計8段,因此提供的字形代碼的長度正好是一個字節。簡易計算器用到的數字09的共陰極字形代碼如下表:圖4-1 數字09的共陰極字形代碼4.2 讀鍵輸入程序為了實現鍵盤的數據輸入功能和命令處理功能,每個鍵都有其處理子程序,為此每個鍵都對應一個碼鍵碼。為了得到被按鍵的鍵碼,現使用行列反轉掃描法識別按鍵,掃描原理如下:1、列線輸出全為0; 2、讀入行線值; 3、行線輸出上次讀入的值;4、讀入列線值; 5、組合 2 種讀入值。優點:m*n個按鍵值需要一次反轉(2 次輸入輸出)就可以檢測到結
14、果不管鍵盤矩陣的規模大小,均進行兩次讀鍵,比逐行掃描法簡單方便。將各特征編碼按希望的順序排成一張表,然后用當前讀得的特征碼來查表。當表中有該特征碼時,它的位置就是對應的順序編碼;當表中沒有該特征碼時,說明這是一個沒有定義的鍵碼,與沒有按鍵(0xff)同等看待。各按鍵返回值對應表如下所示: | 1 | 2 | 3 | + | 4 | 5 | 6 | - | 7 | 8 | 9 | * | 0 | C | = | / |4.3 主程序設計首先初始化參數,送LED第一位顯示“0”,其他位不顯示。然后掃描鍵盤看是否有鍵輸入,若有,讀取鍵碼。判斷鍵碼是數字鍵、清零鍵還是功能鍵(“+”“-”“*”“/”“
15、=” ),是數值鍵則送LED顯示并保存數值,是清零鍵則做清零處理,是功能鍵則又判斷是“=”還是運算鍵,若是“=”則計算最后結果并送LED顯示,若是運算鍵則保存相對運算程序的鍵值。運算主程序流程圖如下所示:初始化參數清零鍵LED顯示輸入數值讀取鍵值狀態清零數值送顯示緩存開始按鍵輸入?分析鍵值數字鍵等待數值輸入結果送顯示緩存保存結果和功能鍵根據上次功能鍵和輸入的數據計算結果功能鍵否是是數字鍵是清零鍵是功能鍵4.4 Proteus仿真圖:5. 系統原理圖:6. 雙層PCB制板圖7. C程序清單7.1 主函數:/*- 名稱:數碼管顯示計算器-*/#include /包含頭文件 #include#inc
16、ludedisplay.h#includedelay.h#includekeyboard.h/*- 主程序-*/main() unsigned char num,i=0,sign; unsigned char temp8; /最大輸入8個 bit firstflag; long a=0,b=0; unsigned char s; TempData0=DuanMa0; Init_Timer0(); /初始化定時器0while (1) /主循環 num=KeyPro(); /掃描鍵盤 if(num!=0xff) /如果掃描是按鍵有效值則進行處理 if(i=0) /輸入是第一個字符的時候需要把數碼管
17、清空,方便觀看 for(s=0;s8;s+) /賦值完成后把緩沖區清零,防止下次輸入影響結果 TempDatas=0; if(num =C) sign=0;a=b=0; /所有數據清零firstflag=0; i=0; /計數器復位for(s=0;s8;s+) temps=0;TempDatas=0; TempData0=DuanMa0; else if(+=num)| (i=8) | (-=num) | (x=num)| (/=num) | (=num)/輸入數字最大值8,輸入符號表示輸入結束 i=0; /計數器復位 if(firstflag=0) /如果是輸入的第一個數據,賦值給a,并把標
18、志位置1,到下一個數據輸入時可以跳轉賦值給b sscanf(temp,%ld,&a);/從一個字符串輸入到變量-格式化輸入 /將變量temp的值以整型數格式寫入到變量a中 / %d 是格式化符號,其他類似的還有 /%f 浮點數 %c 字符型 %s 字符串 firstflag=1; else sscanf(temp,%ld,&b); for(s=0;s=100000000|a=-10000000) /數據溢出錯誤處理 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); /打印十進制到臨時緩沖區for(s=0;s8;s+) /由于打印的是ASCII碼值 if(temps=0) /所以需要轉換,如果為0表示null 數碼管上則不能顯示,所以賦值0TempDatas=0;else if(temps=0x2d)/表示負號,數碼管顯示負號 0x40TempDatas=0x40;else TempDatas=DuanMatemps-0;/其他0-9負號則進行ASCII 到 數字處理,如當前是3,用3-0=3 /3的1
20、6進制是0x33,0的16進制是0x30 sign=0;a=b=0; /用完后所有數據清零 for(s=0;s8;s+) temps=0; elseif(i16) tempi=num+0; TempDatai=DuanManum;/輸出數據 i+; /輸入數值累加 7.2 數碼管顯示函數:#includedisplay.h#includedelay.h#define DataPort P0 /定義數據端口 程序中遇到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 和 帶小數點的段碼值09 unsigned char code WeiMa=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/分別對應相應的數碼管點亮,即位碼unsigned char TempData8; /存儲顯示值的全局變量/*- 顯示函數,用于動態掃描數碼管 輸入參數 FirstBit 表示需要顯示的第一位,如賦值2表示從第三
22、個數碼管開始顯示 如輸入0表示從第一個顯示。 Num表示需要顯示的位數,如需要顯示99兩位數值則該值輸入2-*/void Display(unsigned char FirstBit,unsigned char Num) static unsigned char i=0; DataPort=0; /清空數據,防止有交替重影 LATCH1=1; /段鎖存 LATCH1=0; DataPort=WeiMai+FirstBit; /取位碼 LATCH2=1; /位鎖存 LATCH2=0; DataPort=TempDatai; /取顯示數據,段碼 LATCH1=1; /段鎖存 LATCH1=0; i
23、+; if(i=Num) i=0;/*- 定時器初始化子程序-*/void Init_Timer0(void) TMOD |= 0x01; /使用模式1,16位定時器,使用|符號可以在使用多個定時器時不受影響 /TH0=0x00; /給定初值 /TL0=0x00; EA=1; /總中斷打開 ET0=1; /定時器中斷打開 TR0=1; /定時器開關打開/*- 定時器中斷子程序-*/void Timer0_isr(void) interrupt 1 TH0=(65536-2000)/256; /重新賦值 2ms TL0=(65536-2000)%256; Display(0,8);7.3 鍵盤反
24、轉掃描函數/*- 名稱:矩陣鍵盤-*/#include /包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義#includekeyboard.h#includedelay.h#define KeyPort P1/*-按鍵掃描函數,返回掃描鍵值-*/unsigned char KeyScan(void) /鍵盤掃描函數,使用行列反轉掃描法 unsigned char cord_h,cord_l;/行列值中間變量 KeyPort=0x0f; /行線輸出全為0 cord_h=KeyPort&0x0f; /讀入列線值 &0xf0;/與,將低四位屏蔽 if(cord_h!=0x0f) /先檢
25、測有無按鍵按下 DelayMs(10); /去抖 if(KeyPort&0x0f)!=0x0f) cord_h=KeyPort&0x0f; /讀入列線值 KeyPort=cord_h|0xf0; /輸出當前列線值 cord_l=KeyPort&0xf0; /讀入行線值 while(KeyPort&0xf0)!=0xf0);/等待松開并輸出 return(cord_h+cord_l);/鍵盤最后組合碼值 return(0xff); /返回該值/*- 按鍵值處理函數,返回掃鍵值 可以根據需要改變返回值 | 1 | 2 | 3 | + | | 4 | 5 | 6 | - | | 7 | 8 | 9
26、| * | | 0 | C | = | / | -*/unsigned char KeyPro(void) switch(KeyScan() case 0x7e:return +;break;/0 按下相應的鍵顯示相對應的碼值 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. 總結體會為期一周多的單片機課程設計終于結束了
28、,通過緊張的工作,完成了我們的設計任務-51單片機計算器。總的來說,這次課程設計是比較成功的。當然,這其中也經歷了許多坎坷,但是在我們小組的堅持不懈下,在老師的細心指導下,在同學們的熱情幫助下,最終克服了種種困難,取得了成功。剛開始接到這個計算器的課程設計任務時,因為以前做過類似的題目,于是在腦海中初步構建了編寫程序的一些控制程序。但是由于缺乏編寫大量程序的經驗,不能如行云流水般的將全部的各部分代碼寫出,于是去網上查找相關資料,了解計算器的輸入控制原理、運算處理以及顯示的原理。了解之后自己嘗試編寫程序,在此過程中,其中鍵盤掃描和動態掃描顯示掃描程序困擾了我很久,經過兩三天的辛苦工作,終于初步把
29、所需要的程序編好了,于是就用Keil uversion4進行仿真,在仿真期間也發現了許多錯誤,基本上都是平日容易犯的錯誤,比如忘記了子程序標號、死循環程序、標點符號的漏寫等。經過反復的編譯差錯,仿真編譯通過后,于是開始在Proteus中連接電路,全部接完電路之后將Keil生成的.Hex文件導入進行仿真,發現軟件與硬件不能夠對應協調工作,于是分別對軟件和硬件進行檢查,經過反復的仿真調試,并且在同學的幫助和自己對每個子程序進行仿真觀察下,終于把初步的程序調試出來了。這就是我調試的經過,看似簡單,過程卻曲折艱辛:編寫軟件時我用的是數字和字符串之間的轉換來實現數碼管各位的分別顯示,即把按鍵掃描到的鍵值
30、numt加0放到tempi中:tempi=num+0,當數字錄入完畢就把字符串將變量temp的值以整型數格式寫入到變量a和變量b中:sscanf(temp,%d,&a);sscanf(temp,%d,&b);進行計算后(如:a=a+b),再把十進制數a打印到臨時緩沖區: sprintf(temp,%d,a); 方便存儲顯示值的全局變量TempDatai進行賦值:for(s=0;s8;s+)TempDatas=DuanMatemps-0; /進行ASCII 到 數字 處理但是我們的數碼管是8位的,當數據大于65536時,計算結果就會顯示不正常,我把a和b的數據類型從int改為long長整型還是不行,最后我把所有的%d
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 停業通知的司法實踐-洞察及研究
- 楷書硬筆、毛筆書法技法系統化教程
- 發酵技術的基礎原理與應用分析
- 文化產業發展融資模式探究
- 自然辯證法考試重點與難點總結
- 多維度特征提取在電力系統擾動識別中的應用
- 內部資金調劑管理辦法
- 生物炭與有機肥配施對土壤健康及設施栽培黃瓜生長的影響機制研究
- 安全運輸操作規程與案例分析
- PCR實驗室管理與標準化操作流程
- GB/T 45698-2025物業服務客戶滿意度測評
- 2025年新高考1卷(新課標Ⅰ卷)語文試卷(含答案)
- 本土品牌“品牌年輕化”策略研究
- 湖南省永州市寧遠縣2025屆七年級數學第二學期期末達標檢測試題含解析
- 創新人才小升初試題及答案
- 2025年行政管理期末試題及答案
- 胰島素筆的使用操作流程
- 九年級化學上冊(滬教版2024)新教材解讀課件大綱
- 江山南方水泥有限公司浙江省江山市大陳鄉烏龍村鐵錘山水泥用灰巖礦建設項目環境影響報告表
- 小學語文主題教學論:理論重塑與創新實踐
- 工程框架協議合同協議
評論
0/150
提交評論