單片機計算器設(shè)計論文_第1頁
單片機計算器設(shè)計論文_第2頁
單片機計算器設(shè)計論文_第3頁
單片機計算器設(shè)計論文_第4頁
單片機計算器設(shè)計論文_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、目 錄原理分析1方案選擇12.1主控制芯片12.1.1芯片介紹12.1.2單片機特性12.1.3 參數(shù)22.2 顯示模塊22.3 時鐘模塊43.電路原理圖繪制及仿真43.1元件型號43.2電路原理圖53.3仿真結(jié)果53.3.1常態(tài)下時鐘顯示63.3.2帶小數(shù)點的加法運算63.3.3帶負數(shù)的減法運算63.3.4乘法運算73.3.5除法運算74綜合調(diào)試74.1硬件電路74.1.1單片機最小系統(tǒng)電路74.1.2時鐘電路84.1.3復(fù)位電路94.1.4 LCD1602顯示電路104.1.5 DS1302電路114.1.6 矩陣鍵盤電路114.2軟件設(shè)計124.2.1程序整體框架124.2.2主函數(shù)流程

2、圖134.2.3時鐘顯示模式144.2.4計算器模式145.總結(jié)16附錄一:主函數(shù)源程序17附錄二:計算器函數(shù)22原理分析(陳小波,崔暢,程露)計算器包含了輸入按鍵然后計算再到顯示屏顯示,主要有3部分構(gòu)成,輸入、計算和顯示。采用單片機做主控制單元,從矩陣鍵盤讀取鍵值送入cpu計算然后將結(jié)果送到顯示器顯示。方案選擇(陳小波,崔暢,程露)2.1主控制芯片2.1.1芯片介紹STC89C52是STC公司生產(chǎn)的一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash存儲器。STC89C52使用經(jīng)典的MCS-51內(nèi)核,但做了很多的改進使得芯片具有傳統(tǒng)51單片機不具備的功能。在單芯片上,擁

3、有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標準功能: 8k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門狗定時器,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,3個16 位定時器/計數(shù)器,4個外部中斷,一個7向量4級中斷結(jié)構(gòu)(兼容傳統(tǒng)51的5向量2級中斷結(jié)構(gòu)),全雙工串行口。另外 STC89C52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機一切

4、工作停止,直到下一個中斷或硬件復(fù)位為止。最高運作頻率35MHz,6T/12T可選。2.1.2單片機特性STC89C52RC單片機:8K字節(jié)程序存儲空間;512字節(jié)數(shù)據(jù)存儲空間;內(nèi)帶2K字節(jié)EEPROM存儲空間;可直接使用串口下載;2.1.3 參數(shù)1. 增強型8051單片機,6 時鐘/機器周期和12 時鐘/機器周期可以任意 選擇,指令代碼完全兼容傳統(tǒng)8051.2. 工作電壓:5.5V3.3V(5V單片機)/3.8V2.0V(3V 單片機)3.工作頻率范圍:040MHz,相當于普通8051 的080MHz,實際工作 頻率可達48MHz4. 用戶應(yīng)用程序空間為8K字節(jié)5. 片上集成512 字節(jié)RAM

5、6. 通用I/O 口(32 個),復(fù)位后為:P0/P1/P2/P3 是準雙向口/弱上拉, P0 口是漏極開路輸出,作為總線擴展用時,不用加上拉電阻,作為 I/O 口用時,需加上拉電阻。7. ISP(在系統(tǒng)可編程)/IAP(在應(yīng)用可編程),無需專用編程器,無需專用仿真器,可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程序,數(shù)秒即可完成一片8. 具有EEPROM 功能9. 共3 個16 位定時器/計數(shù)器。即定時器T0、T1、T210.外部中斷4 路,下降沿中斷或低電平觸發(fā)電路,Power Down 模式可 由外部中斷低電平觸發(fā)中斷方式喚醒11. 通用異步串行口(UART),還可用定時

6、器軟件實現(xiàn)多個UART12. 工作溫度范圍:-40+85(工業(yè)級)/075(商業(yè)級)13. PDIP封裝。2.2 顯示模塊1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊。它由若干個5X7或者5X11等點陣字符位組成,每個點陣字符位都可以顯示一個字符,每位之間有一個點距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因為如此所以它不能很好地顯示圖形。1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個字符液晶模塊。1602采用標準的16腳接口,其中:第1腳:GND為電源地第2腳:VCC接5V電源正極第3腳:V0為液晶顯示器對比度

