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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 24832|回復: 28
收起左側

單片機簡易計算器設計報告 論文下載

  [復制鏈接]
ID:200274 發表于 2017-5-13 13:46 | 顯示全部樓層 |閱讀模式
單片機原理與接口技術課程

考試作品報告

作品名稱:簡易計算器
姓    名:王海躍
專業班級:電科1401
學    號:X1920145285

中南大學物理與電子學院



目 錄
摘 要……………………………………………………………………………2                                                  
引 言……………………………………………………………………………3
  • 系統整體概述 ………………………………………………………4
  • 硬件設計……………………………………………………………6
  • 軟件設計 ……………………………………………………………9
  • 調試與分析…………………………………………………………13
  • 制作感受 …………………………………………………………14
附錄……………………………………………………………………………15


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




引言

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


第一章  系統整體概述

1.1 設計目的

應用《單片機應用基礎》、《計算機應用基礎》等所學相關知識及查閱資料,完成簡易計算器的設計,以達到理論與實踐更好的結合、進一步提高綜合運用所學知識和設計的能力的目的。

通過本次設計的訓練,可以使我在基本思路和基本方法上對基于MCS-51單片機的嵌入式系統設計有一個比較感性的認識,并具備一定程度的設計能力。

主要完成如下方面的設計任務:

1、簡要闡述單片機技術發展的國內外現狀及LED動態顯示和矩陣鍵盤基本原理;

2、掌握MCS-51系列某種產品(例如8051)的最小電路及外圍擴展電路的設計方法;

3、了解單片機數據轉換功能及工作過程;

4、完成主要功能模塊的硬件電路設計及必要的參數確定.

1.2 計算器設計總體思想

根據功能和指示要求,本系統選用以51單片機為主控機。通過擴展必要的外圍接口電路,實現對計算器的設計。

具體設計如下:

1、由于要設計的是簡單的計算器,可以進行四則運算,為了得到教好的顯示效果,采用LCD顯示數據和結果。

2、另外鍵盤包括數字鍵(0-9)、符號鍵(+、-、*、/)、清除鍵和等號鍵,故只需要16個按鍵即可,設計中采用集成的計算機鍵盤。

3、執行程序:開機顯示零,等待鍵入數值,當鍵入數字,通過LCD顯示出來,當鍵入+、-、*、/運算符,計算器在內部執行數值轉換和存儲,并等待再次鍵入數值后將顯示鍵入的數值,按等號就會在LCD上輸出運算結果。

4、錯誤提示:當單片機執行程序中有錯誤時,會在LCD上顯示相應的提示,如:當輸入的數值或計算器得到的結果大于計算器的顯示范圍時,計算器會在LCD上提示溢出;當除數為0時,計算器會在LCD上提示錯誤。


1.3系統的組成

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

1.001.jpg
圖片在51hei附件中
圖 系統組成及總體框圖

本系統就是充分利用了8051芯片的I/O引腳。系統以采用MCS-51系列單片機Intel8051為中心器件來設計計算器控制器,實現了能根據實際輸入值顯示并存儲的功能,計算程序則是參照教材。

本計算器是以MCS-51系列8051單片機為核心構成的簡易計算器系統。該系統通過單片機控制,實現對4*4鍵盤掃描進行實時的按鍵檢測,并把檢測數據存儲下來。整個計算器系統的工作過程為:首先存儲單元初始化,顯示初始值和鍵盤掃描,判斷按鍵位置,查表得出按鍵值,單片機則對數據進行儲存與相應處理轉換,之后送入LED顯示器動態顯示。整個系統可分為三個主要功能模塊:功能模塊一,實時鍵盤掃描;功能模塊二,數據轉換成顯示器顯示;功能模塊三,顯示器動態顯示。


硬件系統設計

硬件系統是指構成微機系統的實體和裝置,通常由運算器、控制器、存儲器、輸入接口電路和輸入設備、輸出接口電路和輸出設備等組成。單片機實質上是一個硬件的芯片,在實際應用中,通常很難直接和被控對象進行電氣連接,必須外加各種擴展接口電路、外部設備、被控對象等硬件和軟件,才能構成一個單片機應用系統。本設計選用以AT89S51單片機為主控單元。顯示部分:采用LCD靜態顯示。按鍵部分,采用4*4鍵盤。 硬件電路原理圖如圖2.1所示:

1.009.jpg

  圖2.1 硬件電路原理圖

2.1 鍵盤接口電路

計算機輸入數字和其他功能按鍵時要用到很多按鍵,在這種情況下,編程會很簡單,但是會占用大量的I/O口資源,因此在很多情況下都不采用這樣的方式,而是采用矩陣鍵盤的方式。矩陣鍵盤采用四條I/O線作為行線,四條I/O線作為列線組成鍵盤,在行線和列線的每個交叉點上設置一個按鍵。這樣鍵盤上按鍵的數量就為4*4個。這樣行列式鍵盤結構能有效的提高單片機系統中I/O口的利用率。

計算器的鍵盤布局如圖2.2所示:一般有16個鍵組成,在單片機中正好有一個P端口實現16個按鍵功能,這種形式在單片機系統中最常用。

1.010.jpg

圖2.2 矩陣鍵盤內部電路

2.2 LCD顯示模塊

本設計采用LCD液晶顯示器來顯示輸出數據。LCD的特性有:1、+5V電壓,對比可調度;2、內含復位電路;3、提供各種控制命令,如:清屏、字符閃爍、光標閃爍、顯示移位等多種功能;4、有80字節顯示數據存儲器DDRAM;5、內建有160個5X7點陣的字型的字符發生器CGROM;6、8個可由用戶自定義的5X7的字符發生器CGRAM。

本設計通過D0-D7引腳向LCD寫指令字或寫數據以使LCD實現不同的功能或顯示相應的數據。其接口電路如圖2.3所示。

1.011.jpg

                    圖2.3 LCD接口電路

LCD的引腳說明如表2.1所示:

                表2.1 LCD的引腳說明

符號

引腳說明

符號

引腳說明

VSS

電源地

DB4

Data  I/O

VDD

電源正極(+5V)

DB5

Data  I/O

V0

液晶顯示偏壓輸入

DB6

Data  I/O

RS

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

DB7

Data  I/O

R/W

讀寫控制信號(H/L)

CS1

片選IC1信號

E

使能信號

CS2

片選IC2信號

DB0

Data  I/O

RST

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

DB1

Data  I/O

VEE

負電源輸出(-10V)

DB2

Data  I/O

BLA

背光源正極(+4.2)

DB3

Data  I/O

BLK

背光源正極


2.3 運算模塊

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

運算模塊由鍵盤和顯示屏組成。單片機通過按鍵來實現輸入數據和操作方式的控制,在運算過程中,對所設的數據進行四則運算時,要先確定選用的是哪一個運算符,若是+或*,則要判斷結果是否會溢出,溢出則顯示錯誤提示,沒有溢出則顯示運算結果,若是/,則要判斷除數是否為零,為零時顯示錯誤提示,不為零顯示運算結果。

軟件設計
3.1 語言的特點及選擇

本設計是硬件電路和軟件編程相結合的設計方案,選擇合適的編程語言是一個重要的環節。在單片機的應用系統程序設計時,常用的是匯編語言和C語言。機硬件,程序可讀性和可移植性比較差。而C語言雖然執行效率沒有匯編語言高,但語言簡潔,使用方便,靈活,運算豐富,表達化類型多樣化,數據結構類型豐富,具有結構化的控制語句,程序設計自由度大,有很好的可重用性,可移植性等特點。

由于現在單片機的發展已經達到了很高的水平,內部的各種資源相當的豐富,CPU的處理速度非常的快。用C語言來控制單片機無疑是一個理想的選擇。所以在本設計中采用C語言編寫軟件程序。主程序的設計詳見附錄三。

3.2 鍵掃程序設

鍵掃程序的過程為:開始時,先判斷是否有鍵閉合,無鍵閉合時,返回繼續判斷,有鍵閉合時,先去抖動,然后確定是否有鍵按下,若無鍵按下,則返回繼續判斷是否有鍵閉合,若有鍵按下,則判斷鍵號,然后釋放,若釋放按鍵完畢,則返回,若沒有釋放按鍵,則返回繼續釋放。其流程圖如圖3.1所示。

