久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

QQ登錄

只需一步,快速開始

搜索
查看: 4870|回復(fù): 0
收起左側(cè)

單片機(jī)的簡(jiǎn)易計(jì)算器課程設(shè)計(jì)報(bào)告書

[復(fù)制鏈接]
ID:272736 發(fā)表于 2018-1-7 14:58 | 顯示全部樓層 |閱讀模式
課程設(shè)計(jì)報(bào)告書

課程名稱:
題    目:
系 (院):電子工程學(xué)院自動(dòng)化
學(xué)    期:2016-2017第一學(xué)期
專業(yè)班級(jí):自動(dòng)化141
姓    名:*
學(xué)    號(hào):2014121036

評(píng)語:
成績(jī):
簽名:
日期:

[摘要] 近幾年單片機(jī)技術(shù)的發(fā)展很快,其中電子產(chǎn)品的更新速度迅猛。計(jì)算器是日常生活中比較的常見的電子產(chǎn)品之一。如何才能使計(jì)算器技術(shù)更加的成熟,充分利用已有的軟件和硬件條件,設(shè)計(jì)出更出色的計(jì)算器呢。

本設(shè)計(jì)是以AT89C52單片機(jī)為核心的計(jì)算器模擬系統(tǒng)設(shè)計(jì)。矩陣按鍵輸入、LCD1602液晶顯

示,構(gòu)成一套可以運(yùn)算兩個(gè)數(shù)之間的加減乘除的設(shè)計(jì)。最大運(yùn)算是:9999*9999,可以運(yùn)算負(fù)數(shù)。

科技的進(jìn)步告別了以前復(fù)雜的模擬電路,一塊幾厘米平方的單片機(jī)可以省去很多繁瑣的電路。現(xiàn)在應(yīng)用較廣泛的是科學(xué)計(jì)算器,與我們?nèi)粘K玫暮?jiǎn)單計(jì)算器有較大差別,除了能進(jìn)行加減乘除,科學(xué)計(jì)算器還可以進(jìn)行正數(shù)的四則運(yùn)算和乘方、開方運(yùn)算,具有指數(shù)、對(duì)數(shù)、三角函數(shù)、反三角函數(shù)及存儲(chǔ)等計(jì)算功能。計(jì)算器的未來是小型化和輕便化,現(xiàn)在市面上出現(xiàn)的使用太陽能電池的計(jì)算器,使用ASIC設(shè)計(jì)的計(jì)算器,如使用純軟件實(shí)現(xiàn)的計(jì)算器等,未來的智能化計(jì)算器將是我們的發(fā)展方向,更希望成為應(yīng)用廣泛的計(jì)算工具。


目錄

第一章 前言
1.1 系統(tǒng)開發(fā)背景
1.2 系統(tǒng)開發(fā)意義
1.3 設(shè)計(jì)目的
第二章 方案論證
2.1 方案構(gòu)思
2.2  方案比較與選擇
第三章 系統(tǒng)硬件設(shè)計(jì)及說明
3.1系統(tǒng)組成及總體框圖
3.2元件簡(jiǎn)介
3.2.1 AT89C52特點(diǎn)
3.2.2 LCD1602液晶顯示屏
第四章 設(shè)計(jì)原理分析
4.1  設(shè)計(jì)方案的確定
4.2計(jì)算器硬件方案及硬件資源分配
4.2.1 硬件資源分配
4.2.2 系統(tǒng)的硬件設(shè)計(jì)
4.2.3 鍵盤電路的設(shè)計(jì)
4.2.4 顯示電路的設(shè)計(jì)
第五章 計(jì)算器的軟件設(shè)計(jì)
5.1計(jì)算器的軟件規(guī)劃
5.2 匯編語言和C語言的特點(diǎn)及選擇
5.3 按鍵鍵掃描程序設(shè)計(jì)
5.4 算術(shù)運(yùn)算程序設(shè)計(jì)
5.5 顯示程序設(shè)計(jì)
第六章 系統(tǒng)調(diào)試與存在的問題
6.1 硬件調(diào)試
6.2 軟件調(diào)試
結(jié)束語
致謝
參考文獻(xiàn)
附錄
附錄一:硬件實(shí)物圖
附錄二:系統(tǒng)程序清單


