單片機(jī)簡易計(jì)算器課程設(shè)計(jì)報(bào)告_第1頁
單片機(jī)簡易計(jì)算器課程設(shè)計(jì)報(bào)告_第2頁
單片機(jī)簡易計(jì)算器課程設(shè)計(jì)報(bào)告_第3頁
單片機(jī)簡易計(jì)算器課程設(shè)計(jì)報(bào)告_第4頁
單片機(jī)簡易計(jì)算器課程設(shè)計(jì)報(bào)告_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、中南林業(yè)科技大學(xué)課程設(shè)計(jì)報(bào)告 設(shè)計(jì)名稱: 單片機(jī)計(jì)算器課程設(shè)計(jì) 姓 名: 汪琦 學(xué) 號: 20082124 專業(yè)班級: 電子信息工程一班 院(系): 計(jì)算機(jī)與信息工程學(xué)院 設(shè)計(jì)時(shí)間: 2010年12月28日星期二 設(shè)計(jì)地點(diǎn): 中南林業(yè)科技大學(xué)電子信息樓 指導(dǎo)教師評語: 成績:簽名: 年 月 日目錄一、 題目二、 任務(wù)與要求(老師完成)三、 課程設(shè)計(jì)摘要及整體方框圖1.總體設(shè)計(jì)思路簡述··················

2、;··································2.硬件設(shè)計(jì)簡述··············

3、83;·········································3.軟件設(shè)計(jì)簡述·······&

4、#183;················································4.程序主流程

5、圖··················································

6、;······四、 課程設(shè)計(jì)原理分析及相關(guān)知識概述五、 結(jié)論六、 體會與收獲附件:1、 源程序代碼(根據(jù)需要選擇)2、整體電路原理圖(根據(jù)需要選擇)2、 元件表(根據(jù)需要選擇)3、 PCB板制作(根據(jù)需要選擇)4、焊接與調(diào)試(根據(jù)需要選擇)一、題目利用單片機(jī)芯片STC12C54、四位八段共陰數(shù)碼管,已制作好的電路板等器件設(shè)計(jì)制作一個(gè)計(jì)算器,用LED顯示計(jì)算數(shù)值及結(jié)果。二、任務(wù)與要求要求計(jì)算器能實(shí)現(xiàn)加減乘除四種運(yùn)算,具體如下:1. 加法:四位整數(shù)加法,計(jì)算結(jié)果若超過四位則顯示計(jì)算錯(cuò)誤2. 減法:四位整數(shù)減法,計(jì)算結(jié)果若小于零則顯示計(jì)算錯(cuò)

7、誤3. 乘法:多位整數(shù)乘法,計(jì)算結(jié)果若超過四位則顯示計(jì)算錯(cuò)誤4. 除法:整數(shù)除法5. 有清除功能三、課程設(shè)計(jì)簡述及整體方框圖1.總體設(shè)計(jì)思路簡述按照系統(tǒng)設(shè)計(jì)的功能的要求,初步確定設(shè)計(jì)系統(tǒng)由主控模塊、顯示模塊、鍵掃描接口電路共三個(gè)模塊組成,電路系統(tǒng)構(gòu)成框圖如圖1.1所示。主控芯片使用STC12C54單片機(jī),比 80C51速度更快,功能更強(qiáng),由先進(jìn)工藝制造,并帶有非易失性Flash程序存儲器。它是一種高性能、低功耗的8位COMS微處理芯片,市場應(yīng)用最多。鍵盤電路采用4*4矩陣鍵盤電路。顯示模塊采用4枚共陽極數(shù)碼管和74ls273鎖存芯片構(gòu)成等器件構(gòu)成。2硬件設(shè)計(jì)簡述 單片機(jī)最小系統(tǒng)就是支持主芯片正