1.012.jpg

圖3.1 鍵掃程序流程圖

3.3 算術運算程序設計

算術運算程序的過程為:先判斷輸入的運算符是+、-、*、/ 中的哪一個,若是+或-,則要判斷運算結果是否溢出,溢出則顯示錯誤信息,沒溢出就顯示運算結果,若是/,則要先判斷除數是否為零,為零就顯示錯誤信息,不為零則顯示運算結果,若是-,則直接顯示運算結果。其流程圖如圖3.2所示。

1.013.jpg




圖3.2 算術運算程序設計流程圖
3.4 顯示程序設計

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

1.014.jpg































圖3.3 顯示程序流程圖
調試與分析
4
.1 硬件調試

常見故障:

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

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

3、可靠性差:因其可靠性差的原因很多,如金屬化孔、接插件接觸不良會造成系統時好時壞,經不起振動;走線和布局不合理也會引起系統可靠性差。

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

調試方法:包括多級調試和聯機調試。在調試過程中要針對可能出現的故障認真分析,直至檢查出原因并排除。

本次硬件調試過程中,對所出現的問題進行了認真的分析和改正,最后能夠很好的達到設計要求的效果。

4.2 軟件調試

軟件調試分為以下四個階段:1、 編寫程序并查錯;2、在C語言的編譯系統中編譯源程序3、對程序進行編譯連接,并及時發現程序中存在的錯誤;4、改正錯誤。

在本次調試中出現的問題有:

1、在程序中有的函數名未定義;