7、調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會 產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度)。第4腳:RS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指令寄存器。第5腳:RW為讀寫信號線,高電平1時進行讀操作,電平0時進行寫操作。第6腳:E(或EN)端為使能(enable)端,高電平(1)時讀取信息,負跳變時執(zhí)行指令。第714腳:D0D7為8位雙向數(shù)據(jù)端。第1516腳:空腳或背燈電源。15腳背光正極,16腳背光負極。管腳圖如下圖所示:圖1 LCD1602引腳圖2.3 時鐘模塊DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時

8、時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內(nèi)部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級產(chǎn)品,與DS1202兼容,但增加了主電源/后備電源雙電源引腳,同時提供了對后備電源進行涓細電流充電的能力。DS1302的引腳排列,其中Vcc1為主電源,VCC2為后備電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當Vcc2大于Vcc1+0.2

9、V時,Vcc2給DS1302供電。當Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復(fù)位/片選線,通過把RST輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)傳送的方法。當RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電

10、平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細說明。SCLK為時鐘輸入端。 下圖為DS1302的引腳功能圖:圖2 DS1302引腳圖3.電路原理圖繪制及仿真(陳小波,崔暢,程露)3.1元件型號本設(shè)計主要采用單片機做主控制,所以采用protues仿真。元件型號:AT89C51 x1DS1302 x1LCD1602 x110K排阻 x112Mhz排阻 x1按鍵 若干電阻 若干電容 若干3.2電路原理圖仿真原理圖用protues繪制,圖中大部分導線連接采用網(wǎng)絡(luò)標號代替。圖3 protues仿真原理圖3.3仿真結(jié)果 3.3.1常態(tài)下時鐘顯示圖4 時鐘顯示3.3.2帶小數(shù)點的加法運算圖5 帶小數(shù)的加

11、法3.3.3帶負數(shù)的減法運算圖6 帶負數(shù)的減法3.3.4乘法運算圖7 乘法運算3.3.5除法運算圖8 除法運算結(jié)果中如果只取前三位的時候,第四位四舍五入。4綜合調(diào)試(陳小波,崔暢,程露)4.1硬件電路4.1.1單片機最小系統(tǒng)電路單片機的最小系統(tǒng)是由組成單片機系統(tǒng)必需的一些元件構(gòu)成的,除了單片機之外,還需要包括電源供電電路、時鐘電路、復(fù)位電路。單片機最小系統(tǒng)電路如圖所示。圖9 最小系統(tǒng)原理圖4.1.2時鐘電路單片機工作時,從取指令到譯碼再進行微操作,必須在時鐘信號控制下才能有序地進行,時鐘電路就是為單片機工作提供基本時鐘的。單片機的時鐘信號通常有兩種產(chǎn)生方式:內(nèi)部時鐘方式和外部時鐘方式。在單片機

12、XTAL1和XTAL2引腳上跨接上一個晶振和兩個穩(wěn)頻電容,可以與單片機片內(nèi)的電路構(gòu)成一個穩(wěn)定的自激振蕩器。晶振的取值范圍一般為024MHz,常用的晶振頻率有6MHz、12 MHz、11.0592 MHz、24 MHz等。一些新型的單片機還可以選擇更高的頻率。外接電容的作用是對振蕩器進行頻率微調(diào),使振蕩信號頻率與晶振頻率一致,同時起到穩(wěn)定頻率的作用,一般選用2030pF的瓷片電容。電路如下:圖10 晶振電路外部時鐘方式則是在單片機XTAL1引腳上外接一個穩(wěn)定的時鐘信號源,它一般適用于多片單片機同時工作的情況,使用同一時鐘信號可以保證單片機的工作同步。時序是單片機在執(zhí)行指令時CPU發(fā)出的控制信號在