8、常工作的最小電路部分,包括主控芯片、復(fù)位電路和晶振電路。主控芯片選取STC12C5410AD芯片,因其具有良好的性能及穩(wěn)定性,價(jià)格便宜應(yīng)用方便。晶振選取11.0592MHz,晶振旁電容選取22pF。采用按鍵復(fù)位電路,電阻分別選取560和10K,電容選取10F。鍵盤接口電路 計(jì)算器所需按鍵有: 數(shù)字鍵:1,2,3,4,5,6,7,8,9,0 功能鍵:+, - , *, / , = , C( 清零)共計(jì)16個(gè)按鍵,采用4*4矩陣鍵盤,鍵盤的行和列之間都有公共端相連,四行和四列的8個(gè)公共端分別接P1.0P1.7,這樣掃描P1口就可以完成對矩陣鍵盤的掃描,通過對16個(gè)按鍵進(jìn)行編碼,從而得到鍵盤的口地址

9、,對比P1口的掃描結(jié)果和各按鍵的地址,我們就可以得到是哪個(gè)鍵按下,從而完成鍵盤掃描的功能。數(shù)碼管顯示電路 采用4位數(shù)碼管對計(jì)算數(shù)據(jù)和結(jié)果的顯示,這里選取共陽數(shù)碼管,利用NPN三極管對數(shù)碼管進(jìn)行驅(qū)動,為了節(jié)省I/O資源,采取動態(tài)顯示的方法來顯示計(jì)算數(shù)據(jù)及結(jié)果,動態(tài)掃描。 為了實(shí)現(xiàn)數(shù)碼管的動態(tài)顯示,P2口輸出顯示值,通過P2口的二進(jìn)制代碼送到數(shù)碼管進(jìn)行顯示。P3.2P3.5用來作為位選端,控制哪幾位數(shù)碼管進(jìn)行顯示。比如當(dāng)P3.2為高電平時(shí),其他位全給0,具體的在軟件中會有說明。此時(shí)就將掃描的數(shù)據(jù)送給指定數(shù)碼管顯示。3.軟件設(shè)計(jì)簡述鍵盤掃描子程序設(shè)計(jì) 要進(jìn)行數(shù)據(jù)的計(jì)算就必須先進(jìn)行數(shù)據(jù)的輸入,也就必須

10、確定按鍵輸入的數(shù)值是什么,這就需要對鍵盤進(jìn)行掃描,從而確定究竟是哪個(gè)鍵按下。對于鍵盤的掃描,這里采用行列掃描的方法來完成對鍵盤的掃描。原理就是先確定按鍵在哪一行,接著再確定是哪一列,這樣就可以知道是哪個(gè)按鍵被按下了。我是將P1口作為按鍵掃描口的,比如開始先給P1口設(shè)置為0xf0,即P1.0P1.7為11110000,將它定義為e,再給P1口設(shè)置為0x0f,即P1.0P1.7為00001111,將它定義為f,并且定義temp=e|f,好了,接下來若按下的是按鍵sw1,則P1口變?yōu)?1100000,e就是0xe0,并在非常短的時(shí)間P1口變?yōu)?0001110,則f就是0x0e,那么temp就為0xe

11、e,同理,每個(gè)按鍵都會有一個(gè)對應(yīng)的十六進(jìn)制值,我把它們列出來進(jìn)行一一對應(yīng)就行了,下面是掃描按鍵圖。 以下為鍵盤掃描子程序的程序清單。uint kescan() uint ; P1=0xf0;e=P1; P1=0x0f;f=P1;temp=e|f;while(P1!=0x0f); if(temp=0xb7)=0;if(temp=0x7e)=1; if(temp=0xbe)=2; if(temp=0xde)=3; if(temp=0x7d)=4;if(temp=0xbd)=5;if(temp=0xdd)=6;if(temp=0x7b)=7;if(temp=0xbb)=8;if(temp=0xdb)

