畢業(yè)設(shè)計(jì)基于STC89C52RC單片機(jī)的簡(jiǎn)易計(jì)算器設(shè)計(jì)_第1頁
畢業(yè)設(shè)計(jì)基于STC89C52RC單片機(jī)的簡(jiǎn)易計(jì)算器設(shè)計(jì)_第2頁
畢業(yè)設(shè)計(jì)基于STC89C52RC單片機(jī)的簡(jiǎn)易計(jì)算器設(shè)計(jì)_第3頁
畢業(yè)設(shè)計(jì)基于STC89C52RC單片機(jī)的簡(jiǎn)易計(jì)算器設(shè)計(jì)_第4頁
畢業(yè)設(shè)計(jì)基于STC89C52RC單片機(jī)的簡(jiǎn)易計(jì)算器設(shè)計(jì)_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、電子設(shè)計(jì)實(shí)驗(yàn)名稱:基于stc89c52rc單片機(jī)的簡(jiǎn)易計(jì)算器設(shè)計(jì) 姓 名: _學(xué) 號(hào):指導(dǎo)老師: 目錄一、可行性研究.3二、設(shè)計(jì)方案簡(jiǎn)述.4 2.1、功能介紹.4基本功能.4擴(kuò)展功能.4 2.2、總體設(shè)計(jì)方案.5總體設(shè)計(jì)思路.5方案論證與比較.6系統(tǒng)組成.7三、詳細(xì)設(shè)計(jì).12 1.各個(gè)模塊設(shè)計(jì).12 輸入模塊:鍵盤掃描.13 運(yùn)算模塊:?jiǎn)纹瑱C(jī)控制.14 顯示模塊:lcd1602顯示.15 2.硬件電路設(shè)計(jì).16 硬件連接.16 3.元件的介紹17 stc89c52單片機(jī)組成.17 復(fù)位和復(fù)位電路.18 lcd1602顯示器.19 4.pcb設(shè)計(jì)以及結(jié)果顯示.225、 總結(jié)24附錄主要程序代碼.

2、25一、設(shè)可行性分析:1.2.1 經(jīng)濟(jì)可行性由于只是實(shí)驗(yàn)性質(zhì)的編程,所以在設(shè)計(jì)和開發(fā)都不需要過多的經(jīng)費(fèi),但是系統(tǒng)投入運(yùn)行以后,硬件維護(hù)和損耗所造成的耗費(fèi)是必須的,但是數(shù)目也不會(huì)很大。所以經(jīng)過初步分析,經(jīng)濟(jì)上基本上是可行的1.2.2技術(shù)可行性在技術(shù)方面,因?yàn)槎紝W(xué)習(xí)了c語言,硬件課程設(shè)計(jì)等課程,對(duì)于開發(fā)語言c語言也有一定的掌控能力,應(yīng)該能夠完成相應(yīng)的任務(wù)。1.2.3 運(yùn)行可行性該成果簡(jiǎn)單易操作,非常容易使用。1.2.4 法律可行性由于我們需要完成的功能相對(duì)簡(jiǎn)單,沒有太多涉及到很專業(yè)方面的內(nèi)容,更沒有計(jì)劃將系統(tǒng)利用到商業(yè)用途,所以不存在侵權(quán)或者版權(quán)糾紛方面的問題。1.2.5結(jié)論該系統(tǒng)的軟硬件都比較容

3、易理解和實(shí)現(xiàn),所以,具有實(shí)現(xiàn)一計(jì)算器的可行性。二、設(shè)計(jì)方案簡(jiǎn)述2.1功能概述系統(tǒng)基本功能:(1)由于設(shè)計(jì)的計(jì)算器要進(jìn)行四則運(yùn)算,為了得到較好的顯示效果,經(jīng)綜合分析后,最后采用lcd 顯示數(shù)據(jù)和結(jié)果。(2)采用鍵盤輸入方式,鍵盤包括數(shù)字鍵(09)、符號(hào)鍵(+、-、)、清除鍵(onc)和等號(hào)鍵(=),故只需要16 個(gè)按鍵即可,設(shè)計(jì)中采用集成的計(jì)算鍵盤。(3)在執(zhí)行過程中,開機(jī)顯示零,等待鍵入數(shù)值,當(dāng)鍵入數(shù)字,通過lcd顯示出來,當(dāng)鍵入+、-、*、/運(yùn)算符,計(jì)算器在內(nèi)部執(zhí)行數(shù)值轉(zhuǎn)換和存儲(chǔ),并等待再次鍵入數(shù)值,當(dāng)再鍵入數(shù)值后將顯示鍵入的數(shù)值,按等號(hào)就會(huì)在lcd上輸出運(yùn)算結(jié)果。(4)錯(cuò)誤提示:當(dāng)計(jì)算器執(zhí)