第一章 前言
1.1 系統(tǒng)開發(fā)背景
隨著社會(huì)的發(fā)展,科學(xué)的進(jìn)步,人們的生活水平在逐步的提高,尤其是微電子技術(shù)的發(fā)展,猶如雨后春筍般的變化。電子產(chǎn)品的更新速度快就不足驚奇了。計(jì)算器在人們的日常中是比較的常見的電子產(chǎn)品之一。如何使計(jì)算器技術(shù)更加的成熟,充分利用已有的軟件和硬件條件,設(shè)計(jì)出更出色的計(jì)算器,使其更好的為各個(gè)行業(yè)服務(wù),成了如今電子領(lǐng)域重要的研究課題。
1.2 系統(tǒng)開發(fā)意義
今天,人們的日常生活中已經(jīng)離不開計(jì)算器了,社會(huì)的各個(gè)角落都有它的身影,比如商店,辦公室,學(xué)校……。因此設(shè)計(jì)一款簡(jiǎn)單實(shí)用的計(jì)算器會(huì)有很大的實(shí)際意義。
1.3 設(shè)計(jì)目的
本設(shè)計(jì)旨在進(jìn)一步掌握單片機(jī)理論知識(shí),理解嵌入式單片機(jī)系統(tǒng)的硬軟件設(shè)計(jì),加強(qiáng)對(duì)實(shí)際應(yīng)用系統(tǒng)設(shè)計(jì)的能力。通過本設(shè)計(jì)的學(xué)習(xí),使我掌握單片機(jī)程序設(shè)計(jì)和微機(jī)接口應(yīng)用的基本方法,并能綜合運(yùn)用本科階段所學(xué)軟、硬件知識(shí)分析實(shí)際問題,提高解決畢業(yè)設(shè)計(jì)實(shí)際問題的能力,為單片機(jī)應(yīng)用和開發(fā)打下良好的基礎(chǔ)。
1、對(duì)字符液晶顯示模塊的工作原理,如初始化、清屏、顯示、調(diào)用及外特性有較清楚的認(rèn)識(shí),并會(huì)使用LCD(液晶顯示模塊)實(shí)現(xiàn)計(jì)算結(jié)果的顯示;掌握液晶顯示模塊的驅(qū)動(dòng)和編程,設(shè)計(jì)LCD和單片機(jī)的接口電路,以及利用單片機(jī)對(duì)液晶模塊的驅(qū)動(dòng)和操作;
2、在充分分析內(nèi)部邏輯的概念,進(jìn)行軟件和調(diào)試,學(xué)會(huì)使用,并能夠以其為平臺(tái)設(shè)計(jì)出具有四則運(yùn)算能力簡(jiǎn)易計(jì)算器的硬件電路和軟件程序。

第二章 方案論證

2.1 方案構(gòu)思
本設(shè)計(jì)可以采用兩種方案,一種是以FPGA為核心處理芯片,配備相應(yīng)的外設(shè);另外一種是以AT89S52處理器,配備相應(yīng)的外設(shè)。
1、方案一:采用FPGA控制
FPGA是一種高密度的可編程邏輯器件,自從Xilinx公司1985年推出第一片F(xiàn)PGA以來,FPGA的集成密度和性能提高很快,其集成密度最高達(dá)500萬門/片以上,系統(tǒng)性能可達(dá)200MHz。由于FPGA器件集成度高,方便易用,開發(fā)和上市周期短,在數(shù)字設(shè)計(jì)和電子生產(chǎn)中得到迅速普及和應(yīng)用,并一度在高密度的可編程邏輯器件領(lǐng)域中獨(dú)占鰲頭。
但是而基于 SRAM編程的FPGA,其編程信息需存放在外部存儲(chǔ)器上 ,需外部存儲(chǔ)器芯片 ,且使用方法復(fù)雜 ,保密性差,而其對(duì)于一個(gè)簡(jiǎn)單的計(jì)算器而言,實(shí)用FPGA有點(diǎn)大材小用,成本太高。
2、方案二:采用AT89S52
單片機(jī)是單片微型機(jī)的簡(jiǎn)稱,故又稱為微控制器MCU(Micro Control Unit)。通常由單塊集成電路芯片組成,內(nèi)部包含有計(jì)算機(jī)的基本功能部件:中央處理器CPU,存儲(chǔ)器和I/O接口電路等。因此,單片機(jī)只要和適當(dāng)?shù)能浖巴獠吭O(shè)備相結(jié)合,便可成為一個(gè)單片機(jī)控制系統(tǒng)。單片機(jī)廣泛用于智能產(chǎn)品,智能儀表,測(cè)控技術(shù),智能接口等,具有操作簡(jiǎn)單,實(shí)用方便,價(jià)格便宜等優(yōu)點(diǎn),而其中AT89S52以MCS-51為內(nèi)核,是單片機(jī)中最典型的代表,應(yīng)用于各種控制領(lǐng)域。