13、時間上的先后順序。51單片機的時序概念有4個,可用定時單位來說明,包括振蕩周期、時鐘周期、機器周期和指令周期。振蕩周期:是片內(nèi)振蕩電路或片外為單片機提供的脈沖信號的周期。時序中1個振蕩周期定義為1個節(jié)拍,用P表示。時鐘周期:振蕩脈沖送入內(nèi)部時鐘電路,由時鐘電路對其二分頻后輸出的時鐘脈沖周期稱為時鐘周期。時鐘周期為振蕩周期的2倍。時序中1個時鐘周期定義為1個狀態(tài),用S表示。每個狀態(tài)包括2個節(jié)拍,用P1、P2表示。機器周期:機器周期是單片機完成一個基本操作所需要的時間。一條指令的執(zhí)行需要一個或幾個機器周期。一個機器周期固定的由6個狀態(tài)S1S6組成。指令周期:執(zhí)行一條指令所需要的時間稱為指令周期。一

14、般用指令執(zhí)行所需機器周期數(shù)表示。51單片機多數(shù)指令的執(zhí)行需要1個或2個機器周期,只有乘除兩條指令的執(zhí)行需要4個機器周期。4.1.3復(fù)位電路無論是在單片機剛開始接上電源時,還是運行過程中發(fā)生故障都需要復(fù)位。復(fù)位電路用于將單片機內(nèi)部各電路的狀態(tài)恢復(fù)到一個確定的初始值,并從這個狀態(tài)開始工作。單片機的復(fù)位條件:必須使其RST引腳上持續(xù)出現(xiàn)兩個(或以上)機器周期的高電平。單片機的復(fù)位形式:上電復(fù)位、按鍵復(fù)位。上電復(fù)位和按鍵復(fù)位電路如下。上電復(fù)位電路中,利用電容充電來實現(xiàn)復(fù)位。在電源接通瞬間,RST引腳上的電位是高電平(Vcc),電源接通后對電容進行快速充電,隨著充電的進行,RST引腳上的電位也會逐漸下降

15、為低電平。只要保證RST引腳上高電平出現(xiàn)的時間大于兩個機器周期,便可以實現(xiàn)正常復(fù)位。按鍵復(fù)位電路中,當按鍵沒有按下時,電路同上電復(fù)位電路。如在單片機運行過程中,按下RESET鍵,已經(jīng)充好電的電容會快速通過200電阻的回路放電,從而使得RST引腳上的電位快速變?yōu)楦唠娖?,此高電平會維持到按鍵釋放,從而滿足單片機復(fù)位的條件實現(xiàn)按鍵復(fù)位。按鍵復(fù)位圖如下:圖11 復(fù)位電路4.1.4 LCD1602顯示電路LCD1602顯示電路圖如下,該部分主要負責常態(tài)的時鐘顯示,計算器模式時按鍵數(shù)字以及結(jié)果的顯示,使得系統(tǒng)更加直觀。圖12 LCD1602電路4.1.5 DS1302電路DS1302負責時鐘顯示部分的數(shù)據(jù)

16、,能在單片機掉電的情況下使用備用電池維持時間的正常。主要電路如下:圖13 DS1302電路4.1.6 矩陣鍵盤電路本系統(tǒng)鍵盤輸入采用4x4矩陣鍵盤,鍵盤包括0-9以及加減乘除小數(shù)點等按鍵。電路圖如下:圖14 矩陣鍵盤電路該矩陣鍵盤帶中斷,當有按鍵發(fā)生只有產(chǎn)生一個終端請求,單片機跳入終端讀取鍵值,改設(shè)計可以使IO復(fù)用,在沒有按鍵事件發(fā)生的時候按鍵接的IO口可以正常的數(shù)據(jù)輸入輸出,并使得單片機不用一直掃描按鍵,CPU工作量大大降低。4.2軟件設(shè)計本系統(tǒng)所有代碼全部采用C語言編寫,keil編譯調(diào)試。程序整體框架包含信息采集和信息顯示兩方面。首先由MCU主控制從外部矩陣鍵盤讀入鍵值,時鐘芯片讀取時間等

17、,然后控制液晶顯示器的不同功能顯示。4.2.1程序整體框架MCU主控芯片LCD顯示讀取時間矩陣鍵盤 圖15 程序整體框架主函數(shù)只要處理兩個大任務(wù),分別為時鐘顯示和計算器模式。有一個外部中斷按鍵控制切換顯示器顯示。上電復(fù)位之后開始外圍器件的初始化,初始化完成開始讀取有外部中斷連接的獨立按鍵KEY1,鍵值默認為0,鍵值為0的時候系統(tǒng)處于時鐘顯示模式,顯示當前時間以及日期。當檢測到有按鍵按下后,鍵值取反為1,當鍵值為1的時候主函數(shù)執(zhí)行計算器模式,開始矩形鍵盤的掃描,掃描到的鍵值全部存入數(shù)組待處理。再次觸發(fā)按鍵鍵值再次取反,從計算器模式中挑出,并清空存鍵值數(shù)組數(shù)據(jù)。系統(tǒng)再次進去時鐘顯示模式。交替運行互