4、行過程中有錯(cuò)誤時(shí),會(huì)在lcd上顯示相應(yīng)的提示,如:當(dāng)輸入的數(shù)值或計(jì)算得到的結(jié)果大于計(jì)算器的表示范圍時(shí),計(jì)算器會(huì)在lcd上提示overflow;當(dāng)除數(shù)為0時(shí),計(jì)算器會(huì)在lcd上提示error。擴(kuò)展功能:加上括號(hào)的混合運(yùn)算2.2總體設(shè)計(jì)思路本設(shè)計(jì)主要采用以下基本模塊來實(shí)現(xiàn):控制器模塊,輸入模塊,輸出模塊和電源模塊。通過對(duì)控制器進(jìn)行編程。使其對(duì)輸入模塊的信號(hào)進(jìn)行處理計(jì)算,然后通過輸出模塊反饋給使用者以計(jì)算結(jié)果。stc89c52單片機(jī)4*4鍵盤lcd顯示 晶振電路復(fù)位電路線路原理框圖方案論證與比較控制部分的設(shè)計(jì)方案論證與選擇根據(jù)設(shè)計(jì)要求,控制器主要用于紅外信號(hào)的接收和辨認(rèn)、控制步進(jìn)電機(jī)的動(dòng)作,控制顯示

5、步進(jìn)電機(jī)的轉(zhuǎn)速等。對(duì)于控制器的選擇有以下三種方案。方案一:采用計(jì)算器專用芯片實(shí)現(xiàn)。用計(jì)算器專用芯片進(jìn)行設(shè)計(jì)并編程實(shí)現(xiàn)。這種設(shè)計(jì)方案計(jì)算效率高、速度快、而且成本也相對(duì)較低,是廠家做計(jì)算器的最佳方案。但是本人對(duì)計(jì)算器專用芯片掌握的不夠,還不足以實(shí)現(xiàn)設(shè)計(jì)計(jì)算器,所以這個(gè)方案不可去。 方案二:采用fpga(現(xiàn)場(chǎng)可編程門陣列)作為系統(tǒng)的控制器。fpga將所有器件集成到一塊芯片上,體積小,節(jié)省空間,提高了穩(wěn)定性;直接面向用戶,具有極大的靈活性和通用性,使用方便,硬件測(cè)試和實(shí)現(xiàn)快捷,開發(fā)效率高,工作可靠性好??梢詫?shí)現(xiàn)各種復(fù)雜的邏輯功能,規(guī)模大,密度高,采用并行的輸入輸出方式,系統(tǒng)處理速度高,適合作為大規(guī)模實(shí)

6、時(shí)系統(tǒng)的控制核心。由fpga內(nèi)部編程實(shí)現(xiàn)計(jì)算器功能,本設(shè)計(jì)對(duì)數(shù)據(jù)處理速度的要求不是很高,fpga的高速處理的優(yōu)勢(shì)得不到充分的體現(xiàn),由于其集成度高,使其成本偏高,同時(shí)由于芯片的引腳較多,實(shí)物電路板布線復(fù)雜,加重了電路設(shè)計(jì)和實(shí)際焊接的工作。并且fpga的價(jià)格相對(duì)較高,性價(jià)比太低。 方案三、用單片機(jī)實(shí)現(xiàn)。由于單片機(jī)集成了運(yùn)算器電路、控制電路、存儲(chǔ)器、中斷系統(tǒng)、定時(shí)器/計(jì)數(shù)器以及輸入/輸出口電路等,所以用單片機(jī)設(shè)計(jì)控制電路省去了很多分立元器件。由于單片機(jī)是可編程芯片,并且它可以運(yùn)用c語言編寫,對(duì)于一些復(fù)雜的計(jì)算功能,可以調(diào)用c語言庫函數(shù)。使編寫程序變得非常簡(jiǎn)單。所以該課題用單片機(jī)實(shí)現(xiàn),不僅功能易于實(shí)現(xiàn)

