欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 25338|回復(fù): 28
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)簡(jiǎn)易計(jì)算器設(shè)計(jì)報(bào)告 論文下載

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
單片機(jī)原理與接口技術(shù)課程

考試作品報(bào)告

作品名稱(chēng):簡(jiǎn)易計(jì)算器
姓    名:王海躍
專(zhuān)業(yè)班級(jí):電科1401
學(xué)    號(hào):X1920145285

中南大學(xué)物理與電子學(xué)院



目 錄
摘 要……………………………………………………………………………2                                                  
引 言……………………………………………………………………………3
  • 系統(tǒng)整體概述 ………………………………………………………4
  • 硬件設(shè)計(jì)……………………………………………………………6
  • 軟件設(shè)計(jì) ……………………………………………………………9
  • 調(diào)試與分析…………………………………………………………13
  • 制作感受 …………………………………………………………14
附錄……………………………………………………………………………15


                     
近年來(lái)隨著科技的飛速發(fā)展,單片機(jī)的應(yīng)用正在不斷深入,同時(shí)帶動(dòng)傳統(tǒng)控制檢測(cè)技術(shù)日益更新。在實(shí)時(shí)檢測(cè)和自動(dòng)控制的單片機(jī)應(yīng)用系統(tǒng)中,單片機(jī)往往作為一個(gè)核心部件來(lái)使用,但僅單片機(jī)方面的知識(shí)是不夠的,還應(yīng)根據(jù)具體硬件結(jié)構(gòu)、軟硬件結(jié)合,來(lái)加以完善。
計(jì)算器在人們的日常生活中是比較常見(jiàn)的電子產(chǎn)品之一。可是它還在發(fā)展之中,以后必將出現(xiàn)功能更加強(qiáng)大的計(jì)算機(jī),基于這樣的理念,本次設(shè)計(jì)是用AT89C51單片機(jī)、LCD液晶顯示器、控制按鍵等為元件來(lái)設(shè)計(jì)的計(jì)算器。利用此設(shè)計(jì)熟悉單片機(jī)微控制器及C語(yǔ)言編程,對(duì)其片資源及各個(gè)I/O端口的功能和基本用途的了解。掌握Microsoft Visual C++ 6.0及Keil軟件應(yīng)用程序開(kāi)發(fā)環(huán)境,常用的LCD顯示器的使用方法和一般鍵盤(pán)的使用方法。




引言

    當(dāng)今社會(huì),隨著人們物質(zhì)生活的不斷提高,電子產(chǎn)品已經(jīng)走進(jìn)了家家戶(hù)戶(hù),無(wú)論是生活或?qū)W習(xí),還是娛樂(lè)和消遣幾乎樣樣都離不開(kāi)電子產(chǎn)品,大型復(fù)雜的計(jì)算能力是人腦所不能勝任的,而且比較容易出錯(cuò)。計(jì)算器作為一種快速通用的計(jì)算工具方便了用戶(hù)的使用。計(jì)算器可謂是我們最親密的電子伙伴之一。計(jì)算器一般由運(yùn)算器、控制器、存儲(chǔ)器、鍵盤(pán)、顯示器、電源和一些可選外圍設(shè)備及電子配件通過(guò)人工或機(jī)器設(shè)備組成。鍵盤(pán)是計(jì)算器的輸入部件,一般采用接觸式或傳感式。為減小計(jì)算器的尺寸,一鍵常常有多種功能。顯示器是計(jì)算器的輸出部件,有發(fā)光二極管顯示器和液晶顯示器等。除顯示計(jì)算結(jié)果外,還常有溢出指示、錯(cuò)誤指示等。
    人們利用計(jì)算器代替了許多復(fù)雜計(jì)算,包括加減乘除和其他運(yùn)算。尤其是小型計(jì)算器,它攜帶方便,在生活中用起來(lái)方便快捷,成為了財(cái)政、學(xué)習(xí)、生意上都青睞的必需品。它的需求廣泛,在計(jì)算器的發(fā)展上存在很大的空間和市場(chǎng)意義。單片機(jī)在我國(guó)的各行各業(yè)得到了廣泛使用,單片機(jī)的出現(xiàn)是計(jì)算機(jī)制造技術(shù)高速發(fā)展的產(chǎn)物,它是嵌入式控制系統(tǒng)的核心。如今,它已經(jīng)廣泛應(yīng)用到我們生活中的各個(gè)領(lǐng)域,用單片機(jī)可以很方便的實(shí)現(xiàn)計(jì)算器的設(shè)計(jì)。
    眾所周知單片機(jī)是一種集成在電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU隨機(jī)存儲(chǔ)器RAM、只讀存儲(chǔ)器ROM、多種I/O口和中斷系統(tǒng)、定時(shí)器/計(jì)時(shí)器等功能集成到一塊硅片上構(gòu)成的一個(gè)小而完善的計(jì)算機(jī)系統(tǒng)。單片機(jī)由于其微小的體積和極低的成本,廣泛的應(yīng)用于家用電器、工業(yè)控制等領(lǐng)域中。在工業(yè)生產(chǎn)中。單片微型計(jì)算機(jī)是微型計(jì)算機(jī)的一個(gè)重要分支,也是頗具生命力的機(jī)種。單片微型計(jì)算機(jī)簡(jiǎn)稱(chēng)單片機(jī),特別適用于控制領(lǐng)域,故又稱(chēng)為微控制器。


第一章  系統(tǒng)整體概述

1.1 設(shè)計(jì)目的

應(yīng)用《單片機(jī)應(yīng)用基礎(chǔ)》、《計(jì)算機(jī)應(yīng)用基礎(chǔ)》等所學(xué)相關(guān)知識(shí)及查閱資料,完成簡(jiǎn)易計(jì)算器的設(shè)計(jì),以達(dá)到理論與實(shí)踐更好的結(jié)合、進(jìn)一步提高綜合運(yùn)用所學(xué)知識(shí)和設(shè)計(jì)的能力的目的。

