創(chuàng)新課程設(shè)計(jì)曹斌_第1頁
創(chuàng)新課程設(shè)計(jì)曹斌_第2頁
創(chuàng)新課程設(shè)計(jì)曹斌_第3頁
創(chuàng)新課程設(shè)計(jì)曹斌_第4頁
創(chuàng)新課程設(shè)計(jì)曹斌_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、十進(jìn)制加減乘除法計(jì)算器院 系:電子與電氣工程學(xué)院專 業(yè):電子信息工程班 級:099411姓 名:曹斌學(xué) 號:094109006指導(dǎo)老師:薛曉一、設(shè)計(jì)要求以52系列單片機(jī)為核心實(shí)現(xiàn)一個(gè)簡易計(jì)算器,設(shè)計(jì)十進(jìn)制加減乘除法計(jì)算器。要求能不同時(shí)顯示3位輸入和4位輸出。二、設(shè)計(jì)目的要求計(jì)算器能實(shí)現(xiàn)加減乘除四種運(yùn)算,具體如下:1、加法:整數(shù)加法2、減法:整數(shù)減法3、乘法:多位整數(shù)乘法4、除法:整數(shù)除法5、有去除功能6、在原有要求上擴(kuò)展多位輸入和輸出,超出值顯示亂碼三、設(shè)計(jì)方案論證按照系統(tǒng)設(shè)計(jì)的功能的要求,初步確定設(shè)計(jì)系統(tǒng)由主控模塊、監(jiān)測模塊、顯示模塊、鍵掃描接口電路共四個(gè)模塊組成,主控芯片使用51系列STC

2、89C52單片機(jī),采用高性能的靜態(tài)80C51設(shè)計(jì),由先進(jìn)工藝制造,并帶有非易失性Flash程序存儲(chǔ)器。它是一種高性能、低功耗的8位COMS微處理芯片,市場應(yīng)用最多。監(jiān)測模塊采用三極管和蜂鳴器組成電路。鍵盤電路采用4*4矩陣鍵盤電路。顯示模塊采用4枚共陰極數(shù)碼管和74ls138、74LS47芯片構(gòu)成等器件構(gòu)成。整個(gè)單片機(jī)的接口電路:P0(30)用于數(shù)碼管段選顯示輸出;P2用于鍵掃描輸入;P0(6.4)用于數(shù)碼管位選控制;P07用于監(jiān)測模塊;單片機(jī)最小系統(tǒng)單片機(jī)最小系統(tǒng)就是支持主芯片正常工作的最小電路局部,包括主控芯片、復(fù)位電路和晶振電路。主控芯片選取STC89C52RC芯片,因其具有良好的性能及

3、穩(wěn)定性,價(jià)格廉價(jià)應(yīng)用方便。晶振選取11.0592MHz,晶振旁電容選取20pF。采用按鍵復(fù)位電路,電阻分別選取100和10K,電容選取10F。以下為單片機(jī)最小系統(tǒng)硬件電路圖。2021-11-17 12:37 上傳下載附件(38.67 KB)單片機(jī)最小系統(tǒng)硬件電路鍵盤接口電路采用P2口對鍵盤進(jìn)行控制,行列式鍵盤這里主要用反轉(zhuǎn)掃描法進(jìn)行檢測。原理圖如下:2021-11-17 12:38 上傳下載附件(92.56 KB)數(shù)碼管顯示電路采用8位數(shù)碼管對計(jì)算數(shù)據(jù)和結(jié)果的顯示實(shí)驗(yàn)時(shí)只用到了4位,這里選取共陰數(shù)碼管,利用74LS138和74LS47對數(shù)碼管進(jìn)行驅(qū)動(dòng)。P0.6P0.4用來作為位選端,控制哪幾位

4、數(shù)碼管進(jìn)行顯示。 P0.3P0.0控制數(shù)碼管數(shù)字進(jìn)行顯示。以下為數(shù)碼顯示電路的硬件電路圖2021-11-17 12:38 上傳下載附件(97.03 KB)監(jiān)視電路監(jiān)視電路就是在按鍵時(shí),發(fā)出聲音提醒,以確保輸入數(shù)字有效。這里就采用5V蜂鳴器作為示音設(shè)備。用p0.7口輸出信號。以下為報(bào)警電路硬件電路圖2021-11-17 12:38 上傳下載附件(25.23 KB)1鍵盤掃描函數(shù)鍵盤電路采用4*4矩陣鍵盤電路。采用掃描法對鍵盤進(jìn)行掃描,對P2口的掃描結(jié)果和各按鍵的地址,我們就可以得到是哪個(gè)鍵按下,從而完成鍵盤掃描的功能。unsigned char key_scan(void)unsigned ch

