基于51單片機(jī)的簡易計(jì)算器2_第1頁
基于51單片機(jī)的簡易計(jì)算器2_第2頁
基于51單片機(jī)的簡易計(jì)算器2_第3頁
基于51單片機(jī)的簡易計(jì)算器2_第4頁
基于51單片機(jī)的簡易計(jì)算器2_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、0基于 51 單片機(jī)的計(jì)算器設(shè)計(jì)2015 年 5 月 1 日1目錄目錄摘 要.3一、 前言.41) 主要的問題及目標(biāo):.42) 針對上述目標(biāo),做出以下的設(shè)計(jì):.43) 系統(tǒng)設(shè)計(jì)依據(jù):.4二、 系統(tǒng)方案設(shè)計(jì).41. 方案一.52. 方案二.5三、 理論分析與計(jì)算.6四、 系統(tǒng)電路設(shè)計(jì).61. 顯示模塊.62. 輸入模塊.73. 控制模塊.84. 元器件的選擇.95. 特殊器件的簡介.96. 各單元模塊的連接.9五、 系統(tǒng)軟件設(shè)計(jì).101. 設(shè)計(jì)原理.102. 程序結(jié)構(gòu)框圖.103. 程序流程框圖.11六、 系統(tǒng)測試.131 測試方法.142 計(jì)算器功能測試.143 測試結(jié)果分析.14七、 結(jié)束語

2、.1521. 心得感悟.152. 改進(jìn)的設(shè)想.15八、 附錄.151. 系統(tǒng)設(shè)計(jì)圖.152. 設(shè)計(jì)程序.15摘 要電子計(jì)算器是日常生活中常用的電子計(jì)算儀器,他廣泛應(yīng)用于超市、大中型商場、大小企業(yè)與學(xué)校中。具有精度高。體積小、應(yīng)用范圍廣泛、易于操作等優(yōu)點(diǎn)。本作品以 MCS-51 系列中的 AT89C51 單片機(jī)為核心,能夠?qū)崿F(xiàn)單步加、減、乘、除運(yùn)算。該系統(tǒng)通過檢測矩陣鍵盤掃描,判斷是否按鍵,實(shí)現(xiàn)對 4*4 鍵盤掃描進(jìn)行實(shí)時的按鍵檢測,并把檢測數(shù)據(jù)存儲下來。經(jīng)數(shù)據(jù)轉(zhuǎn)換把數(shù)值送入lcd1602 液晶屏顯示。整個計(jì)算器系統(tǒng)的工作過程為:首先存儲單元初始化,顯示初始值和鍵盤掃描,判斷按鍵位置,查表得出按

3、鍵值,單片機(jī)則對數(shù)據(jù)進(jìn)行儲存與相應(yīng)處理轉(zhuǎn)換,之后送入 lcd1602 顯示。整個系統(tǒng)可分為三個主要功能模塊:功能模塊一,實(shí)時鍵盤掃描;功能模塊二,數(shù)據(jù)轉(zhuǎn)換為了數(shù)碼管顯示;功能模塊三,lcd1602 顯示。能實(shí)現(xiàn) 6 位或 6 位以內(nèi)的精確運(yùn)算,若輸出數(shù)據(jù)超過 6 位則會以科學(xué)計(jì)數(shù)法顯示。關(guān)鍵詞:關(guān)鍵詞:AT89C51 單片機(jī);計(jì)算器;加減乘除;矩陣鍵盤;液晶屏31、前言本設(shè)計(jì)是基于 51 系列單片機(jī)來進(jìn)行的數(shù)字計(jì)算器系統(tǒng)設(shè)計(jì),可以完成計(jì)算器的鍵盤輸入,進(jìn)行加、減、乘、除基本四則運(yùn)算,并在 LCD 上顯示相應(yīng)的結(jié)果;設(shè)計(jì)電路采用 STC89C51 單片機(jī)為主要控制電路,顯示采用1602LCD 顯