12、=9;if(temp=0x77)=10;if(temp=0xd7)=11;if(temp=0xe7)=12;if(temp=0xeb)=13;if(temp=0xed)=14;if(temp=0xee)=15;return();數(shù)碼管顯示電路采用4位數(shù)碼管對計(jì)算數(shù)據(jù)和結(jié)果的顯示,這里選取共陰極數(shù)碼管,利用NPN三極管對數(shù)碼管進(jìn)行驅(qū)動,利用來實(shí)現(xiàn)數(shù)碼管的動態(tài)顯示,P2口輸出顯示值,P2口為段選,P3.2P3.5用來作為位選端,控制哪幾位數(shù)碼管進(jìn)行顯示。下面根據(jù)程序來闡述。n是一個(gè)運(yùn)算中產(chǎn)生的值,若它大于10000,執(zhí)行第一個(gè)if語句,如果則顯示FFFF,若在10000以,則將n分別除以1000、

13、100、10和對10取余,得到我們想要的四個(gè)數(shù),送顯示子程序顯示。其余減、乘、除的計(jì)算方法與加法的計(jì)算方法一樣,這里不再累述。 void dis(uint n) if(n/10000) for(i=0;i<4;i+)if(fu=1) P2=(DSY_CODE15&&0x7f);if(fu=0)P2=DSY_CODE15; P3=bit3-i; n=n/10; delay(4); P3=0x00; else if(n/1000) for(i=0;i<4;i+) if(fu=1) P2=(DSY_CODEn%10&0x7f);if(fu=0)P2=DSY_COD

14、En%10;P3=bit3-i;n=n/10;delay(4);P3=0x00; elseif(n/100)for(i=0;i<3;i+)if(fu=1) P2=(DSY_CODEn%10&0x7f);if(fu=0)P2=DSY_CODEn%10; P3=bit3-i; n=n/10; delay(4); P3=0x00;elseif(n/10)for(i=0;i<2;i+)if(fu=1)P2=(DSY_CODEn%10&0x7f);if(fu=0)P2=DSY_CODEn%10; P3=bit3-i; n=n/10; delay(4); P3=0x00;els

15、eif(n%10)if(fu=1) P2=(DSY_CODEn&0x7f);if(fu=0)P2=DSY_CODEn; P3=0x20; delay(4);運(yùn)算子程序設(shè)計(jì)顯示加減乘除四個(gè)運(yùn)算符void calculate(uint z) if(z=10)P2=0x76; /加法顯示H,并且點(diǎn)亮最高位的數(shù)碼管P3=0x20; if(z=11) P2=0x40; /減法顯示-, 并且點(diǎn)亮最高位的數(shù)碼管 P3=0x20; if(z=12) P2=0x80; /乘法顯示., 并且點(diǎn)亮最高位的數(shù)碼管 P3=0x20; if(z=13) P2=0x49; /除法顯示 并且點(diǎn)亮最高位的數(shù) P3=0x

16、20; 碼管 除法子程序設(shè)計(jì)除法的運(yùn)算,可以顯示小數(shù)點(diǎn)void div(void)d=b/c; if(d/1000) for(i=0;i<4;i+) P2=DSY_CODEd%10;P3=bit3-i;d=d/10;delay(4);P3=0x00; elseif(d/100) d=10*b/c;for(i=0;i<4;i+)if(i=1) P2=(DSY_CODEd%10&0x7f);if(i!=1) P2=DSY_CODEd%10; P3=bit3-i; d=d/10; delay(4); P3=0x00;elseif(d/10)d=100*b/c;for(i=0;i&

17、lt;4;i+)if(i=2)P2=(DSY_CODEd%10&0x7f);if(i!=2)P2=DSY_CODEd%10; P3=bit3-i; d=d/10; delay(4); P3=0x00;elseif(d%10) d=1000*b/c;for(i=0;i<4;i+)if(i=3)P2=(DSY_CODEd%10&0x7f);if(i!=3)P2=DSY_CODEd%10; P3=bit3-i; d=d/10; delay(4); P3=0x00; elsed=(1000*b)/c;for(i=0;i<4;i+)if(i=3)P2=(DSY_CODE0&a

18、mp;0x7f);if(i!=3)P2=DSY_CODEd%10; P3=bit3-i; d=d/10; delay(4); P3=0x00;主程序見附錄1 4.程序主框圖 主程序流程四、課程設(shè)計(jì)原理分析及相關(guān)知識概述 本次課程設(shè)計(jì)用的STC12C54具有速度快、功耗低、抗干擾強(qiáng)的特點(diǎn),有多種I/O端口模式,它默認(rèn)為準(zhǔn)雙向口/弱上拉,最大灌電流為20mA,拉電流為230uA,所以在三極管和芯片管腳間要接15k的電阻,(5v-1.8v)/300歐=10mA,八個(gè)led就為80 mA,超過50 mA的總電流,所以電阻選用511歐。若改為強(qiáng)推挽輸出模式,則根據(jù)拉電流最大為20mA可計(jì)算出,電阻選為1