2.2  方案比較與選擇
通過以上兩種方案論證和比較,從設(shè)計(jì)的實(shí)用性,方便性和成本出發(fā),選擇了以AT89S52單片機(jī)作為中央處理單元進(jìn)行計(jì)算器的設(shè)計(jì),這樣設(shè)計(jì)能夠?qū)崿F(xiàn)對(duì)四位加減乘除和除法四位小點(diǎn)數(shù)的運(yùn)算。

第三章 系統(tǒng)硬件設(shè)計(jì)及說明

3.2.2 LCD1602液晶顯示屏
1、應(yīng)用簡(jiǎn)介
模塊內(nèi)部自帶字符發(fā)生存儲(chǔ)器(CGROM),字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號(hào)、和日文假名等,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫的英文字母“A”的代碼是(41H),顯示時(shí)模塊把代碼41H發(fā)給液晶模塊,我們就能在液晶上看到字母“A”。
1602液晶模塊內(nèi)部的控制器共有11條控制指令,豐富的指令可以完成液晶的時(shí)序控制、工作方式式設(shè)置和數(shù)據(jù)顯示等。
采用的LCD1602液晶模塊是標(biāo)準(zhǔn)16針插座,接口電路如圖3.2.3所示:關(guān)于LCD1602的詳細(xì)資料見表3.2.3-1和表3.2.3-2。


圖3.2.3 LCD接口電路


表3.2.3-1 LCD1602引腳說明
第1腳
VSS為地電源
第2腳
VDD接5V正電源
第3腳
V0為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地電源時(shí)對(duì)比度最高,對(duì)比度過高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對(duì)比度。
實(shí)際電路中采用2K電阻到地,比較理想。
第4腳
RS為寄存器選擇,高電平選擇數(shù)據(jù)寄存器、低電平選擇指令寄存器。
第5腳
RW為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。
當(dāng)RS和RW共同為低電平時(shí)  (00)可以寫入指令或者顯示地址;
當(dāng)RS為低電平RW為高電平時(shí)(01)可以讀入忙信號(hào);
當(dāng)RS為高電平RW為低電平時(shí)(10)可以寫入數(shù)據(jù)。
第6腳
E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。
第7~14腳
D0~D7為8位雙向數(shù)據(jù)線。
第15~16腳
背光陽極和背光陰極。


表3.2.3-2 LCD1602指令表
指令1
清顯示     指令碼01H, 光標(biāo)復(fù)位到地址00H位置;
指令2
光標(biāo)復(fù)位   指令碼02H, 光標(biāo)返回到地址00H位置 ;
指令3
光標(biāo)和顯示模式設(shè)置
I/D位 → 光標(biāo)移動(dòng)方向,高電平右移,低電平左移;
S  位 → 屏幕上所有文字是否左移或者右移,高電平有效,低電平無效;
指令4
顯示開關(guān)控制
D  位 → 控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示;
C  位 → 控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無光標(biāo);   
    B  位 → 控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍 ;
