版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 單片機課程設(shè)計</b></p><p> 課程名稱: 電子時鐘 </p><p> 班 級: 11電科(2)班 </p><p> 姓 名: </p><p> 學(xué) 號:
2、 </p><p> 指導(dǎo)老師: </p><p><b> 目錄</b></p><p><b> 摘要1</b></p><p><b> 一.設(shè)計目標1</b></p><p><b>
3、 二.仿真電路圖2</b></p><p> 三. 系統(tǒng)的硬件設(shè)計與實現(xiàn)2</p><p> 3.1 數(shù)字鐘電路設(shè)計框圖2</p><p> 3.2系統(tǒng)硬件概述3</p><p> 3.3硬件電路結(jié)構(gòu)的設(shè)計3</p><p> 3.3.1 單片機主控制模塊的設(shè)計3</p>
4、<p> 3.3.2 顯示模塊的設(shè)計4</p><p> 3.3.3 按鍵模塊的設(shè)計5</p><p> 四. 系統(tǒng)的軟件設(shè)計5</p><p><b> 程序流程圖5</b></p><p><b> 程序代碼6</b></p><p>&l
5、t;b> 參考文獻13</b></p><p><b> 摘要</b></p><p> 該課程設(shè)計為數(shù)字電子鐘的設(shè)計。以STC89C51為核心,配合液晶顯示器和按鍵為用戶提供長期、連續(xù)、可靠、穩(wěn)定的工作環(huán)境。該數(shù)字電子鐘有時分秒顯示和日期顯示以及具有時間調(diào)整的功能。系統(tǒng)軟件設(shè)計包括單片編程,其主要功能是指令發(fā)送以及數(shù)據(jù)的顯示和存儲,利用其內(nèi)
6、部定時器來T0定時每50ms中斷1次,中斷20次就是一秒鐘(晶振為12MH),外部模塊還有鍵盤、LED數(shù)碼管等。系統(tǒng)的硬件資源有:74LS245,按鍵。</p><p> 關(guān)鍵詞: 單片機 數(shù)碼管 按鍵</p><p><b> 一.設(shè)計目標</b></p><p> 以89C51單片機控制的時鐘,在LED數(shù)碼管上顯示當(dāng)前的時間與日期。&
7、lt;/p><p><b> 具體功能如下:</b></p><p> 用2個功能鍵操作來設(shè)置當(dāng)前時間。功能鍵功能如下。</p><p> ?。?)K1——進入設(shè)置現(xiàn)在的時間。</p><p> ?。?)K2——上調(diào)數(shù)據(jù)。</p><p> (3)K3——復(fù)位鍵</p><p
8、> 程序執(zhí)行后工作指示燈閃動,表示程序開始執(zhí)行,LED數(shù)碼管顯示“23:59:53;13-11-11”,然后開始計時。</p><p> 按下K1,進入設(shè)置時間狀態(tài),只有時顯示在LED數(shù)碼管,按K2進行時間秒的大調(diào)節(jié),然后再按K1,只有分顯示在LED數(shù)碼管,再按K2進行分的大調(diào)節(jié),以此類推,便可以完成時間與日期的設(shè)置。</p><p><b> 二.仿真電路圖<
9、/b></p><p> 三. 系統(tǒng)的硬件設(shè)計與實現(xiàn)</p><p> 3.1 數(shù)字鐘電路設(shè)計框圖</p><p> 圖3-1電路設(shè)計框圖</p><p><b> 3.2系統(tǒng)硬件概述</b></p><p> 該電路是由AT89C51單片機為控制核心,具有在線編程功能,低功耗,能
10、在5V超低壓工作;時鐘電路也由AT89C51單片機提供,它可以對年、月、日、時、分、秒進行計時,可以通過按鍵進行時間設(shè)置,。時間顯示部分采用LED數(shù)碼管模塊。</p><p> 3.3硬件電路結(jié)構(gòu)的設(shè)計</p><p> 3.3.1 單片機主控制模塊的設(shè)計</p><p> 此次單片機數(shù)字時鐘的設(shè)計采用AT89C51為主控制芯片,并由其定時器提供時鐘,利用LE
11、D數(shù)碼管進行時間按顯示。</p><p> 3.3.2 顯示模塊的設(shè)計</p><p><b> LED數(shù)碼管</b></p><p> LED數(shù)碼管實際上是由七個發(fā)光管組成8字形構(gòu)成的,加上小數(shù)點就是8個。這些段分別由字母a,b,c,d,e,f,g,dp來表示。當(dāng)數(shù)碼管特定的段加上電壓后,這些特定的段就會發(fā)亮,以形成我們眼睛看到的
12、60;2個8數(shù)碼管字樣了。如:顯示一個“2”字,那么應(yīng)當(dāng)是a亮b亮g亮e亮d亮f不亮c不亮dp不亮。LED數(shù)碼管有一般亮和超亮等不同之分,也有0.5寸、1寸等不同的尺寸。小尺寸數(shù)碼管的顯示筆畫常用一個發(fā)光二極管組成,而大尺寸的數(shù)碼管由二個或多個發(fā)光二極管組成,一般情況下,單個發(fā)光二極管的管壓降為1.8V左右,電流不超過30mA。發(fā)光二極管的陽極連接到一起連接到電源正極的稱為共陽數(shù)碼管,發(fā)光二極管的陰極連接到一起連接到電源負極的稱為共陰數(shù)
13、碼管。常用LED數(shù)碼管顯示的數(shù)字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。</p><p> 3.3.3 按鍵模塊的設(shè)計</p><p> 四. 系統(tǒng)的軟件設(shè)計</p><p><b> 程序流程圖</b></p><p><b> 程序代碼</b></p
14、><p> #include<reg52.h> </p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> uchar secshi=1,secge=1,minshi=1,minge=1,hourshi=1,hourge=1
15、,dayshi=1,dayge=1,monshi=1,monge=1,yearshi=1,yearge=3;</p><p> uint num=0,t=0,sec=53,min=59,hour=23,day=11,month=11,year=13; </p><p> uint lq=2000; </p><p> uchar flag,flag1;<
16、/p><p> sbit K1=P3^3;//切換按鍵</p><p> sbit K2=P3^4;//加一按鍵</p><p> uchar code table[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//0-9段碼表</p><p><b> /*函數(shù)
17、聲明*/</b></p><p> void delay(uchar k ); //延時子程序</p><p> void time_pro( ); //時間處理子程序</p><p> void display( ); //顯示子程序</p><p> void display1( );<
18、;/p><p> void display2();</p><p> void keyscan( ); //鍵盤掃描子程序</p><p> void keyscan1( );</p><p> /*****************************/</p><p><b
19、> /*延時子程序*/</b></p><p> /****************************/</p><p> void delay (uint k)</p><p><b> {</b></p><p><b> uint j;</b></p&g
20、t;<p> while((k--)!=0)</p><p><b> {</b></p><p> for(j=0;j<125;j++)</p><p><b> {;}</b></p><p><b> }</b></p><
21、;p><b> } </b></p><p> /**************************/</p><p> /*時間處理子程序*/</p><p> /**************************/</p><p> void time_pro( void)</p&g
22、t;<p><b> { </b></p><p> if(seconde==60) //秒鐘設(shè)為60進制</p><p> { seconde=0;</p><p><b> minite++;</b></p><p> if( min
23、ite==60) //分鐘設(shè)為60進制</p><p> { minite=0;</p><p><b> hour++;</b></p><p> if(hour==24) //時鐘設(shè)為24進制</p><p><b> {hour=0;</b
24、></p><p><b> day++;</b></p><p> if(month==1)</p><p><b> {</b></p><p> if(day==32)</p><p> {day=1;month++;}}</p><
25、p> if(month==2)</p><p> {if(((year+lq)%100!=0&&(year+lq)%4==0)||(year+lq)%400==0)</p><p><b> {</b></p><p> if(day==30)</p><p> {day=1;month+
26、+;} }</p><p> else if(day==29)</p><p> {day=1;month++;}</p><p><b> }</b></p><p> if(month==3)</p><p><b> {</b></p><
27、p> if(day==32)</p><p> {day=1;month++;}}</p><p> if(month==4)</p><p><b> {</b></p><p> if(day==31)</p><p> {day=1;month++;}}</p>
28、<p> if(month==5)</p><p><b> {</b></p><p> if(day==32)</p><p> {day=1;month++;}} </p><p> if(month==6)</p><p><b> {</b>
29、;</p><p> if(day==31)</p><p> {day=1;month++;}}</p><p> if(month==7)</p><p><b> {</b></p><p> if(day==32)</p><p> {day=1;mon
30、th++;}}</p><p> if(month==8)</p><p><b> {</b></p><p> if(day==32)</p><p> {day=1;month++;}}</p><p> if(month==9)</p><p><b
31、> {</b></p><p> if(day==31)</p><p> {day=1;month++;}}</p><p> if(month==10)</p><p><b> {</b></p><p> if(day==32)</p><
32、p> {day=1;month++;}}</p><p> if(month==11)</p><p><b> {</b></p><p> if(day==31)</p><p> {day=1;month++;}}</p><p> if(month==12)</p&
33、gt;<p><b> {</b></p><p> if(day==32)</p><p> {day=1;month++;}}</p><p> if(month==13)</p><p> {month=1;year++;</p><p> if(year==23)
34、</p><p> {year=13;}} </p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
35、<p> /*****************************/</p><p> /* 顯示子程序*/</p><p> /*****************************/</p><p> void display(void) </p><p><b> { </b&
36、gt;</p><p><b> P2=0x7f;</b></p><p> P0=dispcode[hour/10]; //顯示小時的十位</p><p><b> delay(2);</b></p><p><b> P2=0xbf;</b
37、></p><p> P0=(dispcode[(hour%10)]); //顯示小時的個位</p><p><b> delay(2);</b></p><p><b> P2=0xef;</b></p><p> P0=dispcode[minite/10];
38、 //顯示分的十位</p><p><b> delay(2);</b></p><p><b> P2=0xf7;</b></p><p> P0=(dispcode[minite%10]); //顯示分的個位</p><p><b> dela
39、y(2);</b></p><p><b> P2=0xfd;</b></p><p> P0=dispcode[seconde/10]; //顯示秒的十位</p><p><b> delay(2);</b></p><p><b> P2=0
40、xfe;</b></p><p> P0=dispcode[seconde%10]; //顯示秒的個位</p><p> delay(2); </p><p><b> P2=0xdb;</b></p><p> P0=dispcode[20]; delay(2); <
41、/p><p><b> }</b></p><p> void display2(void)</p><p> {if(a==0){P0=0x00;}</p><p><b> if(a==1)</b></p><p><b> {</b><
42、/p><p> time_pro( ); //時間處理</p><p> display( );</p><p><b> }</b></p><p><b> if(a==2)</b></p><p> { if(P1_1==0)
43、 //秒的設(shè)置</p><p><b> { </b></p><p> delay(30);</p><p> if(P1_1==0)</p><p><b> {</b></p><p> seconde++;</p><p> i
44、f(seconde==60)</p><p> {seconde=0; }</p><p><b> }</b></p><p><b> }</b></p><p> time_pro( );//時間處理</p><p><b> P2=0xfd;<
45、;/b></p><p> P0=dispcode[seconde/10]; //顯示秒的十位</p><p><b> delay(4);</b></p><p><b> P2=0xfe;</b></p><p> P0=dispcode[seconde%1
46、0]; //顯示秒的個位</p><p> delay(4); </p><p><b> }</b></p><p><b> if(a==3) </b></p><p> { if(P1_1==0) //分的設(shè)置&l
47、t;/p><p><b> { </b></p><p> delay(30);</p><p> if(P1_1==0)</p><p><b> {</b></p><p><b> minite++;</b></p><p
48、> if(minite==60)</p><p> {minite=0;}</p><p><b> }</b></p><p><b> } </b></p><p> time_pro( );</p><p><b> P2=0xef;<
49、/b></p><p> P0=dispcode[minite/10]; //顯示分的十位</p><p><b> delay(4);</b></p><p><b> P2=0xf7;</b></p><p> P0=(dispcode[minite%1
50、0]); //顯示分的個位</p><p><b> delay(4);</b></p><p><b> }</b></p><p><b> if(a==4)</b></p><p> { if(P1_1==0) /
51、/按鍵3小時的調(diào)整</p><p><b> { </b></p><p> delay(300);</p><p> if(P1_1==0)</p><p><b> {</b></p><p><b> hour++;</b></p&
52、gt;<p> if(hour==24)</p><p> {hour=0; }</p><p><b> }</b></p><p><b> }</b></p><p> time_pro( );</p><p><b> P2=0x7
53、f;</b></p><p> P0=dispcode[hour/10]; //顯示小時的十位</p><p><b> delay(4);</b></p><p><b> P2=0xbf;</b></p><p> P0=(dispcode[(
54、hour%10)]); //顯示小時的個位</p><p><b> delay(4);</b></p><p><b> } </b></p><p><b> if(a==5)</b></p><p> {//keyscan1( ); //按
55、鍵掃描</p><p> time_pro( ); //時間處理</p><p> display1( );</p><p><b> } </b></p><p><b> if(a==6)</b></p><p> {if(P1_1==0)
56、 //按鍵1秒的調(diào)整</p><p><b> { </b></p><p> delay(30);</p><p> if(P1_1==0)</p><p><b> {</b></p><p><b> day++;</b&g
57、t;</p><p> if(day==32)</p><p><b> {day=1; }</b></p><p><b> }</b></p><p><b> }</b></p><p> time_pro( );</p>
58、<p><b> P2=0xfd;</b></p><p> P0=dispcode[day/10]; //顯示秒的十位</p><p><b> delay(4);</b></p><p><b> P2=0xfe;</b></p><p
59、> P0=dispcode[day%10]; //顯示秒的個位</p><p> delay(4); </p><p><b> }</b></p><p><b> if(a==7) </b></p><p> { if(P1_1==0)
60、 //按鍵2分的調(diào)整</p><p><b> { </b></p><p> delay(30);</p><p> if(P1_1==0)</p><p><b> {</b></p><p><b> month++;
61、</b></p><p> if(month==13)</p><p> {month=1;}</p><p><b> }</b></p><p><b> }</b></p><p> time_pro( );</p><p>
62、;<b> P2=0xf7;</b></p><p> P0=dispcode[month/10]; //顯示分的十位</p><p><b> delay(4);</b></p><p><b> P2=0xfb;</b></p><p>
63、 P0=(dispcode[month%10]); //顯示分的個位</p><p><b> delay(4);</b></p><p><b> }</b></p><p> if(a==8) </p><p> { if(P1_1==0)
64、 //按鍵3小時的調(diào)整</p><p><b> { </b></p><p> delay(300);</p><p> if(P1_1==0)</p><p><b> {</b></p><p><b> year++;</b>
65、</p><p> if(year==24)</p><p> {year=13; }</p><p><b> }</b></p><p><b> }</b></p><p> time_pro( );</p><p><b>
66、 P2=0xdf;</b></p><p> P0=dispcode[year/10]; //顯示小時的十位</p><p><b> delay(4);</b></p><p><b> P2=0xef;</b></p><p> P0=(di
67、spcode[(year%10)]); //顯示小時的個位</p><p><b> delay(4);</b></p><p><b> } </b></p><p><b> }</b></p><p> void display1(void)
68、 </p><p><b> { </b></p><p><b> P2=0xdf;</b></p><p> P0=dispcode[year/10]; //顯示年的十位</p><p><b> delay(2);</b>
69、;</p><p><b> P2=0xef;</b></p><p> P0=(dispcode[(year%10)])|0X80; //顯示小年的個位</p><p><b> delay(2);</b></p><p><b> P2=0xf7;</b&g
70、t;</p><p> P0=dispcode[month/10]; //顯示月的十位</p><p><b> delay(2);</b></p><p><b> P2=0xfb;</b></p><p> P0=(dispcode[month%10])|0X
71、80; //顯示月的個位</p><p><b> delay(2);</b></p><p><b> P2=0xfd;</b></p><p> P0=dispcode[day/10]; //顯示天的十位</p><p><b> dela
72、y(2);</b></p><p><b> P2=0xfe;</b></p><p> P0=dispcode[day%10]; //顯示天的個位</p><p> delay(2); </p><p><b> P2=0x7f;</b></p&g
73、t;<p> P0=dispcode[21];</p><p><b> delay(2);</b></p><p><b> P2=0xbf;</b></p><p> P0=dispcode[22]; delay(2); </p><p><b> }&l
74、t;/b></p><p> /*******************************/</p><p> /*鍵盤掃描子程序*/</p><p> /*******************************/</p><p> void timer0(void) interrupt 1 using 0 /
75、/定時器0方式1,50ms中斷一次</p><p><b> {</b></p><p><b> TH0=0x3c;</b></p><p> TMOD = 0x11;</p><p><b> mstcnt++;</b></p><p>
76、if(mstcnt==20)</p><p><b> {</b></p><p> seconde++;</p><p> mstcnt=0; //注意點。對計數(shù)單元的清零十分的重要,本次調(diào)試中就是</p><p> } //因為忽略了這一點,給我造成了很大的被動。</p
77、><p><b> }</b></p><p> /**************************/</p><p><b> /*主函數(shù)*/</b></p><p> /**************************/</p><p> void main
78、(void)</p><p> { P1=0xff; //初始化p1口,全設(shè)為1 </p><p> TMOD = 0x11; //time0為定時器,方式1</p><p> TH0=0x3c; //預(yù)置計數(shù)初值</p><p><b> TL0=
79、0xb0;</b></p><p><b> EA=1; </b></p><p><b> ET0=1; </b></p><p><b> TR0=1; </b></p><p><b> while (1)</b></p&g
80、t;<p><b> { </b></p><p> if(P1_0==0)</p><p><b> {</b></p><p><b> delay(5);</b></p><p> if(P1_0==0)</p><p>
81、;<b> {</b></p><p> a++;if(a==9)</p><p><b> a=0;</b></p><p><b> }</b></p><p> while(!P1_0);</p><p><b> delay
82、(5);</b></p><p> while(!P1_0); }</p><p> display2( );</p><p><b> }}</b></p><p><b> 參考文獻</b></p><p> 李群芳 肖看 張士軍,單片微型計算機與
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設(shè)計報告--電子時鐘
- 單片機課程設(shè)計報告--電子時鐘
- 單片機課程設(shè)計-單片機課程設(shè)計---電子時鐘
- 電子時鐘單片機課程設(shè)計
- 單片機課程設(shè)計---電子時鐘
- 單片機課程設(shè)計——電子時鐘
- 單片機課程設(shè)計——電子時鐘
- 單片機課程設(shè)計--電子時鐘
- 單片機課程設(shè)計-電子時鐘
- 單片機課程設(shè)計--電子時鐘
- 單片機課程設(shè)計--電子時鐘
- 單片機課程設(shè)計----電子時鐘
- 單片機課程設(shè)計-電子時鐘
- 單片機課程設(shè)計---單片機電子時鐘
- 單片機課程設(shè)計報告--基于單片機的電子時鐘
- 單片機課程設(shè)計--電子時鐘設(shè)計
- 數(shù)字電子時鐘-單片機課程設(shè)計
- 單片機課程設(shè)計---電子時鐘.doc
- 單片機課程設(shè)計--單片機模擬電子時鐘設(shè)計
- 單片機課程設(shè)計--- 單片機電子時鐘設(shè)計
評論
0/150
提交評論