4、示;軟件方面使用 C 語言編程。最后用 PROSE99 畫 PCB,焊接萬用板,進(jìn)行硬件調(diào)試。1) 主要的問題及目標(biāo):鍵盤輸入數(shù)值顯示能實(shí)現(xiàn)加、減、乘、除四則運(yùn)算;可計(jì)算小數(shù),負(fù)數(shù);當(dāng)計(jì)算器執(zhí)行過程中有錯誤時,會在液晶屏上做出相應(yīng)的提示。當(dāng)除數(shù)為 0 時,程序運(yùn)算出錯,液晶屏?xí)@示+INF。2) 針對上述目標(biāo),做出以下的設(shè)計(jì):以 STC89C51 位主控芯片,P0 口連接 1602 液晶屏,P1 口連接 4*4 矩陣鍵盤。將所有輸入數(shù)據(jù)已浮點(diǎn)型進(jìn)行運(yùn)算,故最大輸入數(shù)據(jù)為 16 位。為了更好的顯示效果使用采用 1602 液晶屏作為顯示模塊。由于按鍵包含數(shù)字鍵“09”與“+”“-”“*”“/”“.

5、”“=”這16 個按鍵。故以 4*4 矩陣鍵盤作為輸入模塊。以 3 節(jié)串聯(lián)的 5 號電池作為電源。3) 系統(tǒng)設(shè)計(jì)依據(jù):實(shí)用性可靠性美觀性42、系統(tǒng)方案設(shè)計(jì)1. 方案一顯示模塊采用數(shù)碼管,數(shù)值只能顯示一行,且無法顯示“+”“*”“/”“=”等符號。使用效果欠佳。電源模塊采用USB,電壓為5.0V,符合單片機(jī)的要求。但使計(jì)算器不方便使用,必須通過USB通電,實(shí)用性不強(qiáng)。功能設(shè)計(jì)中添加復(fù)位鍵,可以使電路恢復(fù)到起始狀態(tài),確保微機(jī)系統(tǒng)中穩(wěn)定可靠,避免計(jì)算器出現(xiàn)“死機(jī)”“程序走飛”等現(xiàn)象。但添加復(fù)位鍵會使計(jì)算器顯得繁瑣。雙精度型(double ),占用64位的存儲空間。在操作值很大的數(shù)字時,雙精度型是最好

6、的選擇。2. 方案二顯示模塊:數(shù)碼管電源模塊:USB功能設(shè)計(jì):有復(fù)位鍵數(shù)據(jù)類型:雙精度浮點(diǎn)型電源模塊:USB顯示模塊:1602lcd電源模塊:電池盒功能設(shè)計(jì):上電復(fù)位數(shù)據(jù)類型:單精度浮點(diǎn)型方案一方案二5以1602lcd作為顯示器,可顯示雙行數(shù)據(jù),還可以顯示多種運(yùn)算符號。實(shí)用性強(qiáng),便于計(jì)算器的升級。將獨(dú)立電源盒作為電源,以3節(jié)5號電池串聯(lián),電壓可達(dá)4.5V,可以使單片機(jī)正常工作。并且易于攜帶,給使用者帶來很大便利。采用上電復(fù)位,將復(fù)位電路與電源開關(guān)結(jié)合。既可以確保微機(jī)系統(tǒng)中穩(wěn)定可靠的運(yùn)行,又使計(jì)算器更為精簡。 單精度浮點(diǎn)型(float )專指占用32位存儲空間的單精度值。單精度在一些處理器上比雙