指令5
光標(biāo)或顯示移位
S/C位 → 高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo)
指令6
功能命令設(shè)置
DL位---高電平時(shí)為4位數(shù)據(jù)總線,低電平時(shí)為8位總線;
N—位低電平時(shí)為單行顯示,高電平時(shí)為雙行顯示;
F—位低電平時(shí)顯示5x7的點(diǎn)陣字符,高電平時(shí)為5x10的點(diǎn)陣字符;
指令7
字符發(fā)生器RAM地址設(shè)置
指令8
DDRAM地址設(shè)置
指令9
讀忙信號(hào)和光標(biāo)地址
BF位 → 為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù)
指令10
寫數(shù)據(jù)
指令11
讀數(shù)據(jù)


2 、LCD的特點(diǎn):
(1)低壓微功耗;
(2)平板型結(jié)構(gòu);
(3)被動(dòng)顯示型(無眩光,不刺激人眼,不會(huì)引起眼睛疲勞);
(4)顯示信息量大(因?yàn)橄袼乜梢宰龅煤苄?;
(5)易于彩色化(在色譜上可以非常準(zhǔn)確的復(fù)現(xiàn));
(6)無電磁輻射(對(duì)人體安全,利于信息保密);
(7)長(zhǎng)壽命(這種器件幾乎沒有什么劣化問題,因此壽命極長(zhǎng),但是液晶背光壽命有限,不過背光部分可以更換)。


第四章 設(shè)計(jì)原理分析4.1  設(shè)計(jì)方案的確定
本設(shè)計(jì)需要使用LCD液晶顯示屏和編碼鍵盤。故選擇靜態(tài)顯示和用編碼鍵盤。使用LCD液晶顯示屏顯示運(yùn)算結(jié)果。
    主程序進(jìn)行初始化,其他的程序選擇模塊式的方式。首先對(duì)每個(gè)模塊進(jìn)行調(diào)試, 當(dāng)模塊調(diào)試成功后,逐一的加入主程序中,最后完成整個(gè)軟件部分的設(shè)計(jì)。
