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

下載本文檔

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

文檔簡介

單片機(jī)課程設(shè)計(jì)課程設(shè)計(jì)報(bào)告書課題名稱簡易計(jì)算器的設(shè)計(jì)姓 名周運(yùn)鴻學(xué) 號2010118010208專 業(yè)電氣工程及其自動(dòng)化指導(dǎo)教師皮大能機(jī)電與控制工程學(xué)院 年 月 日 摘 要近年來隨著科技的飛速發(fā)展,單片機(jī)的應(yīng)用正在不斷深入,同時(shí)帶動(dòng)傳統(tǒng)控制檢測技術(shù)日益更新。在實(shí)時(shí)檢測和自動(dòng)控制的單片機(jī)應(yīng)用系統(tǒng)中,單片機(jī)往往作為一個(gè)核心部件來使用,但僅單片機(jī)方面的知識是不夠的,還應(yīng)根據(jù)具體硬件結(jié)構(gòu)、軟硬件結(jié)合,來加以完善。計(jì)算機(jī)在人們的日常生活中是比較常見的電子產(chǎn)品之一。可是它還在發(fā)展之中,以后必將出現(xiàn)功能更加強(qiáng)大的計(jì)算機(jī),基于這樣的理念,本次設(shè)計(jì)是用AT89S51單片機(jī)、LCD顯示器、控制按鍵為元件來設(shè)計(jì)的計(jì)算器。利用此設(shè)計(jì)熟悉單片機(jī)微控制器及C語言編程,對其片資源及各個(gè)I/O端口的功能和基本用途的了解。掌握keil應(yīng)用程序開發(fā)環(huán)境,常用的LCD顯示器的使用方法和一般鍵盤的使用方法。關(guān)鍵詞:51單片機(jī);LCD ;控制按鍵目 錄1 課程設(shè)計(jì)內(nèi)容2 1.1任務(wù)內(nèi)容2 1.2任務(wù)分析22計(jì)算器設(shè)計(jì)基本原理32.1 AT89C51系列單片機(jī)簡介32.2 LCD顯示模塊62.3 運(yùn)算模塊 82.4鍵盤接口電路93 主程序設(shè)計(jì)104結(jié)論4 系統(tǒng)仿真圖221. 課程設(shè)計(jì)內(nèi)容1.1 任務(wù)內(nèi)容本系統(tǒng)就是充分利用了8051芯片的I/O引腳。系統(tǒng)以采用MCS-51系列單片機(jī)Intel8051為中心器件來設(shè)計(jì)計(jì)算器控制器,實(shí)現(xiàn)了能根據(jù)實(shí)際輸入值顯示并存儲的功能,計(jì)算程序則是參照教材。至于位數(shù)和功能,如果有需要可以通過設(shè)計(jì)擴(kuò)充原系統(tǒng)來實(shí)現(xiàn) 。具體設(shè)計(jì)如下:1、由于要設(shè)計(jì)的是簡單的計(jì)算器,可以進(jìn)行四則運(yùn)算,為了得到教好的顯示效果,采用LCD顯示數(shù)據(jù)和結(jié)果。2、另外鍵盤包括數(shù)字鍵(0-9)、符號鍵(+、-、*、/)、等號鍵,故只需要16個(gè)按鍵即可,設(shè)計(jì)中采用手焊接的4*4矩陣鍵盤。3、執(zhí)行程序:開機(jī)顯示零,等待鍵入數(shù)值,當(dāng)鍵入數(shù)字,通過LCD顯示出來,當(dāng)鍵入+、-、*、/運(yùn)算符,計(jì)算器在內(nèi)部執(zhí)行數(shù)值轉(zhuǎn)換和存儲,并等待再次鍵入數(shù)值后將顯示鍵入的數(shù)值,按等號就會在LCD上輸出運(yùn)算結(jié)果。本計(jì)算器是以MCS-51系列8051單片機(jī)為核心構(gòu)成的簡易計(jì)算器系統(tǒng)。該系統(tǒng)通過單片機(jī)控制,實(shí)現(xiàn)對4*4鍵盤掃描進(jìn)行實(shí)時(shí)的按鍵檢測,并把檢測數(shù)據(jù)存儲下來。整個(gè)計(jì)算器系統(tǒng)的工作過程為:首先存儲單元初始化,顯示初始值和鍵盤掃描,判斷按鍵位置,查表得出按鍵值,單片機(jī)則對數(shù)據(jù)進(jìn)行儲存與相應(yīng)處理轉(zhuǎn)換,之后送入LED顯示器動(dòng)態(tài)顯示。整個(gè)系統(tǒng)可分為三個(gè)主要功能模塊:功能模塊一,實(shí)時(shí)鍵盤掃描;功能模塊二,數(shù)據(jù)轉(zhuǎn)換成顯示器顯示;功能模塊三,顯示器動(dòng)態(tài)顯示。1.2 任務(wù)分析在本次課程設(shè)計(jì)中,主要完成如下方面的設(shè)計(jì)任務(wù):1、簡要闡述單片機(jī)技術(shù)發(fā)展的國內(nèi)外現(xiàn)狀及LED動(dòng)態(tài)顯示和矩陣鍵盤基本原理;2、掌握51系列某種產(chǎn)品的最小電路及外圍擴(kuò)展電路的設(shè)計(jì)方法;3、了解單片機(jī)數(shù)據(jù)轉(zhuǎn)換功能及工作過程;4、完成主要功能模塊的硬件電路設(shè)計(jì)及必要的參數(shù)確定;5、用proteus軟件完成原理電路圖的繪制;通過本次課題設(shè)計(jì),應(yīng)用單片機(jī)應(yīng)用基礎(chǔ)、計(jì)算機(jī)應(yīng)用基礎(chǔ)等所學(xué)相關(guān)知識及查閱資料,完成簡易計(jì)算器的設(shè)計(jì),以達(dá)到理論與實(shí)踐更好的結(jié)合、進(jìn)一步提高綜合運(yùn)用所學(xué)知識和設(shè)計(jì)的能力的目的。2. 簡易計(jì)算器設(shè)計(jì)基本原理根據(jù)功能和指示要求,本系統(tǒng)選用以MCS-51單片機(jī)為主控機(jī)。通過擴(kuò)展必要的外圍接口電路,實(shí)現(xiàn)對計(jì)算器的設(shè)計(jì)。2.1 89c51系列單片機(jī)簡介89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS8位微處理器,俗稱單片機(jī)。單片機(jī)的可擦除只讀存儲器可以反復(fù)擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個(gè)芯片中,ATMEL的89C51是一種高效微控制器,89C2051是它的一種精簡版本。89C單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價(jià)廉的方案。STC89c51的引腳說明:MCS-51系列單片機(jī)中的8031、8051及8751均采用40Pin封裝的雙列直插DIP結(jié)構(gòu),下圖是它們的引腳配置,40個(gè)引腳中,正電源和地線兩根,外置石英振蕩器的時(shí)鐘線兩根,4組8位共32個(gè)I/O口,中斷口線與P3口線復(fù)用?,F(xiàn)在對這些引腳的功能加以說明:如圖2.3所示。圖2.1 雙列直插式封裝引腳圖Pin9:RESET/Vpc復(fù)位信號復(fù)用腳,當(dāng)8051通電,時(shí)鐘電路開始工作,在RESET引腳上出現(xiàn)24個(gè)時(shí)鐘周期以上的高電平,系統(tǒng)即初始復(fù)位。初始化后,程序計(jì)數(shù)器PC指向0000H,P0-P3輸出口全部為高電平,堆棧指針寫入07H,其它專用寄存器被清“0”。RESET由高電平下降為低電平后,系統(tǒng)即從0000H地址開始執(zhí)行程序。然而,初始復(fù)位不改變RAM(包括工作寄存器R0-R7)的狀態(tài),8051的初始態(tài)。8051的復(fù)位方式可以是自動(dòng)復(fù)位,也可以是手動(dòng)復(fù)位。此外,RESET/Vpd還是一復(fù)用腳,Vcc掉電其間,此腳可接上備用電源,以保證單片機(jī)內(nèi)部RAM的數(shù)據(jù)不丟失。見下圖2.4為兩種復(fù)位方式和兩種時(shí)鐘方式:上電自動(dòng)復(fù)位 手動(dòng)復(fù)位電路 內(nèi)部時(shí)鐘方式 外部時(shí)鐘方式圖2.2 復(fù)位方式和時(shí)鐘方式圖硬件系統(tǒng)是指構(gòu)成微機(jī)系統(tǒng)的實(shí)體和裝置,通常由運(yùn)算器、控制器、存儲器、輸入接口電路和輸入設(shè)備、輸出接口電路和輸出設(shè)備等組成。單片機(jī)實(shí)質(zhì)上是一個(gè)硬件的芯片,在實(shí)際應(yīng)用中,通常很難直接和被控對象進(jìn)行電氣連接,必須外加各種擴(kuò)展接口電路、外部設(shè)備、被控對象等硬件和軟件,才能構(gòu)成一個(gè)單片機(jī)應(yīng)用系統(tǒng)。本設(shè)計(jì)選用以AT89S51單片機(jī)為主控單元。顯示部分:采用LCD靜態(tài)顯示。按鍵部分,采用4*4鍵盤。 硬件電路原理圖如圖3.1所示:2.2 LCD顯示模塊本設(shè)計(jì)采用LCD液晶顯示器來顯示輸出數(shù)據(jù)。LCD的特性有:1、+5V電壓,對比可調(diào)度;2、內(nèi)含復(fù)位電路;3、提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能;4、有80字節(jié)顯示數(shù)據(jù)存儲器DDRAM;5、內(nèi)建有160個(gè)5X7點(diǎn)陣的字型的字符發(fā)生器CGROM;6、8個(gè)可由用戶自定義的5X7的字符發(fā)生器CGRAM。本設(shè)計(jì)通過D0-D7引腳向LCD寫指令字或?qū)憯?shù)據(jù)以使LCD實(shí)現(xiàn)不同的功能或顯示相應(yīng)的數(shù)據(jù)。其接口電路如圖3.3所示。 圖2.3 1602LCD引腳圖 表2.4 LCD的引腳說明符號引腳說明符號引腳說明VSS電源地DB4Data I/OVDD電源正極(+5V)DB5Data I/OV0液晶顯示偏壓輸入DB6Data I/ORS數(shù)據(jù)/命令選擇端(H/L)DB7Data I/OR/W讀寫控制信號(H/L)E使能信號DB0Data I/ORST復(fù)位端(H:正常工作,L:復(fù)位)DB1Data I/OVEE負(fù)電源輸出(-10V)DB2Data I/OBLA背光源正極(+4.2)DB3Data I/OBLK背光源正極2.3運(yùn)算模塊MCS-51單片機(jī)是在一塊芯片中集成了CPU、RAM、ROM、定時(shí)器/計(jì)數(shù)器和多功能I/O等計(jì)算機(jī)所需要的基本功能部件。如果按功能劃分,它由以下功能部件組成,即微處理器(CPU),數(shù)據(jù)存儲器(RAM),程序存儲器(ROM/EPROM),并行I/O口,串行口,定時(shí)器/計(jì)數(shù)器,中斷系統(tǒng)及特殊功能寄存器(SFR)。單片機(jī)是靠程序運(yùn)行的,并且可以修改。通過不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的一些功能,通過使用單片機(jī)編寫的程序可以實(shí)現(xiàn)高智能、高效率以及高可靠性,因此采用單片機(jī)作為計(jì)算器的主要功能部件,可以很快的實(shí)現(xiàn)運(yùn)算功能。運(yùn)算模塊由鍵盤和顯示屏組成。單片機(jī)通過按鍵來實(shí)現(xiàn)輸入數(shù)據(jù)和操作方式的控制,在運(yùn)算過程中,對所設(shè)的數(shù)據(jù)進(jìn)行四則運(yùn)算時(shí),要先確定選用的是哪一個(gè)運(yùn)算符,若是+或*,則要判斷結(jié)果是否會溢出,溢出則顯示錯(cuò)誤提示,沒有溢出則顯示運(yùn)算結(jié)果,若是/,則要判斷除數(shù)是否為零,為零時(shí)顯示錯(cuò)誤提示,不為零顯示運(yùn)算結(jié)果。2.4鍵盤接口電路計(jì)算器輸入數(shù)字和其他功能按鍵要用到很多按鍵,如果采用獨(dú)立按鍵的方式,在這種情況下,編程會很簡單,但是會占用大量的I/O 口資源,因此在很多情況下都不采用這種方式,而是采用矩陣鍵盤的方案。矩陣鍵盤采用四條I/O 線作為行線,四條I/O 線作為列線組成鍵盤,在行線和列線的每個(gè)交叉點(diǎn)上設(shè)置一個(gè)按鍵。這樣鍵盤上按鍵的個(gè)數(shù)就為44個(gè)。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機(jī)系統(tǒng)中I/O 口的利用率。矩陣鍵盤的工作原理:計(jì)算器的鍵盤布局如圖2所示:一般有16個(gè)鍵組成,在單片機(jī)中正好可以用一個(gè)P口實(shí)現(xiàn)16個(gè)按鍵功能,這種形式在單片機(jī)系統(tǒng)中也最常用。圖2.5 矩陣鍵盤內(nèi)部電路圖第三章 主程序設(shè)計(jì)Keil C51是美國Keil Software公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,因而易學(xué)易用。用過匯編語言后再使用C來開發(fā),體會更加深刻。Keil C51軟件提供豐富的庫函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會到Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時(shí)更能體現(xiàn)高級語言的優(yōu)勢。下面詳細(xì)介紹Keil C51開發(fā)系統(tǒng)各部分功能和使用。 Keil C51單片機(jī)軟件開發(fā)系統(tǒng)的整體結(jié)構(gòu)C51工具包的整體結(jié)構(gòu),如圖3.1所示,其中uVision與Ishell分別是C51 for Windows和for DOS的集成開發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿真等整個(gè)開發(fā)流程。開發(fā)人員可用IDE 本身或其它編輯器編輯C 或匯編源文件。然后分別由C51及A51編譯器編譯生成目標(biāo)文件(.OBJ)。目標(biāo)文件可由LIB51創(chuàng)建生成庫文件,也可以與庫文件一起經(jīng)L51連接定位生成絕對目標(biāo)文件(.ABS)。ABS文件由OH51轉(zhuǎn)換成標(biāo)準(zhǔn)的Hex文件,以供調(diào)試器dScope51或tScope51使用進(jìn)行源代碼級調(diào)試,也可由仿真器使用直接對目標(biāo)板進(jìn)行調(diào)試,也可以直接寫入程序存貯器如EPROM 中。普通計(jì)算器課程序設(shè)計(jì):/*/通用計(jì)算器的編寫,能夠?qū)崿F(xiàn)兩位的加減計(jì)算 +,-,*,/設(shè)計(jì)人:周運(yùn)鴻。指導(dǎo)人:皮大能/2013-6-6#include#include#includeLCD1602.h#includekeyboard.h#includecalculation.h#define uchar unsigned char#define uint unsigned intdouble num2; uchar sign2; uchar numble110; uchar numble210; void main()int i=0,j=0,k=0,flag=0,a=0,b,c=0,e=0,opNum=0;long int sum1,sum0;double sum2;init();write_com(0x80);while(!mark)matrixkeyscan();mark=0;while(expressionj!=)if(!In(expressionj,OP) /如否不是運(yùn)算符就入操作數(shù)棧if(opNum = 0)opNum =expressionj - 48;+j;if(In(expressionj,OP)flag = 1;elseopNum = opNum * 10 + (expressionj - 48);+j;if(In(expressionj,OP)flag = 1;if(flag = 1)numi=opNum;opNum=0;i+;flag=0;elsesignk=expressionj;+j;k+; sum1=Operator( num0,sign0, num1);sum2=Operator( num0,sign0, num1);sum0=sum1;while(sum1!=0) numble1a=sum1%10+48; sum1=sum1/10; a+; b=strlen(numble1);write_com(0x80+0x40); for(c=b-1;c=0;c-)write_data(numble1c);delayms(10);write_data(.);sum2=sum2*1000;sum0=sum2-sum0*1000;numble20=sum0/100+48;numble22=sum0%10+48;numble21=(sum0/10)%10+48;if(numble22=(5+48)numble21=numble21+1;write_data(numble20);delayms(5);write_data(numble21);delayms(5);while(1);/*/鍵盤掃描程序驅(qū)動(dòng)/文件名:keyboard.h/*#ifndef _keyboard_H_#define _keyboard_H_#include#includeLCD1602.h#define uchar unsigned char#define uint unsigned intuint move=0; uchar mark=0;uchar code table=0,1,2,3,4,5,6,7,8,9;uchar expression20; uchar code OP=+,-,*,/,=,n;void matrixkeyscan() uchar temp,key; P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delayms(10); temp=P3; temp=P3&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xee:key=0;break; case 0xde:key=1;break; case 0xbe:key=2;break; case 0x7e:key=3;break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; write_data(tablekey); delayms(5); expressionmove=tablekey; move+; P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delayms(10); temp=P3; temp=P3&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xed:key=4;break; case 0xdd:key=5;break; case 0xbd:key=6;break; case 0x7d:key=7;break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; write_data(tablekey); delayms(5); expressionmove=tablekey; move+; P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delayms(10); temp=P3; temp=P3&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xeb:key=8;break; case 0xdb:key=9;break; case 0xbb:key=10;break; case 0x7b:key=11;break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; if(key10)write_data(tablekey); delayms(5);else write_data(OPkey-10); delayms(5); expressionmove=tablekey; move+; P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delayms(10); temp=P3; temp=P3&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xe7:key=12;break; case 0xd7:key=13;break; case 0xb7:key=14;break; case 0x77:key=15;break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; if(key=14) mark=1; write_data(OPkey-10); delayms(5); expressionmove=tablekey; move+; #endif/*/LCD1602驅(qū)動(dòng)程序/文件名:LCD1602.h/*#ifndef _LCD1602_H_#define _LCD1602_H_#include#define uchar unsigned char#define uint unsigned intsbit lcden=P24;sbit lcdrs=P25;void delayms(uint xms) uint i,j;for(i=xms;i0;i-) for(j=110;j0;j-); void write_com(uchar com)lcdrs=0;P0=com;delayms(5);lcden=1;delayms(5);lcden=0;void write_data(uchar date)lcdrs=1;P0=date;delayms(5);lcden=1;delayms(5);lcden=0;void init()lcden=0;write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01);#endif/*/數(shù)學(xué)計(jì)算程序/文件名:calculation.h/*#ifndef _calculation_H_#define _calculation_H_#define uchar unsigned char#define uint unsigned intdouble Operator(double first,char theta,double second)switch(theta)case +:return first + second;break;case -:return first - second;bre

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論