通過(guò)本次設(shè)計(jì)的訓(xùn)練,可以使我在基本思路和基本方法上對(duì)基于MCS-51單片機(jī)的嵌入式系統(tǒng)設(shè)計(jì)有一個(gè)比較感性的認(rèn)識(shí),并具備一定程度的設(shè)計(jì)能力。

主要完成如下方面的設(shè)計(jì)任務(wù):

1、簡(jiǎn)要闡述單片機(jī)技術(shù)發(fā)展的國(guó)內(nèi)外現(xiàn)狀及LED動(dòng)態(tài)顯示和矩陣鍵盤(pán)基本原理;

2、掌握MCS-51系列某種產(chǎn)品(例如8051)的最小電路及外圍擴(kuò)展電路的設(shè)計(jì)方法;

3、了解單片機(jī)數(shù)據(jù)轉(zhuǎn)換功能及工作過(guò)程;

4、完成主要功能模塊的硬件電路設(shè)計(jì)及必要的參數(shù)確定.

1.2 計(jì)算器設(shè)計(jì)總體思想

根據(jù)功能和指示要求,本系統(tǒng)選用以51單片機(jī)為主控機(jī)。通過(guò)擴(kuò)展必要的外圍接口電路,實(shí)現(xiàn)對(duì)計(jì)算器的設(shè)計(jì)。

具體設(shè)計(jì)如下:

1、由于要設(shè)計(jì)的是簡(jiǎn)單的計(jì)算器,可以進(jìn)行四則運(yùn)算,為了得到教好的顯示效果,采用LCD顯示數(shù)據(jù)和結(jié)果。

2、另外鍵盤(pán)包括數(shù)字鍵(0-9)、符號(hào)鍵(+、-、*、/)、清除鍵和等號(hào)鍵,故只需要16個(gè)按鍵即可,設(shè)計(jì)中采用集成的計(jì)算機(jī)鍵盤(pán)。

3、執(zhí)行程序:開(kāi)機(jī)顯示零,等待鍵入數(shù)值,當(dāng)鍵入數(shù)字,通過(guò)LCD顯示出來(lái),當(dāng)鍵入+、-、*、/運(yùn)算符,計(jì)算器在內(nèi)部執(zhí)行數(shù)值轉(zhuǎn)換和存儲(chǔ),并等待再次鍵入數(shù)值后將顯示鍵入的數(shù)值,按等號(hào)就會(huì)在LCD上輸出運(yùn)算結(jié)果。

4、錯(cuò)誤提示:當(dāng)單片機(jī)執(zhí)行程序中有錯(cuò)誤時(shí),會(huì)在LCD上顯示相應(yīng)的提示,如:當(dāng)輸入的數(shù)值或計(jì)算器得到的結(jié)果大于計(jì)算器的顯示范圍時(shí),計(jì)算器會(huì)在LCD上提示溢出;當(dāng)除數(shù)為0時(shí),計(jì)算器會(huì)在LCD上提示錯(cuò)誤。


1.3系統(tǒng)的組成

計(jì)算器設(shè)計(jì)硬件電路采用三部分電路模塊構(gòu)成,第一部分是鍵盤(pán)模塊電路,采用4*4矩陣式鍵盤(pán)作為輸入電路;第二部分是LCD1602液晶顯示模塊;第三部分是以51單片機(jī)作為控制核心。軟件程序主要由三部分組成:主程序、按鍵掃描程序和LCD1602顯示程序。


圖片在51hei附件中
圖 系統(tǒng)組成及總體框圖

本系統(tǒng)就是充分利用了8051芯片的I/O引腳。系統(tǒng)以采用MCS-51系列單片機(jī)Intel8051為中心器件來(lái)設(shè)計(jì)計(jì)算器控制器,實(shí)現(xiàn)了能根據(jù)實(shí)際輸入值顯示并存儲(chǔ)的功能,計(jì)算程序則是參照教材。

本計(jì)算器是以MCS-51系列8051單片機(jī)為核心構(gòu)成的簡(jiǎn)易計(jì)算器系統(tǒng)。該系統(tǒng)通過(guò)單片機(jī)控制,實(shí)現(xiàn)對(duì)4*4鍵盤(pán)掃描進(jìn)行實(shí)時(shí)的按鍵檢測(cè),并把檢測(cè)數(shù)據(jù)存儲(chǔ)下來(lái)。整個(gè)計(jì)算器系統(tǒng)的工作過(guò)程為:首先存儲(chǔ)單元初始化,顯示初始值和鍵盤(pán)掃描,判斷按鍵位置,查表得出按鍵值,單片機(jī)則對(duì)數(shù)據(jù)進(jìn)行儲(chǔ)存與相應(yīng)處理轉(zhuǎn)換,之后送入LED顯示器動(dòng)態(tài)顯示。整個(gè)系統(tǒng)可分為三個(gè)主要功能模塊:功能模塊一,實(shí)時(shí)鍵盤(pán)掃描;功能模塊二,數(shù)據(jù)轉(zhuǎn)換成顯示器顯示;功能模塊三,顯示器動(dòng)態(tài)顯示。


硬件系統(tǒng)設(shè)計(jì)

硬件系統(tǒng)是指構(gòu)成微機(jī)系統(tǒng)的實(shí)體和裝置,通常由運(yùn)算器、控制器、存儲(chǔ)器、輸入接口電路和輸入設(shè)備、輸出接口電路和輸出設(shè)備等組成。單片機(jī)實(shí)質(zhì)上是一個(gè)硬件的芯片,在實(shí)際應(yīng)用中,通常很難直接和被控對(duì)象進(jìn)行電氣連接,必須外加各種擴(kuò)展接口電路、外部設(shè)備、被控對(duì)象等硬件和軟件,才能構(gòu)成一個(gè)單片機(jī)應(yīng)用系統(tǒng)。本設(shè)計(jì)選用以AT89S51單片機(jī)為主控單元。顯示部分:采用LCD靜態(tài)顯示。按鍵部分,采用4*4鍵盤(pán)。 硬件電路原理圖如圖2.1所示:

  圖2.1 硬件電路原理圖