4.2計(jì)算器硬件方案及硬件資源分配4.2.1 硬件資源分配
主要用到的硬件:AT89S52   LCD液晶顯示屏  編碼鍵盤
硬件分配:
1、P1、P3口:做為輸出口,控制LCD液晶顯示屏顯示數(shù)據(jù)的結(jié)果。
2、P2口:做為輸入口,與鍵盤連接,實(shí)現(xiàn)數(shù)據(jù)的輸入。
3、LCD液晶顯示屏顯示輸出。
4.2.2 系統(tǒng)的硬件設(shè)計(jì)
為了更好的實(shí)現(xiàn)系統(tǒng)得功能,硬件電路的設(shè)計(jì)應(yīng)該遵循以下原則:
1、優(yōu)化硬件電路
采用軟件設(shè)計(jì)與硬件設(shè)計(jì)相結(jié)合的方法;盡管采用軟件來實(shí)現(xiàn)硬件系統(tǒng)的功能時(shí),也許響應(yīng)時(shí)間會(huì)比單純使用硬件時(shí)長(zhǎng),而且還要占用微處理器(MCU)的時(shí)間;但是,用軟件實(shí)現(xiàn)硬件的功能可以簡(jiǎn)化硬件結(jié)構(gòu),提高電路的可靠性。所以,在設(shè)計(jì)本系統(tǒng)得時(shí)候,在滿足可靠性和實(shí)時(shí)性的前提下,盡可能的通過軟件來實(shí)現(xiàn)硬件功能。
2、可靠性及抗干擾設(shè)計(jì)
根據(jù)可靠性設(shè)計(jì)理論,系統(tǒng)所用芯片數(shù)量越少,系統(tǒng)的平均無故障時(shí)間越長(zhǎng)。而且,所用芯片數(shù)量越少,地址和數(shù)據(jù)總線在電路板上受干擾的可能性也就越小。因此,系統(tǒng)的設(shè)計(jì)思想是在滿足功能的情況下力爭(zhēng)使用較少數(shù)量的芯片。
3、靈活的功能擴(kuò)展
功能擴(kuò)展是否靈活是衡量一個(gè)系統(tǒng)優(yōu)劣的重要指標(biāo)。一次設(shè)計(jì)往往不能完全考慮到系統(tǒng)的各個(gè)方面,系統(tǒng)需要不斷完善以及進(jìn)行功能升級(jí)。進(jìn)行功能擴(kuò)展時(shí),應(yīng)該在原有設(shè)計(jì)的基礎(chǔ)上,通過修改軟件程序和少量硬件完成。對(duì)于本系統(tǒng)而言,就是要求在系統(tǒng)硬件不變的情況下,能夠通過修改軟件程序,完成功能的升級(jí)和擴(kuò)展。
根據(jù)第提出的系統(tǒng)設(shè)計(jì)方案,結(jié)合以上三條原則,確定了系統(tǒng)硬件的設(shè)計(jì)。計(jì)算器主要由以下一些功能模塊構(gòu)成:非編碼鍵盤模塊、LCD液晶顯示屏模塊等。
該系統(tǒng)的硬件設(shè)計(jì)采用了模塊化的設(shè)計(jì)方法。AT89S52 單片機(jī)與LCD液晶顯示屏顯示電路是整個(gè)電路的核心,它們實(shí)現(xiàn)系統(tǒng)的功能要求。
簡(jiǎn)易計(jì)算器主要包括:鍵盤電路,顯示電路。
下圖為總體硬件結(jié)構(gòu)。(如圖4.2.2 所示為整個(gè)系統(tǒng)的原理圖)
圖4.2.2 計(jì)算器原理圖
前面敘述了該系統(tǒng)的設(shè)計(jì)說明,系統(tǒng)采用了比較簡(jiǎn)單的設(shè)計(jì)方案,所以該系統(tǒng)的硬件設(shè)計(jì)的總外圍電路不會(huì)產(chǎn)生過多的干擾。在下面的闡述中,對(duì)系統(tǒng)的外圍電路分別予以介紹。鍵盤部分采用編碼鍵盤,顯示部分采用LCD液晶顯示屏完全能夠很好的實(shí)現(xiàn)顯示方面的要求。
4.2.3 鍵盤電路的設(shè)計(jì)
鍵盤可分為兩類:編碼鍵盤和非編碼鍵盤。編碼鍵盤是較多按鍵(20個(gè)以上)和專用驅(qū)動(dòng)芯片的組合,當(dāng)按下某個(gè)按鍵時(shí),它能夠處理按鍵抖動(dòng)、連擊等問題,直接輸出按鍵的編碼,無需系統(tǒng)軟件干預(yù)。通用計(jì)算機(jī)使用的標(biāo)準(zhǔn)鍵盤就是編碼鍵盤。在智能儀器中,使用并行接口芯片8279或串行接口芯片HD7279均可以組成編碼鍵盤,同時(shí)還可以兼顧數(shù)碼管的顯示驅(qū)動(dòng),其相關(guān)的接口電路和接口軟件均可在芯片資料中得到。當(dāng)系統(tǒng)功能比較復(fù)雜,按鍵數(shù)量很多時(shí),采用編碼鍵盤可以簡(jiǎn)化軟件設(shè)計(jì)。非編碼鍵盤成本低廉。
從成本角度出發(fā),本設(shè)計(jì)選用的是非編碼鍵盤。如圖4.2.3

圖4.2.3 編碼鍵盤電路

4.2.4 顯示電路的設(shè)計(jì)
當(dāng)系統(tǒng)需要顯示少量數(shù)據(jù)時(shí),采用LCD液晶顯示屏進(jìn)行顯示是一種經(jīng)濟(jì)實(shí)用的方法。P0口作為液晶顯示的數(shù)據(jù)端口,P3.5-P3.7口作為其控制端口,控制LCD液晶顯示屏顯示輸出數(shù)據(jù)。
最終電路如圖4.2.4所示:
圖4.2.4 LCD液晶顯示屏顯示

第五章 計(jì)算器的軟件設(shè)計(jì)5.1計(jì)算器的軟件規(guī)劃
簡(jiǎn)易計(jì)算器的程序主要包括以下功能模塊:
1、定時(shí)查鍵模塊,分為讀鍵程序、判鍵程序段、運(yùn)算操作子程序等部分;
2、基于LCD液晶顯示屏的顯示模塊;
3、主模塊,為系統(tǒng)的初始化。
5.2 匯編語言和C語言的特點(diǎn)及選擇

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

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