7、,而且精確度高,穩(wěn)定性好,抗干擾能力強(qiáng)。并且由于其成本低、體積小、技術(shù)成熟和功耗小等優(yōu)點(diǎn),且技術(shù)比較成熟。性價(jià)比也相當(dāng)高。更重要的是本人經(jīng)過幾年的學(xué)習(xí),對(duì)單片機(jī)已有深刻的理解,并且可以靈活運(yùn)用。綜上所述,并通過各個(gè)方面綜合比較為達(dá)到最佳效果。我們采用方案三利用單片機(jī)控制器。顯示電路的設(shè)計(jì)方案論證與選擇方案一:數(shù)碼管顯示方案。數(shù)碼管顯示使用兩個(gè)四位一體動(dòng)態(tài)數(shù)碼管顯示方案,此設(shè)計(jì)電路如圖所示。采用動(dòng)態(tài)數(shù)碼管顯示,具有程序簡(jiǎn)單, 對(duì)外界環(huán)境要求低,易于維護(hù),同時(shí)其精度比較高,精確可靠,操作簡(jiǎn)單。顯示直觀的特點(diǎn)。但只能顯示數(shù)字和一些代碼,不能顯示漢字及一些常用的符號(hào),且硬件設(shè)計(jì)比較復(fù)雜。方案二;lcd

8、1602顯示器所謂1602是指顯示的內(nèi)容為16*2,即可以顯示兩行,每行16個(gè)字符。目前字符液晶絕大多數(shù)是基于hd44780液晶芯片的,控制原理是完全相同的,因此基于hd44780寫的控制程序可以很方便地應(yīng)用于大部分的字符型液晶。字符型lcd1602通常有14條引腳線或16條引腳線的lcd,多出來的2條線是背光電源線vcc(15腳)和地線gnd(16腳),其控制原理與14腳的lcd完全一樣,引腳定義如下表所示: hd44780內(nèi)置了ddram、cgrom和cgram。 ddram就是顯示數(shù)據(jù)ram,用來寄存待顯示的字符代碼。共80個(gè)字節(jié),其地址和屏幕的對(duì)應(yīng)關(guān)系如下表: hd44780的指令集1

9、.清屏指令 功能: 清除液晶顯示器,即將ddram的內(nèi)容全部填入空白的ascii碼20h; 光標(biāo)歸位,即將光標(biāo)撤回液晶顯示屏的左上方; 將地址計(jì)數(shù)器(ac)的值設(shè)為0。 2.光標(biāo)歸位指令 功能: 把光標(biāo)撤回到顯示器的左上方; 把地址計(jì)數(shù)器(ac)的值設(shè)置為0; 保持ddram的內(nèi)容不變 3.進(jìn)入模式設(shè)置指令 功能:設(shè)定每次定入1位數(shù)據(jù)后光標(biāo)的移位方向,并且設(shè)定每次寫入的一個(gè)字符是否移動(dòng)。參數(shù)設(shè)定的情況如下所示: 位名設(shè)置 i/d 0=寫入新數(shù)據(jù)后光標(biāo)左移 1=寫入新數(shù)據(jù)后光標(biāo)右移 s0=寫入新數(shù)據(jù)后顯示屏不移動(dòng) 1=寫入新數(shù)據(jù)后顯示屏整體右移1個(gè)字 4.顯示開關(guān)控制指令 功能:控制顯示器開/關(guān)

10、、光標(biāo)顯示/關(guān)閉以及光標(biāo)是否閃爍。參數(shù)設(shè)定的情況如下: 位名設(shè)置 d0=顯示功能關(guān) 1=顯示功能開 c0=無光標(biāo) 1=有光標(biāo) b0=光標(biāo)閃爍 1=光標(biāo)不閃爍 5.設(shè)定顯示屏或光標(biāo)移動(dòng)方向指令 功能:使光標(biāo)移位或使整個(gè)顯示屏幕移位。參數(shù)設(shè)定的情況如下: s/c r/l設(shè)定情況 0 0光標(biāo)左移1格,且ac值減1 0 1光標(biāo)右移1格,且ac值加1 1 0顯示器上字符全部左移一格,但光標(biāo)不動(dòng) 1 1顯示器上字符全部右移一格,但光標(biāo)不動(dòng) 6.功能設(shè)定指令 功能:設(shè)定數(shù)據(jù)總線位數(shù)、顯示的行數(shù)及字型。參數(shù)設(shè)定的情況如下: 位名設(shè)置 dl 0=數(shù)據(jù)總線為4位 1=數(shù)據(jù)總線為8位 n 0=顯示1行 1=顯示2行