5、ar row,col=0,k=0xff;KEYIO=0xf0;if(KEYIO&0xf0)=0xf0)return k;delay(10);if(KEYIO&0xf0)=0xf0)return k;for(row=0;row<4;row+)KEYIO=(1<<row);k=KEYIO&0xf0;if(k!=0xf0)while(k&(1<<(col+4)col+;k=row*4+col;KEYIO=0xf0;P0&=0x7f;while(KEYIO&0xf0)!=0xf0);break;return k;鍵盤調(diào)用程序

6、:調(diào)用鍵盤掃描程序,讀取按鍵的值。實(shí)現(xiàn)各個(gè)鍵的加減乘除的功能,采用switch功能進(jìn)行讀取。unsigned char key_vect(unsigned char keyValue)unsigned char nKey;switch(keyValue)case 0:nKey=7; break;case 1: nKey=8; break;case 2: nKey=9; break;case 3: nKey=ADD;break; case 4: nKey=4; break;case 5: nKey=5; break;case 6: nKey=6; break;case 7: nKey=SUB;

7、break; case 8: nKey=1; break;case 9: nKey=2; break;case 10: nKey=3; break;case 11: nKey=MUL; break; case 12: nKey=0; break;case 13: nKey=CLR;break; case 14: nKey=EQU; break;case 15: nKey=DIV;break; default : nKey=ERROR;return nKey;2數(shù)碼管顯示函數(shù)采用4位數(shù)碼管對計(jì)算數(shù)據(jù)和結(jié)果的顯示,這里選取共陰數(shù)碼管,利用74LS47和74LS138芯片對數(shù)碼管進(jìn)行驅(qū)動(dòng)。P0.6P

8、3.4用來作為位選端,控制哪幾位數(shù)碼管進(jìn)行顯示。比方當(dāng)P0.6P0.4為0時(shí),其他位全給1。此時(shí)就將掃描的數(shù)據(jù)送給指定數(shù)碼管顯示。void Led_display(unsigned char wei,unsigned char duan)duan&=0x0f;wei&=0x07;P0=(7-wei)<<4)|duan|0x80; 3監(jiān)測模塊函數(shù)采用三極管和蜂鳴器組成,利用P0.7進(jìn)行控制,當(dāng)P0.7端口為低電平時(shí),此時(shí)計(jì)算結(jié)果出現(xiàn)問題,并報(bào)警。/蜂鳴器初始化函數(shù)void sys_init()P0|=0x80;4主程序框圖2021-11-17 12:37 上傳下載附件

9、(17.27 KB)程序流程5調(diào)試步驟在焊接好器件后,先不要將芯片插在芯片座上,要先驗(yàn)證先板上電源是否好用,有無短路等。接上電源,用萬用表測量個(gè)芯片座對應(yīng)電源和地之間的電壓值,觀察電壓值是否正常。一切正常前方可將芯片插入芯片座,以繼續(xù)測試其他功能。將芯片插上后,對各個(gè)模塊進(jìn)行調(diào)試,按鍵是否工作正常,數(shù)碼管是否顯示正常等。編寫相關(guān)局部的測試程序?qū)ζ溥M(jìn)行測試。各局部硬件檢測無誤后,下載程序進(jìn)行整體調(diào)試,一切正常后,結(jié)束調(diào)試過程。在具體調(diào)試時(shí)首先遇到的問題是程序無法下載進(jìn)入單片機(jī),通過將電路板接線與原理電路圖接線的比照發(fā)現(xiàn),串口芯片與單片機(jī)連接的輸入,輸出接反,重新用銅線連接后,依然無法下載程序。后

10、找到原因是由于下載串口與設(shè)計(jì)封裝不符,用相對應(yīng)的下載線可以下載。成功下載程序后,發(fā)現(xiàn)數(shù)碼管顯示不正確,查看后發(fā)現(xiàn)有先沒有連接,可能是制板時(shí)漏印,連接后顯示正常。四、設(shè)計(jì)結(jié)果與分析對程序進(jìn)行調(diào)試,經(jīng)計(jì)算機(jī)仿真分析,結(jié)果說明本程序根本實(shí)現(xiàn)了其功能。當(dāng)輸入3位數(shù)字相加減乘除時(shí),能夠?qū)崿F(xiàn)4位輸出。例如“138+456=594,由硬仿件真結(jié)果可得出結(jié)果。具體見圖;2021-11-17 12:37 上傳下載附件(109.35 KB)2021-11-17 12:37 上傳下載附件(100.48 KB)2021-11-17 12:37 上傳下載附件(130.05 KB)五、心得體會(huì)通過本次課程設(shè)計(jì)我完成了對給