5.3 按鍵鍵掃描程序設(shè)計(jì)

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

圖5.1 鍵掃程序流程圖

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

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



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

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


圖5.3 顯示程序流程圖
系統(tǒng)調(diào)試與存在的問題6.1 硬件調(diào)試

常見故障:

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

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)試過程中要針對(duì)可能出現(xiàn)的故障認(rèn)真分析,直至檢查出原因并排除。

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

6.2 軟件調(diào)試

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

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

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

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

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

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

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

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



結(jié)束語

在硬件的制作過程中我走了好多的彎路,主要是在系統(tǒng)還沒有設(shè)計(jì)很有把握就開始動(dòng)手制作了。后來發(fā)現(xiàn)與設(shè)計(jì)的要求還有偏差,反復(fù)的改過了幾次,浪費(fèi)了大量的時(shí)間和體力。感受到設(shè)計(jì)人員要有耐心,要認(rèn)真的從要求開始研究。軟件的編寫過程中費(fèi)了很大的力氣,因?yàn)檐浖木帉懸蠛芨撸芗?xì)心,一不小心就會(huì)調(diào)用錯(cuò)誤,很深刻的體會(huì)到作為軟件編程人員是絕不能粗心大意的。一個(gè)程序的完成的速度和質(zhì)量高低與細(xì)心與否有著很大聯(lián)系。編程時(shí),我充分使用了結(jié)構(gòu)化的思想。這樣因?yàn)檎Z句較少,程序調(diào)試比較方便,功能模塊可以逐一的調(diào)試,充分體現(xiàn)了結(jié)構(gòu)化編程的優(yōu)勢(shì)。當(dāng)每個(gè)模塊都完成時(shí),將其功能加到一起就完成了整體的設(shè)計(jì)。


致謝
本次畢業(yè)設(shè)計(jì)得到導(dǎo)師XXX老師的熱心指導(dǎo),在這里對(duì)X老師表示最衷心的感謝。X老師平易近人,對(duì)學(xué)生的設(shè)計(jì)進(jìn)度和學(xué)習(xí)很關(guān)心。在畢業(yè)設(shè)計(jì)的前期,首先給我們介紹了不少有用的資料和書籍;在硬件設(shè)計(jì)等方面給予悉心的指導(dǎo);在調(diào)試的過程中X老師給每個(gè)出現(xiàn)的問題給予及時(shí)的指導(dǎo)。在寫畢業(yè)設(shè)計(jì)論文的階段,X老師讓我們提前給他評(píng)審,不論內(nèi)容字體,還是格式上的問題都一一指出。待人平和、工作認(rèn)真、治學(xué)嚴(yán)謹(jǐn)他的給我留下很深刻的印象。更重要的是,他善于與學(xué)生溝通,不僅在畢業(yè)設(shè)計(jì)上給我及時(shí)的指導(dǎo),更為我大學(xué)最后階段的學(xué)習(xí)提出了許多寶貴的意見。這一切都在潛移默化地影響著我,為我以后進(jìn)入工作崗位樹立了良好的榜樣。
同時(shí)還要感謝XXX老師,她關(guān)心同學(xué)們的進(jìn)程,了解同學(xué)們?cè)谧珜戇^程中的麻煩,給我們提供很多幫助。
最后向所有幫助和關(guān)心過我的人表示衷心感謝!

參考文獻(xiàn)

