




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、目 錄原理分析1方案選擇12.1主控制芯片12.1.1芯片介紹12.1.2單片機(jī)特性12.1.3 參數(shù)22.2 顯示模塊22.3 時(shí)鐘模塊43.電路原理圖繪制及仿真43.1元件型號(hào)43.2電路原理圖53.3仿真結(jié)果53.3.1常態(tài)下時(shí)鐘顯示63.3.2帶小數(shù)點(diǎn)的加法運(yùn)算63.3.3帶負(fù)數(shù)的減法運(yùn)算63.3.4乘法運(yùn)算73.3.5除法運(yùn)算74綜合調(diào)試74.1硬件電路74.1.1單片機(jī)最小系統(tǒng)電路74.1.2時(shí)鐘電路84.1.3復(fù)位電路94.1.4 LCD1602顯示電路104.1.5 DS1302電路114.1.6 矩陣鍵盤電路114.2軟件設(shè)計(jì)124.2.1程序整體框架124.2.2主函數(shù)流程
2、圖134.2.3時(shí)鐘顯示模式144.2.4計(jì)算器模式145.總結(jié)16附錄一:主函數(shù)源程序17附錄二:計(jì)算器函數(shù)22原理分析(陳小波,崔暢,程露)計(jì)算器包含了輸入按鍵然后計(jì)算再到顯示屏顯示,主要有3部分構(gòu)成,輸入、計(jì)算和顯示。采用單片機(jī)做主控制單元,從矩陣鍵盤讀取鍵值送入cpu計(jì)算然后將結(jié)果送到顯示器顯示。方案選擇(陳小波,崔暢,程露)2.1主控制芯片2.1.1芯片介紹STC89C52是STC公司生產(chǎn)的一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash存儲(chǔ)器。STC89C52使用經(jīng)典的MCS-51內(nèi)核,但做了很多的改進(jìn)使得芯片具有傳統(tǒng)51單片機(jī)不具備的功能。在單芯片上,擁
3、有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門狗定時(shí)器,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,3個(gè)16 位定時(shí)器/計(jì)數(shù)器,4個(gè)外部中斷,一個(gè)7向量4級(jí)中斷結(jié)構(gòu)(兼容傳統(tǒng)51的5向量2級(jí)中斷結(jié)構(gòu)),全雙工串行口。另外 STC89C52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切
4、工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。最高運(yùn)作頻率35MHz,6T/12T可選。2.1.2單片機(jī)特性STC89C52RC單片機(jī):8K字節(jié)程序存儲(chǔ)空間;512字節(jié)數(shù)據(jù)存儲(chǔ)空間;內(nèi)帶2K字節(jié)EEPROM存儲(chǔ)空間;可直接使用串口下載;2.1.3 參數(shù)1. 增強(qiáng)型8051單片機(jī),6 時(shí)鐘/機(jī)器周期和12 時(shí)鐘/機(jī)器周期可以任意 選擇,指令代碼完全兼容傳統(tǒng)8051.2. 工作電壓:5.5V3.3V(5V單片機(jī))/3.8V2.0V(3V 單片機(jī))3.工作頻率范圍:040MHz,相當(dāng)于普通8051 的080MHz,實(shí)際工作 頻率可達(dá)48MHz4. 用戶應(yīng)用程序空間為8K字節(jié)5. 片上集成512 字節(jié)RAM
5、6. 通用I/O 口(32 個(gè)),復(fù)位后為:P0/P1/P2/P3 是準(zhǔn)雙向口/弱上拉, P0 口是漏極開路輸出,作為總線擴(kuò)展用時(shí),不用加上拉電阻,作為 I/O 口用時(shí),需加上拉電阻。7. ISP(在系統(tǒng)可編程)/IAP(在應(yīng)用可編程),無需專用編程器,無需專用仿真器,可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程序,數(shù)秒即可完成一片8. 具有EEPROM 功能9. 共3 個(gè)16 位定時(shí)器/計(jì)數(shù)器。即定時(shí)器T0、T1、T210.外部中斷4 路,下降沿中斷或低電平觸發(fā)電路,Power Down 模式可 由外部中斷低電平觸發(fā)中斷方式喚醒11. 通用異步串行口(UART),還可用定時(shí)
6、器軟件實(shí)現(xiàn)多個(gè)UART12. 工作溫度范圍:-40+85(工業(yè)級(jí))/075(商業(yè)級(jí))13. PDIP封裝。2.2 顯示模塊1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊。它由若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符,每位之間有一個(gè)點(diǎn)距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因?yàn)槿绱怂运荒芎芎玫仫@示圖形。1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個(gè)字符液晶模塊。1602采用標(biāo)準(zhǔn)的16腳接口,其中:第1腳:GND為電源地第2腳:VCC接5V電源正極第3腳:V0為液晶顯示器對(duì)比度
7、調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地電源時(shí)對(duì)比度最高(對(duì)比度過高時(shí)會(huì) 產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對(duì)比度)。第4腳:RS為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器。第5腳:RW為讀寫信號(hào)線,高電平1時(shí)進(jìn)行讀操作,電平0時(shí)進(jìn)行寫操作。第6腳:E(或EN)端為使能(enable)端,高電平(1)時(shí)讀取信息,負(fù)跳變時(shí)執(zhí)行指令。第714腳:D0D7為8位雙向數(shù)據(jù)端。第1516腳:空腳或背燈電源。15腳背光正極,16腳背光負(fù)極。管腳圖如下圖所示:圖1 LCD1602引腳圖2.3 時(shí)鐘模塊DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實(shí)時(shí)
8、時(shí)鐘電路,它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),具有閏年補(bǔ)償功能,工作電壓為2.5V5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。DS1302內(nèi)部有一個(gè)31×8的用于臨時(shí)性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級(jí)產(chǎn)品,與DS1202兼容,但增加了主電源/后備電源雙電源引腳,同時(shí)提供了對(duì)后備電源進(jìn)行涓細(xì)電流充電的能力。DS1302的引腳排列,其中Vcc1為主電源,VCC2為后備電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2
9、V時(shí),Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時(shí),DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復(fù)位/片選線,通過把RST輸入驅(qū)動(dòng)置高電平來啟動(dòng)所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)傳送的方法。當(dāng)RST為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對(duì)DS1302進(jìn)行操作。如果在傳送過程中RST置為低電平,則會(huì)終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時(shí),才能將RST置為高電
10、平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細(xì)說明。SCLK為時(shí)鐘輸入端。 下圖為DS1302的引腳功能圖:圖2 DS1302引腳圖3.電路原理圖繪制及仿真(陳小波,崔暢,程露)3.1元件型號(hào)本設(shè)計(jì)主要采用單片機(jī)做主控制,所以采用protues仿真。元件型號(hào):AT89C51 x1DS1302 x1LCD1602 x110K排阻 x112Mhz排阻 x1按鍵 若干電阻 若干電容 若干3.2電路原理圖仿真原理圖用protues繪制,圖中大部分導(dǎo)線連接采用網(wǎng)絡(luò)標(biāo)號(hào)代替。圖3 protues仿真原理圖3.3仿真結(jié)果 3.3.1常態(tài)下時(shí)鐘顯示圖4 時(shí)鐘顯示3.3.2帶小數(shù)點(diǎn)的加法運(yùn)算圖5 帶小數(shù)的加
11、法3.3.3帶負(fù)數(shù)的減法運(yùn)算圖6 帶負(fù)數(shù)的減法3.3.4乘法運(yùn)算圖7 乘法運(yùn)算3.3.5除法運(yùn)算圖8 除法運(yùn)算結(jié)果中如果只取前三位的時(shí)候,第四位四舍五入。4綜合調(diào)試(陳小波,崔暢,程露)4.1硬件電路4.1.1單片機(jī)最小系統(tǒng)電路單片機(jī)的最小系統(tǒng)是由組成單片機(jī)系統(tǒng)必需的一些元件構(gòu)成的,除了單片機(jī)之外,還需要包括電源供電電路、時(shí)鐘電路、復(fù)位電路。單片機(jī)最小系統(tǒng)電路如圖所示。圖9 最小系統(tǒng)原理圖4.1.2時(shí)鐘電路單片機(jī)工作時(shí),從取指令到譯碼再進(jìn)行微操作,必須在時(shí)鐘信號(hào)控制下才能有序地進(jìn)行,時(shí)鐘電路就是為單片機(jī)工作提供基本時(shí)鐘的。單片機(jī)的時(shí)鐘信號(hào)通常有兩種產(chǎn)生方式:內(nèi)部時(shí)鐘方式和外部時(shí)鐘方式。在單片機(jī)
12、XTAL1和XTAL2引腳上跨接上一個(gè)晶振和兩個(gè)穩(wěn)頻電容,可以與單片機(jī)片內(nèi)的電路構(gòu)成一個(gè)穩(wěn)定的自激振蕩器。晶振的取值范圍一般為024MHz,常用的晶振頻率有6MHz、12 MHz、11.0592 MHz、24 MHz等。一些新型的單片機(jī)還可以選擇更高的頻率。外接電容的作用是對(duì)振蕩器進(jìn)行頻率微調(diào),使振蕩信號(hào)頻率與晶振頻率一致,同時(shí)起到穩(wěn)定頻率的作用,一般選用2030pF的瓷片電容。電路如下:圖10 晶振電路外部時(shí)鐘方式則是在單片機(jī)XTAL1引腳上外接一個(gè)穩(wěn)定的時(shí)鐘信號(hào)源,它一般適用于多片單片機(jī)同時(shí)工作的情況,使用同一時(shí)鐘信號(hào)可以保證單片機(jī)的工作同步。時(shí)序是單片機(jī)在執(zhí)行指令時(shí)CPU發(fā)出的控制信號(hào)在
13、時(shí)間上的先后順序。51單片機(jī)的時(shí)序概念有4個(gè),可用定時(shí)單位來說明,包括振蕩周期、時(shí)鐘周期、機(jī)器周期和指令周期。振蕩周期:是片內(nèi)振蕩電路或片外為單片機(jī)提供的脈沖信號(hào)的周期。時(shí)序中1個(gè)振蕩周期定義為1個(gè)節(jié)拍,用P表示。時(shí)鐘周期:振蕩脈沖送入內(nèi)部時(shí)鐘電路,由時(shí)鐘電路對(duì)其二分頻后輸出的時(shí)鐘脈沖周期稱為時(shí)鐘周期。時(shí)鐘周期為振蕩周期的2倍。時(shí)序中1個(gè)時(shí)鐘周期定義為1個(gè)狀態(tài),用S表示。每個(gè)狀態(tài)包括2個(gè)節(jié)拍,用P1、P2表示。機(jī)器周期:機(jī)器周期是單片機(jī)完成一個(gè)基本操作所需要的時(shí)間。一條指令的執(zhí)行需要一個(gè)或幾個(gè)機(jī)器周期。一個(gè)機(jī)器周期固定的由6個(gè)狀態(tài)S1S6組成。指令周期:執(zhí)行一條指令所需要的時(shí)間稱為指令周期。一
14、般用指令執(zhí)行所需機(jī)器周期數(shù)表示。51單片機(jī)多數(shù)指令的執(zhí)行需要1個(gè)或2個(gè)機(jī)器周期,只有乘除兩條指令的執(zhí)行需要4個(gè)機(jī)器周期。4.1.3復(fù)位電路無論是在單片機(jī)剛開始接上電源時(shí),還是運(yùn)行過程中發(fā)生故障都需要復(fù)位。復(fù)位電路用于將單片機(jī)內(nèi)部各電路的狀態(tài)恢復(fù)到一個(gè)確定的初始值,并從這個(gè)狀態(tài)開始工作。單片機(jī)的復(fù)位條件:必須使其RST引腳上持續(xù)出現(xiàn)兩個(gè)(或以上)機(jī)器周期的高電平。單片機(jī)的復(fù)位形式:上電復(fù)位、按鍵復(fù)位。上電復(fù)位和按鍵復(fù)位電路如下。上電復(fù)位電路中,利用電容充電來實(shí)現(xiàn)復(fù)位。在電源接通瞬間,RST引腳上的電位是高電平(Vcc),電源接通后對(duì)電容進(jìn)行快速充電,隨著充電的進(jìn)行,RST引腳上的電位也會(huì)逐漸下降
15、為低電平。只要保證RST引腳上高電平出現(xiàn)的時(shí)間大于兩個(gè)機(jī)器周期,便可以實(shí)現(xiàn)正常復(fù)位。按鍵復(fù)位電路中,當(dāng)按鍵沒有按下時(shí),電路同上電復(fù)位電路。如在單片機(jī)運(yùn)行過程中,按下RESET鍵,已經(jīng)充好電的電容會(huì)快速通過200電阻的回路放電,從而使得RST引腳上的電位快速變?yōu)楦唠娖?,此高電平?huì)維持到按鍵釋放,從而滿足單片機(jī)復(fù)位的條件實(shí)現(xiàn)按鍵復(fù)位。按鍵復(fù)位圖如下:圖11 復(fù)位電路4.1.4 LCD1602顯示電路LCD1602顯示電路圖如下,該部分主要負(fù)責(zé)常態(tài)的時(shí)鐘顯示,計(jì)算器模式時(shí)按鍵數(shù)字以及結(jié)果的顯示,使得系統(tǒng)更加直觀。圖12 LCD1602電路4.1.5 DS1302電路DS1302負(fù)責(zé)時(shí)鐘顯示部分的數(shù)據(jù)
16、,能在單片機(jī)掉電的情況下使用備用電池維持時(shí)間的正常。主要電路如下:圖13 DS1302電路4.1.6 矩陣鍵盤電路本系統(tǒng)鍵盤輸入采用4x4矩陣鍵盤,鍵盤包括0-9以及加減乘除小數(shù)點(diǎn)等按鍵。電路圖如下:圖14 矩陣鍵盤電路該矩陣鍵盤帶中斷,當(dāng)有按鍵發(fā)生只有產(chǎn)生一個(gè)終端請(qǐng)求,單片機(jī)跳入終端讀取鍵值,改設(shè)計(jì)可以使IO復(fù)用,在沒有按鍵事件發(fā)生的時(shí)候按鍵接的IO口可以正常的數(shù)據(jù)輸入輸出,并使得單片機(jī)不用一直掃描按鍵,CPU工作量大大降低。4.2軟件設(shè)計(jì)本系統(tǒng)所有代碼全部采用C語言編寫,keil編譯調(diào)試。程序整體框架包含信息采集和信息顯示兩方面。首先由MCU主控制從外部矩陣鍵盤讀入鍵值,時(shí)鐘芯片讀取時(shí)間等
17、,然后控制液晶顯示器的不同功能顯示。4.2.1程序整體框架MCU主控芯片LCD顯示讀取時(shí)間矩陣鍵盤 圖15 程序整體框架主函數(shù)只要處理兩個(gè)大任務(wù),分別為時(shí)鐘顯示和計(jì)算器模式。有一個(gè)外部中斷按鍵控制切換顯示器顯示。上電復(fù)位之后開始外圍器件的初始化,初始化完成開始讀取有外部中斷連接的獨(dú)立按鍵KEY1,鍵值默認(rèn)為0,鍵值為0的時(shí)候系統(tǒng)處于時(shí)鐘顯示模式,顯示當(dāng)前時(shí)間以及日期。當(dāng)檢測(cè)到有按鍵按下后,鍵值取反為1,當(dāng)鍵值為1的時(shí)候主函數(shù)執(zhí)行計(jì)算器模式,開始矩形鍵盤的掃描,掃描到的鍵值全部存入數(shù)組待處理。再次觸發(fā)按鍵鍵值再次取反,從計(jì)算器模式中挑出,并清空存鍵值數(shù)組數(shù)據(jù)。系統(tǒng)再次進(jìn)去時(shí)鐘顯示模式。交替運(yùn)行互
18、不干擾,以實(shí)現(xiàn)整個(gè)系統(tǒng)任務(wù)。4.2.2主函數(shù)流程圖結(jié)束讀取鍵值計(jì)算器模式時(shí)鐘顯示模式0 ?1?初始化開始 圖16 主函數(shù)流程圖4.2.3時(shí)鐘顯示模式單片機(jī)從IO口讀取外設(shè)DS1302輸出的數(shù)據(jù),讀取完成后存入數(shù)組,由于DS1302讀出的事BCD碼,所以要對(duì)其進(jìn)行處理轉(zhuǎn)化為10進(jìn)制碼以便顯示。轉(zhuǎn)換完成后送1602顯示,顯示完成繼續(xù)讀取重復(fù)以上步驟,實(shí)現(xiàn)數(shù)據(jù)時(shí)間實(shí)時(shí)更新效果。DS1302外部接有備用電池,單片機(jī)以及芯片電源斷開的時(shí)候,備用電池供電時(shí)間不短依舊在持續(xù)運(yùn)行,故下次單片機(jī)上電可直接讀取到當(dāng)前時(shí)間,送顯示。4.2.4計(jì)算器模式當(dāng)單片機(jī)進(jìn)去計(jì)算器模式后,LCD顯示清除屏幕,等待讀取輸入鍵值的
19、顯示。矩陣不停行列掃描,有按鍵按下后進(jìn)行判斷為哪一位的鍵值,存數(shù)組并送顯示。等號(hào)鍵按下為本次輸入的結(jié)束標(biāo)志,呆等號(hào)鍵松開后,進(jìn)入計(jì)算器函數(shù),先遍歷一邊數(shù)組,首先判斷是否有多個(gè)符號(hào)輸入,當(dāng)有多個(gè)符號(hào)輸入的時(shí)候分幾種情況,有一個(gè)或者兩個(gè)負(fù)數(shù)的輸入,一個(gè)負(fù)號(hào)輸入的時(shí)候有判斷前一個(gè)數(shù)為負(fù)或者后一個(gè)為負(fù),進(jìn)行不同的處理。當(dāng)檢測(cè)到的多個(gè)符號(hào)并不屬于負(fù)號(hào)輸入的時(shí)候跳出并顯示ERROR表示輸入錯(cuò)誤。當(dāng)負(fù)號(hào)判斷處理完成之后把運(yùn)算負(fù)號(hào)存入一個(gè)標(biāo)志位,然后對(duì)數(shù)組數(shù)據(jù)進(jìn)行由字符到數(shù)值的處理,處理完成后進(jìn)入對(duì)應(yīng)負(fù)號(hào)的計(jì)算,計(jì)算出結(jié)果并顯示。顯示完成等待任意按鍵清除屏幕以及數(shù)組并等待下一次的輸入。本系統(tǒng)加入了小數(shù)點(diǎn)的輸入
20、,當(dāng)檢測(cè)到小數(shù)點(diǎn)的時(shí)候會(huì)對(duì)相應(yīng)數(shù)值處理并以float形式進(jìn)行保存和運(yùn)算。圖17 錯(cuò)誤輸入演示最后顯示的結(jié)果分有小時(shí)和沒顯示顯示,有小數(shù)的時(shí)候默認(rèn)顯示小數(shù)點(diǎn)后3位小時(shí),沒有小數(shù)點(diǎn)的時(shí)候不顯示小數(shù)。圖18 結(jié)果小數(shù)顯示另外結(jié)果可顯示負(fù)數(shù)結(jié)果。圖19 結(jié)果負(fù)號(hào)顯示5.總結(jié)(陳小波,崔暢,程露)本次實(shí)驗(yàn)剛開始認(rèn)為比較簡(jiǎn)單,想法方案沒有仔細(xì)想就采用了一個(gè)笨方法,加之對(duì)C語言的一些庫函數(shù)的不熟悉,導(dǎo)致走了很多彎路。最后在大神同學(xué)的指導(dǎo)啟發(fā)下對(duì)方案進(jìn)行了大的調(diào)整,花了更多的心思,寫了更少量的代碼實(shí)現(xiàn)了更多的功能。在此非常感謝大神的幫助。本組在經(jīng)過一系列的失敗以及反思,請(qǐng)教之后完成了作品。感觸最深刻的就是不論
21、做什么之前應(yīng)該先深思方法步驟,不要急于下手,學(xué)會(huì)用巧妙的辦法解決更多的事。收獲頗豐!本系統(tǒng)還存在一些可以改進(jìn)的地方,后期我希望能在時(shí)鐘顯示的基礎(chǔ)上加入鬧鐘,以及時(shí)間校準(zhǔn)功能,但由于期末來臨更多的心思放在了學(xué)習(xí)上。待期末結(jié)束后會(huì)進(jìn)行進(jìn)一步的功能完整以及方案的完整改進(jìn)。附錄一:主函數(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 /按鍵去抖動(dòng)延時(shí)的時(shí)間bit ucKeySec=0; /被觸發(fā)的按鍵編號(hào)unsigned int uiKeyTimeCnt1=0; /按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器unsigned char ucKeyLock1=0; /按鍵觸發(fā)后自鎖的變量標(biāo)志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是高電平,說明按鍵沒有被按下,這時(shí)要及時(shí)清零一些標(biāo)志位 ucKeyLock1=0; /按鍵自鎖標(biāo)志清零 uiKeyTimeCnt1=0;/按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零,此行非常巧妙,是我實(shí)戰(zhàn)中摸索出來的。 else if(ucKeyLock1=0)/有按鍵按下,且是第一次被按下 +uiKeyTimeCnt1; /延時(shí)計(jì)數(shù)器 if(uiKeyTimeCnt1>const_key_time1) uiKeyTimeCnt1=0; ucKeyLock1=1; /自鎖按鍵置位,避免一直觸發(fā) ucKeySec=ucKeySec; /觸發(fā)1號(hào)鍵 void button_servce(void)/
25、button_scan();if(ucKeySec=0) delay_ms(50); Ds1302_Read_Time();delay_ms(50);/讀取時(shí)間Ds1302_Display();delay_ms(50); /顯示時(shí)間/button_scan();else if(ucKeySec=1) lcd_clr();/cal_function();/計(jì)算器/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; /按鍵對(duì)應(yīng)符號(hào)if(temp) /顯示到屏幕上
29、lcd_write_char(*(ptr-1);while(temp!=13);delay_ms(10); /當(dāng)按鍵為'='時(shí)跳出循環(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"); /輸入錯(cuò)誤,在屏幕顯示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ù),保存為長(zhǎng)整數(shù)形式保存字符串locateXY(0,1);lcd_write_char('=');lcd_write_str(output_buf);delay_ms(15);do/button_scan();if(ucKeySec=0)break;temp = 0;/"="鍵進(jìn)行下一次計(jì)算temp =
31、 key_board();while(P1&0XF0) != 0XF0);while(temp=0);lcd_clr(); /清屏void ISR_INT1(void) interrupt 2 if(!INT1) delay_ms(10);/在此處可以添加去抖動(dòng)程序,防止按鍵抖動(dòng)造成錯(cuò)誤 if(!INT1) while(!INT1);/等待按鍵釋放 ucKeySec=ucKeySec; void ISR_INT0(void) interrupt 0 if(!INT0) delay_ms(10);/在此處可以添加去抖動(dòng)程序,防止按鍵抖動(dòng)造成錯(cuò)誤 if(!INT0) while(!INT0
32、);/等待按鍵釋放 Ds1302_Write_Time(); 附錄二:計(jì)算器函數(shù)#include "calculator.h"static long double count(long double x,long double y,unsigned char sign) /兩個(gè)數(shù)之間的運(yùn)算(參數(shù)一,參數(shù)二,符號(hào))switch(sign)case '+' : return (x+y);case '-' : return (x-y);case '*' : return (x*y);case '/' : return
33、 (y=0)? ERROR:(x/y);/除數(shù)為0,返回錯(cuò)誤return ERROR; /符號(hào)錯(cuò)誤,返回錯(cuò)誤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ù)組,看看是否有運(yùn)算符號(hào)if(sbufi = '+' | sbufi = '-' | sbufi = '
34、*' | sbufi = '/')sign = sign + 1; /記錄運(yùn)算符號(hào)個(gè)數(shù)switch(sign)case 1: if(sbuf0>'9' | sbuf0<'0') /運(yùn)算符號(hào)為1個(gè),如果第一個(gè)字符不是數(shù)字返回錯(cuò)誤return ERROR;for(i=0,point_flag=0; ; i+) /把符號(hào)前面的字符串轉(zhuǎn)換為數(shù)字if(sbufi='+' | sbufi='-' | sbufi='*' | sbufi='/')sign=sbufi; /sig
35、n保存運(yùn)算符號(hào)break;if(sbufi = '.')/如果數(shù)據(jù)中有小數(shù)i+;point_flag = 1; /小數(shù)標(biāo)志位置為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') /如果最后一個(gè)字符是符號(hào)返回錯(cuò)誤return ERRO
36、R;for(point_flag=0; sbufi!='0' i+) /把符號(hào)后面的字符串轉(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') /如果第一個(gè)字符是負(fù)號(hào),第二個(gè)字符不是數(shù)字返回錯(cuò)誤return ERROR;for(i=1,point_flag=0;i+) /把符號(hào)前面的字符串轉(zhuǎn)換為數(shù)字if(sbufi='+' | sbufi='-' | sbufi='*' | sbufi='/')sign=sbufi; /sign保存運(yùn)算符號(hào)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') /如果最后一個(gè)字符是符號(hào)返回錯(cuò)誤return ERROR;for(point_flag=0;sbufi!='0'i+) /把符號(hào)后面的字符串轉(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+) /把符號(hào)前面的字符串轉(zhuǎn)換為數(shù)字if(sbufi='+' | sbufi='-' | sbufi='*' | sbufi='/')sign=sbufi;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年高中物理課時(shí)分層作業(yè)15機(jī)械能守恒定律含解析教科版必修2
- 2024-2025學(xué)年高中政治專題三運(yùn)用辯證思維的方法第4框推動(dòng)認(rèn)識(shí)發(fā)展學(xué)案新人教版選修4
- 2024-2025學(xué)年高中地理第二章區(qū)域可持續(xù)發(fā)展第二節(jié)濕地資源的開發(fā)與保護(hù)知識(shí)梳理學(xué)案湘教版必修3
- 裝配式建筑 鋼結(jié)構(gòu) 預(yù)制構(gòu)件與節(jié)點(diǎn)技術(shù)條件 編制說明
- “多位數(shù)乘一位數(shù)(不進(jìn)位)的筆算乘法”(教學(xué)設(shè)計(jì))-2024-2025學(xué)年三年級(jí)上冊(cè)數(shù)學(xué)人教版
- 第四單元《第15課 網(wǎng)上點(diǎn)播-在線點(diǎn)播微電影》教學(xué)設(shè)計(jì)-2023-2024學(xué)年清華版(2012)信息技術(shù)四年級(jí)上冊(cè)
- 第四單元 單元教學(xué)設(shè)計(jì) 2023-2024學(xué)年統(tǒng)編版高中語文選擇性必修中冊(cè)
- 第五章排版-排球雙手正面?zhèn)髑?教學(xué)設(shè)計(jì) 2023-2024學(xué)年北師大版八年級(jí)上冊(cè)
- 2025年變壓器、整流器和電感器項(xiàng)目合作計(jì)劃書
- 多邊形內(nèi)角和 (教學(xué)設(shè)計(jì))-2023-2024學(xué)年四年級(jí)下冊(cè)數(shù)學(xué)人教版
- 電梯口包邊施工方案正式
- 部編版六年級(jí)道德與法治下冊(cè)《學(xué)會(huì)反思》教案
- 三年級(jí)道德與法治下冊(cè)我是獨(dú)特的
- 部編版四年級(jí)下冊(cè)語文教案(完整)
- T∕CIS 71001-2021 化工安全儀表系統(tǒng)安全要求規(guī)格書編制導(dǎo)則
- 青年卒中 幻燈
- 典型倒閘操作票
- 第七章 化學(xué)物質(zhì)與酶的相互作用
- 機(jī)械畢業(yè)設(shè)計(jì)論文鋼筋自動(dòng)折彎?rùn)C(jī)的結(jié)構(gòu)設(shè)計(jì)全套圖紙
- 綜采工作面順槽頂板退錨安全技術(shù)措施
- 中國電機(jī)工程學(xué)報(bào)論文格式模板
評(píng)論
0/150
提交評(píng)論