11、定要求系統(tǒng)的硬件設(shè)計(jì)、電路設(shè)計(jì)、電路板設(shè)計(jì)、軟件設(shè)計(jì)以及對成品的調(diào)試過程。從整個(gè)過程中學(xué)習(xí)到了很多方面的知識,了解到以往學(xué)習(xí)中自己知識在某方面的缺乏之處,是對以往學(xué)習(xí)科目的一種貫穿和承接,從而能更好的認(rèn)識和學(xué)習(xí),也對將來從事工作大有裨益。本次實(shí)驗(yàn)過程中,我真正體驗(yàn)到了,認(rèn)真對待每一個(gè)細(xì)小零件的重要性。對于實(shí)驗(yàn)室提供的零件要具有檢錯(cuò)能力。實(shí)驗(yàn)中換取了4個(gè)鍵盤,最后才得到正確的結(jié)果顯示。此外從本次試驗(yàn)中我學(xué)會(huì)到了,焊接電路布局的重要性,以及在布線時(shí),對線路的長度要有一定的冗余,以提供糾錯(cuò)方便。還有最重要的一點(diǎn)是,要學(xué)會(huì)使用萬用表對電路進(jìn)行檢測,查出問題。從本次課設(shè)中我也看到了自身的很多缺乏之處,對

12、知識的掌握不夠扎實(shí),有一知半解的現(xiàn)象。有時(shí)做事不夠穩(wěn)定,過于毛躁,不能平心靜氣的去分析所遇到的問題和錯(cuò)誤。這在以后的工作和生活中是不可取的,通過對自身問題的認(rèn)識與改正相信再遇到同樣問題時(shí)會(huì)更好的解決。以后的設(shè)計(jì)實(shí)驗(yàn)也會(huì)更好的完成。而且我也意識到了團(tuán)隊(duì)合作的重要性,五人為一組的分配讓我們學(xué)會(huì)了如何分配各自的工作,讓我們減少了很多的時(shí)間,每一步都有每一個(gè)人去做,這樣,每個(gè)人都能夠從中收獲不同的只是,而且,還能交換各自的收獲心得,讓我們的知識以及走向社會(huì)工作中有了對團(tuán)隊(duì)合作的全新認(rèn)識。以后,做實(shí)驗(yàn)一定要認(rèn)真對待,用心去做。參考文獻(xiàn)1 李群芳,黃建. 單片機(jī)微型計(jì)算機(jī)與接口技術(shù). 北京:電子工業(yè)出版社

13、,20012 徐維祥、劉旭敏. 單片微型機(jī)原理及應(yīng)用. 大連:大連理工大學(xué)出版社,19963 李光飛、樓然苗、胡佳文、謝象佐. 單片機(jī)課程設(shè)計(jì)與實(shí)例指導(dǎo). 北京:北京航空航天大學(xué)出版社,2004 4 周國運(yùn). 單片機(jī)原理及應(yīng)用C語言版.中國水利水電出版社,2021年2月第一版附錄:1、先輸入一個(gè)+運(yùn)算,接著輸入一個(gè)減運(yùn)算符,結(jié)果將運(yùn)行哪個(gè),加還是減,怎樣實(shí)現(xiàn)的?-王東賓答復(fù):case EQU:NumberFormat(1);switch(MathWay)case 1:resValue=fstValue+secValue;break;case 2:resValue=fstValue-secVal

14、ue;break;case 3:resValue=fstValue*secValue;break;case 4:resValue=fstValue/secValue;break;程序的流程,不管按幾次,只默認(rèn)是最后一次的符號有效。2、74LS138和74LS47是怎么對數(shù)碼管進(jìn)行驅(qū)動(dòng)的.張玉崇答復(fù):138和47都是譯碼器,138通過對輸入端A/B/C輸入的電平進(jìn)行譯碼輸出端輸出相應(yīng)的電平,然后對數(shù)碼管的位選進(jìn)行控制。47也是通過輸入端端口輸入的電平進(jìn)行譯碼,但他是4個(gè)輸入端口A/B/C/D,對其輸入的數(shù)字轉(zhuǎn)換為相應(yīng)的二進(jìn)制編碼,然后輸出端輸出對應(yīng)于數(shù)碼管的段選端的控制電平!3、如何實(shí)現(xiàn)數(shù)碼管的

