版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 單片機(jī)原理及系統(tǒng)課程設(shè)計(jì)</p><p> 專 業(yè):電氣工程及其自動化</p><p> 班 級: 電氣1001班 </p><p> 姓 名: </p><p> 學(xué) 號: </p><p>
2、指導(dǎo)教師: </p><p> 2013 年 3 月 7 日</p><p><b> 摘要</b></p><p> 此設(shè)計(jì)以AT89C51單片機(jī)為核心控制元件,與數(shù)碼管和蜂鳴器和按鍵結(jié)合,在應(yīng)用C語言來實(shí)現(xiàn)電子時鐘的顯示和調(diào)制功能。本次設(shè)計(jì)運(yùn)用了KEIL和Protues仿真軟件來進(jìn)行調(diào)試,并給出了完整的設(shè)計(jì)
3、電路和KEIL程序代碼,并畫出了編程的邏輯流程圖。通過調(diào)試和運(yùn)行,最終完成了一個完整的電路仿真,其功能是實(shí)現(xiàn)時間和日歷的現(xiàn)實(shí)并且都能進(jìn)行相應(yīng)的調(diào)整,同時還能進(jìn)行鬧鈴的設(shè)置并在達(dá)到預(yù)定的時間時鬧鈴。</p><p> 一、電子時鐘功能概述</p><p> 本次電子時鐘作品分由單片機(jī)部分、數(shù)碼管顯示部分、按鍵部分和蜂鳴器電路相互連接組成。這樣硬件部分就組成了一個電子時鐘的基本完整的電路。
4、電子時鐘的工作過程是:接通電源時時鐘開始工作,時鐘分為三個狀態(tài):正常計(jì)時、顯示日歷、顯示鬧鈴,分別按下鬧鈴按鍵和日歷按鍵就可以顯示當(dāng)前的日歷和設(shè)置的鬧鈴時間。在這三個狀態(tài)下按下設(shè)置鍵就可以對相應(yīng)的狀態(tài)進(jìn)行設(shè)置,同時對應(yīng)的數(shù)碼管位開始閃爍,當(dāng)按下調(diào)時鍵時就可以對相應(yīng)的位進(jìn)行調(diào)整,當(dāng)再次切換相應(yīng)的功能時數(shù)碼管就停止閃爍,同時設(shè)置完成。當(dāng)時間到達(dá)鬧鈴設(shè)置時間視蜂鳴器就會響起并響一分鐘結(jié)束。</p><p><b&
5、gt; 二、硬件電路和資料</b></p><p> 1、AT89C51單片機(jī)</p><p> 本設(shè)計(jì)采用 Atmel公司生產(chǎn)的單片機(jī)AT89C51實(shí)現(xiàn)主要功能, AT89C51 的引腳圖如2-1所示: </p><p> 圖2-1 單片機(jī)的引腳</p><p><b> 各引腳功能情況為:</b>
6、;</p><p> Vcc:供電電壓。 </p><p><b> GND:接地。 </b></p><p> P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門流。當(dāng)P1口的管腳第一次寫1時,被定義為高阻輸入。</p><p> P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器
7、可接收,輸出4TTL門電流,當(dāng)P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。在給出地址“1”時,它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進(jìn)行讀寫時,P2口輸出其特殊功能寄存器的內(nèi)容。</p><p> P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL 門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部
8、上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 </p><p> P3口功能引腳簡介: </p><p> P3.0:RXD(串行口輸入) </p><p> P3.1:TXD(串行口輸出) </p><p> P3.2:INT0(外部中斷0) </p><
9、;p> P3.3:INT1(外部中斷1) </p><p> P3.4:T0(定時器0外部脈沖輸入) </p><p> P3.5:T1(定時器1外部脈沖輸入) </p><p> P3.6:WR(外部數(shù)據(jù)存儲器寫選通) </p><p><b> 2、LED數(shù)碼管</b></p><
10、p> 為了節(jié)省I/O口的使用,本設(shè)計(jì)采用的是動態(tài)顯示,其工作原理為:采用各數(shù)碼管循環(huán)輪流顯示的方法,當(dāng)循環(huán)顯示的頻率較高時,利用人眼的暫留特性,看不出閃爍顯示現(xiàn)象。將所有LED的段選線并聯(lián)在一起,由一個八位I/O口控制,而位選線分別由相應(yīng)的I/O口線控制。其中一個控制段選碼,另一個控制位選。動態(tài)顯示器電路如圖2-2所示。</p><p> 圖2-2 八位LED動態(tài)顯示電路</p><
11、p><b> 3、獨(dú)立鍵盤</b></p><p> 利用4個自復(fù)式常開按鈕開關(guān)作為功能鍵,KEY0~KEY3分別為設(shè)置、調(diào)時、鬧鈴、日歷三、硬件電路設(shè)計(jì)圖。</p><p><b> 三、總體電路設(shè)計(jì)</b></p><p> 圖3-1 總體電路圖</p><p><b>
12、 四、程序流程圖</b></p><p> 根據(jù)以上硬件電路和單片機(jī)控制原理,搭建編程思路,程序流程圖如圖4-1所示:</p><p> 圖4-1 程序流程圖</p><p><b> 五、仿真及其結(jié)果</b></p><p><b> 仿真方法是: </b></p>
13、;<p> (1)在Keil C51仿真軟件下創(chuàng)建項(xiàng)目,并把上述源程序添加到項(xiàng)目中,通過編譯產(chǎn)生一個".hex"為后綴的文件,此文件就是用于燒寫到Proteus軟件中AT89C51芯片的文件,參考文獻(xiàn)[2]。 </p><p> (2)把生成的".hex"為后綴的文件添加到Proteus軟件中繪制的AT89C51芯片中作為控制程序。</p>
14、<p> (3)在Proteus軟件仿真電路圖中點(diǎn)擊左下角的運(yùn)行按鈕,電子時鐘就會開始計(jì)時,并顯示如圖所示:</p><p><b> 圖5-1 顯示時間</b></p><p><b> 圖5-2 顯示鬧鈴</b></p><p><b> 圖5-3 顯示日期</b></p&
15、gt;<p><b> 六、總結(jié)</b></p><p> 本設(shè)計(jì)以AT89C51單片機(jī)為核心,運(yùn)用Proteus仿真軟件來實(shí)現(xiàn)整個設(shè)計(jì)流程,借助其功能強(qiáng)大的仿真系統(tǒng)對設(shè)計(jì)的系統(tǒng)進(jìn)行實(shí)時仿真,以檢測系統(tǒng)設(shè)計(jì)的正確性與合理性,并可以根據(jù)仿真電路圖制作硬件電路,這種設(shè)計(jì)具有傳統(tǒng)邏輯設(shè)計(jì)方法所無法比擬的優(yōu)越性。設(shè)計(jì)整體性好、人性化強(qiáng)、可靠性高,實(shí)現(xiàn)了數(shù)字顯示控制的智能化。<
16、/p><p><b> 七、參考文獻(xiàn):</b></p><p> [1] 周潤景.基于 Proteus的電路與單片機(jī)系統(tǒng)設(shè)計(jì)與仿真 [M].北京:北京航空航天大學(xué)出版社,2005.</p><p> [2] 金炯泰,金奎煥.如何使用KEIL8051C編譯器[M].北 京:北京航空航天大學(xué)出版社,2002.</p><p&g
17、t; [3] 程相波,衛(wèi)安軍.基于MCS-51單片機(jī)的八路搶答器設(shè)計(jì)方法研究文獻(xiàn)名[J].北京工業(yè)職業(yè)技術(shù)學(xué)院學(xué)報,2007(2).</p><p> [4] 張齊. 單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)技術(shù)———基于 C 語言編程[M] .北京: 電子工業(yè)出版社,2004. </p><p> [5] 潘永雄.新編單片機(jī)與應(yīng)用[M].西安 :西安電子科技大學(xué)出版社,2003.</p>
18、<p><b> 八、附錄:</b></p><p> 完整C語言代碼如下:</p><p> #include <reg52.h></p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p&
19、gt;<p> uint numwe,tt,t,numdu,set,aclock,rili;</p><p> unsigned long int time,time1=0;</p><p> unsigned long int second,minute,hour,year=2012,month=12,day=31;</p><p> uch
20、ar code du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,</p><p> 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};</p><p> uchar code we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};</p><p>
21、 uchar Mth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//每月對應(yīng)的天數(shù)</p><p> uchar YMth[13]={0,2,9,2,1,2,1,2,2,1,2,1,2};</p><p> sbit dula=P2^0;</p><p> sbit wela=P2^1;</p>
22、<p> sbit KEY0=P3^2;//選位</p><p> sbit KEY1=P3^1;//加一</p><p> sbit KEY2=P3^0;//設(shè)鬧鈴</p><p> sbit KEY3=P3^3;</p><p> sbit beep=P2^2;//響鈴</p><p> v
23、oid Delay(uint del);//延時程序</p><p> void Display(uint sd,uint mm,uint hy);//顯示程序</p><p> void add();//加一</p><p> void alarmclock();//鬧鐘</p><p> void init();//初始化<
24、/p><p> int clock();//計(jì)算時間</p><p> void Calender();//計(jì)算日期</p><p> void main()</p><p><b> {</b></p><p><b> P2=0xff;</b></p>
25、<p><b> init();</b></p><p><b> while(1){</b></p><p><b> add();</b></p><p> if(rili==1)//分日歷和時間顯示</p><p> Display(day,mon
26、th,year);</p><p><b> else</b></p><p> Display(second,minute,hour);</p><p> alarmclock();</p><p><b> }</b></p><p><b> }&l
27、t;/b></p><p> void Display(uint sd,uint mm,uint hy)</p><p> {int y0,y1,y2;</p><p> if(rili==1)</p><p><b> {</b></p><p> y0=hy/1000,y1=
28、hy%1000;y2=hy%100;</p><p><b> }</b></p><p> for(numwe=0;numwe<8;numwe++)</p><p><b> {</b></p><p><b> P0=0xff;</b></p>
29、<p><b> wela=1;</b></p><p> P0=we[numwe];</p><p><b> wela=0;</b></p><p><b> P0=0xff;</b></p><p><b> dula=1;</b>
30、;</p><p> switch(numwe)</p><p><b> {</b></p><p><b> case 0:</b></p><p> P0=(tt==1&set==1)?0x00:(rili==1)?du[y0]:du[hy/10];break;</p&g
31、t;<p><b> case 1:</b></p><p> P0=(tt==1&set==2)?0x00:(rili==1)?du[y1/100]:du[hy%10];break;</p><p><b> case 2:</b></p><p> P0=(rili!=1)?0x40:(t
32、t==1&set==3)?0x00:du[y2/10];break;</p><p><b> case 3:</b></p><p> P0=(tt==1&set==4)?0x00:(rili==1)?du[hy%10]+0x80:du[mm/10];break;</p><p><b> case 4:<
33、;/b></p><p> P0=(tt==1&set==5)?0x00:(rili==1)?du[mm/10]:du[mm%10];break;</p><p><b> case 5:</b></p><p> P0=(rili!=1)?0x40:(tt==1&set==6)?0x00:du[mm%10]+0x8
34、0;break;</p><p><b> case 6:</b></p><p> P0=(tt==1&set==7)?0x00:du[sd/10];break;</p><p><b> case 7:</b></p><p> P0=(tt==1&set==8)?0x0
35、0:du[sd%10];break;</p><p><b> }</b></p><p><b> dula=0;</b></p><p><b> Delay(5);</b></p><p><b> }</b></p>&
36、lt;p><b> }</b></p><p> void init()//初始化</p><p><b> {</b></p><p><b> wela=0;</b></p><p><b> dula=0;</b></p>
37、<p> TMOD=0x01;//設(shè)置定時器0為工作方式1</p><p> TH0=(65536-50000)/256;//定時器高八位//定時5ms</p><p> TL0=(65536-50000)%256;//定時器低八位</p><p> IE=0x8f;//開啟中斷</p><p> TCON=0x15;
38、//啟動定時器及工作方式</p><p><b> }</b></p><p> int clock()//計(jì)算時間</p><p><b> {</b></p><p> if(t==10|t==20) tt=!tt;//閃爍標(biāo)志位</p><p><b>
39、; if(t==20)</b></p><p><b> {</b></p><p><b> t=0;</b></p><p> if(!(set!=0&aclock==0))</p><p><b> time++;</b></p>
40、<p> if(time>=time1&time<time1+60)</p><p><b> beep=0;</b></p><p><b> else</b></p><p><b> beep=1;</b></p><p> C
41、alender();</p><p> if(aclock==0)</p><p><b> {</b></p><p> second=time%60;</p><p> minute=(time%3600)/60;</p><p> hour=time/3600;</p>
42、<p> if(hour==24)</p><p><b> {</b></p><p><b> time=0;</b></p><p><b> hour=0;</b></p><p><b> }</b></p>
43、<p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> second=time1%60;</p><p> minute=(time1%3600)/60;</p>&
44、lt;p> hour=time1/3600;</p><p> if(hour==24)</p><p><b> {</b></p><p><b> time=0;</b></p><p><b> hour=0;</b></p><p
45、><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void Delay(uint del)</p><p>&
46、lt;b> {</b></p><p><b> uint i,j;</b></p><p> for(i=0; i<del; i++)</p><p> for(j=0; j<100; j++);</p><p><b> }</b></p>
47、<p> void timer0() interrupt 1//定時器0中斷</p><p><b> {</b></p><p> TH0=(65536-50000)/256;//定時器高八位//定時5ms</p><p> TL0=(65536-50000)%256;//定時器低八位</p><p>
48、;<b> t++;</b></p><p><b> clock();</b></p><p><b> }</b></p><p> void settime() interrupt 0//it0</p><p><b> {</b><
49、;/p><p> if(KEY0==0)</p><p><b> {</b></p><p><b> Delay(2);</b></p><p> if(KEY0==0)</p><p> {if(rili!=1)</p><p> {i
50、f(set==2|set==5) set=set+2; else set++;}</p><p><b> else</b></p><p><b> set++;</b></p><p> if(set==9)</p><p> {set=0;t=0;}</p><
51、;p> //while(!KEY0);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void calendar() interrupt 2//日歷</p>&l
52、t;p><b> {</b></p><p> if(KEY3==0)</p><p><b> { </b></p><p><b> Delay(2);</b></p><p> if(KEY3==0)</p><p> ril
53、i=!rili;</p><p> set=0;aclock=0;</p><p><b> }</b></p><p><b> }</b></p><p> void Calender()//計(jì)算日歷</p><p><b> {</b>&
54、lt;/p><p> if(time==86400)</p><p><b> {</b></p><p><b> day++;</b></p><p> if((year%4==0&year%100!=0)|(year%400==0)) </p><p>
55、Mth[2]=29;</p><p><b> else</b></p><p> Mth[2]=28;</p><p> if(day>Mth[month])</p><p><b> {</b></p><p><b> day=1;</b
56、></p><p><b> month++;</b></p><p> if(month>12)</p><p><b> {month=1;</b></p><p><b> year++;}</b></p><p><b&
57、gt; }</b></p><p><b> }</b></p><p><b> }</b></p><p> void add()//自加一</p><p><b> {</b></p><p> int ge,ge1,ge2
58、,shi,shi1,shi2,bai2,qian2;</p><p> if(rili==1)</p><p><b> {</b></p><p> ge=day%10;ge1=month%10;ge2=year%10;</p><p> shi=day/10;shi1=month/10;shi2=year%1
59、00/10;</p><p> bai2=year%1000/100;qian2=year/1000;</p><p><b> }else</b></p><p><b> {</b></p><p> ge=second%10;ge1=minute%10;ge2=hour%10;<
60、/p><p> shi=second/10;shi1=minute/10;shi2=hour/10;</p><p><b> }</b></p><p> if(KEY1==0)</p><p><b> {</b></p><p><b> Delay(2
61、);</b></p><p> if(KEY1==0)</p><p><b> {</b></p><p> if(rili==1)</p><p><b> {</b></p><p> if((year%4==0&year%100!=0)|
62、(year%400==0)) </p><p> YMth[2]=10;</p><p><b> else</b></p><p> YMth[2]=9;</p><p> switch(set)</p><p><b> {</b></p><
63、;p> case 1:qian2=(qian2+1)%10;break;</p><p> case 2:bai2=(bai2+1)%10;break;</p><p> case 3:shi2=(shi2+1)%10;break;</p><p> case 4:ge2=(ge2+1)%10;break;</p><p>
64、case 5:shi1=(shi1+1)%2;break;</p><p> case 6:ge1=(shi1==1)?(ge1+1)%3:(ge1+1)%10;break;</p><p> case 7:shi=(month==2)?(shi+1)%3:(shi+1)%4;break;</p><p> case 8:ge=(shi==3)?(ge+1)%
65、YMth[month]:(month==2)?(ge+1)%YMth[2]:(ge+1)%10;break;</p><p><b> }</b></p><p> year=qian2*1000+bai2*100+shi2*10+ge2;</p><p> month=shi1*10+ge1;</p><p>
66、 day=shi*10+ge;</p><p><b> }else</b></p><p><b> {</b></p><p> switch(set)</p><p><b> {</b></p><p> case 1: shi2=(s
67、hi2+1)%3;break;</p><p> case 2: ge2=(ge2+1)%4;break;</p><p> case 4: shi1=(shi1+1)%6;break;</p><p> case 5: ge1=(ge1+1)%10;break;</p><p> case 7: shi=(shi+1)%6;bre
68、ak;</p><p> case 8: ge=(ge+1)%10;break;</p><p><b> }</b></p><p> second=shi*10+ge; minute=shi1*10+ge1;hour=shi2*10+ge2;</p><p> if(aclock==0)</p>
69、<p> time=hour*3600+minute*60+second;</p><p><b> else</b></p><p> time1=hour*3600+minute*60+second;</p><p><b> }</b></p><p> while(!K
70、EY1);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void alarmclock()//設(shè)置鬧鈴</p><p><b> {</b&
71、gt;</p><p> if(KEY2==0)</p><p><b> {</b></p><p><b> Delay(2);</b></p><p> if(KEY2==0)</p><p><b> {</b></p>
72、<p> while(!KEY2);</p><p><b> aclock=1;</b></p><p><b> rili=0;</b></p><p><b> set=0;</b></p><p><b> while(1)</b&g
73、t;</p><p><b> {</b></p><p> if(rili==1)</p><p> Display(day,month,year);</p><p><b> else</b></p><p> Display(second,minute,hou
74、r);</p><p><b> add();</b></p><p> if(KEY2==0)</p><p><b> {</b></p><p> while(!KEY2);</p><p><b> aclock=0;</b></
75、p><p><b> set=0;</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b>
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)原理及應(yīng)用課程設(shè)計(jì)(電子時鐘)
- 單片機(jī)原理及應(yīng)用課程設(shè)計(jì)電子時鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-單片機(jī)課程設(shè)計(jì)---電子時鐘
- 電子時鐘單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---電子時鐘
- 單片機(jī)課程設(shè)計(jì)——電子時鐘
- 單片機(jī)課程設(shè)計(jì)——電子時鐘
- 《單片機(jī)原理及應(yīng)用》電子時鐘課程設(shè)計(jì)報告
- 單片機(jī)課程設(shè)計(jì)--電子時鐘系統(tǒng)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--電子時鐘
- 單片機(jī)課程設(shè)計(jì)-電子時鐘
- 單片機(jī)課程設(shè)計(jì)--電子時鐘
- 單片機(jī)課程設(shè)計(jì)--電子時鐘
- 單片機(jī)課程設(shè)計(jì)----電子時鐘
- 單片機(jī)課程設(shè)計(jì)-電子時鐘
- 單片機(jī)課程設(shè)計(jì)---單片機(jī)電子時鐘
- 單片機(jī)原理及應(yīng)用課程設(shè)計(jì)--基于單片機(jī)的電子時鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--電子時鐘設(shè)計(jì)
- 數(shù)字電子時鐘-單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---電子時鐘.doc
評論
0/150
提交評論