7、精度更快而且只占用雙精度一半的空間,但是當(dāng)值很大或很小的時候,它將變得不精確。當(dāng)你需要小數(shù)部分并且對精度的要求不高時,單精度浮點(diǎn)型的變量是有用的。結(jié)合上述考慮論證,小組采用方案二作為計(jì)算器系統(tǒng)的設(shè)計(jì)方案。結(jié)合上述考慮論證,小組采用方案二作為計(jì)算器系統(tǒng)的設(shè)計(jì)方案。3、理論分析與計(jì)算本作品為了要實(shí)現(xiàn)鍵盤輸入,液晶顯示屏輸出,加、減、乘、除計(jì)算,上電復(fù)位等功能。小組做出以下的分析與計(jì)算:將4*4矩陣鍵盤連接到單片機(jī)的P1口上,液晶顯示屏連接到P0口上。并在軟件中用矩陣鍵盤掃描程序?qū)ζ鋵?shí)時檢測,將鍵盤輸入的數(shù)據(jù)顯示到液晶屏上,并通過運(yùn)算程序計(jì)算,最終將計(jì)算結(jié)果輸出到液晶屏上。將輸入與輸出數(shù)據(jù)以單精度浮

8、點(diǎn)型定義,以%g或%f顯示輸出數(shù)據(jù),可顯示精確數(shù)字或以科學(xué)計(jì)數(shù)法表示。64、系統(tǒng)電路設(shè)計(jì)1. 顯示模塊液晶顯示器(LCD)的主要原理是一電流刺激液晶分子產(chǎn)生點(diǎn)、線、面并配合背部燈管構(gòu)成畫面。本系統(tǒng)采用的1602液晶為5V電壓驅(qū)動,帶背光,可顯示兩行,每行16個字符,能顯示漢字,內(nèi)置128個字符的ASCII字符集字庫,只有并行接口,無串行接口。2. 輸入模塊4*4矩陣鍵盤將16個按鍵排成4行4列,第一行將每個按鍵的一端連在一起構(gòu)成行線,第一列將每個按鍵的另一端連接在一起構(gòu)成列線,共有4行4列8根線,將這八根線接到單片機(jī)的8個I/O口上,通過程序掃描鍵盤就可檢測16個鍵。73. 控制模塊 AT89

9、C51 是一種帶 4K 字節(jié) FLASH 存儲器(FPEROMFlash Programmable and Erasable Read Only Memory)的低電壓、高性能 CMOS 8 位微處理器,俗稱單片機(jī)。AT89C51 是一種帶 2K 字節(jié)閃存可編程可擦除只讀存儲器的單片機(jī)。單片機(jī)的可擦除只讀存儲器可以反復(fù)擦除 1000 次。該器件采用 ATMEL 高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的 MCS-51 指令集和輸出管腳相兼容。由于將多功能 8 位 CPU 和閃爍存儲器組合在單個芯片中,ATMEL 的 AT89C51 是一種高效微控制器,AT89C51 是它的一種精簡版本。AT

10、89C51 單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價(jià)廉的方案。84. 元器件的選擇1602LCD、4*4矩陣鍵盤、10千歐排阻、自鎖開關(guān)、20pF電容、12MHZ晶振、103千歐電位器。5. 特殊器件的簡介自鎖開關(guān)是指開關(guān)自帶機(jī)械鎖定功能,按下去,松手后按鈕是不會完全跳起來的,處于鎖定狀態(tài),需要再按一次,才解鎖完全跳起來。按下后接通,彈起來后斷開。6. 各單元模塊的連接P0 單片機(jī)P2P1P31602LCD鍵盤晶振9如圖所示:液晶接PO口,鍵盤接P1口。液晶使能端P2.5,液晶數(shù)據(jù)命令選擇端P2.6,液晶讀寫選擇端P2.7。電源正負(fù)極分別接到VCC和GND。5、系統(tǒng)軟件設(shè)計(jì)1. 設(shè)計(jì)原

