版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 1 概述</b></p><p> 1.1 總體設(shè)計方案</p><p> 先進(jìn)行系統(tǒng)板的基本焊接,即先將晶振電路和復(fù)位電路焊接完成。然后對秒表的功能進(jìn)行總體的設(shè)計和規(guī)劃,列寫出程序的綱要,規(guī)劃好I/O口的控制對象。再進(jìn)行外圍電路的設(shè)計,根據(jù)安排好的I/O口的使用,設(shè)計出合理的電路圖,并進(jìn)行最后的焊接。最后,根據(jù)自己的總體設(shè)計和規(guī)
2、劃進(jìn)行軟件設(shè)計。</p><p> 1.2 硬件設(shè)計與焊接</p><p> 最小系統(tǒng)版是現(xiàn)成的套件,只要焊接時細(xì)心一點基本不會出錯,而數(shù)碼管一般是由P0和P2口控制,或者由P0口加鎖存器控制,這也不需要自己過多的去設(shè)計,只要焊接時仔細(xì)一點,一般也不會出錯。在這個秒表中,最重要的就是獨立按鍵的設(shè)計和焊接,因為,如果設(shè)計不合理,就很有可能造成秒表的操作不便或者是計時誤差增大。我認(rèn)為,按
3、鍵2控制外部中斷0是最優(yōu)選擇。</p><p> 1.3 軟件設(shè)計方案</p><p> 將各個功能以模塊化的形式設(shè)計出來,當(dāng)然,要先寫主體,編譯通過并下載入實驗板功能可以實現(xiàn)后再添加其他功能模塊,然后再編譯下載,一步一步直至完成所有功能。</p><p> 軟件設(shè)計要比硬件設(shè)計復(fù)雜很多,出現(xiàn)的問題也多。小問題一大堆,。在設(shè)計中,我遇到的最大的兩個問題就是存
4、儲時間的數(shù)組定義和減小按鍵存數(shù)時產(chǎn)生的誤差。剛開始我存儲時間數(shù)組定義為code型,結(jié)果不能用設(shè)置的時間變量賦值,在網(wǎng)上找了好久才發(fā)現(xiàn)問題所在,只能將code去掉;最初存儲時間數(shù)值的按鍵只是一個單純的按鍵,結(jié)果發(fā)現(xiàn)按鍵按下期間秒表是停止的,最后只得將該功能用外部中斷來實現(xiàn),并且將其設(shè)置為下降沿觸發(fā),這樣就大大減少了誤差。</p><p> 2 系統(tǒng)總體方案及硬件設(shè)計</p><p> 2
5、.1 硬件總體設(shè)計</p><p> 1)單片機選型:AT89S51</p><p> 2)復(fù)位電路:上電+按鈕</p><p><b> 3)晶振電路</b></p><p> 4)鍵盤:獨立鍵盤+中斷</p><p> 5)數(shù)碼管顯示:LED</p><p>
6、;<b> 6)獨立按鍵控制</b></p><p><b> 原理圖如下:</b></p><p> 2.2 單片機基本電路設(shè)計</p><p> 1)復(fù)位電路:上電+按鈕</p><p><b> 2)晶振電路</b></p><p>&
7、lt;b> 3)EA處理</b></p><p><b> 4)電源設(shè)計</b></p><p><b> 原理圖如下:</b></p><p> 2.3 秒表時間顯示電路設(shè)計</p><p> 2.4 獨立按鍵電路設(shè)計</p><p> 2
8、.5 蜂鳴器電路設(shè)計</p><p><b> 3 軟件設(shè)計</b></p><p> 3.1 程序設(shè)計思路</p><p> 利用定時器經(jīng)確定時,并且利用隨機存儲區(qū)的有限空間,定義一個二維數(shù)組,通過按鍵將時間數(shù)值賦給數(shù)組(實踐證明,隨機存儲器內(nèi)最多只能存儲30組時間數(shù)值),然后在秒表停止或在數(shù)組存滿的情況下將所存的時間數(shù)值讀出。當(dāng)然
9、,也需要通過按鍵來讀取不同時間數(shù)值,并且使用按鍵來控制秒表的開始、停止與清零。</p><p> 附加項目:1)按鍵每按下一次,蜂鳴器聲響50毫秒或100毫秒;</p><p> 2)在秒表啟動時,第二段數(shù)碼管小點亮0.5毫秒,滅0.5毫秒;</p><p> 3)在秒表啟動和讀取所存時間數(shù)值時,由于只有四段數(shù)碼管,不可能將分,秒,毫秒同時顯示,所以在秒表啟動
10、時,當(dāng)時間小于60秒時,數(shù)碼管顯示秒和毫秒,而大于60秒時則顯示分和秒;在讀取所存時間數(shù)值時,采用“點”作標(biāo)志位,第二段數(shù)碼管的“點”亮表示顯示的是秒和毫秒,而第四段的數(shù)碼管的“點”亮則表示的是分和秒。</p><p> 3.2 秒表程序構(gòu)成</p><p> ?。ň唧w程序參見附1)</p><p> 3.2.1主程序(main函數(shù))</p>&
11、lt;p> 程序的初始入口,不斷調(diào)用各個子程序,程序的骨架。</p><p> 3.2.2秒表啟動存數(shù)程序(keeptime函數(shù))</p><p> 用以處理分,秒和毫秒之間的聯(lián)系。</p><p> 3.2.3讀取所存數(shù)值處理程序(showtime函數(shù))</p><p> 用以讀取處理所存時間數(shù)值并加以處理。</p&g
12、t;<p> 3.2.4數(shù)碼管顯示程序</p><p> 1)秒表啟動時顯示程序(display函數(shù)):確定顯示數(shù)值,將顯示數(shù)值分為個位、十位、百位、千位,分別查表顯示。</p><p> 2)讀取所存時間數(shù)值顯示程序(display2函數(shù)):調(diào)取數(shù)組值賦給該函數(shù),確定顯示數(shù)值,將將其分為個、十、百、千位,分別查表顯示。</p><p> 3)
13、所存時間數(shù)值序號顯示程序(display3函數(shù)):用以顯示所存時間的序號,以便于區(qū)分。</p><p> 3.2.5按鍵掃描程序</p><p> 1)掃描按鍵1(scankey1函數(shù))</p><p> 用于停止秒表或所存時間數(shù)值清零。</p><p> 2)掃描按鍵2(exter0函數(shù))</p><p>
14、 用以觸發(fā)外部中斷0,觸發(fā)方式為下降沿觸發(fā),盡量降低了存儲時間數(shù)值時引起的誤差。</p><p> 3)掃描按鍵3(scankey3函數(shù))</p><p> 用于所存時間數(shù)值的序號加一。</p><p> 4)掃描按鍵3(scankey4函數(shù))</p><p> 用于所存時間數(shù)值的序號減一。</p><p>
15、 3.2.6延時程序(delay函數(shù))</p><p> 用于延時z*1毫秒。 </p><p> 3.3 源程序代碼見附1。</p><p><b> 4 實驗仿真</b></p><p> 單片機學(xué)習(xí)中我們使用proteus做仿真,該軟件的優(yōu)點是可以搭建單片機的常用仿真電路,并且可以利用豐富的外設(shè)器件,如數(shù)
16、碼管,LCD,按鍵,傳感器,A/D,D/A等,實現(xiàn)與實際系統(tǒng)板運行相接近的效果,即可以完成系統(tǒng)級的調(diào)試。</p><p> 使用Proteus 軟件進(jìn)行單片機系統(tǒng)仿真設(shè)計, 是虛擬仿真技術(shù)和計算機多媒體技術(shù)相結(jié)合的綜合運用,有利于培養(yǎng)學(xué)生的電路設(shè)計能力及仿真軟件的操作能力;在單片機課程設(shè)計中,我們使用 Proteus 開發(fā)環(huán)境學(xué)習(xí),在不需要硬件投入的條件下,對單片機的學(xué)習(xí)比單純學(xué)習(xí)書本知識更容易接受,更容易提高
17、。實踐證明,在使用 Proteus 進(jìn)行系統(tǒng)仿真開發(fā)成功之后再進(jìn)行實際制作,能極大提高單片機系統(tǒng)設(shè)計效率。</p><p> Proteus仿真軟件可以看做是構(gòu)建了一個特殊的單片機系統(tǒng), 只要將所寫程序的HEX文件導(dǎo)入該單片機系統(tǒng),就可以讓它一句句的執(zhí)行所寫的指令,也可以讓它與Keil實現(xiàn)聯(lián)調(diào),程序有問題可以隨時改,幫助快速調(diào)試程序。</p><p> Proteus仿真軟件的應(yīng)用,使
18、我們在沒有硬件開銷的情況下,更快更好的接觸到單片機的開發(fā)和應(yīng)用,并且方便了程序的調(diào)試。</p><p> Proteus仿真圖參見——附2 系統(tǒng)原理圖。</p><p><b> 5 設(shè)計體會</b></p><p> 經(jīng)過這六周的單片機實訓(xùn),自己有很多的心得體會,我接觸單片機程序設(shè)計將近有一年了,第一次接觸是跟著電氣開發(fā)部一起學(xué)習(xí),其實
19、當(dāng)時也沒學(xué)到太多內(nèi)容,只是懂得了一點皮毛而已。</p><p> 而現(xiàn)在做一個相對自己水平來說功能較強的實物,這使我在實踐中對單片機的理解又加深了不少,而且,在這個課程設(shè)計中,讓我真真切切感受到收獲的喜悅。在做的過程中,我遇到了很多問題,通過自己的努力,比如上網(wǎng)查資料,去圖書館借書,或者請教高年級的同學(xué),都把他們一一解決了,成功后的喜悅給了我莫大學(xué)好單片機的信心和動力。</p><p>
20、 單片機對于我們電專業(yè)的學(xué)生來說是一門很重要的學(xué)科,老師和一些畢業(yè)的學(xué)長都說,如果學(xué)好單片機,就憑這門技術(shù)找一個好工作不成問題。盡管我們在課堂上學(xué)到的內(nèi)容有限,但在以后還要好好的學(xué)習(xí)單片機。最后感謝老師對我們的精心指導(dǎo)和幫助,感謝同學(xué)們對我的幫助。</p><p> 下面我就來談?wù)勎覀€人的幾點體會:</p><p> 1. 在設(shè)計程序時,不能妄想一次就將整個程序設(shè)計好,“反復(fù)修改,不
21、斷改進(jìn)”是程序設(shè)計的必經(jīng)之路。</p><p> 2. 要養(yǎng)成注釋程序的好習(xí)慣,一個程序的完美與否不僅僅是實現(xiàn)功能,而應(yīng)該讓人一看就能明白你的思路,這樣也為資料的保存和交流提供了方便。</p><p> 3. 在設(shè)計程序過程中遇到問題是很正常的,但我們應(yīng)該將每次遇到的問題記錄下來,并分析清楚,以免下次再碰到同樣的問題。</p><p> 4. 在設(shè)計程序時,將
22、自己的程序分成一個模塊一個模塊來寫,先寫程序的主體,編譯沒錯誤后再往上添加其他功能模塊,添加一個功能模塊就編譯一次,并下載到單片機里查看是否有錯誤,等成功后再依次添加其他模塊直至完成所有功能。</p><p><b> 參考文獻(xiàn)</b></p><p> 【1】 賈宗璞,許合利.C語言程序設(shè)計:中國礦業(yè)大學(xué)出版社,2007</p><p>
23、 【2】 靳孝峰,王艷.單片機的原理與應(yīng)用,北京:北京航空航天大學(xué)大學(xué)出版社2009</p><p> 【3】 康華光.電子技術(shù)基礎(chǔ)(模擬部分)(第五版).北京:高等教育出版社,2006.</p><p><b> 附1:源程序代碼</b></p><p> #include<reg52.h></p><
24、p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> sbit buz=P3^0;</p><p> sbit key1=P3^1;</p><p> sbit key2=P3^2;</p><p> sb
25、it key3=P3^3;</p><p> sbit key4=P3^4;</p><p> uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};</p><p> uchar bank[30][3]={0};</p><p> uchar
26、min,sec,msec,aa,bb,cc,dd,ee,ff;</p><p> uchar tab=0,tab1=0,i,j;</p><p> uint tab3;</p><p> void display(uchar qian,uchar bai,uchar shi,uchar ge);</p><p> void displ
27、ay2(uchar qian,uchar bai,uchar shi,uchar ge,uchar qq);</p><p> void display3(uchar shi,uchar ge);</p><p> void delay(uint);</p><p> void scankey1();</p><p> void sc
28、ankey3();</p><p> void scankey4();</p><p> void keeptime();</p><p> void showtime();</p><p> void init()//初始化子程序</p><p><b> {</b></p&
29、gt;<p> for(i=0;i<30;i++)</p><p> for(j=0;j<3;j++)</p><p> bank[i][j]=0;</p><p><b> P3=0xff;</b></p><p><b> min=0;</b></p&
30、gt;<p><b> sec=0;</b></p><p><b> msec=0;</b></p><p> TMOD=0X01;</p><p> TH0=(65536-10000)/256;</p><p> TL0=(65536-10000)%256;</p&
31、gt;<p><b> EA=1;</b></p><p><b> EX0=1;</b></p><p><b> IT0=1;</b></p><p><b> ET0=1;</b></p><p><b> TR0=
32、tab1;</b></p><p><b> tab=0;</b></p><p><b> tab3=1;</b></p><p><b> i=0;</b></p><p><b> } </b></p><
33、p> void main()//主函數(shù)</p><p><b> {</b></p><p><b> init();</b></p><p><b> while(1)</b></p><p><b> {</b></p>
34、<p> scankey1();</p><p> if(tab1==1)</p><p> keeptime();</p><p><b> else</b></p><p> showtime();</p><p><b> }</b&
35、gt;</p><p><b> }</b></p><p> void display(uchar qian,uchar bai,uchar shi,uchar ge)//顯示子程序1,用于秒表走動時顯示</p><p><b> {</b></p><p><b> P2=0
36、xfe;</b></p><p> P0=table[qian];</p><p><b> delay(1);</b></p><p><b> P0=0;</b></p><p><b> P2=0xfd;</b></p><p>
37、; if(tab<=50)</p><p> P0=table[bai]|0x80;</p><p> else P0=table[bai];</p><p><b> delay(1);</b></p><p><b> P0=0;</b></p><p>
38、<b> P2=0xfb;</b></p><p> P0=table[shi];</p><p><b> delay(1);</b></p><p><b> P0=0;</b></p><p><b> P2=0xf7;</b></p
39、><p> P0=table[ge];</p><p><b> delay(1);</b></p><p><b> P0=0;</b></p><p><b> }</b></p><p> void display2(uchar qian,
40、uchar bai,uchar shi,uchar ge,uchar qq)//顯示子程序2,顯示所存時間</p><p><b> {</b></p><p><b> P2=0xfe;</b></p><p> P0=table[qian];</p><p><b> dela
41、y(1);</b></p><p><b> P0=0;</b></p><p><b> P2=0xfd;</b></p><p><b> if(qq==0)</b></p><p> P0=table[bai]|0x80;</p><
42、;p> else P0=table[bai];</p><p><b> delay(1);</b></p><p><b> P0=0;</b></p><p><b> P2=0xfb;</b></p><p> P0=table[shi];</p&g
43、t;<p><b> delay(1);</b></p><p><b> P0=0;</b></p><p><b> P2=0xf7;</b></p><p><b> if(qq==1)</b></p><p> P0=tab
44、le[ge]|0x80;</p><p> else P0=table[ge];</p><p><b> delay(1);</b></p><p><b> P0=0;</b></p><p><b> }</b></p><p> vo
45、id display3(uchar shi,uchar ge)//顯示子程序3,顯示存儲時間的序號</p><p><b> {</b></p><p><b> P2=0xfb;</b></p><p> P0=table[shi];</p><p><b> delay(1
46、);</b></p><p><b> P0=0;</b></p><p><b> P2=0xf7;</b></p><p> P0=table[ge];</p><p><b> delay(1);</b></p><p><
47、;b> P0=0;</b></p><p><b> }</b></p><p> void keeptime()//秒表記時函數(shù)</p><p><b> {</b></p><p><b> msec=tab;</b></p>
48、<p> aa=msec%10;</p><p> bb=msec/10;</p><p> cc=sec%10;</p><p> dd=sec/10;</p><p> ee=min%10;</p><p> ff=min/10;</p><p> if(tab==1
49、00)</p><p><b> {</b></p><p><b> tab=0;</b></p><p><b> sec++;</b></p><p><b> }</b></p><p> if(sec==60)&
50、lt;/p><p><b> {</b></p><p><b> sec=0;</b></p><p><b> min++;</b></p><p><b> }</b></p><p> if(min==59)</
51、p><p><b> {</b></p><p><b> tab1=0;</b></p><p><b> TR0=tab1;</b></p><p><b> }</b></p><p> if(min==0)</p
52、><p> display(dd,cc,bb,aa);</p><p> if(min!=0)</p><p> display(ff,ee,dd,cc);</p><p><b> }</b></p><p> void showtime()//存儲時間調(diào)出顯示函數(shù)</p>
53、<p><b> {</b></p><p><b> uchar pp;</b></p><p> pp=(tab3-1)/2;</p><p> scankey3();</p><p> scankey4();</p><p> aa=bank[
54、pp][0]%10;</p><p> bb=bank[pp][0]/10;</p><p> cc=bank[pp][1]%10;</p><p> dd=bank[pp][1]/10;</p><p> ee=bank[pp][2]%10;</p><p> ff=bank[pp][2]/10;</
55、p><p> if(bank[0][0]==0)</p><p> display(0,0,0,0);</p><p><b> else</b></p><p><b> {</b></p><p> if(tab3%2==1)</p><p>
56、; display3((pp+1)/10,(pp+1)%10);</p><p> if(tab3%2==0)</p><p><b> {</b></p><p> if(bank[pp][2]==0)</p><p> display2(dd,cc,bb,aa,0);</p><p>
57、; if(bank[pp][2]!=0)</p><p> display2(ff,ee,dd,cc,1);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p&g
58、t; void scankey1()//檢測按鍵1是否被按下</p><p><b> {</b></p><p> if(key1==0)</p><p><b> {</b></p><p><b> delay(8);</b></p><
59、p> if(key1==0)</p><p><b> {</b></p><p> if(tab1==1)</p><p><b> {</b></p><p><b> tab1=0;</b></p><p> TR0=tab1;
60、 </p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> init();</b></p><p><b> }
61、</b></p><p><b> buz=0;</b></p><p> delay(100);</p><p><b> buz=1;</b></p><p> while(key1!=1);</p><p><b> delay(8);&
62、lt;/b></p><p> while(key1!=1);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void scankey3()/
63、/檢測按鍵3是否被按下</p><p><b> {</b></p><p> if(key3==0)</p><p><b> {</b></p><p><b> delay(8);</b></p><p> if(key3==0)<
64、/p><p><b> {</b></p><p> if((tab3<60)&&(tab1==0))</p><p><b> tab3++; </b></p><p><b> buz=0;</b></p><p> d
65、elay(100);</p><p><b> buz=1;</b></p><p> while(key3!=1);</p><p><b> delay(8);</b></p><p> while(key3!=1);</p><p><b> }&l
66、t;/b></p><p><b> }</b></p><p><b> }</b></p><p> void scankey4()//檢測按鍵4是否被按下</p><p><b> {</b></p><p> if(key4=
67、=0)</p><p><b> {</b></p><p><b> delay(8);</b></p><p> if(key4==0)</p><p><b> {</b></p><p> if((tab3>1)&&
68、;(tab1==0))</p><p><b> tab3--; </b></p><p><b> buz=0;</b></p><p> delay(100);</p><p><b> buz=1;</b></p><p> while
69、(key4!=1);</p><p><b> delay(8);</b></p><p> while(key4!=1);</p><p><b> }</b></p><p><b> }</b></p><p><b> }&l
70、t;/b></p><p> void delay(uint z)//延時函數(shù)</p><p><b> {</b></p><p><b> uint x,y;</b></p><p> for(x=z;x>0;x--)</p><p> for(
71、y=110;y>0;y--);</p><p><b> }</b></p><p> void exter0() interrupt 0 //外部中斷0函數(shù)</p><p><b> {</b></p><p> delay(10);</p><p>
72、; if((key2==0)&&(i<30))</p><p><b> { </b></p><p> if(tab1==0)</p><p><b> {</b></p><p><b> tab1=1;</b></p>&
73、lt;p><b> TR0=tab1;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> j=0;</b><
74、/p><p> bank[i][j++]=msec;</p><p> bank[i][j++]=sec;</p><p> bank[i][j]=min;</p><p><b> i++;</b></p><p><b> }</b></p><
75、p><b> buz=0;</b></p><p> delay(50);</p><p><b> buz=1;</b></p><p><b> }</b></p><p><b> }</b></p><p>
76、; void timer0() interrupt 1//定時器中斷0函數(shù)</p><p><b> {</b></p><p> TH0=(65536-10000)/256;</p><p> TL0=(65536-10000)%256;</p><p><b> tab++;</b&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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 秒表課程設(shè)計
- 秒表課程設(shè)計
- 秒表課程設(shè)計-- 秒表系統(tǒng)的設(shè)計
- 秒表 課程設(shè)計
- 數(shù)字秒表課程設(shè)計
- 數(shù)字秒表課程設(shè)計
- 電子秒表 課程設(shè)計
- 鍵控秒表課程設(shè)計
- 數(shù)字秒表課程設(shè)計
- 電子秒表課程設(shè)計
- 數(shù)字秒表課程設(shè)計
- 多用秒表課程設(shè)計
- 電子秒表課程設(shè)計
- 課程設(shè)計-- 數(shù)字秒表
- 課程設(shè)計--數(shù)字秒表設(shè)計
- 課程設(shè)計---數(shù)字秒表設(shè)計
- eda課程設(shè)計--秒表設(shè)計
- 電子秒表課程設(shè)計
- 電子秒表課程設(shè)計
- 秒表課程設(shè)計報告
評論
0/150
提交評論