2.1 鍵盤(pán)接口電路

計(jì)算機(jī)輸入數(shù)字和其他功能按鍵時(shí)要用到很多按鍵,在這種情況下,編程會(huì)很簡(jiǎn)單,但是會(huì)占用大量的I/O口資源,因此在很多情況下都不采用這樣的方式,而是采用矩陣鍵盤(pán)的方式。矩陣鍵盤(pán)采用四條I/O線作為行線,四條I/O線作為列線組成鍵盤(pán),在行線和列線的每個(gè)交叉點(diǎn)上設(shè)置一個(gè)按鍵。這樣鍵盤(pán)上按鍵的數(shù)量就為4*4個(gè)。這樣行列式鍵盤(pán)結(jié)構(gòu)能有效的提高單片機(jī)系統(tǒng)中I/O口的利用率。

計(jì)算器的鍵盤(pán)布局如圖2.2所示:一般有16個(gè)鍵組成,在單片機(jī)中正好有一個(gè)P端口實(shí)現(xiàn)16個(gè)按鍵功能,這種形式在單片機(jī)系統(tǒng)中最常用。

圖2.2 矩陣鍵盤(pán)內(nèi)部電路

2.2 LCD顯示模塊

本設(shè)計(jì)采用LCD液晶顯示器來(lái)顯示輸出數(shù)據(jù)。LCD的特性有:1、+5V電壓,對(duì)比可調(diào)度;2、內(nèi)含復(fù)位電路;3、提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能;4、有80字節(jié)顯示數(shù)據(jù)存儲(chǔ)器DDRAM;5、內(nèi)建有160個(gè)5X7點(diǎn)陣的字型的字符發(fā)生器CGROM;6、8個(gè)可由用戶(hù)自定義的5X7的字符發(fā)生器CGRAM。

本設(shè)計(jì)通過(guò)D0-D7引腳向LCD寫(xiě)指令字或?qū)憯?shù)據(jù)以使LCD實(shí)現(xiàn)不同的功能或顯示相應(yīng)的數(shù)據(jù)。其接口電路如圖2.3所示。

                    圖2.3 LCD接口電路

LCD的引腳說(shuō)明如表2.1所示:

                表2.1 LCD的引腳說(shuō)明

符號(hào)

引腳說(shuō)明

符號(hào)

引腳說(shuō)明

VSS

電源地

DB4

Data  I/O

VDD

電源正極(+5V)

DB5

Data  I/O

V0

液晶顯示偏壓輸入

DB6

Data  I/O

RS

數(shù)據(jù)/命令選擇端(H/L)

DB7

Data  I/O

R/W

讀寫(xiě)控制信號(hào)(H/L)

CS1

片選IC1信號(hào)

E

使能信號(hào)

CS2

片選IC2信號(hào)

DB0

Data  I/O

RST

復(fù)位端(H:正常工作,L:復(fù)位)

DB1

Data  I/O

VEE

負(fù)電源輸出(-10V)

DB2

Data  I/O

BLA

背光源正極(+4.2)

DB3

Data  I/O

BLK

背光源正極


2.3 運(yùn)算模塊

MCS-51單片機(jī)是在一塊芯片中集成了CPU、RAM、ROM、定時(shí)器/計(jì)數(shù)器和多功能I/O等計(jì)算機(jī)所需要的基本功能部件。如果按功能劃分,它由以下功能部件組成,即微處理器(CPU),數(shù)據(jù)存儲(chǔ)器(RAM),程序存儲(chǔ)器(ROM/EPROM),并行I/O口,串行口,定時(shí)器/計(jì)數(shù)器,中斷系統(tǒng)及特殊功能寄存器(SFR)。單片機(jī)是靠程序運(yùn)行的,并且可以修改。通過(guò)不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的一些功能,通過(guò)使用單片機(jī)編寫(xiě)的程序可以實(shí)現(xiàn)高智能、高效率以及高可靠性,因此采用單片機(jī)作為計(jì)算器的主要功能部件,可以很快的實(shí)現(xiàn)運(yùn)算功能。

運(yùn)算模塊由鍵盤(pán)和顯示屏組成。單片機(jī)通過(guò)按鍵來(lái)實(shí)現(xiàn)輸入數(shù)據(jù)和操作方式的控制,在運(yùn)算過(guò)程中,對(duì)所設(shè)的數(shù)據(jù)進(jìn)行四則運(yùn)算時(shí),要先確定選用的是哪一個(gè)運(yùn)算符,若是+或*,則要判斷結(jié)果是否會(huì)溢出,溢出則顯示錯(cuò)誤提示,沒(méi)有溢出則顯示運(yùn)算結(jié)果,若是/,則要判斷除數(shù)是否為零,為零時(shí)顯示錯(cuò)誤提示,不為零顯示運(yùn)算結(jié)果。

軟件設(shè)計(jì)
3.1 語(yǔ)言的特點(diǎn)及選擇

本設(shè)計(jì)是硬件電路和軟件編程相結(jié)合的設(shè)計(jì)方案,選擇合適的編程語(yǔ)言是一個(gè)重要的環(huán)節(jié)。在單片機(jī)的應(yīng)用系統(tǒng)程序設(shè)計(jì)時(shí),常用的是匯編語(yǔ)言和C語(yǔ)言。機(jī)硬件,程序可讀性和可移植性比較差。而C語(yǔ)言雖然執(zhí)行效率沒(méi)有匯編語(yǔ)言高,但語(yǔ)言簡(jiǎn)潔,使用方便,靈活,運(yùn)算豐富,表達(dá)化類(lèi)型多樣化,數(shù)據(jù)結(jié)構(gòu)類(lèi)型豐富,具有結(jié)構(gòu)化的控制語(yǔ)句,程序設(shè)計(jì)自由度大,有很好的可重用性,可移植性等特點(diǎn)。