11、 f0=57點(diǎn)陣/每字符 1=510點(diǎn)陣/每字符 7.設(shè)定cgram地址指令 功能:設(shè)定下一個(gè)要存入數(shù)據(jù)的cgram的地址。 8.設(shè)定ddram地址指令 功能:設(shè)定下一個(gè)要存入數(shù)據(jù)的cgram的地址。 (注意這里我們送地址的時(shí)候應(yīng)該是0x80+address,這也是前面說到寫地址命令的時(shí)候要加上0x80的原因) 9.讀取忙信號(hào)或ac地址指令 功能: 讀取忙碌信號(hào)bf的內(nèi)容,bf=1表示液晶顯示器忙,暫時(shí)無法接收單片機(jī)送來的數(shù)據(jù)或指令; 當(dāng)bf=0時(shí),液晶顯示器可以接收單片機(jī)送來的數(shù)據(jù)或指令; 讀取地址計(jì)數(shù)器(ac)的內(nèi)容。 10.數(shù)據(jù)寫入ddram或cgram指令一覽 功能: 將字符碼寫入dd

12、ram,以使液晶顯示屏顯示出相對(duì)應(yīng)的字符; 將使用者自己設(shè)計(jì)的圖形存入cgram。 11.從cgram或ddram讀出數(shù)據(jù)的指令一覽 功能:讀取ddram或cgram中的內(nèi)容。 基本操作時(shí)序: 讀狀態(tài) 輸入:rs=l,rw=h,e=h 輸出:db0db7=狀態(tài)字 寫指令 輸入:rs=l,rw=l,e=下降沿脈沖,db0db7=指令碼 輸出:無 讀數(shù)據(jù) 輸入:rs=h,rw=h,e=h 輸出:db0db7=數(shù)據(jù) 寫數(shù)據(jù) 輸入:rs=h,rw=l,e=下降沿脈沖,db0db7=數(shù)據(jù) 輸出:無 2.2.2.3、鍵盤設(shè)計(jì)方案與選擇方案一:獨(dú)立鍵盤。獨(dú)立鍵盤為一端接地,另一端接i/o口,并且要接上拉電阻

13、。這種鍵盤的硬件都很容易實(shí)現(xiàn),但每一個(gè)按鍵就要用一個(gè)i/o口,適合本次設(shè)計(jì)。方案二:通過ps2協(xié)義,用鍵盤同單片機(jī)相接,從而實(shí)現(xiàn)單片機(jī)與鍵盤通信。其電路如圖所示?,F(xiàn)在pc機(jī)廣泛采用的ps/2接口為minidin 6引腳的連接器。1數(shù)據(jù)線(data);未用;3電源地(gnd);4電源(+5 v);5時(shí)鐘(clk);6未用。由此圖可知,使用鍵盤硬件結(jié)構(gòu)比較簡(jiǎn)單,但鍵盤的體積太大,所以此系統(tǒng)不采用此方案。方案三:自制編碼鍵盤。編碼鍵盤的電路如圖所示,這種鍵盤有編程簡(jiǎn)單,占用資源少,但其硬件比較復(fù)雜,要用很多的二極管,不是很理想。 方案四:4*4矩陣式鍵盤。其電路圖如圖所示,這種鍵盤的硬件簡(jiǎn)單,使用的

14、i/o口也不多,而且這種鍵盤的編程方法已很成熟。本次設(shè)計(jì)也可以采用這種矩陣式鍵盤。其電路圖如圖主體設(shè)計(jì)部分:(1)、系統(tǒng)模塊圖:(2)、算術(shù)運(yùn)算程序流程圖:(3)、系統(tǒng)總流程圖:(4)、硬件設(shè)計(jì):(一)、總體硬件設(shè)計(jì):本設(shè)計(jì)選用at89c51單片機(jī)為主控單元; 顯示部分:采用lcd靜態(tài)顯示;按鍵部分:采用4*4鍵盤;用mm74c922為4*4鍵盤掃描ic,讀取輸入的鍵值??傮w設(shè)計(jì)效果如下圖:(二)、單片機(jī)接口電路說明:1、手動(dòng)上電復(fù)位電路:當(dāng)vcc上電時(shí),c充電,在10k電阻上出現(xiàn)電壓,使得單片機(jī)復(fù)位;幾個(gè)毫秒后,c充滿,10k電阻上電流降為0,電壓也為0,使得單片機(jī)進(jìn)入工作狀態(tài)。工作期間,按