2、在抄錄程序時,少錄入一些字符,如:“;”、“{”、“-”等符號,而出現錯誤;

3、有一些函數名錄入時少寫一個字母或順序顛倒;

4、沒有注意函數名的調用及定義;

5、芯片引腳定義出錯而導致沒有實驗現象。

在軟件調試過程中,對出現的錯誤進行了認真的分析和修改,多次調試成功后,能夠很好的達到既定的設計效果。

第五章 制作感受

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

當我剛剛做完這個作品第一次進行功能運行的時候,沒有成功,當時心里有些無奈,經過幾天的布線焊接最終卻沒成功,有點點小失落。當然不是每個人都能一次就能做成的,便進行各種檢查調試,經過幾番周折最后勉強能實現功能了,但是還有些不盡人意,不過當時已有一種成功的喜悅感了。再經過不斷地進行修改完善,終于達到了我想要的效果,這時的我感覺自己棒棒噠,自己也能做出計算器了。這個過程中除了學到知識以外,還感受到了堅持努力最終就會取得自己想要的成績。












附錄一:計算器proteus仿真圖

1.015.jpg

附錄二:元器件清單

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

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

附錄三:源程序


  1. /*
  2. 接盤按鍵說明:
  3. --------------------------------------------------
  4.             |  1  |  2  |  3  |  +  |
  5.             - - - - - - - - - - - - -
  6.             |  4  |  5  |  6  |  -  |
  7.             - - - - - - - - - - - - -
  8.             |  7  |  8  |  9  |  *  |
  9.             - - - - - - - - - - - - -
  10.                                           |  C  |  0  |  =  |  /  |
  11. --------------------------------------------------*/
  12. //操作簡介
  13. // 按第一個數,再按'+-*/',再按'='顯示出結果,然后按C清屏
  14. // 加最大9999+9999=19998
  15. // 減最大9999-0   =9999
  16. // 乘最大9999*9999=99980001
  17. // 除 1/9=0.1111 保留小數點后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數據
  24. sbit wela=P2^6;      //讀or寫
  25. sbit lcden=P2^7;              //使能信號
  26. //--------LCD1602-------------------
  27. //--------KEY-----------------------
  28. //P1口
  29. //--------KEY-----------------------
  30. uchar code table[]= "                ";

  31. long  int data_a,data_b;               //第一個數和第二個數
  32. long  int data_c;                                          //計算結果

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

  34. //************************************************************************/
  35. // 描述: 延時t us函數
  36. //************************************************************************/
  37. void LCD_Delay_us(unsigned int t)
  38. {
  39.               while(t--);           //t=0,退出
  40. }
  41. //************************************************************************/
  42. // 描述: 延時t ms函數
  43. //************************************************************************/
  44. void LCD_Delay_ms(unsigned int t)
  45. {
  46.               unsigned int i,j;
  47.               for(i=0;i<t;i++)                                   //執行t次循環
  48.               for(j=0;j<113;j++)                                 //執行113次循環
  49.               ;
  50. }
  51. //************************************************************************/
  52. // 描述: 1602液晶寫指令
  53. //************************************************************************/
  54. void write_com(uchar com)                  //1602液晶寫指令
  55. {
  56.               rs=0;                       //寫指令
  57.               lcden=0;                    //使能1602
  58.               P0=com;                     //寫入指令com
  59.               LCD_Delay_ms(1);            //延時1ms
  60.               lcden=1;                    //使能1602
  61.               LCD_Delay_ms(2);            //延時2ms
  62.               lcden=0;                              //使能1602
  63. }
  64. //************************************************************************/
  65. // 描述:1602液晶寫數據
  66. //************************************************************************/
  67. void write_date(uchar date) //1602液晶寫數據
  68. {
  69.               rs=1;                        //寫數據
  70.               lcden=0;                     //使能1602
  71.               P0=date;                     //寫入數據date
  72.               LCD_Delay_ms(1);             //延時1ms
  73.               lcden=1;                     //使能1602
  74.               LCD_Delay_ms(2);             //延時2ms
  75.               lcden=0;                               //使能1602
  76. }
  77. //************************************************************************/
  78. // 描述:指定x,y寫入字符函數
  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);                  //寫入數據
  85. }
  86. //指定x,y寫入字符串函數
  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++;}                                  //寫入數據
  93. }
  94. //************************************************************************/
  95. // 描述:初始化液晶,及畫面初始化
  96. //************************************************************************/
  97. void init_lcd(void)            //初始化液晶,及畫面初始化
  98. {
  99.               wela=0;                      //寫液晶
  100.               lcden=0;                     //使能1602
  101.               write_com(0x38);             //8 位總線,雙行顯示,5X7 的點陣字符
  102.               LCD_Delay_us(100);           //延時100us
  103.               write_com(0x0c);             //開顯示,無光標,光標不閃爍
  104.               write_com(0x06);             //光標右移動
  105.               write_com(0x01);             //清屏
  106.               write_com(0x80);             //DDRAM 地址歸0
  107. }
  108. //************************************************************************/
  109. // 描述: 反轉法鍵盤掃描
  110. //************************************************************************/
  111. short keycheckdown()                                                        /* 反轉法鍵盤掃描 */
  112. {

  113.               short temp1,temp2,temp,a=0xff;
  114.               P1=0xf0;                                                                                    /* 輸入行值(或列值) */
  115.               LCD_Delay_ms(20);                                                        /* 延時 */
  116.               temp1=P1;                                                                                    /* 讀列值(或行值) */
  117.               P1=0xff;
  118.               LCD_Delay_ms(20);                                                        /* 延時 */
  119.               P1=0x0f;                                                                                    /* 輸入列值(或行值) */
  120.               LCD_Delay_ms(20);                                                        /* 延時 */            
  121.               temp2=P1;                                                                                    /* 讀行值(或列值) */
  122.               P1=0xff;
  123.               temp=(temp1&0xf0)|(temp2&0xf);              /* 將兩次讀入數據組合 */
  124.               switch(temp)                                                                      /* 通過讀入數據組合判斷按鍵位置 */
  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() //顯示數據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;            //個

  152.               write_com(0x80+0);               //顯示數據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]);      //顯示個位
  157. }

  158. void display_b() //顯示數據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;            //個

  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]);      //顯示個位
  169. }

  170. //計算結果
  171. void display_c(x)
  172. {

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

  175.                             dispaly[8]=data_c%1000000000/100000000;                  //萬萬
  176.                             dispaly[7]=data_c%100000000/10000000;                  //千萬
  177.                             dispaly[6]=data_c%10000000/1000000;                                //百萬
  178.                             dispaly[5]=data_c%1000000/100000;                                //十萬
  179.                             dispaly[4]=data_c%100000/10000;                                              //萬
  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;                                                      //個
  184.                             write_com(0x80+6+0x40); //第一行
  185.                             if(x==4)
  186.                             {   
  187.                             if(data_c>99999999)              {              write_date('0'+dispaly[8]);}    //顯示萬萬
  188.                             if(data_c>9999999)              {              write_date('0'+dispaly[7]);}   //千萬
  189.                             if(data_c>999999)              {              write_date('0'+dispaly[6]);}    //百萬
  190.                             if(data_c>99999)              {              write_date('0'+dispaly[5]);}    //十萬
  191.                                                                                                                 write_date('0'+dispaly[4]);    //萬
  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]);    //個
  197.                             }
  198.               else{
  199.                             if(data_c>99999999)              {              write_date('0'+dispaly[8]);}    //顯示萬萬
  200.                             if(data_c>9999999)              {              write_date('0'+dispaly[7]);}    //千萬
  201.                             if(data_c>999999)              {              write_date('0'+dispaly[6]);}    //百萬
  202.                             if(data_c>99999)              {              write_date('0'+dispaly[5]);}    //十萬
  203.                             if(data_c>9999)                            {              write_date('0'+dispaly[4]);}    //萬
  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]);    //個
  208.                             }
  209.               }
  210.               else  //溢出時顯示錯誤
  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)//加減乘除運算
  221. {
  222.               switch(x)                            /*功能鍵選擇*/
  223.                                           {  
  224.                                                         case 1:data_c=data_a+data_b;break;                               //加  /* + S=1 */ /* 數值轉換函數 */                                                                                                                             
  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,'-');} //負數符號
  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 *///除//溢出時顯示錯誤
  230.                                                         case 0:break;
  231.                                           }               

  232. }

  233. void main()
  234. {
  235.               uchar   key=0xff;               //鍵值初始化
  236.               uchar   n=0;                                                                      //第1個數可以按1-4次
  237.               uchar   m=5;                                                                       //第2個數可以按1-4次
  238.               uchar   x=0;
  239.               data_a=0;                       //前一個數
  240.               data_b=0;                       //后一個數
  241.               data_c=0;                       //結果
  242.               init_lcd();                                                                        //1602液晶初始化
  243.               display_a();
  244.     while(1)
  245.                 {
  246.                               key=keycheckdown();                                          /*動態掃描鍵盤,返回按鍵對應值,賦給j        key=0到f */
  247.                             if(0xff!=key)                                                        /*若返回值有效,進入內部處理程序*/
  248.                             {
  249.                               if(key<10)
  250.                               {
  251.                       if(n<4){data_a=data_a*10+key;m=5;display_a();}n++;  //首先輸入第一個數
  252.                                 if(m<4){data_b=data_b*10+key;n=5;display_b();}m++;  //必須按了+-*/才能輸入第二個數                           
  253.                               }
  254.           else
  255.           {              switch(key)                            /*功能鍵選擇*/
  256.                                                                       {
  257.                                                                                     case 0xa:n=5;m=0;x=1;W_lcd(5,0,'+');break; //加 /* + S=1 */ /* 數值轉換函數 */                                                                                                                             
  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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

完整論文下載(word格式 可編輯):
單片機作品之計算器設計報告.doc (622.26 KB, 下載次數: 299)


評分

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

查看全部評分

回復

使用道具 舉報

ID:277109 發表于 2018-1-17 18:48 | 顯示全部樓層
受教了
回復

使用道具 舉報

ID:277230 發表于 2018-1-18 08:24 來自觸屏版 | 顯示全部樓層
看來挺不錯的資料
回復

使用道具 舉報

ID:347385 發表于 2018-6-8 11:06 | 顯示全部樓層
不錯的資料,學習了
回復

使用道具 舉報

ID:358645 發表于 2018-6-25 16:51 | 顯示全部樓層
很厲害
回復

使用道具 舉報

ID:363545 發表于 2018-7-2 21:56 | 顯示全部樓層
太棒了,幫大忙了
回復

使用道具 舉報

ID:368586 發表于 2018-7-10 12:02 | 顯示全部樓層
很給力
回復

使用道具 舉報

ID:342128 發表于 2018-7-10 15:26 | 顯示全部樓層
很好的分享 感謝
回復

使用道具 舉報

ID:369931 發表于 2018-7-12 09:27 | 顯示全部樓層
大佬。。。
回復

使用道具 舉報

ID:369931 發表于 2018-7-12 09:28 | 顯示全部樓層
請問你這個有prodeus的仿真電路圖
回復

使用道具 舉報

ID:325250 發表于 2018-7-13 09:08 | 顯示全部樓層
多謝多謝
回復

使用道具 舉報

ID:399809 發表于 2018-9-19 09:05 | 顯示全部樓層
感謝樓主分享
回復

使用道具 舉報

ID:400039 發表于 2018-9-19 15:37 來自觸屏版 | 顯示全部樓層
學習到了,確實很好
回復

使用道具 舉報

ID:434835 發表于 2018-11-28 11:29 | 顯示全部樓層
謝謝了,剛好急需
回復

使用道具 舉報

ID:438408 發表于 2018-12-3 14:57 來自觸屏版 | 顯示全部樓層
上課剛好可以用到!謝謝!
回復

使用道具 舉報

ID:443436 發表于 2018-12-10 16:56 | 顯示全部樓層
最近在做單片機的實習,正需要這篇帖子,奈斯
回復

使用道具 舉報

ID:443718 發表于 2018-12-15 22:09 | 顯示全部樓層
為什么跟樓主連的一樣,仿真的時候按鍵盤沒有反應啊
回復

使用道具 舉報

ID:447541 發表于 2018-12-17 00:08 | 顯示全部樓層
很實用!
回復

使用道具 舉報

ID:453458 發表于 2018-12-24 14:47 | 顯示全部樓層
很棒的這個程序
回復

使用道具 舉報

ID:453458 發表于 2018-12-24 14:49 | 顯示全部樓層
很棒的這個程序、、
回復

使用道具 舉報

ID:456730 發表于 2018-12-27 22:56 | 顯示全部樓層
網上都是lcd1602
回復

使用道具 舉報

ID:457268 發表于 2018-12-28 14:03 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:460483 發表于 2019-1-2 21:23 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:482132 發表于 2019-2-28 15:36 | 顯示全部樓層
謝謝 正好用到
回復

使用道具 舉報

ID:513165 發表于 2019-4-24 14:25 | 顯示全部樓層
早就想自己做了
回復

使用道具 舉報

ID:559525 發表于 2019-6-11 07:49 來自觸屏版 | 顯示全部樓層
思路清醒,我們老師說搞工程或者項目關鍵在于你怎么想,最后才去實現,我認為重要的不是源代碼,而是思路
回復

使用道具 舉報

ID:559780 發表于 2019-6-11 11:29 | 顯示全部樓層
看起來很好,謝謝
回復

使用道具 舉報

ID:787036 發表于 2020-6-23 10:29 | 顯示全部樓層
為啥我這邊操作后運行程序顯示目標沒有被創造
回復

使用道具 舉報

ID:787436 發表于 2020-6-23 16:21 | 顯示全部樓層
很不錯的資料
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 伊人中文字幕 | 国产精品久久久久久二区 | 欧美一二三 | 日韩av一区二区在线 | a在线视频观看 | 国产精品久久国产精品99 gif | 国产精品成人在线播放 | 天堂一区二区三区四区 | 精品一区二区三区在线观看 | 日韩伦理一区二区三区 | 亚洲一区av | 国产伦一区二区三区四区 | 国产精品一区久久久 | 久久一区二区三区免费 | 一级黄片一级毛片 | 精品欧美一区二区精品久久久 | 日韩一级免费大片 | 视频一区二区国产 | 精品国产一区二区国模嫣然 | 亚洲精品久久久久久久久久吃药 | 极品粉嫩国产48尤物在线播放 | 中文av网站 | 日韩视频一区 | 奇米av| 美女一级毛片 | а_天堂中文最新版地址 | 国产一区免费 | 久久99精品久久久久久国产越南 | 日韩久草 | 亚洲aⅴ | 久久综合一区 | 激情a| 日韩国产一区二区三区 | 亚洲国产精品一区 | 欧美一区二区三区精品 | 国产精品日韩一区二区 | 中文字幕国产 | 国产精品99久久免费观看 | 国产精品一区二区福利视频 | 亚洲毛片在线 | 日韩国产中文字幕 |