15、位選自動(dòng)選擇,如2*5=10,原來是1位的,如何最終變成兩位的?-盧春林答復(fù):位選的選擇是通過P0(3.0)口控制的。原來一位變成兩位的時(shí)候?qū)⒅暗臄?shù)乘10,然后數(shù)碼管往左移一位顯示高位,然后第二個(gè)數(shù)碼管再顯示地位,以此類推。下面是原計(jì)算程序:fstValue=0; FormatLoop=nValideLed;for(;FormatLoop>0;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)>0;tmp1-)tmp*=10; /高位乘10fstValue+=keyValueForma

16、tLoop-1*tmp; /高位乘10后相加4、如果除法有余數(shù)時(shí)怎么處理-任小麗答復(fù):這是硬件的一個(gè)缺點(diǎn),因?yàn)閿?shù)碼管不能夠顯示小數(shù)點(diǎn)位,所以在處理計(jì)算小數(shù)點(diǎn)的過程時(shí),舍棄掉了小數(shù)點(diǎn)位,只保存整數(shù)。case EQU:NumberFormat(1);switch(MathWay)case 1:resValue=fstValue+secValue;break;case 2:resValue=fstValue-secValue;break;case 3:resValue=fstValue*secValue;break;case 4:resValue=fstValue/secValue; /除法brea

17、k;如果要處理余數(shù)的話,可在后面求余除法resValue=fstValue%secValue;5、計(jì)算處理子程序的設(shè)計(jì)思路-朱阿松答復(fù):void NumberFormat(unsigned char bSec)if(bSec)secValue=0;FormatLoop=nValideLed;for(;FormatLoop>0;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)>0;tmp1-)tmp*=10; secValue+=keyValueFormatLoop-1*tmp; els

18、efstValue=0; FormatLoop=nValideLed; /獲取按鍵獲取的次數(shù)for(;FormatLoop>0;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)>0;tmp1-) /按鍵次數(shù)進(jìn)行循環(huán)*10的次數(shù)tmp*=10; fstValue+=keyValueFormatLoop-1*tmp; /將獲取的值進(jìn)行組合相加首先從按鍵獲取第一個(gè)數(shù)值顯示,然后當(dāng)輸入第二個(gè)數(shù)值時(shí),將第一個(gè)數(shù)值存入一個(gè)數(shù)組緩存起來,存入keyValue里面,然后乘于10在加上獲取的第二個(gè)數(shù)值,

19、然后組合起來送入fstValue,最后得到最后的數(shù)值。最后再將獲取的第一個(gè)輸入的數(shù)值和第二個(gè)輸入數(shù)值進(jìn)行加、減、乘、除運(yùn)算。 case EQU:NumberFormat(1);switch(MathWay)case 1:resValue=fstValue+secValue; /加法運(yùn)算break;case 2:resValue=fstValue-secValue; /減法運(yùn)算break;case 3:resValue=fstValue*secValue; /乘法運(yùn)算break;case 4:resValue=fstValue/secValue; /除法運(yùn)算break;resFormat();b

20、reak; 然后主程序調(diào)用void main(void)sys_init();for(;) Calculate();DisplayLoop=nValideLed;if(DisplayLoop=0)Led_display(0,0);elsefor(;DisplayLoop>0;DisplayLoop-)Led_display(DisplayLoop-1,keyValueDisplayLoop-1);/將緩存的數(shù)值賦給數(shù)碼管的段選delay(5); 6、請問你們的設(shè)計(jì)計(jì)算器的優(yōu)缺點(diǎn)是什么?-王坡答復(fù):優(yōu)點(diǎn)是可以實(shí)現(xiàn)任意位的計(jì)算輸入和輸出。缺點(diǎn)是不能算小數(shù)。7、如果我要計(jì)算的是100*100得

21、到的結(jié)果怎么顯示?-董艷波答復(fù):按照原先題目要求和設(shè)計(jì)發(fā)現(xiàn),結(jié)果超值,顯示錯(cuò)誤。這如果要設(shè)計(jì)計(jì)算器的話太不方便。經(jīng)改正之后,可以顯示其100*100的值,。為10000.8、如果輸入的數(shù)字是負(fù)數(shù)怎么處理-周丹陽答復(fù):按要求是沒有負(fù)數(shù)的,但如果想要用到負(fù)數(shù)的話,可以用按鍵進(jìn)行判斷??梢栽趗nsigned char key_vect(unsigned char keyValue)函數(shù)加個(gè)case語句,然后在void Calculate(void)函數(shù)里加個(gè)IF語句進(jìn)行判斷,如:IF/所按的鍵/加個(gè)符號;,但由于硬件限制,數(shù)碼管不能顯示符號,所以不能用到。9、程序能不能實(shí)現(xiàn)兩個(gè)數(shù)相加之后數(shù)值直接顯示