18、不干擾,以實現(xiàn)整個系統(tǒng)任務(wù)。4.2.2主函數(shù)流程圖結(jié)束讀取鍵值計算器模式時鐘顯示模式0 ?1?初始化開始 圖16 主函數(shù)流程圖4.2.3時鐘顯示模式單片機從IO口讀取外設(shè)DS1302輸出的數(shù)據(jù),讀取完成后存入數(shù)組,由于DS1302讀出的事BCD碼,所以要對其進行處理轉(zhuǎn)化為10進制碼以便顯示。轉(zhuǎn)換完成后送1602顯示,顯示完成繼續(xù)讀取重復(fù)以上步驟,實現(xiàn)數(shù)據(jù)時間實時更新效果。DS1302外部接有備用電池,單片機以及芯片電源斷開的時候,備用電池供電時間不短依舊在持續(xù)運行,故下次單片機上電可直接讀取到當前時間,送顯示。4.2.4計算器模式當單片機進去計算器模式后,LCD顯示清除屏幕,等待讀取輸入鍵值的

19、顯示。矩陣不停行列掃描,有按鍵按下后進行判斷為哪一位的鍵值,存數(shù)組并送顯示。等號鍵按下為本次輸入的結(jié)束標志,呆等號鍵松開后,進入計算器函數(shù),先遍歷一邊數(shù)組,首先判斷是否有多個符號輸入,當有多個符號輸入的時候分幾種情況,有一個或者兩個負數(shù)的輸入,一個負號輸入的時候有判斷前一個數(shù)為負或者后一個為負,進行不同的處理。當檢測到的多個符號并不屬于負號輸入的時候跳出并顯示ERROR表示輸入錯誤。當負號判斷處理完成之后把運算負號存入一個標志位,然后對數(shù)組數(shù)據(jù)進行由字符到數(shù)值的處理,處理完成后進入對應(yīng)負號的計算,計算出結(jié)果并顯示。顯示完成等待任意按鍵清除屏幕以及數(shù)組并等待下一次的輸入。本系統(tǒng)加入了小數(shù)點的輸入

20、,當檢測到小數(shù)點的時候會對相應(yīng)數(shù)值處理并以float形式進行保存和運算。圖17 錯誤輸入演示最后顯示的結(jié)果分有小時和沒顯示顯示,有小數(shù)的時候默認顯示小數(shù)點后3位小時,沒有小數(shù)點的時候不顯示小數(shù)。圖18 結(jié)果小數(shù)顯示另外結(jié)果可顯示負數(shù)結(jié)果。圖19 結(jié)果負號顯示5.總結(jié)(陳小波,崔暢,程露)本次實驗剛開始認為比較簡單,想法方案沒有仔細想就采用了一個笨方法,加之對C語言的一些庫函數(shù)的不熟悉,導致走了很多彎路。最后在大神同學的指導啟發(fā)下對方案進行了大的調(diào)整,花了更多的心思,寫了更少量的代碼實現(xiàn)了更多的功能。在此非常感謝大神的幫助。本組在經(jīng)過一系列的失敗以及反思,請教之后完成了作品。感觸最深刻的就是不論

21、做什么之前應(yīng)該先深思方法步驟,不要急于下手,學會用巧妙的辦法解決更多的事。收獲頗豐!本系統(tǒng)還存在一些可以改進的地方,后期我希望能在時鐘顯示的基礎(chǔ)上加入鬧鐘,以及時間校準功能,但由于期末來臨更多的心思放在了學習上。待期末結(jié)束后會進行進一步的功能完整以及方案的完整改進。附錄一:主函數(shù)源程序#include "reg52.h"#include "1602.h"#include "key_board.h"#include "calculator.h"#include "ds1302.h"#include