15、下s,c放電。s松手,c又充電,在10k電阻上出現(xiàn)電壓,使得單片機(jī)復(fù)位。幾個(gè)毫秒后,單片機(jī)進(jìn)入工作狀態(tài)。 2、內(nèi)部時(shí)鐘模式電路:當(dāng)單片機(jī)工作于內(nèi)部時(shí)鐘模式的時(shí)候,只需在xtal1和xtal2引腳連接一個(gè)晶體振蕩器或者陶瓷振蕩器,并接兩個(gè)電容后接地即可,在使用時(shí)對(duì)于電容的選擇有一定的要求:當(dāng)外接晶體振蕩器的時(shí)候,電容值一般選擇c1=c2=30+10pf或30-10pf;當(dāng)外接陶瓷振蕩器的時(shí)候,電容值一般選擇c1=c2=40+10pf或40-10pf;3、 stc89c52介紹:stc89c52是一種低功耗、高性能cmos8位微控制器,具有 8k 在系統(tǒng)可編程flash 存儲(chǔ)器。在單芯片上,擁有靈

16、巧的8 位cpu 和在系統(tǒng)可編程flash,使得stc89c52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)flash,512字節(jié)ram, 32 位i/o 口線,看門狗電路,內(nèi)置4kb eeprom,max810復(fù)位電路,三個(gè)16 位 定時(shí)器/計(jì)數(shù)器,一個(gè)6向量2級(jí)中斷結(jié)構(gòu),全雙工串行口。另外 stc89x52 可降至0hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,cpu 停止工作,允許ram、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,ram內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。最高運(yùn)作頻率3

17、5mhz,6t/12t可選。和atmel的對(duì)比stc89c52rc單片機(jī):8k字節(jié)程序存儲(chǔ)空間;512字節(jié)數(shù)據(jù)存儲(chǔ)空間;內(nèi)帶4k字節(jié)eeprom存儲(chǔ)空間;可直接使用串口下載;at89s52單片機(jī):8k字節(jié)程序存儲(chǔ)空間;256字節(jié)數(shù)據(jù)存儲(chǔ)空間;沒有內(nèi)帶eeprom存儲(chǔ)空間; 4、 lcd1602介紹:1602采用標(biāo)準(zhǔn)的16腳接口,其中:第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ì)比度)。第4腳:rs為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電

18、平0時(shí)選擇指令寄存器。第5腳:rw為讀寫信號(hào)線,高電平(1)時(shí)進(jìn)行讀操作,低電平(0)時(shí)進(jìn)行寫操作。第6腳:e(或en)端為使能(enable)端。第714腳:d0d7為8位雙向數(shù)據(jù)端。第1516腳:空腳或背燈電源。15腳背光正極,16腳背光負(fù)極602lcd的特性n+5v電壓,對(duì)比度可調(diào)n內(nèi)含復(fù)位電路n提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能n有80字節(jié)顯示數(shù)據(jù)存儲(chǔ)器ddramn內(nèi)建有192個(gè)5x7點(diǎn)陣的字型的字符發(fā)生器cgromn8個(gè)可由用戶自定義的5x7的字符發(fā)生器cgram讀的時(shí)候,先讀左邊那列,再讀上面那行,如:感嘆號(hào)!的ascii為0x21,字母b的asci

19、i為0x42(前面加0x表示十六進(jìn)制)1602通過d0d7的8位數(shù)據(jù)端傳輸數(shù)據(jù)和指令。顯示模式設(shè)置: (初始化)0011 0000 0x38 設(shè)置162顯示,57點(diǎn)陣,8位數(shù)據(jù)接口;顯示開關(guān)及光標(biāo)設(shè)置: (初始化)0000 1dcb d顯示(1有效)、c光標(biāo)顯示(1有效)、b光標(biāo)閃爍(1有效)0000 01ns n=1(讀或?qū)懸粋€(gè)字符后地址指針加1 &光標(biāo)加1),n=0(讀或?qū)懸粋€(gè)字符后地址指針減1 &光標(biāo)減1),s=1 且 n=1 (當(dāng)寫一個(gè)字符后,整屏顯示左移)s=0 當(dāng)寫一個(gè)字符后,整屏顯示不移動(dòng)數(shù)據(jù)指針設(shè)置:數(shù)據(jù)首地址為80h,所以數(shù)據(jù)地址為80h+地址碼(0-27h,40-67h)其