22、,然后自動(dòng)保存,再乘或除運(yùn)算之后顯示結(jié)果?-袁一方答復(fù):我們設(shè)計(jì)的程序不可以實(shí)現(xiàn),程序只可進(jìn)行一步運(yùn)算,但可以把結(jié)果作為第一個(gè)輸入的值繼續(xù)進(jìn)行運(yùn)算,也就是說多步運(yùn)算只能一步一步來。10、是否可以實(shí)現(xiàn)兩個(gè)整數(shù)相減而得到負(fù)數(shù)?-黃文淑答復(fù):不可以實(shí)現(xiàn),本程序會(huì)顯示亂碼。程序代碼:unsigned char key_scan(void);unsigned char key_vect(unsigned char keyValue);voidsys_init();#include "common.h"#include "sys_init.h"voidsys_ini

23、t()P0|=0x80;#include "reg52.h"#define ADD21#define SUB 22#define MUL 23#define DIV 24#define CLR 25#define EQU 26#define ERROR 27void delay(unsigned char z);#include "common.h"void delay(unsigned char z)unsigned char x,y;for(x=50;x>0;x-)for(y=z;y>0;y-);voidLed_display(unsig

24、ned char wei,unsigned char duan);#include "common.h"#include "display.h"voidLed_display(unsigned char wei,unsigned char duan)duan&=0x0f;wei&=0x07;P0=(7-wei)<<4)|duan|0x80;void Calculate(void);voidNumberFormat(unsigned char bSec);voidresFormat(void);#include "co

25、mmon.h"#include "key.h"#define KEYIO P2unsigned char key_scan(void)unsigned char row,col=0,k=0xff;KEYIO=0xf0;if(KEYIO&0xf0)=0xf0)return k;delay(10);if(KEYIO&0xf0)=0xf0)return k;for(row=0;row<4;row+)KEYIO=(1<<row);k=KEYIO&0xf0;if(k!=0xf0)while(k&(1<<(col+

26、4)col+;k=row*4+col;KEYIO=0xf0;P0&=0x7f;while(KEYIO&0xf0)!=0xf0);break;return k;unsigned char key_vect(unsigned char keyValue)unsigned char nKey;switch(keyValue)case 0:nKey=7; break;case 1:nKey=8;break;case 2:nKey=9;break;case 3:nKey=ADD;break;case 4:nKey=4;break;case 5:nKey=5;break;case 6:nK

27、ey=6;break;case 7:nKey=SUB;break;case 8:nKey=1;break;case 9:nKey=2;break;case 10:nKey=3;break;case 11:nKey=MUL;break; case 12:nKey=0;break;case 13:nKey=CLR;break;case 14:nKey=EQU;break;case 15:nKey=DIV;break;default: nKey=ERROR;returnnKey;#include "common.h"#include "calculate.h"

28、#include "key.h"#include "display.h"unsigned char nkey;signed char nValideLed=0,nLoop,FormatLoop,ResLoop;unsigned char keyValue8;unsigned long fstValue,secValue,resValue;unsigned char MathWay=0;voidNumberFormat(unsigned char bSec)if(bSec)secValue=0;FormatLoop=nValideLed;for(;Form

29、atLoop>0;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)>0;tmp1-)tmp*=10;secValue+=keyValueFormatLoop-1*tmp;elsefstValue=0;FormatLoop=nValideLed;for(;FormatLoop>0;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)>0;tmp1-)tmp*=10;fstValue+

30、=keyValueFormatLoop-1*tmp;voidresFormat(void)signed char reschar=7;for(;reschar>-1;reschar-)unsigned long tmp=1;signed char tmp1=reschar;for(;tmp1>0;tmp1-)tmp*=10;keyValuereschar=(unsigned char)(resValue/tmp);resValue-=keyValuereschar*tmp;for(nValideLed=8;nValideLed>0;nValideLed-)if(keyValuenValideLed-1!=0)break;void Calculate(void) nkey=key_vect(key_scan();if(nkey!=ERROR)if(nkey<10)nLoop=nValideLed;for(;nLoop>0;nLoop-)keyValuenLoop=keyValuenLoop-1;nValideLed+;ke

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論