22、 <stdio.h>#define const_key_time1 500 /按鍵去抖動延時的時間bit ucKeySec=0; /被觸發(fā)的按鍵編號unsigned int uiKeyTimeCnt1=0; /按鍵去抖動延時計數(shù)器unsigned char ucKeyLock1=0; /按鍵觸發(fā)后自鎖的變量標志sbit key = P37;void cal_function(void);void button_servce(void);void button_scan(void);static void delay_ms(unsigned int z)unsigned int x,

23、y;for(x=z;x>0;x-)for(y=114;y>0;y-);int main(void) EA=1; /全局中斷開 EX1=1; /外部中斷0開 IT1=0; /琁T1=0表示電平觸發(fā) EX0=1; /外部中斷0開 IT0=0; /琁T1=0表示電平觸發(fā)lcd_init(); /lcd初始化Ds1302_Init(); /DS1302初始化/Ds1302_Write_Time();/Ds1302_Init();while(1)/lcd_write_char('c');button_servce();void button_scan(void)if(key=

24、1)/IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標志位 ucKeyLock1=0; /按鍵自鎖標志清零 uiKeyTimeCnt1=0;/按鍵去抖動延時計數(shù)器清零,此行非常巧妙,是我實戰(zhàn)中摸索出來的。 else if(ucKeyLock1=0)/有按鍵按下,且是第一次被按下 +uiKeyTimeCnt1; /延時計數(shù)器 if(uiKeyTimeCnt1>const_key_time1) uiKeyTimeCnt1=0; ucKeyLock1=1; /自鎖按鍵置位,避免一直觸發(fā) ucKeySec=ucKeySec; /觸發(fā)1號鍵 void button_servce(void)/

25、button_scan();if(ucKeySec=0) delay_ms(50); Ds1302_Read_Time();delay_ms(50);/讀取時間Ds1302_Display();delay_ms(50); /顯示時間/button_scan();else if(ucKeySec=1) lcd_clr();/cal_function();/計算器/button_scan(); void cal_function(void)unsigned char temp=0; unsigned char input_buf20; /輸入的數(shù)據(jù)轉(zhuǎn)換為字符串保存unsigned char out

26、put_buf20; /輸出的數(shù)據(jù)保存空間unsigned char *ptr=input_buf; long double output=0; /輸出結(jié)果,double型unsigned char i;for(i=0; i<sizeof(input_buf); i+) /遍歷一遍輸入數(shù)組,使其清空input_bufi = 0;ptr=input_buf;locateXY(0,0);do/button_scan();if(ucKeySec=0)break;temp = 0;temp = key_board();while(P1&0XF0) != 0XF0); /等待按鍵彈起swi

27、tch(temp)case 1 : *ptr+ = '1' break;case 2 : *ptr+ = '2' break;case 3 : *ptr+ = '3' break;case 5 : *ptr+ = '4' break;case 6 : *ptr+ = '5' break;case 7 : *ptr+ = '6' break;case 9 : *ptr+ = '7' break;case 10 : *ptr+ = '8' break;case 11 :

28、*ptr+ = '9' break;case 14 : *ptr+ = '0' break;case 15 : *ptr+ = '.' break;case 13 : *ptr+ = '0' break;case 4 : *ptr+ = '+' break;case 8 : *ptr+ = '-' break;case 12 : *ptr+ = '*' break;case 16 : *ptr+ = '/' break; /按鍵對應(yīng)符號if(temp) /顯示到屏幕上