20、他設(shè)置:01h(顯示清屏,數(shù)據(jù)指針=0,所有顯示=0);02h(顯示回車,數(shù)據(jù)指針=0)。(三)、鍵盤接口電路:計(jì)算器輸入數(shù)字和其他功能按鍵要用到很多按鍵,如果采用獨(dú)立按鍵的方式,在這種情況下,編程會(huì)很簡(jiǎn)單,但是會(huì)占用大量的i/o 口資源,因此在很多情況下都不采用這種方式,而是采用矩陣鍵盤的方案。矩陣鍵盤采用四條i/o 線作為行線,四條i/o 線作為列線組成鍵盤,在行線和列線的每個(gè)交叉點(diǎn)上設(shè)置一個(gè)按鍵。這樣鍵盤上按鍵的個(gè)數(shù)就為44個(gè)。這種行列式鍵盤結(jié)構(gòu)能有效地提高單片機(jī)系統(tǒng)中i/o 口的利用率。矩陣鍵盤的工作原理:計(jì)算器的鍵盤布局如圖1所示:一般有16個(gè)鍵組成,在單片機(jī)中正好可以用一個(gè)p口實(shí)現(xiàn)

21、16個(gè)按鍵功能,這種形式在單片機(jī)系統(tǒng)中也最常用。圖 1 矩陣鍵盤布局圖矩陣鍵盤內(nèi)部電路圖如圖2所示: (四)、lcd顯示模塊:本設(shè)計(jì)采用lcd液晶顯示器來顯示輸出數(shù)據(jù)。通過d0-d7引腳向lcd寫指令字或?qū)憯?shù)據(jù)以使lcd實(shí)現(xiàn)不同的功能或顯示相應(yīng)數(shù)據(jù)。圖5 lcd 模塊(五)運(yùn)算模塊(單片機(jī)控制):mcs-51 單片機(jī)是在一塊芯片中集成了cpu、ram、rom、定時(shí)器/計(jì)數(shù)器和多功能i/o等一臺(tái)計(jì)算機(jī)所需要的基本功能部件。如果按功能劃分,它由如下功能部件組成,即微處理器(cpu)、數(shù)據(jù)存儲(chǔ)器(ram)、程序存儲(chǔ)器(rom/eprom)、并行i/o 口、串行口、定時(shí)器/計(jì)數(shù)器、中斷系統(tǒng)及特殊功能寄

22、存器(sfr)。單片機(jī)是靠程序運(yùn)行的,并且可以修改。通過不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨(dú)特的一些功能,通過使用單片機(jī)編寫的程序可以實(shí)現(xiàn)高智能,高效率,以及高可靠性!因此我們采用單片機(jī)作為計(jì)算器的主要功能部件,可以很快地實(shí)現(xiàn)運(yùn)算功能。pcb設(shè)計(jì):1、實(shí)驗(yàn)現(xiàn)象、數(shù)據(jù)記錄數(shù)碼顯示及運(yùn)算最多九位顯示及運(yùn)算當(dāng)超出時(shí)溢出顯示五、總結(jié)在實(shí)驗(yàn)中遇到了這樣那樣的問題,軟件的編輯中使得c語言的應(yīng)用更加熟練;在硬件的實(shí)現(xiàn)中又出現(xiàn)了軟件和硬件不統(tǒng)一的問題,本實(shí)驗(yàn)我做了兩次,第一次的時(shí)候stc89c52單片機(jī)的p2口的p2.0p2.7分別對(duì)應(yīng)連接到lcd1602的d7d0口,這就使得在寫程序的時(shí)候需要把所有讀寫

23、的數(shù)據(jù)以及地址都按位取反,改寫程序比較復(fù)雜,最終調(diào)試失敗,又改變了硬件電路。最終成功; 本次設(shè)計(jì)不管在軟件,或是在硬件方面都讓我受益匪淺,讓我所學(xué)的知識(shí)得以應(yīng)用到實(shí)踐,經(jīng)過這次創(chuàng)新性實(shí)驗(yàn),也令我看到了很多的不足,在實(shí)驗(yàn)中的一些程序不能夠及時(shí)編輯正確,需要很長(zhǎng)時(shí)間的設(shè)計(jì)。硬件中我對(duì)單片機(jī)實(shí)驗(yàn)板上的很多硬件不是很清楚,使得在下載程序后,又進(jìn)行了很長(zhǎng)時(shí)間的調(diào)整。六、主要程序代碼key.c #include #define uchar unsigned char #define uint unsigned int #define keydata p1 uchar key; uchar dis_buff