11、理以keilV4.0設(shè)計(jì)。采用大循環(huán)嵌套的設(shè)計(jì)思想。程序主要由“液晶顯示模塊”“矩陣鍵盤掃描模塊”“運(yùn)算模塊”構(gòu)成。大循環(huán)一直進(jìn)行,是計(jì)算器一直處于工作狀態(tài)。不停地調(diào)用鍵盤掃描函數(shù),將鍵盤輸入的數(shù)據(jù)送給液晶顯示與運(yùn)算模塊,經(jīng)運(yùn)算模塊計(jì)算出結(jié)果后,只需調(diào)用液晶顯示的子函數(shù)就可將答案顯示到液晶屏上。2. 程序結(jié)構(gòu)框圖10定義變量,便于后面程序的使用。位定義:液晶使能端P2.5,液晶數(shù)據(jù)命令選擇端P2.6,液晶讀寫選擇端P2.7。初始化:液晶開顯示,清屏。矩陣鍵盤掃描程序:包含軟件去逗,在大循環(huán)中不斷調(diào)用鍵盤掃描程序當(dāng)檢測到有鍵按下后,如果是有效值就進(jìn)行處理,否則繼續(xù)掃描鍵盤。3. 程序流程框圖矩陣

12、鍵盤掃描程序1602 顯示程序運(yùn)算模塊主函數(shù)初始化大循環(huán)處理錯誤調(diào)用頭文件變量定義位定義11否是否是否是開始初始化鍵盤掃描有鍵按下?返回值為 09?計(jì)算第一次輸入的數(shù)值鍵盤掃描有按鍵按下?12是否是否返回值為09?計(jì)算第二次輸入的數(shù)值計(jì)算運(yùn)算結(jié)果有按鍵按下?LCD 顯示136、系統(tǒng)測試1測試方法將計(jì)算器斷電,把萬用表調(diào)到蜂鳴器檔上,把萬用表兩表筆放在待測的兩個端子上,若短路蜂鳴器就會響。經(jīng)測得開關(guān)處電路存在短路,經(jīng)修復(fù)后電路焊接正常。2計(jì)算器功能測試加法測試:減法測試:乘法測試:除法測試:錯誤處理:3測試結(jié)果分析經(jīng)測試,各項(xiàng)功能均已達(dá)成。對于一般的整形運(yùn)算,計(jì)算器能準(zhǔn)確無誤的計(jì)算出來。由于使用

13、浮點(diǎn)型數(shù)據(jù),計(jì)算器只能進(jìn)行67位以內(nèi)的精確運(yùn)算。147、結(jié)束語1. 心得感悟經(jīng)過兩個星期的設(shè)計(jì)與制作,本小組完成了基于51單片機(jī)的計(jì)算器的設(shè)計(jì)。期間我們遇到許多困難和問題都一一解決,最終完全達(dá)到了預(yù)期的目標(biāo),體會到團(tuán)體合作與成功的喜悅。我感到只有親手實(shí)踐才能更深刻,更全面的學(xué)好知識,并且要在設(shè)計(jì)制作中多加入自己的想法,力求創(chuàng)新而不要模仿前人做過的作品。在設(shè)計(jì)的每一小步都要盡自己最大努力做到最好,這樣才能做出出色的作品。2. 改進(jìn)的設(shè)想1)使計(jì)算器能完成多步混合運(yùn)算的功能。2)添加一個功能鍵,當(dāng)按下功能鍵后改變矩陣鍵盤的鍵值。將第四列改為平方,開根號,求模,求余。再次按下此鍵后第四列改回加,減,

14、乘,除。并設(shè)計(jì)一個led燈來顯示鍵值是否被改變。8、附錄1. 系統(tǒng)設(shè)計(jì)圖2. 設(shè)計(jì)程序#include#include#include15#define uchar unsigned char #define uint unsigned int#define check_busysbit rs = P27;sbit rw = P26;sbit en = P25;void delay(int z)int x,y; for (x=z;x0;x-) for(y=110;y0;y-);/*判忙函數(shù)*/ bit LCD_check_busy()/當(dāng)LCD“忙”時,LCD的DATA.7位輸出為高電平信號,