由于現(xiàn)在單片機(jī)的發(fā)展已經(jīng)達(dá)到了很高的水平,內(nèi)部的各種資源相當(dāng)?shù)呢S富,CPU的處理速度非常的快。用C語(yǔ)言來(lái)控制單片機(jī)無(wú)疑是一個(gè)理想的選擇。所以在本設(shè)計(jì)中采用C語(yǔ)言編寫(xiě)軟件程序。主程序的設(shè)計(jì)詳見(jiàn)附錄三。

3.2 鍵掃程序設(shè)計(jì)

鍵掃程序的過(guò)程為:開(kāi)始時(shí),先判斷是否有鍵閉合,無(wú)鍵閉合時(shí),返回繼續(xù)判斷,有鍵閉合時(shí),先去抖動(dòng),然后確定是否有鍵按下,若無(wú)鍵按下,則返回繼續(xù)判斷是否有鍵閉合,若有鍵按下,則判斷鍵號(hào),然后釋放,若釋放按鍵完畢,則返回,若沒(méi)有釋放按鍵,則返回繼續(xù)釋放。其流程圖如圖3.1所示。

圖3.1 鍵掃程序流程圖

3.3 算術(shù)運(yùn)算程序設(shè)計(jì)

算術(shù)運(yùn)算程序的過(guò)程為:先判斷輸入的運(yùn)算符是+、-、*、/ 中的哪一個(gè),若是+或-,則要判斷運(yùn)算結(jié)果是否溢出,溢出則顯示錯(cuò)誤信息,沒(méi)溢出就顯示運(yùn)算結(jié)果,若是/,則要先判斷除數(shù)是否為零,為零就顯示錯(cuò)誤信息,不為零則顯示運(yùn)算結(jié)果,若是-,則直接顯示運(yùn)算結(jié)果。其流程圖如圖3.2所示。




圖3.2 算術(shù)運(yùn)算程序設(shè)計(jì)流程圖
3.4 顯示程序設(shè)計(jì)

顯示程序的過(guò)程為:顯示開(kāi)始時(shí),先進(jìn)行LCD的初始化,判斷是否顯示漢字或ACSII碼或圖形,若不顯示,則返回,若顯示的是漢字或ACSII碼,則進(jìn)行相應(yīng)功能的設(shè)置,然后送地址和數(shù)據(jù),再判斷是否顯示完,顯示完則返回,沒(méi)有顯示完則繼續(xù)送地址,若顯示的是圖形,則先進(jìn)行相應(yīng)功能的設(shè)置,再送行地址和列地址,然后送數(shù)據(jù),最后判斷是否顯示完,顯示完則返回,沒(méi)有顯示完則繼續(xù)送行地址和列地址。其流程圖如圖3.3所示。































圖3.3 顯示程序流程圖
調(diào)試與分析
4
.1 硬件調(diào)試

常見(jiàn)故障:

1、邏輯錯(cuò)誤:它是由設(shè)計(jì)錯(cuò)誤或加工過(guò)程中的工藝性錯(cuò)誤所造成的。這類(lèi)錯(cuò)誤包括錯(cuò)線、開(kāi)路、短路等。

2、元器件失效:有兩方面的原因:一是器件本身已損壞或性能不符合要求;二是組裝錯(cuò)誤造成元件失效,如電解電容、集成電路安裝方向錯(cuò)誤等。

3、可靠性差:因其可靠性差的原因很多,如金屬化孔、接插件接觸不良會(huì)造成系統(tǒng)時(shí)好時(shí)壞,經(jīng)不起振動(dòng);走線和布局不合理也會(huì)引起系統(tǒng)可靠性差。

4、電源故障:若樣機(jī)由電源故障,則加電后很容易造成器件損壞。電源故障包括電壓值不符合設(shè)計(jì)要求,電源引線和插座不對(duì),功率不足,負(fù)載能力差等。

調(diào)試方法:包括多級(jí)調(diào)試和聯(lián)機(jī)調(diào)試。在調(diào)試過(guò)程中要針對(duì)可能出現(xiàn)的故障認(rèn)真分析,直至檢查出原因并排除。

本次硬件調(diào)試過(guò)程中,對(duì)所出現(xiàn)的問(wèn)題進(jìn)行了認(rèn)真的分析和改正,最后能夠很好的達(dá)到設(shè)計(jì)要求的效果。

4.2 軟件調(diào)試

軟件調(diào)試分為以下四個(gè)階段:1、 編寫(xiě)程序并查錯(cuò);2、在C語(yǔ)言的編譯系統(tǒng)中編譯源程序3、對(duì)程序進(jìn)行編譯連接,并及時(shí)發(fā)現(xiàn)程序中存在的錯(cuò)誤;4、改正錯(cuò)誤。

在本次調(diào)試中出現(xiàn)的問(wèn)題有:

1、在程序中有的函數(shù)名未定義;