24、; void delay1(uint x) uint i,j; for(i=0;ix;i+) for(j=0;j4)|0xf0); if(temp=1)key=0; else if(temp=2)key=1; else if(temp=4)key=2; else if(temp=8)key=3; else key=16; keydata=0x0f; delay1(1); temp=keydata; temp=temp&0x0f; temp=(temp|0xf0); if(temp=1)key+=12; else if(temp=2)key+=8; else if(temp=4)key+=4;

25、else if(temp=8)key+=0; else key=16; if(key16) dis_buff=key; return dis_buff; uchar keydown(void) uchar keyflag; uchar temp; keydata=0xf0; if(keydata!=0xf0) temp=keydata; delay1(200); if(temp=keydata) keyflag=1; else keyflag=0; else keyflag=0; return keyflag; 1602. c #include #include #define uchar u

26、nsigned char #define uint unsigned int sbit rs=p25; sbit rw=p26; sbit e=p27; sbit bf=p07; void delay1ms(void) uchar i,j; for(i=0;i10;i+) for(j=0;j33;j+) ; void delay(uchar n) uchar i; for(i=0;in;i+) delay1ms(); uchar busytest(void) bit result1; rs=0; rw=1; e=1; _nop_(); _nop_(); _nop_(); _nop_(); re

27、sult1=bf; e=0; return result1; void writecommand(uchar command) while(busytest()=1); rs=0; rw=0; e=0; _nop_(); _nop_();p0=command;_nop_();e=1;_nop_();e=0;void writeaddress(uchar addr) writecommand(addr|0x80); void writedata(uchar d)while(busytest()=1);rs=1;rw=0;e=0;_nop_();p0=d;e=1;_nop_();e=0;void

28、lcdinit(void)delay(15);writecommand(0x38);delay(5);writecommand(0x38);delay(5); writecommand(0x38);delay(5);writecommand(0x06);delay(5);writecommand(0x01);delay(5);writecommand(0x0c);delay(5);writecommand(0x0e);delay(5);main.c#include#define uchar unsigned char#define uint unsigned intuchar position