19、k五、結(jié)論完成硬件和軟件的設(shè)計(jì)和制作后,進(jìn)行系統(tǒng)的調(diào)試,并處理不斷出現(xiàn)的問題。對于計(jì)算器的性能,主要的衡量指標(biāo)就在于計(jì)算的精度,本次制作的計(jì)算器性能情況如下:加法運(yùn)算:四位整數(shù)加法運(yùn)算,和值不超過9999,若超過上限,則顯示錯(cuò)誤提示FFFF。減法運(yùn)算:四位正整數(shù)減法運(yùn)算,若結(jié)果為負(fù),對其取絕對值。乘法運(yùn)算:積不超過9999的整數(shù)乘法運(yùn)算,若超出上限,顯示錯(cuò)誤提示FFFF。除法運(yùn)算:整數(shù)除法,既計(jì)算結(jié)果為可顯示小數(shù)。六、體會與收獲通過這次課程設(shè)計(jì),最大的一點(diǎn)體會是單片機(jī)學(xué)的不夠扎實(shí),不會的很多啊,當(dāng)然這次的課程設(shè)計(jì)做計(jì)算器程序用的是c語言,不是課上初學(xué)的匯編,所以很難適應(yīng),盡管大家都知道匯編編這

20、個(gè)程序也很困難,但還是互相學(xué)習(xí),到處找資料看,問同學(xué),所以我的軟件主程序才能編譯成功,系統(tǒng)才能調(diào)試出結(jié)果。很感那些熱心教導(dǎo)我的同學(xué)和指導(dǎo)我的老師。首先在硬件電路的制作中,也就是焊板子,由于我的粗心,我芯片插槽的一個(gè)管腳沒焊進(jìn)去,別的都好了,就這個(gè)腳沒有用了,后來在老師的幫助下,我將插槽里德那個(gè)管腳拔出來,換了個(gè)腳在插進(jìn)去,然后用萬用表測試后證明是有效的,心里還是很高興的。整個(gè)硬件電路還是做得令自己比較滿意的。在軟件方面,感覺困難更多一些,一開始真的很著急,毫無頭緒啊,一時(shí)間,百度,論壇,貼吧逛了個(gè)遍,找了很多資料,也參考了同學(xué)的程序,其中每一個(gè)子程序模塊都認(rèn)真去讀,去分析,化為己用,最重要的按

21、鍵掃描和顯示程序,還有包括加減乘除的運(yùn)算程序,還了解了c語言在單片機(jī)編程中的一些特點(diǎn),包括函數(shù)的聲明和調(diào)用等等。而且在用uvison編譯的時(shí)候出了很多問題,其中一個(gè)就是關(guān)于頭文件的,要加上“#include <STC12C5410AD.H>”,不僅如此,還要將有關(guān)STC12C5410AD的文件覆蓋在uvison安裝路徑下,這樣頭文件才有效啊,所以,一開始找不出問題所在,極其郁悶。但是總的來說,軟件設(shè)計(jì)能夠把結(jié)果調(diào)出來還是很激動的,盡管還有很多未知的問題沒有出現(xiàn)。附錄1 程序源代碼#include <STC12C5410AD.H>#include <intrins.