15、當(dāng)LCD“不忙”時,LCD的DATA.7位輸出為低電平信號 P0= 0 xFF;/為便于檢測16 rs=0;/rs=0,rw=1,en=1 忙 rw=1;/ void busy(void) P1=0 xff; RS=0; RW=1; E=1; while(P1&0 x80)=0 x80); E=0; en=0; _nop_(); en=1; return (bit)(P0 & 0 x80); / else /*lcd1602判忙函數(shù) bit LCD_Check_Busy(void) bit result;/修改了判忙函數(shù) DataPort= 0 xFF; RS=0; RW=1;

16、 EN=1; _nop_(); 17 result=(bit)(DataPort & 0 x80); EN=0; return result;*/ return 0; /*寫入命令函數(shù)*/ void write_com(uchar com) while(LCD_check_busy(); /忙則等待 rs=0; rw=0; en=1; P0= com; _nop_(); en=0;18 /*寫入數(shù)據(jù)函數(shù)*/ void write_dat(uchar dat) while(LCD_check_busy(); /忙則等待 rs=1; rw=0; en=1; P0= dat; _nop_()

17、; en=0; /*寫入字符函數(shù)*/void LCD_write_char(uchar x,uchar y,uchar dat) if (y = 0) write_com(0 x80 + x); 19 else write_com(0 xC0 + x); write_dat( dat); /*寫入字符串函數(shù)*/? void write_string(uchar x,uchar y,uchar *s) while (*s) LCD_write_char(x,y,*s); s+; x+; 20/*初始化函數(shù)*/ void LCD_init() write_com(0 x38); /*顯示模式設(shè)置*

18、/ delay(5); write_com(0 x06);/*顯示光標(biāo)移動設(shè)置*/ delay(5); write_com(0 x0C); /*顯示開及光標(biāo)設(shè)置*/ write_com(0 x01); /*顯示清屏*/ /*按鍵掃描函數(shù),返回掃描鍵值*/uchar keyscan() /鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法 unsigned char cord_h,cord_l;/行列值中間變量 P1=0 x0f; /行線輸出全為0 cord_h=P1&0 x0f; /讀入列線值21 if(cord_h!=0 x0f) /先檢測有無按鍵按下 delay(10); /去抖 if(P1&

19、;0 x0f)!=0 x0f) cord_h=P1&0 x0f; /讀入列線值 P1=cord_h|0 xf0; /輸出當(dāng)前列線值 cord_l=P1&0 xf0; /讀入行線值 while(P1&0 xf0)!=0 xf0);/等待松開并輸出 return(cord_h+cord_l);/鍵盤最后組合碼值 return(0 xff); /返回該值unsigned char keypro() switch(keyscan() 22 case 0 x7e:return +;break; case 0 x7d:return -;break; case 0 x7b:retur

20、n x;break; case 0 x77:return /;break; case 0 xbe:return 3;break; case 0 xbd:return 6;break; case 0 xbb:return 9;break; case 0 xb7:return =;break; case 0 xde:return 2;break; case 0 xdd:return 5;break; case 0 xdb:return 8;break; case 0 xd7:return 0;break; case 0 xee:return 1;break; case 0 xed:return 4

21、;break; case 0 xeb:return 7;break; case 0 xe7:return .;break; default:return 0 xff;break; 23/*主函數(shù)*/void main() unsigned char num,i,sign; unsigned char temp16; /最大輸入16個 bit firstflag; float a=0,b=0; unsigned char s; LCD_init(); /初始化液晶屏 delay(10);/延時用于穩(wěn)定,可以去掉 write_com(0 x01); /清屏 while (1) /主循環(huán) num=keypro(); /掃描鍵盤 if(num!=0 xff) /如果掃描是按鍵有效值則進(jìn)行處理 24 if(i=0) /輸入是第一個字符的時候需要把該行清空,方便觀看 write_com(0 x01); if(+=num)| (i=16) | (-=num) | (x=num)| (/=num) | (=num)/輸入數(shù)字最大值16,輸入符號表示輸入結(jié)束 i=0; /計(jì)數(shù)器復(fù)位 if(firstflag=0) /如果是輸入的第一個數(shù)據(jù),賦值

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論