【1】張靖武,周靈杉.單片機(jī)系統(tǒng)的PROTEUS設(shè)計(jì)與仿真[M].北京:北京電子工業(yè)出版社
【2】靳達(dá).求是科技.單片機(jī)應(yīng)用系統(tǒng)開發(fā)實(shí)例導(dǎo)航[M].:人民郵電出版社,2006
【3】劉守義. 單片機(jī)應(yīng)用技術(shù)[M].:西安電子科技大學(xué)出版社,2001
【4】林志琦.基于PROTEUS的單片機(jī)可視化軟硬件仿真[M].北京:北京航空航天大學(xué)出版社,2006
【5】胡漢才.單片機(jī)原理及接口技術(shù).清華大學(xué)出版社,1996
【6】徐江海.單片機(jī)實(shí)用教程[M].北京:機(jī)械工業(yè)出版社,2007.
【7】肖洪兵. 跟我學(xué)用單片機(jī). 北京:北京航空航天大學(xué)出版社,2002.8
【8】夏繼強(qiáng). 單片機(jī)實(shí)驗(yàn)與實(shí)踐教程. 北京:北京航空航天大學(xué)出版社, 2001
【9】譚浩強(qiáng). C語言程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2000.
【10】劉福基. C語言程序設(shè)計(jì)與實(shí)訓(xùn)教程[M].北京:科學(xué)出版社,2004.
【11】張磊. C語言程序設(shè)計(jì)[M].北京:高等教育出版社,2005.
【12】嚴(yán)桂蘭. C語言程序設(shè)計(jì)[M].廈門:廈門大學(xué)出版社,2006


附錄附錄一:硬件實(shí)物圖
硬件實(shí)物圖(正面)
自己拍自己的實(shí)物照片
硬件實(shí)物圖(背面)
附錄二:系統(tǒng)程序清單