22、h>#define uchar unsigned char#define uint unsigned intuchar e,f,temp,fu=0;uint a=50,flag=0,key,dyh,bru,cru,i,fuhao=0;long c=0,d=0,b=0;uint code bit=0x04,0x08,0x10,0x20;uint code DSY_CODE=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e; void delay(uint x) uchar t;wh

23、ile(x-) for(t=120;t>0;t-); uint kescan() uint ; P1=0xf0;e=P1; P1=0x0f;f=P1;temp=e|f;while(P1!=0x0f); if(temp=0xb7)=0;if(temp=0x7e)=1; if(temp=0xbe)=2; if(temp=0xde)=3; if(temp=0x7d)=4;if(temp=0xbd)=5;if(temp=0xdd)=6;if(temp=0x7b)=7;if(temp=0xbb)=8;if(temp=0xdb)=9;if(temp=0x77)=10;if(temp=0xd7)=11

24、;if(temp=0xe7)=12;if(temp=0xeb)=13;if(temp=0xed)=14;if(temp=0xee)=15;return(); void dis(uint n) if(n/10000) for(i=0;i<4;i+)if(fu=1) P2=(DSY_CODE15&&0x7f);if(fu=0)P2=DSY_CODE15; P3=bit3-i; n=n/10; delay(4); P3=0x00; else if(n/1000) for(i=0;i<4;i+) if(fu=1) P2=(DSY_CODEn%10&0x7f);if(

25、fu=0)P2=DSY_CODEn%10;P3=bit3-i;n=n/10;delay(4);P3=0x00; elseif(n/100)for(i=0;i<3;i+)if(fu=1) P2=(DSY_CODEn%10&0x7f);if(fu=0)P2=DSY_CODEn%10; P3=bit3-i; n=n/10; delay(4); P3=0x00;elseif(n/10)for(i=0;i<2;i+)if(fu=1)P2=(DSY_CODEn%10&0x7f);if(fu=0)P2=DSY_CODEn%10; P3=bit3-i; n=n/10; delay(

26、4); P3=0x00;elseif(n%10)if(fu=1) P2=(DSY_CODEn&0x7f);if(fu=0)P2=DSY_CODEn; P3=0x20; delay(4);void caculate(uint z) if(z=10)P2=0x76;P3=0x20; if(z=11) P2=0x40; P3=0x20; if(z=12) P2=0x80; P3=0x20; if(z=13) P2=0x49;P3=0x20; void div(void)d=b/c; if(d/1000) for(i=0;i<4;i+) P2=DSY_CODEd%10;P3=bit3-i

27、;d=d/10;delay(4);P3=0x00; elseif(d/100) d=10*b/c;for(i=0;i<4;i+)if(i=1) P2=(DSY_CODEd%10&0x7f);if(i!=1) P2=DSY_CODEd%10; P3=bit3-i; d=d/10; delay(4); P3=0x00;elseif(d/10)d=100*b/c;for(i=0;i<4;i+)if(i=2)P2=(DSY_CODEd%10&0x7f);if(i!=2)P2=DSY_CODEd%10; P3=bit3-i; d=d/10; delay(4); P3=0x00

28、;elseif(d%10) d=1000*b/c;for(i=0;i<4;i+)if(i=3)P2=(DSY_CODEd%10&0x7f);if(i!=3)P2=DSY_CODEd%10; P3=bit3-i; d=d/10; delay(4); P3=0x00; elsed=(1000*b)/c;for(i=0;i<4;i+)if(i=3)P2=(DSY_CODE0&0x7f);if(i!=3)P2=DSY_CODEd%10; P3=bit3-i; d=d/10; delay(4); P3=0x00; void main() P3M1=0xff;P2M1=0xff; P2M0=0x00;P3M0=0x00;P1M0=0x00;P1M1=0x00; flag=0;cru=0;bru=0;dyh=0;while(1) P1=0xf0;if(P1!=0xf0) delay(30);if(P1!=0xf0)a=kescan(); if(a&g

溫馨提示

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

評論

0/150

提交評論