29、=0x00;uchar string30;/存放輸入的表達(dá)式uchar code warn=error;uchar code num=q,7,4,1,0,8,5,2,=,9,6,3,s,k,c,j;uchar curtime7=50,15,13,7,5,1,8;uchar opr15; /操作符int opt15; /操作數(shù)uchar iopt,iopr; /記錄操作數(shù)和操作符數(shù)組的下標(biāo)bit flag=0; /標(biāo)記是否輸入“(”操作符 循環(huán)嵌套long result=0; uchar pp; /記錄表達(dá)式的字符位置bit equal=0; /標(biāo)記是否開始計(jì)算int op=0;/用來記錄合成的

30、數(shù)值bit normal=1;/用來記錄是否正常,正常就進(jìn)行運(yùn)算,否則停止運(yùn)算uchar operate;/用來標(biāo)記操作數(shù)和操作符的堆棧bit equalflag=0;/用來標(biāo)記等號(hào)是否按下,按下之后為1相當(dāng)于清屏uchar shift=0; /shift鍵 sbit m1=p37; sbit m2=p36;sbit m3=p35; /用來標(biāo)識(shí)shift鍵是否按下,按下則滅uchar pzp=0;/用來保存修改狀態(tài)下等號(hào)的位置uchar writeaddress(uchar addr);uchar writedata(uchar d);uchar writecommand(uchar comm

31、and);void lcdinit();uchar keydown(void);uchar keyscan(void);void init(void) int i; position=0x00; for(i=0;i30;i+) stringi=a; flag=0; pp=0; equal=0; normal=1; shift=0; opr0=0; iopt=0; iopr=0; pzp=0; op=0;void displaynumble(long numble) /顯示結(jié)果,把結(jié)果轉(zhuǎn)換為字符串形式在輸出 uchar numx8=a,a,a,a,a,a,a,a; uchar i=1,j=0x4

32、2; lcdinit(); writecommand(0x0c);/關(guān)光標(biāo)顯示 writeaddress(0x40);writedata(=); if(numble0) numxi=numble%10; i+; numble=numble/10; i=i-1; while(numxi!=a) writeaddress(j+); writedata(numxi+0x30); i-; void displayerror(void) /顯示錯(cuò)誤uchar i;i=0;normal=0;while(warni!=0)writeaddress(0x40+i);writedata(warni);i+;vo

33、id calculate(void)/計(jì)算int m;switch(opriopr%10)case 0:flag=1;break;case 1:m=opt-iopt+opt-iopt;optiopt+=m;break;case 2:m=optiopt-2-optiopt-1;iopt=iopt-2;optiopt+=m; break;case 3:m=opt-iopt*opt-iopt;optiopt+=m;break;case 4:m=optiopt-2/optiopt-1;if(optiopt-1=0)displayerror();elseiopt=iopt-2;optiopt+=m; b

34、reak; void insertopr(uchar operate)reentrantif(operate/10opriopr/10|operate=10)opr+iopr=operate;elseif(iopr!=0)calculate();if(operate=15)iopr-;if(flag=0)insertopr(operate);elseflag=0; /用來使遞歸結(jié)束elseif(iopr=0)iopr+=1;opriopr=operate;uchar keychar(void)uchar ch; uchar n=keyscan();if(shift!=2)switch(n) c

35、ase 0:if(shift=0)ch=q; /q表示清除else ch=w;break; /w表示修改case 12:shift=(shift+1)%3;ch=m;break;case 13:if(shift=0)ch=(;else ch=);break;case 14:if(shift=0)ch=*;else ch=/;break;case 15:if(shift=0)ch=+;else ch=-;break;default:ch=numn;break;else ch=t;return ch;void writenum(uchar num,uchar add) /顯示數(shù)字writeaddr

36、ess(add);writedata(num/10+0x30);writeaddress(add+1);writedata(num%10+0x30);void display()writenum(curtime6,0x00);writeaddress(0x02);writedata(-);writenum(curtime4,0x03);writeaddress(0x05);writedata(-);writenum(curtime3,0x06);writeaddress(0x09);writedata(d);writeaddress(0x0a);writedata(a);writeaddres

37、s(0x0b);writedata(y);writenum(curtime5,0x0d);writenum(curtime2,0x44);writeaddress(0x46);writedata(:);writenum(curtime1,0x47);writeaddress(0x49);writedata(:);writenum(curtime0,0x4a);void main(void)init();lcdinit();while(1)switch(shift)case 0:m1=1;m2=0;m3=0;break;case 1:m1=0;m2=1;m3=0;break;case 2:m1=

38、0;m2=0;m3=1;break;if(shift!=2) if(keydown()=1)uchar ch;ch=keychar();if(ch!=t) if(ch!=)/為按下鍵記錄表達(dá)式if(equalflag=1) /進(jìn)行過運(yùn)算之后,再運(yùn)算則初始化init();lcdinit();equalflag=0;if(ch!=m&ch!=q&ch!=w) /m模式選擇、q清除鍵,w修改鍵stringpp+=ch; if(pp-pzp=1) pzp=pp;writeaddress(position);position+=1;if(position=15)writecommand(0x07);wr

39、itedata(stringpp-1);else /實(shí)現(xiàn)清除功能 if(ch=q)pp-;position-;writeaddress(position);writedata(0x20);writeaddress(position);stringpp=a; pzp=pp;if(ch=w) /實(shí)現(xiàn)修改功能 pp-;position-;writeaddress(position);.else stringpzp=;pp=0;while(stringpp!=a)if(0=stringpp&stringpp=0&stringpp-1=9)optiopt+=op;op=0; switch(stringp

40、p)case (: if(pp!=0) if(!(0=stringpp-1&stringpp-1=9)&stringpp-1!=) operate=10; /operate第一位表示優(yōu)先級(jí),第二位標(biāo)識(shí)算符else /1+、 2-、 3*、 4/、 5)displayerror();elseoperate=10;break;case +:if(0=stringpp-1&stringpp-1=9)|stringpp-1=)operate=21;elsedisplayerror();break;case -:if(0=stringpp-1&stringpp-1=9)|stringpp-1=)oper

41、ate=22;elsedisplayerror();break;case *:if(0=stringpp-1&stringpp-1=9)|stringpp-1=)operate=33;elsedisplayerror();break;case /:if(0=stringpp-1&stringpp-1=9)|stringpp-1=)operate=34;elsedisplayerror();break;case ):if(0=stringpp-1&stringpp-1=9)|stringpp-1=)operate=15;elsedisplayerror();break;case =: if(0=

42、stringpp-1&stringpp-1=9)|stringpp-1=)operate=0;elsedisplayerror();break;insertopr(operate);pp+;/displaynumble(opr1);if(opr1!=0)switch(opr1%10)case 1:result=opt0+opt1;break;case 2:result=opt0-opt1;break;case 3:result=opt0*opt1;break;case 4:if(opt1=0)displayerror();elseresult=opt0/opt1;break; else result=opt0;if(normal=1) displaynumble(result);equalflag=1;init(); emplo

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論