單片機(jī)源程序如下:

  1. /*
  2. 接盤按鍵說明:
  3. --------------------------------------------------
  4.    - - - - - - - - - - - -- - - - - - -
  5.   |              1602液晶               |
  6.   |                                     |
  7.    - - - - - - - - - - -- - - - - - - -
  8.             - - - - - - - - - - - - -
  9.                                           |      89s52             |  
  10.             - - - - - - - - - - - - -

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

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

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

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

  120.               short temp1,temp2,temp,a=0xff;
  121.               P2=0xf0;                                                                                    /* 輸入行值(或列值) */
  122.               LCD_Delay_ms(20);                                                        /* 延時(shí) */
  123.               temp1=P2;                                                                                    /* 讀列值(或行值) */
  124.               P2=0xff;
  125.               LCD_Delay_ms(20);                                                        /* 延時(shí) */
  126.               P2=0x0f;                                                                                    /* 輸入列值(或行值) */
  127.               LCD_Delay_ms(20);                                                        /* 延時(shí) */            
  128.               temp2=P2;                                                                                    /* 讀行值(或列值) */
  129.               P2=0xff;
  130.               temp=(temp1&0xf0)|(temp2&0xf);              /* 將兩次讀入數(shù)據(jù)組合 */
  131.               switch(temp)                                                                      /* 通過讀入數(shù)據(jù)組合判斷按鍵位置 */
  132.               {


  133.                             case 0x77 :a=0x0d;break;//  按鍵/  
  134.                             case 0x7b :a=0x0e; break;// 按鍵=            
  135.                             case 0x7d :a=0;                 break;// 按鍵0
  136.                             case 0x7e :a=0x0f; break;// 按鍵CE

  137.                             case 0xb7 :a=0x0c;break;//               按鍵*
  138.                             case 0xbb :a=0x9;break; //  按鍵9
  139.                             case 0xbd :a=0x8;break; //  按鍵8
  140.                             case 0xbe :a=0x7;break; //               按鍵7

  141.                             case 0xd7 :a=0x0b;break;//  按鍵-
  142.                             case 0xdb :a=0x6;break; //               按鍵6
  143.                             case 0xdd :a=0x5;break; //               按鍵5
  144.                             case 0xde :a=0x4;break; //               按鍵4

  145.                             case 0xe7 :a=0x0a; break;// 按鍵+
  146.                             case 0xeb :a=3;break;              //  按鍵3
  147.                             case 0xed :a=2;break;              //  按鍵2
  148.                             case 0xee :a=1;break;              //  按鍵1

  149.                             default :a=0xff;
  150.               }
  151.               return a;                                                                                    /* 返回按鍵值 */
  152. }
  153. void display_a() //顯示數(shù)據(jù)a
  154. {
  155.               dispaly[3]=data_a%10000/1000;    //千
  156.               dispaly[2]=data_a%1000/100;      //百
  157.               dispaly[1]=data_a%100/10;        //十
  158.               dispaly[0]=data_a%10;            //個(gè)

  159.               write_com(0x80+0);               //顯示數(shù)據(jù)a
  160.               if(data_a>999){              write_date('0'+dispaly[3]);}      //顯示千位
  161.               if(data_a>99){              write_date('0'+dispaly[2]);}                            //顯示百位
  162.               if(data_a>9){              write_date('0'+dispaly[1]);}     //顯示十位
  163.                                           write_date('0'+dispaly[0]);      //顯示個(gè)位
  164. }

  165. void display_b() //顯示數(shù)據(jù)b
  166. {
  167.               write_com(0x80+7); //第一行
  168.               dispaly[3]=data_b%10000/1000;    //千
  169.               dispaly[2]=data_b%1000/100;      //百
  170.               dispaly[1]=data_b%100/10;        //十
  171.               dispaly[0]=data_b%10;            //個(gè)

  172. if(data_b>999){              write_date('0'+dispaly[3]); }     //顯示千位  
  173. if(data_b>99) {              write_date('0'+dispaly[2]); }    //顯示百位
  174. if(data_b>9)  {              write_date('0'+dispaly[1]); }     //顯示十位
  175.                                                 write_date('0'+dispaly[0]);      //顯示個(gè)位
  176. }

  177. //計(jì)算結(jié)果
  178. void display_c(x)
  179. {

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

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

  227. void eql(uchar x)//加減乘除運(yùn)算
  228. {
  229.               switch(x)                            /*功能鍵選擇*/
  230.                                           {  
  231.                                                         case 1:data_c=data_a+data_b;break;                               //加  /* + S=1 */ /* 數(shù)值轉(zhuǎn)換函數(shù) */                                                                                                                             
  232.                                                         case 2:if(data_a>=data_b){data_c=data_a-data_b;} /* - S=2 *///減
  233.                        else{data_c=data_b-data_a;W_lcd(5,1,'-');} //負(fù)數(shù)符號(hào)
  234.                                                                          break;               
  235.                                                         case 3:data_c=(data_a*data_b);break;                              /* * S=3 *///乘
  236.                                                         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ò)誤
  237.                                                         case 0:break;
  238.                                           }               

  239. }

  240. void main()
  241. {
  242.               uchar   key=0xff;               //鍵值初始化
  243.               uchar   n=0;                                                                      //第1個(gè)數(shù)可以按1-4次
  244.               uchar   m=5;                                                                       //第2個(gè)數(shù)可以按1-4次
  245. ……………………

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

所有資料51hei提供下載:
2017年27-單片機(jī)的簡(jiǎn)易計(jì)算器設(shè)計(jì).doc (526.87 KB, 下載次數(shù): 33)


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产成人精品视频在线观看 | 一级片在线观看 | 久草视频观看 | 亚洲精品国产成人 | 亚洲日本中文字幕在线 | 精品视频在线免费观看 | 亚洲欧美中文日韩在线v日本 | 欧美精品欧美精品系列 | 5060网一级毛片 | 一级免费在线视频 | 一区二区三区四区五区在线视频 | 欧美精品在线免费观看 | 久久免费观看视频 | 一区二区三区四区国产 | 日本黄色免费视频 | 精品国产乱码久久久久久闺蜜 | 亚欧洲精品在线视频免费观看 | 欧美乱大交xxxxx另类电影 | 精品一区二区在线视频 | 久久新 | 中文字幕在线国产 | 一级做a爰片久久毛片 | 欧美一级免费黄色片 | 亚洲草草视频 | 国产农村妇女毛片精品久久麻豆 | 日韩免费一区二区 | 91资源在线| 三级黄色大片网站 | 6080亚洲精品一区二区 | 国产黄色精品在线观看 | 日韩成人精品 | 久久成人免费 | 伊人久久精品一区二区三区 | 日本一道本视频 | 国产在线网站 | 国产成人精品a视频一区www | 欧美一级黄色免费看 | 91大片| 国产精品精品视频 | 成人亚洲一区 | 91精品国产91久久久久久最新 |