2、在抄錄程序時(shí),少錄入一些字符,如:“;”、“{”、“-”等符號(hào),而出現(xiàn)錯(cuò)誤;

3、有一些函數(shù)名錄入時(shí)少寫(xiě)一個(gè)字母或順序顛倒;

4、沒(méi)有注意函數(shù)名的調(diào)用及定義;

5、芯片引腳定義出錯(cuò)而導(dǎo)致沒(méi)有實(shí)驗(yàn)現(xiàn)象。

在軟件調(diào)試過(guò)程中,對(duì)出現(xiàn)的錯(cuò)誤進(jìn)行了認(rèn)真的分析和修改,多次調(diào)試成功后,能夠很好的達(dá)到既定的設(shè)計(jì)效果。

第五章 制作感受

通過(guò)這個(gè)作品的設(shè)計(jì),收獲頗多,當(dāng)我開(kāi)始準(zhǔn)備做單片機(jī)作品設(shè)計(jì)的時(shí)候,設(shè)計(jì)什么都是我十分困惑的,無(wú)意中室友找我借計(jì)算器去考試,靈感就來(lái)了,沒(méi)錯(cuò)就設(shè)計(jì)計(jì)算器了,于是便搜集各種關(guān)于計(jì)算器的相關(guān)資料。開(kāi)始感覺(jué)設(shè)計(jì)出來(lái)應(yīng)該會(huì)很難,不過(guò),經(jīng)過(guò)不斷地努力之后,了解計(jì)算器的工作原理,設(shè)計(jì)計(jì)算器的電路原理圖和實(shí)物圖,然后便到網(wǎng)上買(mǎi)需要的電子元器件了,經(jīng)過(guò)一些時(shí)日各種東西都已準(zhǔn)備齊全,說(shuō)干就干,按照原理圖一步步進(jìn)行焊接。做起來(lái)越來(lái)越來(lái)勁,感覺(jué)很有趣的樣子,都說(shuō)興趣是最好的老師,果然沒(méi)錯(cuò)。

當(dāng)我剛剛做完這個(gè)作品第一次進(jìn)行功能運(yùn)行的時(shí)候,沒(méi)有成功,當(dāng)時(shí)心里有些無(wú)奈,經(jīng)過(guò)幾天的布線焊接最終卻沒(méi)成功,有點(diǎn)點(diǎn)小失落。當(dāng)然不是每個(gè)人都能一次就能做成的,便進(jìn)行各種檢查調(diào)試,經(jīng)過(guò)幾番周折最后勉強(qiáng)能實(shí)現(xiàn)功能了,但是還有些不盡人意,不過(guò)當(dāng)時(shí)已有一種成功的喜悅感了。再經(jīng)過(guò)不斷地進(jìn)行修改完善,終于達(dá)到了我想要的效果,這時(shí)的我感覺(jué)自己棒棒噠,自己也能做出計(jì)算器了。這個(gè)過(guò)程中除了學(xué)到知識(shí)以外,還感受到了堅(jiān)持努力最終就會(huì)取得自己想要的成績(jī)。












附錄一:計(jì)算器proteus仿真圖

附錄二:元器件清單

1
10uf
直插電解電容
1
2
30P
直插瓷片電容
2
3
10K
9腳排阻
1
4
LCD1602
LCD1602液晶顯示器
1
5
POWER
DC電源插座
1
6
2.2k
色環(huán)電阻
1
7
10K
2
8
SW-PB
按鍵6X6X5MM
17
9
SWITCH
自鎖開(kāi)關(guān)
1
10
STC89C51/52
51單片機(jī)
1
11
12MHZ
晶振
1
12
導(dǎo)線
XXcm
1
13
焊錫
XXcm
1
14
USB轉(zhuǎn)DC3.5mm電源線
系統(tǒng)供電
1
15
9*15萬(wàn)用板

1
16
單片機(jī)插座
40腳IC座
1
17
DC電源頭
DC插頭 3.5-1.35MM
1
18
LCD1602插座
16P排母
1
19
LCD1602引出腳
16P排針
1

附錄三:源程序


  1. /*
  2. 接盤(pán)按鍵說(shuō)明:
  3. --------------------------------------------------
  4.             |  1  |  2  |  3  |  +  |
  5.             - - - - - - - - - - - - -
  6.             |  4  |  5  |  6  |  -  |
  7.             - - - - - - - - - - - - -
  8.             |  7  |  8  |  9  |  *  |
  9.             - - - - - - - - - - - - -
  10.                                           |  C  |  0  |  =  |  /  |
  11. --------------------------------------------------*/
  12. //操作簡(jiǎn)介
  13. // 按第一個(gè)數(shù),再按'+-*/',再按'='顯示出結(jié)果,然后按C清屏
  14. // 加最大9999+9999=19998
  15. // 減最大9999-0   =9999
  16. // 乘最大9999*9999=99980001
  17. // 除 1/9=0.1111 保留小數(shù)點(diǎn)后4位
  18. #include<reg51.h>
  19. #define uint unsigned int
  20. #define uchar unsigned char
  21. //--------LCD1602-------------------
  22. //P00-07==== D0-7
  23. sbit rs=P2^5;        //指令or數(shù)據(jù)
  24. sbit wela=P2^6;      //讀or寫(xiě)
  25. sbit lcden=P2^7;              //使能信號(hào)
  26. //--------LCD1602-------------------
  27. //--------KEY-----------------------
  28. //P1口
  29. //--------KEY-----------------------
  30. uchar code table[]= "                ";

  31. long  int data_a,data_b;               //第一個(gè)數(shù)和第二個(gè)數(shù)
  32. long  int data_c;                                          //計(jì)算結(jié)果

  33. uchar dispaly[10];         //顯示緩沖

  34. //************************************************************************/
  35. // 描述: 延時(shí)t us函數(shù)
  36. //************************************************************************/
  37. void LCD_Delay_us(unsigned int t)
  38. {
  39.               while(t--);           //t=0,退出
  40. }
  41. //************************************************************************/
  42. // 描述: 延時(shí)t ms函數(shù)
  43. //************************************************************************/
  44. void LCD_Delay_ms(unsigned int t)
  45. {
  46.               unsigned int i,j;
  47.               for(i=0;i<t;i++)                                   //執(zhí)行t次循環(huán)
  48.               for(j=0;j<113;j++)                                 //執(zhí)行113次循環(huán)
  49.               ;
  50. }
  51. //************************************************************************/
  52. // 描述: 1602液晶寫(xiě)指令
  53. //************************************************************************/
  54. void write_com(uchar com)                  //1602液晶寫(xiě)指令
  55. {
  56.               rs=0;                       //寫(xiě)指令
  57.               lcden=0;                    //使能1602
  58.               P0=com;                     //寫(xiě)入指令com
  59.               LCD_Delay_ms(1);            //延時(shí)1ms
  60.               lcden=1;                    //使能1602
  61.               LCD_Delay_ms(2);            //延時(shí)2ms
  62.               lcden=0;                              //使能1602
  63. }
  64. //************************************************************************/
  65. // 描述:1602液晶寫(xiě)數(shù)據(jù)
  66. //************************************************************************/
  67. void write_date(uchar date) //1602液晶寫(xiě)數(shù)據(jù)
  68. {
  69.               rs=1;                        //寫(xiě)數(shù)據(jù)
  70.               lcden=0;                     //使能1602
  71.               P0=date;                     //寫(xiě)入數(shù)據(jù)date
  72.               LCD_Delay_ms(1);             //延時(shí)1ms
  73.               lcden=1;                     //使能1602
  74.               LCD_Delay_ms(2);             //延時(shí)2ms
  75.               lcden=0;                               //使能1602
  76. }
  77. //************************************************************************/
  78. // 描述:指定x,y寫(xiě)入字符函數(shù)
  79. //************************************************************************/
  80. void W_lcd(unsigned char x,unsigned char y,unsigned char Data)
  81. {   
  82.               if (y == 0){write_com(0x80 + x);}   //第一行
  83.               else{write_com(0xc0 + x);}          //第二行
  84.               write_date( Data);                  //寫(xiě)入數(shù)據(jù)
  85. }
  86. //指定x,y寫(xiě)入字符串函數(shù)
  87. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  88. {   
  89. if (y == 0){write_com(0x80 + x);}                             //第一行
  90. else{write_com(0xC0 + x);}                                    //第二行
  91. while (*s)                                                    //
  92.               {write_date( *s); s++;}                                  //寫(xiě)入數(shù)據(jù)
  93. }
  94. //************************************************************************/
  95. // 描述:初始化液晶,及畫(huà)面初始化
  96. //************************************************************************/
  97. void init_lcd(void)            //初始化液晶,及畫(huà)面初始化
  98. {
  99.               wela=0;                      //寫(xiě)液晶
  100.               lcden=0;                     //使能1602
  101.               write_com(0x38);             //8 位總線,雙行顯示,5X7 的點(diǎn)陣字符
  102.               LCD_Delay_us(100);           //延時(shí)100us
  103.               write_com(0x0c);             //開(kāi)顯示,無(wú)光標(biāo),光標(biāo)不閃爍
  104.               write_com(0x06);             //光標(biāo)右移動(dòng)
  105.               write_com(0x01);             //清屏
  106.               write_com(0x80);             //DDRAM 地址歸0
  107. }
  108. //************************************************************************/
  109. // 描述: 反轉(zhuǎn)法鍵盤(pán)掃描
  110. //************************************************************************/
  111. short keycheckdown()                                                        /* 反轉(zhuǎn)法鍵盤(pán)掃描 */
  112. {

  113.               short temp1,temp2,temp,a=0xff;
  114.               P1=0xf0;                                                                                    /* 輸入行值(或列值) */
  115.               LCD_Delay_ms(20);                                                        /* 延時(shí) */
  116.               temp1=P1;                                                                                    /* 讀列值(或行值) */
  117.               P1=0xff;
  118.               LCD_Delay_ms(20);                                                        /* 延時(shí) */
  119.               P1=0x0f;                                                                                    /* 輸入列值(或行值) */
  120.               LCD_Delay_ms(20);                                                        /* 延時(shí) */            
  121.               temp2=P1;                                                                                    /* 讀行值(或列值) */
  122.               P1=0xff;
  123.               temp=(temp1&0xf0)|(temp2&0xf);              /* 將兩次讀入數(shù)據(jù)組合 */
  124.               switch(temp)                                                                      /* 通過(guò)讀入數(shù)據(jù)組合判斷按鍵位置 */
  125.               {


  126.                             case 0x77 :a=0x0d;break;//  按鍵/  
  127.                             case 0x7b :a=0x0e; break;// 按鍵=            
  128.                             case 0x7d :a=0;                 break;// 按鍵0
  129.                             case 0x7e :a=0x0f; break;// 按鍵CE

  130.                             case 0xb7 :a=0x0c;break;//               按鍵*
  131.                             case 0xbb :a=0x9;break; //  按鍵9
  132.                             case 0xbd :a=0x8;break; //  按鍵8
  133.                             case 0xbe :a=0x7;break; //               按鍵7

  134.                             case 0xd7 :a=0x0b;break;//  按鍵-
  135.                             case 0xdb :a=0x6;break; //               按鍵6
  136.                             case 0xdd :a=0x5;break; //               按鍵5
  137.                             case 0xde :a=0x4;break; //               按鍵4

  138.                             case 0xe7 :a=0x0a; break;// 按鍵+
  139.                             case 0xeb :a=3;break;              //  按鍵3
  140.                             case 0xed :a=2;break;              //  按鍵2
  141.                             case 0xee :a=1;break;              //  按鍵1

  142.                             default :a=0xff;
  143.               }
  144.               return a;                                                                                    /* 返回按鍵值 */
  145. }
  146. void display_a() //顯示數(shù)據(jù)a
  147. {
  148.               dispaly[3]=data_a%10000/1000;    //千
  149.               dispaly[2]=data_a%1000/100;      //百
  150.               dispaly[1]=data_a%100/10;        //十
  151.               dispaly[0]=data_a%10;            //個(gè)

  152.               write_com(0x80+0);               //顯示數(shù)據(jù)a
  153.               if(data_a>999){              write_date('0'+dispaly[3]);}      //顯示千位
  154.               if(data_a>99){              write_date('0'+dispaly[2]);}                            //顯示百位
  155.               if(data_a>9){              write_date('0'+dispaly[1]);}     //顯示十位
  156.                                           write_date('0'+dispaly[0]);      //顯示個(gè)位
  157. }

  158. void display_b() //顯示數(shù)據(jù)b
  159. {
  160.               write_com(0x80+7); //第一行
  161.               dispaly[3]=data_b%10000/1000;    //千
  162.               dispaly[2]=data_b%1000/100;      //百
  163.               dispaly[1]=data_b%100/10;        //十
  164.               dispaly[0]=data_b%10;            //個(gè)

  165. if(data_b>999){              write_date('0'+dispaly[3]); }     //顯示千位  
  166. if(data_b>99) {              write_date('0'+dispaly[2]); }    //顯示百位
  167. if(data_b>9)  {              write_date('0'+dispaly[1]); }     //顯示十位
  168.                                                 write_date('0'+dispaly[0]);      //顯示個(gè)位
  169. }

  170. //計(jì)算結(jié)果
  171. void display_c(x)
  172. {

  173.               if(data_c<100000000&&data_c>-1)//溢出時(shí)顯示錯(cuò)誤
  174.               {            

  175.                             dispaly[8]=data_c%1000000000/100000000;                  //萬(wàn)萬(wàn)
  176.                             dispaly[7]=data_c%100000000/10000000;                  //千萬(wàn)
  177.                             dispaly[6]=data_c%10000000/1000000;                                //百萬(wàn)
  178.                             dispaly[5]=data_c%1000000/100000;                                //十萬(wàn)
  179.                             dispaly[4]=data_c%100000/10000;                                              //萬(wàn)
  180.                             dispaly[3]=data_c%10000/1000;                                              //千
  181.                             dispaly[2]=data_c%1000/100;                                                //百
  182.                             dispaly[1]=data_c%100/10;                                                  //十
  183.                             dispaly[0]=data_c%10;                                                      //個(gè)
  184.                             write_com(0x80+6+0x40); //第一行
  185.                             if(x==4)
  186.                             {   
  187.                             if(data_c>99999999)              {              write_date('0'+dispaly[8]);}    //顯示萬(wàn)萬(wàn)
  188.                             if(data_c>9999999)              {              write_date('0'+dispaly[7]);}   //千萬(wàn)
  189.                             if(data_c>999999)              {              write_date('0'+dispaly[6]);}    //百萬(wàn)
  190.                             if(data_c>99999)              {              write_date('0'+dispaly[5]);}    //十萬(wàn)
  191.                                                                                                                 write_date('0'+dispaly[4]);    //萬(wàn)
  192.                                                                                                                 write_date('.');
  193.                                                                                                                 write_date('0'+dispaly[3]);    //千
  194.                                                                                                                 write_date('0'+dispaly[2]);    //百
  195.                                                                                                                 write_date('0'+dispaly[1]);    //十
  196.                                                                                                                 write_date('0'+dispaly[0]);    //個(gè)
  197.                             }
  198.               else{
  199.                             if(data_c>99999999)              {              write_date('0'+dispaly[8]);}    //顯示萬(wàn)萬(wàn)
  200.                             if(data_c>9999999)              {              write_date('0'+dispaly[7]);}    //千萬(wàn)
  201.                             if(data_c>999999)              {              write_date('0'+dispaly[6]);}    //百萬(wàn)
  202.                             if(data_c>99999)              {              write_date('0'+dispaly[5]);}    //十萬(wàn)
  203.                             if(data_c>9999)                            {              write_date('0'+dispaly[4]);}    //萬(wàn)
  204.                             if(data_c>999)                            {              write_date('0'+dispaly[3]);}    //千
  205.                             if(data_c>99)                            {              write_date('0'+dispaly[2]);}    //百
  206.                             if(data_c>9)                            {              write_date('0'+dispaly[1]);}    //十
  207.                                                                                                                 write_date('0'+dispaly[0]);    //個(gè)
  208.                             }
  209.               }
  210.               else  //溢出時(shí)顯示錯(cuò)誤
  211.               {
  212.                             write_com(0x80+11+0x40); //第一行
  213.                             write_date('E');         //顯示 E
  214.                             write_date('r');         //顯示R
  215.                             write_date('r');                            //顯示R
  216.                             write_date('o');                            //顯示O
  217.                             write_date('r');                            //顯示E
  218.               }
  219. }

  220. void eql(uchar x)//加減乘除運(yùn)算
  221. {
  222.               switch(x)                            /*功能鍵選擇*/
  223.                                           {  
  224.                                                         case 1:data_c=data_a+data_b;break;                               //加  /* + S=1 */ /* 數(shù)值轉(zhuǎn)換函數(shù) */                                                                                                                             
  225.                                                         case 2:if(data_a>=data_b){data_c=data_a-data_b;} /* - S=2 *///減
  226.                        else{data_c=data_b-data_a;W_lcd(5,1,'-');} //負(fù)數(shù)符號(hào)
  227.                                                                          break;               
  228.                                                         case 3:data_c=(data_a*data_b);break;                              /* * S=3 *///乘
  229.                                                         case 4:if(data_b==0){LCD_Write_String(0,1,"Error !");}else{data_c=(data_a*10000)/data_b;}break;                              /* / S=4 *///除//溢出時(shí)顯示錯(cuò)誤
  230.                                                         case 0:break;
  231.                                           }               

  232. }

  233. void main()
  234. {
  235.               uchar   key=0xff;               //鍵值初始化
  236.               uchar   n=0;                                                                      //第1個(gè)數(shù)可以按1-4次
  237.               uchar   m=5;                                                                       //第2個(gè)數(shù)可以按1-4次
  238.               uchar   x=0;
  239.               data_a=0;                       //前一個(gè)數(shù)
  240.               data_b=0;                       //后一個(gè)數(shù)
  241.               data_c=0;                       //結(jié)果
  242.               init_lcd();                                                                        //1602液晶初始化
  243.               display_a();
  244.     while(1)
  245.                 {
  246.                               key=keycheckdown();                                          /*動(dòng)態(tài)掃描鍵盤(pán),返回按鍵對(duì)應(yīng)值,賦給j        key=0到f */
  247.                             if(0xff!=key)                                                        /*若返回值有效,進(jìn)入內(nèi)部處理程序*/
  248.                             {
  249.                               if(key<10)
  250.                               {
  251.                       if(n<4){data_a=data_a*10+key;m=5;display_a();}n++;  //首先輸入第一個(gè)數(shù)
  252.                                 if(m<4){data_b=data_b*10+key;n=5;display_b();}m++;  //必須按了+-*/才能輸入第二個(gè)數(shù)                           
  253.                               }
  254.           else
  255.           {              switch(key)                            /*功能鍵選擇*/
  256.                                                                       {
  257.                                                                                     case 0xa:n=5;m=0;x=1;W_lcd(5,0,'+');break; //加 /* + S=1 */ /* 數(shù)值轉(zhuǎn)換函數(shù) */                                                                                                                             
  258.                                                                                     case 0xb:n=5;m=0;x=2;W_lcd(5,0,'-');break;                              /* - S=2 *///減
  259.                                                                                     case 0xc:n=5;m=0;x=3;W_lcd(5,0,'*');break;                              /* * S=3 *///乘
  260.                                                                                     case 0xd:n=5;m=0;x=4;W_lcd(5,0,'/');break;                              /* / S=4 *///除
  261.                                                                                     case 0xe:n=5;m=5;eql(x);W_lcd(12,0,'=');display_c(x);break;   

  262. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

完整論文下載(word格式 可編輯):
單片機(jī)作品之計(jì)算器設(shè)計(jì)報(bào)告.doc (622.26 KB, 下載次數(shù): 299)


評(píng)分

參與人數(shù) 3黑幣 +15 收起 理由
林木林 + 5 很給力!
l278966232 + 5
454656432 + 5 很給力!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂5 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:277109 發(fā)表于 2018-1-17 18:48 | 只看該作者
受教了
回復(fù)

使用道具 舉報(bào)

板凳
ID:277230 發(fā)表于 2018-1-18 08:24 來(lái)自觸屏版 | 只看該作者
看來(lái)挺不錯(cuò)的資料
回復(fù)

使用道具 舉報(bào)

地板
ID:347385 發(fā)表于 2018-6-8 11:06 | 只看該作者
不錯(cuò)的資料,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

5#
ID:358645 發(fā)表于 2018-6-25 16:51 | 只看該作者
很厲害
回復(fù)

使用道具 舉報(bào)

6#
ID:363545 發(fā)表于 2018-7-2 21:56 | 只看該作者
太棒了,幫大忙了
回復(fù)

使用道具 舉報(bào)

7#
ID:368586 發(fā)表于 2018-7-10 12:02 | 只看該作者
很給力
回復(fù)

使用道具 舉報(bào)

8#
ID:342128 發(fā)表于 2018-7-10 15:26 | 只看該作者
很好的分享 感謝
回復(fù)

使用道具 舉報(bào)

9#
ID:369931 發(fā)表于 2018-7-12 09:27 | 只看該作者
大佬。。。
回復(fù)

使用道具 舉報(bào)

10#
ID:369931 發(fā)表于 2018-7-12 09:28 | 只看該作者
請(qǐng)問(wèn)你這個(gè)有prodeus的仿真電路圖
回復(fù)

使用道具 舉報(bào)

11#
ID:325250 發(fā)表于 2018-7-13 09:08 | 只看該作者
多謝多謝
回復(fù)

使用道具 舉報(bào)

12#
ID:399809 發(fā)表于 2018-9-19 09:05 | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

13#
ID:400039 發(fā)表于 2018-9-19 15:37 來(lái)自觸屏版 | 只看該作者
學(xué)習(xí)到了,確實(shí)很好
回復(fù)

使用道具 舉報(bào)

14#
ID:434835 發(fā)表于 2018-11-28 11:29 | 只看該作者
謝謝了,剛好急需
回復(fù)

使用道具 舉報(bào)

15#
ID:438408 發(fā)表于 2018-12-3 14:57 來(lái)自觸屏版 | 只看該作者
上課剛好可以用到!謝謝!
回復(fù)

使用道具 舉報(bào)

16#
ID:443436 發(fā)表于 2018-12-10 16:56 | 只看該作者
最近在做單片機(jī)的實(shí)習(xí),正需要這篇帖子,奈斯
回復(fù)

使用道具 舉報(bào)

17#
ID:443718 發(fā)表于 2018-12-15 22:09 | 只看該作者
為什么跟樓主連的一樣,仿真的時(shí)候按鍵盤(pán)沒(méi)有反應(yīng)啊
回復(fù)

使用道具 舉報(bào)

18#
ID:447541 發(fā)表于 2018-12-17 00:08 | 只看該作者
很實(shí)用!
回復(fù)

使用道具 舉報(bào)

19#
ID:453458 發(fā)表于 2018-12-24 14:47 | 只看該作者
很棒的這個(gè)程序
回復(fù)

使用道具 舉報(bào)

20#
ID:453458 發(fā)表于 2018-12-24 14:49 | 只看該作者
很棒的這個(gè)程序、、
回復(fù)

使用道具 舉報(bào)

21#
ID:456730 發(fā)表于 2018-12-27 22:56 | 只看該作者
網(wǎng)上都是lcd1602
回復(fù)

使用道具 舉報(bào)

22#
ID:457268 發(fā)表于 2018-12-28 14:03 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

23#
ID:460483 發(fā)表于 2019-1-2 21:23 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

24#
ID:482132 發(fā)表于 2019-2-28 15:36 | 只看該作者
謝謝 正好用到
回復(fù)

使用道具 舉報(bào)

25#
ID:513165 發(fā)表于 2019-4-24 14:25 | 只看該作者
早就想自己做了
回復(fù)

使用道具 舉報(bào)

26#
ID:559525 發(fā)表于 2019-6-11 07:49 來(lái)自觸屏版 | 只看該作者
思路清醒,我們老師說(shuō)搞工程或者項(xiàng)目關(guān)鍵在于你怎么想,最后才去實(shí)現(xiàn),我認(rèn)為重要的不是源代碼,而是思路
回復(fù)

使用道具 舉報(bào)

27#
ID:559780 發(fā)表于 2019-6-11 11:29 | 只看該作者
看起來(lái)很好,謝謝
回復(fù)

使用道具 舉報(bào)

28#
ID:787036 發(fā)表于 2020-6-23 10:29 | 只看該作者
為啥我這邊操作后運(yùn)行程序顯示目標(biāo)沒(méi)有被創(chuàng)造
回復(fù)

使用道具 舉報(bào)

29#
ID:787436 發(fā)表于 2020-6-23 16:21 | 只看該作者
很不錯(cuò)的資料
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表