29、lcd_write_char(*(ptr-1);while(temp!=13);delay_ms(10); /當按鍵為'='時跳出循環(huán) locateXY(0,0); lcd_write_str(input_buf); lcd_write_str(" ");output = calculator(input_buf); /保存結(jié)果if(output = ERROR)locateXY(5,1);lcd_write_str("Error"); /輸入錯誤,在屏幕顯示ERRORelseif(output - (long int)output !=

30、 0) /如果結(jié)果有小數(shù),轉(zhuǎn)換為小數(shù)形式保存字符串sprintf(output_buf,"%.3f",output);elsesprintf(output_buf,"%ld",(long)output); /如果結(jié)果是整數(shù),保存為長整數(shù)形式保存字符串locateXY(0,1);lcd_write_char('=');lcd_write_str(output_buf);delay_ms(15);do/button_scan();if(ucKeySec=0)break;temp = 0;/"="鍵進行下一次計算temp =

31、 key_board();while(P1&0XF0) != 0XF0);while(temp=0);lcd_clr(); /清屏void ISR_INT1(void) interrupt 2 if(!INT1) delay_ms(10);/在此處可以添加去抖動程序,防止按鍵抖動造成錯誤 if(!INT1) while(!INT1);/等待按鍵釋放 ucKeySec=ucKeySec; void ISR_INT0(void) interrupt 0 if(!INT0) delay_ms(10);/在此處可以添加去抖動程序,防止按鍵抖動造成錯誤 if(!INT0) while(!INT0

32、);/等待按鍵釋放 Ds1302_Write_Time(); 附錄二:計算器函數(shù)#include "calculator.h"static long double count(long double x,long double y,unsigned char sign) /兩個數(shù)之間的運算(參數(shù)一,參數(shù)二,符號)switch(sign)case '+' : return (x+y);case '-' : return (x-y);case '*' : return (x*y);case '/' : return

33、 (y=0)? ERROR:(x/y);/除數(shù)為0,返回錯誤return ERROR; /符號錯誤,返回錯誤long double calculator(unsigned char *sbuf)long double temp1=0,temp2=0;unsigned char sign=0;unsigned char i=0;unsigned char point_flag=0;for(i=0; sbufi!='0' i+) /遍歷一遍數(shù)組,看看是否有運算符號if(sbufi = '+' | sbufi = '-' | sbufi = '

34、*' | sbufi = '/')sign = sign + 1; /記錄運算符號個數(shù)switch(sign)case 1: if(sbuf0>'9' | sbuf0<'0') /運算符號為1個,如果第一個字符不是數(shù)字返回錯誤return ERROR;for(i=0,point_flag=0; ; i+) /把符號前面的字符串轉(zhuǎn)換為數(shù)字if(sbufi='+' | sbufi='-' | sbufi='*' | sbufi='/')sign=sbufi; /sig

35、n保存運算符號break;if(sbufi = '.')/如果數(shù)據(jù)中有小數(shù)i+;point_flag = 1; /小數(shù)標志位置為if(point_flag = 0) /如果是整數(shù)部分temp1 = temp1*10 + (sbufi - 0x30);/上一次乘以10加上這次else /小數(shù)部分temp1 = temp1 + (sbufi-0x30)/(10*point_flag); /上次結(jié)果加上本次除以10的n次階乘point_flag = point_flag * 10;if(sbuf+i = '0') /如果最后一個字符是符號返回錯誤return ERRO

36、R;for(point_flag=0; sbufi!='0' i+) /把符號后面的字符串轉(zhuǎn)換為數(shù)字if(sbufi = '.')i+;point_flag = 1;if(point_flag = 0)temp2 = temp2*10 + (sbufi - 0x30);else temp2 = temp2 + (sbufi-0x30)/(10*point_flag);point_flag = point_flag * 10;break;case 2: if(sbuf0 = '-')if(sbuf1>'9' | sbuf1&l

37、t;'0') /如果第一個字符是負號,第二個字符不是數(shù)字返回錯誤return ERROR;for(i=1,point_flag=0;i+) /把符號前面的字符串轉(zhuǎn)換為數(shù)字if(sbufi='+' | sbufi='-' | sbufi='*' | sbufi='/')sign=sbufi; /sign保存運算符號break;if(sbufi = '.')i+;point_flag = 1;if(point_flag = 0)temp1 = temp1*10 + (sbufi - 0x30);else

38、 temp1 = temp1 + (sbufi-0x30)/(10*point_flag);point_flag = point_flag * 10;temp1 = temp1 * -1;if(sbuf+i = '0') /如果最后一個字符是符號返回錯誤return ERROR;for(point_flag=0;sbufi!='0'i+) /把符號后面的字符串轉(zhuǎn)換為數(shù)字if(sbufi = '.')i+;point_flag = 1;if(point_flag = 0)temp2 = temp2*10 + (sbufi - 0x30);else temp2 = temp2 + (sbufi-0x30)/(10*point_flag);point_flag = point_flag * 10;elsefor(i=0,point_flag=0;i+) /把符號前面的字符串轉(zhuǎn)換為數(shù)字if(sbufi='+' | sbufi='-' | sbufi='*' | sbufi='/')sign=sbufi;

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論