版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課 程 設(shè) 計(jì)</p><p> 課程名稱 單片機(jī)原理與應(yīng)用 </p><p> 課題名稱 電子時(shí)鐘 </p><p> 專 業(yè) 電氣工程及其自動(dòng)化 </p><p> 班 級(jí) &
2、lt;/p><p> 學(xué) 號(hào) </p><p> 姓 名 </p><p> 指導(dǎo)教師 </p><p><b> 年 月 日</b></
3、p><p> 課 程 設(shè) 計(jì) 任 務(wù) 書(shū)</p><p> 課程名稱 單片機(jī)原理與應(yīng)用 </p><p> 課 題 電子時(shí)鐘 </p><p> 專業(yè)班級(jí) </p><p> 學(xué)生姓名
4、 </p><p> 學(xué) 號(hào) </p><p> 指導(dǎo)老師 </p><p> 審 批 </p><p> 任務(wù)書(shū)下達(dá)日期 年 月 日</p>
5、<p> 任務(wù)完成日期 年 月 日</p><p><b> 目 錄</b></p><p> 第1章 總體設(shè)計(jì)方案選擇與說(shuō)明1</p><p> 1.1 設(shè)計(jì)方案1</p><p> 第2章 系統(tǒng)結(jié)構(gòu)框圖與工作原理2</p><p> 2.1系統(tǒng)結(jié)構(gòu)
6、框圖:2</p><p> 2.2系統(tǒng)工作原理2</p><p> 第3章 硬件電路設(shè)計(jì)及說(shuō)明3</p><p> 3.1鍵盤接口電路3</p><p><b> 3.2顯示電路4</b></p><p> 第4章 軟件設(shè)計(jì)與說(shuō)明5</p><p>
7、 4.1 初始化子程序5</p><p> 4.2 延時(shí)子函數(shù)5</p><p> 4.3 鍵盤掃描函數(shù)6</p><p> 4.4 按鍵服務(wù)函數(shù)6</p><p> 4.5 數(shù)碼管顯示函數(shù)8</p><p> 4.6 中斷服務(wù)函數(shù)10</p><p> 4.7 主程序流
8、程圖12</p><p> 第5章 調(diào)試結(jié)果與調(diào)試說(shuō)明13</p><p><b> 設(shè)計(jì)總結(jié)14</b></p><p><b> 參考文獻(xiàn)15</b></p><p><b> 附 錄16</b></p><p> 附錄A:設(shè)計(jì)電
9、路圖16</p><p> 附錄B:源程序清單17</p><p> 第1章 總體設(shè)計(jì)方案選擇與說(shuō)明</p><p><b> 1.1 設(shè)計(jì)方案</b></p><p> 本系統(tǒng)的硬件主要包括單片機(jī)芯片、數(shù)碼管顯示、按鍵開(kāi)關(guān)電路,它的硬件電路如原理圖,單片機(jī)采用廣泛的AT89C51,系統(tǒng)時(shí)鐘采用12MHz的晶
10、振,8個(gè)數(shù)碼管顯示,小時(shí)與分鐘、分鐘與秒鐘之間用短橫線間隔,采用共陽(yáng)極七段式數(shù)碼管,P0口為段選碼輸出端與數(shù)碼管相連,P2口為位選碼輸出端,分別與數(shù)碼管陽(yáng)極相連。按鍵開(kāi)關(guān)設(shè)定了6個(gè),通過(guò)P1口相連。分別為啟動(dòng)、停止、復(fù)位、設(shè)置、加、減。</p><p> 整個(gè)系統(tǒng)分為:主程序、數(shù)碼管顯示模塊(在本系統(tǒng)中數(shù)碼管采用軟件譯碼動(dòng)態(tài)顯示,在存儲(chǔ)器中首先建立一張顯示信息的字段碼管,顯示時(shí),先從顯示緩沖區(qū)中取出顯示的信息,
11、然后通過(guò)查表程序在字段碼中查出顯示所顯示的信息的字段碼,從P0口將對(duì)應(yīng)的位選碼輸出,選中顯示的數(shù)碼管,就能在相應(yīng)的數(shù)碼管上顯示顯示緩沖區(qū)的內(nèi)容。)、定時(shí)器/計(jì)數(shù)器T1中斷服務(wù)程序、按鍵處理模塊(按鍵處理設(shè)置為:在時(shí)鐘正常顯示時(shí),按下【設(shè)置】鍵進(jìn)入秒表模式,若不按秒表的控制鍵啟動(dòng)、停止、復(fù)位,則在再次按下【設(shè)置】鍵是轉(zhuǎn)入調(diào)秒狀態(tài),再按進(jìn)入調(diào)分,再按進(jìn)入調(diào)時(shí),再按回到正常顯示時(shí)鐘狀態(tài)。否則會(huì)直接回到正常狀態(tài)。 在調(diào)秒、調(diào)時(shí)、調(diào)分狀態(tài)下按下
12、【加】或【減】可進(jìn)行單個(gè)加1或單個(gè)減1操作,若按下不松1s后會(huì)連續(xù)加或連續(xù)減。</p><p> 第2章 系統(tǒng)結(jié)構(gòu)框圖與工作原理</p><p> 2.1系統(tǒng)結(jié)構(gòu)框圖: </p><p> 圖2.1 系統(tǒng)結(jié)構(gòu)框圖</p><p><b> 2.2系統(tǒng)工作原理</b>&l
13、t;/p><p> 利用單片機(jī)定時(shí)器完成計(jì)時(shí)功能,定時(shí)器1計(jì)時(shí)中斷程序每隔10ms中斷一次并當(dāng)作一個(gè)計(jì)數(shù),設(shè)定定時(shí)1秒的中斷計(jì)數(shù)初值閥值為100,每中斷一次中斷計(jì)數(shù)加1,當(dāng)加到100時(shí),則表示1s到了,秒變量加1,同理再判斷是否1min鐘到了,再判斷是否1h到了。 </p><p> 為了將時(shí)間在LED數(shù)碼管上顯示,可采用靜態(tài)顯示法和動(dòng)態(tài)顯示法,由于靜態(tài)顯示法需要譯碼器,數(shù)據(jù)鎖存
14、器等較多硬件,可采用動(dòng)態(tài)顯示法實(shí)現(xiàn)LED顯示,通過(guò)對(duì)每位數(shù)碼管的依次掃描,使對(duì)應(yīng)數(shù)碼管亮,同時(shí)向該數(shù)碼管送對(duì)應(yīng)的字碼,使其顯示數(shù)字。由于數(shù)碼管掃描周期很短,由于人眼的視覺(jué)暫留效應(yīng),使數(shù)碼管看起來(lái)總是亮的,從而實(shí)現(xiàn)了各種顯示。</p><p> 第3章 硬件電路設(shè)計(jì)及說(shuō)明</p><p><b> 3.1鍵盤接口電路</b></p><p>
15、 獨(dú)立式鍵盤:獨(dú)立式鍵盤中,每個(gè)按鍵占用一根I/O口線,每個(gè)按鍵電路相對(duì)獨(dú)立。I/O口通過(guò)按鍵與地相連,I/O口有上拉電阻,無(wú)鍵按下時(shí),引腳端為高電平,有鍵按下時(shí),引腳電平被拉低,I/O口內(nèi)部有上拉電阻時(shí),外部可不接上拉電阻。</p><p> 圖3.1 鍵盤接口電路圖</p><p><b> 3.2顯示電路</b></p><p>
16、 它的連接方式為7段共陽(yáng)LED顯示器的公共端分別接單片機(jī)的P2口。相應(yīng)的P0口接LED顯示器的a、b、c、d、e、f、g和dp引腳,利用程序進(jìn)行動(dòng)態(tài)的掃描實(shí)現(xiàn)顯示功能。</p><p> 圖3.2 硬件顯示電路圖</p><p> LED數(shù)碼管的原理與接口:</p><p> 八段LED顯示器與單片機(jī)的接口比較簡(jiǎn)單,只要將一個(gè)8位并行口與顯示器的引腳對(duì)應(yīng)相接即
17、可,由8位并行口輸出不同的字節(jié)數(shù)據(jù),顯示出不同的數(shù)字或字符。</p><p> 控制LED顯示出不同的數(shù)字或字符的8位字節(jié)數(shù)據(jù)稱為“段選碼”,共陰極LED與共陽(yáng)極LED的段選碼互為補(bǔ)碼。數(shù)碼管的接口有靜態(tài)和動(dòng)態(tài)接口兩種,靜態(tài)接口為固定顯示方式,無(wú)閃爍,其電路可采用一個(gè)并行口接一個(gè)數(shù)碼管,數(shù)碼管的公共端按共陰或共陽(yáng)分別接地或接電源。</p><p> 動(dòng)態(tài)接口采用各數(shù)碼管循環(huán)輪流顯示的方
18、法,當(dāng)循環(huán)顯示的頻率教高時(shí),利用人眼的視覺(jué)暫留性,看不出閃爍顯示現(xiàn)象,這種顯示與要一個(gè)接口完成字形碼的輸出,另一接口完成各數(shù)碼管的輪流點(diǎn)亮。</p><p> 第4章 軟件設(shè)計(jì)與說(shuō)明</p><p> 4.1 初始化子程序</p><p> 對(duì)所用到的存儲(chǔ)單元和寄存器單元進(jìn)行初始化,同時(shí)對(duì)要使用到的定時(shí)器進(jìn)行清零并賦初始值。</p><p&
19、gt;<b> 初始化子程序:</b></p><p> void InitTimer1(void) // 系統(tǒng)初始化 函數(shù)</p><p><b> {</b></p><p> TMOD = 0x10; // 定時(shí)器 T1,工作方式1</p><p> TH1 = 0x
20、0D8; // 賦初值 </p><p> TL1 = 0x0F0;</p><p> EA = 1; // 開(kāi)總中斷</p><p> ET1 = 1; // 開(kāi)定時(shí)器T1中斷</p><p> TR1 = 1; // 開(kāi)定時(shí)器T1</p><p><b
21、> }</b></p><p><b> 4.2 延時(shí)子函數(shù)</b></p><p> void delay1(unsigned int de) //延時(shí)函數(shù)由于數(shù)碼管暫留</p><p><b> {</b></p><p> unsigned int t;<
22、/p><p> for(t=0;t<de;t++);</p><p><b> }</b></p><p> 4.3 鍵盤掃描函數(shù)</p><p> void key_scan() // 按鍵掃描函數(shù)</p><p><b> {</b></p&g
23、t;<p> if(key_sr1==1) // 第一個(gè)按鍵松開(kāi)</p><p><b> {</b></p><p> key_lock1=0; // 解鎖</p><p> delay_cnt1=0; // 延時(shí)計(jì)數(shù)清零</p><p><b> }</b>&
24、lt;/p><p> else if(key_lock1==0) // 是否按下,避免重復(fù)觸發(fā)</p><p><b> {</b></p><p> ++delay_cnt1;</p><p> if(delay_cnt1>cnt_delay_cnt1) // 消抖動(dòng)</p><p&
25、gt;<b> {</b></p><p> delay_cnt1=0;</p><p> key_lock1=1; // 上鎖</p><p> key_sec=1; //觸發(fā)1號(hào)鍵</p><p><b> } </b></p><
26、;p><b> }</b></p><p> ......具體請(qǐng)看附錄B 源代碼</p><p><b> }</b></p><p> 4.4 按鍵服務(wù)函數(shù)</p><p> void key_service() // 按鍵服務(wù)函數(shù)</p><p>&l
27、t;b> {</b></p><p> static unsigned char x =0; // 用于連發(fā)頻率控制變量</p><p> switch(key_sec)</p><p><b> {</b></p><p> case 1:// 開(kāi)始鍵</p>
28、<p> switch (wd_sec)</p><p><b> {</b></p><p> case 2: // 秒表 模式</p><p> start = 1; // 啟動(dòng)秒表</p><p> sec_sec = 1; // 秒表執(zhí)行標(biāo)志 用于窗口轉(zhuǎn)換選擇<
29、/p><p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0;</p><p><b> break;</b></p><p> case 2: // 停止鍵</p
30、><p> switch (wd_sec)</p><p><b> {</b></p><p> case 2: // 秒表 模式</p><p> start = 0;</p><p> sec_sec = 1;// 秒表執(zhí)行標(biāo)志 用于窗口轉(zhuǎn)換選擇 </p>
31、<p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0;//清除鍵值</p><p><b> break;</b></p><p> case 3: // 復(fù)位鍵</p&
32、gt;<p> switch (wd_sec)</p><p><b> {</b></p><p> case 2: // 秒表 模式</p><p> //qing dong miao biao </p><p> if(!start) // 秒表在停止?fàn)顟B(tài)下 才允許復(fù)位&
33、lt;/p><p><b> {</b></p><p> time_sec = 0;</p><p> time_min = 0;</p><p> timesec = 0;</p><p><b> }</b></p><p> sec_
34、sec = 1; //秒表執(zhí)行標(biāo)志 用于窗口轉(zhuǎn)換選擇 </p><p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0;//清除鍵值</p><p><b> break;</b></p
35、><p> ... ... 具體請(qǐng)看附錄B 源代碼</p><p><b> }</b></p><p> 4.5 數(shù)碼管顯示函數(shù)</p><p> void display() // 顯示函數(shù)</p><p><b> {</b></p>&l
36、t;p> static unsigned char i; </p><p> switch(wd_sec) // 不同模式(窗口)下給顯示緩沖區(qū)的值不同</p><p><b> {</b></p><p> case 1: // 正常顯示時(shí)間</p><p> temp[
37、7]=sec%10;</p><p> temp[6]=sec/10;</p><p> temp[4]=min%10;</p><p> temp[3]=min/10;</p><p> temp[1]=hour%10;</p><p> temp[0]=hour/10;</p><p
38、><b> break;</b></p><p> case 2: // 顯示秒表模式</p><p> temp[7]=timesec%10;</p><p> temp[6]=timesec/10;</p><p> temp[4]=time_sec%10;</p><
39、;p> temp[3]=time_sec/10;</p><p> temp[1]=time_min%10;</p><p> temp[0]=time_min/10;</p><p><b> break;</b></p><p> case 3: // 時(shí)間調(diào)整 秒 </p>
40、<p> temp[4]=min%10;</p><p> temp[3]=min/10;</p><p> if (biaozhi) // 閃爍標(biāo)志</p><p><b> {</b></p><p> temp[7]=sec%10; // 顯示</p><p&g
41、t; temp[6]=sec/10;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> temp[7]=11 ; // 滅</p><p> temp
42、[6]=11 ;</p><p><b> }</b></p><p> temp[1]=hour%10; // 分離個(gè)位</p><p> temp[0]=hour/10; // 分離十位</p><p><b> break;</b></p>
43、<p> case 4:// 時(shí)間調(diào)整 分 </p><p><b> ... ...</b></p><p><b> break;</b></p><p> case 5:// 時(shí)間調(diào)整 時(shí) </p><p><b> ... ...</b>
44、;</p><p><b> break;</b></p><p><b> }</b></p><p> delay1(1); // 小延時(shí)</p><p> P0=0xff; // 關(guān)段碼 </p><p> P2= 0x00; // 關(guān)位碼
45、 用于消影</p><p> delay1(1); // 小延時(shí)</p><p> P2=wele[i]; // 位選控制</p><p> P0=table[temp[i]]; //段選控制</p><p> delay1(50); // 延時(shí) 視覺(jué)暫留</p><p><b>
46、 if(++i>8)</b></p><p><b> i=0;</b></p><p><b> }</b></p><p> 4.6 中斷服務(wù)函數(shù)</p><p> void Timer1Interrupt(void) interrupt 3 // 10 ms
47、中斷函數(shù)</p><p><b> {</b></p><p> static unsigned char time1;</p><p> TH1 = 0x0D8; // 重新裝入初值</p><p> TL1 = 0x0F0;</p><p> if (!(wd_sec == 3 |
48、 wd_sec == 4 | wd_sec == 5 )) </p><p> { // 時(shí)間在 調(diào)整過(guò)程中不允許走時(shí)</p><p> if(++time==100) // 一秒時(shí)間到</p><p><b> {</b></p><p><b> time=0; </b
49、></p><p> if(++sec==60) // 一分鐘時(shí)間到</p><p><b> {</b></p><p><b> sec=0;</b></p><p> if(++min==60) // 一小時(shí)時(shí)間到</p><p><b>
50、{</b></p><p><b> min=0;</b></p><p> if(++hour==24) // 一天時(shí)間到 </p><p><b> {</b></p><p><b> hour=0; </b></p><p
51、><b> } </b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>
52、 if (wd_sec == 2 && start==1) </p><p> { // 秒表開(kāi)始計(jì)時(shí)條件( 在秒表模式且秒表啟動(dòng) )</p><p> if (++timesec == 100) // 1秒時(shí)間到</p><p><b> {</b></p><p> t
53、imesec =0;</p><p> if (++time_sec == 60) // 1分鐘時(shí)間到 </p><p><b> {</b></p><p> time_sec =0;</p><p> time_min++;</p><p><b> }</b>
54、;</p><p><b> }</b></p><p><b> }</b></p><p> if (++time1>= 25) // 時(shí)間調(diào)整的閃爍標(biāo)志</p><p><b> {</b></p><p><b&g
55、t; time1=0;</b></p><p> biaozhi = ~biaozhi;</p><p><b> }</b></p><p> key_scan(); // 按鍵掃描 </p><p><b> }</b></p><p>
56、; 4.7 主程序流程圖</p><p> 圖4.1 主程序流程圖</p><p> 第5章 調(diào)試結(jié)果與調(diào)試說(shuō)明</p><p> 通過(guò)proteus 7.7SP2仿真,開(kāi)始后數(shù)碼管可以正常顯示時(shí)間,此時(shí)按下【設(shè)置】鍵,可切換到秒表模式,在秒表模式下按【啟動(dòng)】鍵開(kāi)始計(jì)時(shí),最小值為10ms。按【停止】鍵可以停止計(jì)時(shí),按【復(fù)位】鍵可以清零秒表,以便開(kāi)始下一輪的計(jì)
57、時(shí)。</p><p> 當(dāng)回到正常顯示模式后,連續(xù)按兩次【設(shè)置】鍵即可進(jìn)入時(shí)鐘調(diào)整狀態(tài)。依次調(diào)整秒、分、時(shí)。</p><p> 在時(shí)鐘調(diào)整的狀態(tài)下,按【加】鍵可以對(duì)當(dāng)前閃爍的秒(或分或時(shí))進(jìn)行單個(gè)加1操作,若按下不松1s后進(jìn)入連續(xù)加1操作,以實(shí)現(xiàn)快速時(shí)鐘調(diào)整。</p><p> 調(diào)試過(guò)程中的截圖如下:</p><p> 圖 5.1 分
58、鐘調(diào)試過(guò)程</p><p><b> 設(shè)計(jì)總結(jié)</b></p><p> 通過(guò)本次的單片機(jī)課程設(shè)計(jì),我在電路調(diào)試經(jīng)驗(yàn)等方面增加了很多經(jīng)驗(yàn),這些都是在課本上無(wú)法學(xué)到得東西。在程序方面,在一些延時(shí)子程序等網(wǎng)絡(luò)上有很多現(xiàn)成的資料,我們要充分的利用資源,借鑒別人優(yōu)秀的程序,做出來(lái)的程序更加優(yōu)秀。程序方面我覺(jué)得寫程序注釋寫得越詳細(xì)越好、不要怕麻煩。這樣方便自己讀懂程序,也是
59、有利于讓別人能讀懂你寫的程序。在反復(fù)確認(rèn)自己的程序正確無(wú)誤之后,接下來(lái)要做的就是模擬仿真了。我們?cè)跁?shū)上、網(wǎng)上都查閱了相關(guān)芯片的功能、管腳等信息。仔細(xì)研究芯片的主要功能及管腳接法,這也就為我們后面比較成功地仿真出結(jié)果打好了基礎(chǔ)。當(dāng)仿真出錯(cuò)時(shí)我們反復(fù)檢查線路連接是否有誤,仔細(xì)的觀察相應(yīng)管腳在運(yùn)行時(shí)的電位的變化。我相信,不管是什么電路,經(jīng)過(guò)如此仔細(xì)的檢查后,任何錯(cuò)誤不會(huì)遺漏。當(dāng)然,這也是我們最終走向成功的原因。</p><
60、p> 在老師的辛勤的指導(dǎo)下,最后我們順利地完成了這次的課程設(shè)計(jì)??匆?jiàn)到課本所學(xué)知識(shí)得以應(yīng)用,心中滿是歡喜,滿是激動(dòng)。這次課程設(shè)計(jì)加強(qiáng)了我的實(shí)際操作能力,提高了我解決實(shí)際問(wèn)題的能力,并對(duì)本專業(yè)的課程充滿了濃厚的興趣,及對(duì)以后的學(xué)習(xí)充滿了信心,決定在以后的學(xué)習(xí)生活中加強(qiáng)練習(xí),端正心態(tài),迎接新的挑戰(zhàn)。</p><p><b> 參考文獻(xiàn)</b></p><p>
61、 1、《單片機(jī)C語(yǔ)言輕松入門》周堅(jiān)編 北京航空航天大學(xué)出版社</p><p> 2、《單片機(jī)人機(jī)接口實(shí)例》公茂法編著 北京航空航天大學(xué)出版社</p><p> 3、《51系列單片機(jī)應(yīng)用與實(shí)踐教程》周向紅編著 北京航空航天大學(xué)出版社</p><p> 4、《單片機(jī)原理與應(yīng)用》王迎旭編著 機(jī)械工業(yè)出版社 </p><p><b
62、> 附 錄</b></p><p><b> 附錄A:設(shè)計(jì)電路圖</b></p><p><b> 附錄B:源程序清單</b></p><p><b> /*</b></p><p> 單片機(jī)課程設(shè)計(jì) </p><p>
63、 課題名稱 :基于單片機(jī)的電子時(shí)鐘設(shè)計(jì)</p><p> 時(shí)間 :2013年6月13日</p><p> 硬件 :P0口 接數(shù)碼管的段碼。 P2口 接數(shù)碼的位選 </p><p> 六個(gè)獨(dú)立按鍵接 P1^0 到 P1^5 口 </p><p> 晶振 12 MHz 單片機(jī) AT89C51&
64、lt;/p><p> 功能 : 利用定時(shí)中斷進(jìn)行計(jì)時(shí),有正常時(shí)間顯示, </p><p> 有秒表啟動(dòng)、停止、復(fù)位功能 ,時(shí)間可以 </p><p><b> 調(diào)整,</b></p><p> 時(shí)間調(diào)整 按加鍵時(shí)間加1,若不松開(kāi),</p><p> 1s后進(jìn)入連續(xù)加1直至松開(kāi)按鈕
65、。</p><p><b> */</b></p><p> #include <reg51.h></p><p> #define cnt_delay_cnt1 25 //按鍵去抖延時(shí)</p><p> void delay1(unsigned int de); // 小延時(shí) 數(shù)碼管顯示暫留延時(shí)
66、</p><p> void display(); // 顯示函數(shù)</p><p> void key_scan();//按鍵掃描函數(shù)放在中斷函數(shù)里面</p><p> void key_service(); //案件服務(wù)函數(shù)放在主函數(shù)里面</p><p> sbit key_sr1=P1^0;//獨(dú)立按鍵輸入 啟動(dòng)
67、</p><p> sbit key_sr2=P1^1;//獨(dú)立按鍵輸入 停止</p><p> sbit key_sr3=P1^2;//。。。。。。 復(fù)位</p><p> sbit key_sr4=P1^3; // 模式</p><p> sbit key_sr5=P1^4; //
68、 加</p><p> sbit key_sr6=P1^5; // 減</p><p> unsigned char key_lock1=0; //按鍵自鎖標(biāo)志</p><p> unsigned char key_lock2=0;</p><p> unsigned char key_lock3=0
69、;</p><p> unsigned char key_lock4=0;</p><p> unsigned char key_lock5=0;</p><p> unsigned char key_lock6=0;</p><p> unsigned int delay_cnt=0; // 6號(hào)鍵長(zhǎng)按延時(shí) </p>
70、<p> unsigned int delay_cnt_1=0; // 5號(hào)鍵長(zhǎng)按延時(shí)</p><p> unsigned int delay_cnt1=0; //延時(shí)計(jì)數(shù)器的變量</p><p> unsigned int delay_cnt2=0;</p><p> unsigned int delay_cnt3=0;</p>
71、;<p> unsigned int delay_cnt4=0;</p><p> unsigned int delay_cnt5=0;</p><p> unsigned int delay_cnt6=0;</p><p> unsigned char key_sec=0;//哪個(gè)鍵被觸發(fā)</p><p> uns
72、igned char wd_sec = 1;</p><p> bit biaozhi = 1; // 位閃爍用 時(shí)間標(biāo)志</p><p> bit start =0; // 秒表開(kāi)始標(biāo)志</p><p> bit sec_sec = 0; //用來(lái)區(qū)分 從秒表模式切換到 正常顯示(1) 還是 調(diào)整時(shí)間(0)</p>
73、<p> unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; // 段碼數(shù)組 0到9 + '-' + ' '</p><p> unsigned char code wele[]={0x01,0x02,0x04,0x08,0x1
74、0,0x20,0x40,0x80}; // 數(shù)碼管位選碼</p><p> unsigned char temp[]={0,0,10,0,0,10,0,0}; // 顯示緩沖區(qū) (原先將 '-' 寫入)</p><p> int time=0,sec=0,min=0,hour=0 ; // 定義時(shí)間的 變量</p><p>
75、; int timesec=0,time_sec =0, time_min=0; // 定義秒表的變量</p><p> void InitTimer1(void) // 系統(tǒng)初始化 函數(shù)</p><p><b> {</b></p><p> TMOD = 0x10;</p><p> TH1
76、= 0x0D8;</p><p> TL1 = 0x0F0;</p><p><b> EA = 1;</b></p><p><b> ET1 = 1;</b></p><p><b> TR1 = 1;</b></p><p><b&g
77、t; }</b></p><p> void main(void) // 主函數(shù)</p><p><b> {</b></p><p> InitTimer1(); // 初始化</p><p><b> while(1)</b></p><p>
78、<b> { </b></p><p> display(); // 顯示子程序 </p><p> key_service(); //按鍵服務(wù)程序</p><p><b> }</b></p><p><b> }</b><
79、/p><p> void display() // 顯示函數(shù)</p><p><b> {</b></p><p> static unsigned char i; </p><p> switch(wd_sec) // 不同模式(窗口)下給顯示緩沖區(qū)的值不同</p><
80、p><b> {</b></p><p> case 1: // 正常顯示時(shí)間</p><p> temp[7]=sec%10;</p><p> temp[6]=sec/10;</p><p> temp[4]=min%10;</p><p> temp[3]=
81、min/10;</p><p> temp[1]=hour%10;</p><p> temp[0]=hour/10;</p><p><b> break;</b></p><p> case 2: // 顯示秒表模式</p><p> temp[7]=timesec%
82、10;</p><p> temp[6]=timesec/10;</p><p> temp[4]=time_sec%10;</p><p> temp[3]=time_sec/10;</p><p> temp[1]=time_min%10;</p><p> temp[0]=time_min/10;<
83、;/p><p><b> break;</b></p><p> case 3: // 時(shí)間調(diào)整 秒 </p><p> temp[4]=min%10;</p><p> temp[3]=min/10;</p><p> if (biaozhi) // 閃爍標(biāo)志</p&
84、gt;<p><b> {</b></p><p> temp[7]=sec%10; // 顯示</p><p> temp[6]=sec/10;</p><p><b> }</b></p><p><b> else</b></p>
85、;<p><b> {</b></p><p> temp[7]=11 ; // 滅</p><p> temp[6]=11 ;</p><p><b> }</b></p><p> temp[1]=hour%10; // 分離個(gè)位</p&g
86、t;<p> temp[0]=hour/10; // 分離十位</p><p><b> break;</b></p><p> case 4:// 時(shí)間調(diào)整 分 </p><p> temp[7]=sec%10;</p><p> temp[6]=sec/10;</p>
87、<p> if (biaozhi) // 閃爍標(biāo)志</p><p><b> {</b></p><p> temp[4]=min%10;</p><p> temp[3]=min/10;</p><p><b> }</b></p><p>&l
88、t;b> else</b></p><p><b> {</b></p><p> temp[4]=11 ;</p><p> temp[3]=11 ;</p><p><b> }</b></p><p> temp[1]=hour%10;
89、</p><p> temp[0]=hour/10;</p><p><b> break;</b></p><p> case 5:// 時(shí)間調(diào)整 時(shí) </p><p> temp[7]=sec%10;</p><p> temp[6]=sec/10;</p>&
90、lt;p> temp[4]=min%10;</p><p> temp[3]=min/10;</p><p> if (biaozhi) // 閃爍標(biāo)志</p><p><b> {</b></p><p> temp[1]=hour%10;</p><p> temp[
91、0]=hour/10;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> temp[1]=11;</p><p> temp[0]=11 ;</
92、p><p><b> }</b></p><p><b> break;</b></p><p><b> }</b></p><p> delay1(1); </p><p> P0=0xff; // 關(guān)段碼 </p>&
93、lt;p> P2= 0x00; // 關(guān)位碼 用于消影</p><p> delay1(1);</p><p> P2=wele[i]; // 位選</p><p> P0=table[temp[i]]; //段選</p><p> delay1(50); // 延時(shí) 視覺(jué)暫留</p><
94、;p><b> if(++i>8)</b></p><p><b> i=0;</b></p><p><b> }</b></p><p> void delay1(unsigned int de) //延時(shí)函數(shù)</p><p><b>
95、 {</b></p><p> unsigned int t;</p><p> for(t=0;t<de;t++);</p><p><b> }</b></p><p> void key_scan() // 按鍵掃描函數(shù)</p><p><b>
96、 {</b></p><p> if(key_sr1==1) // 第一個(gè)按鍵松開(kāi)</p><p><b> {</b></p><p> key_lock1=0; // 解鎖</p><p> delay_cnt1=0; // 延時(shí)計(jì)數(shù)清零</p><p>&l
97、t;b> }</b></p><p> else if(key_lock1==0) // </p><p><b> {</b></p><p> ++delay_cnt1;</p><p> if(delay_cnt1>cnt_delay_cnt1) // 消抖動(dòng)</p>
98、<p><b> {</b></p><p> delay_cnt1=0;</p><p> key_lock1=1;</p><p> key_sec=1;//觸發(fā)1號(hào)鍵</p><p><b> } </b></p><p><b>
99、 }</b></p><p> if(key_sr2==1)</p><p><b> {</b></p><p> key_lock2=0;</p><p> delay_cnt2=0;</p><p><b> }</b></p>&
100、lt;p> else if(key_lock2==0)</p><p><b> {</b></p><p> ++delay_cnt2;</p><p> if(delay_cnt2>cnt_delay_cnt1)</p><p><b> {</b></p>
101、<p> delay_cnt2=0;</p><p> key_lock2=1;</p><p> key_sec=2;//觸發(fā)2號(hào)鍵</p><p><b> }</b></p><p><b> }</b></p><p> if(key_sr3
102、==1)</p><p><b> {</b></p><p> key_lock3=0;</p><p> delay_cnt3=0;</p><p><b> }</b></p><p> else if(key_lock3==0)</p><
103、;p><b> {</b></p><p> ++delay_cnt3;</p><p> if(delay_cnt3>cnt_delay_cnt1)</p><p><b> {</b></p><p> delay_cnt3=0;</p><p>
104、; key_lock3=1;</p><p> key_sec=3;//觸發(fā)3號(hào)鍵</p><p><b> }</b></p><p><b> }</b></p><p> if(key_sr4==1)</p><p><b> {</b&g
105、t;</p><p> key_lock4=0;</p><p> delay_cnt4=0;</p><p><b> }</b></p><p> else if(key_lock4==0)</p><p><b> {</b></p><p
106、> ++delay_cnt4;</p><p> if(delay_cnt4>cnt_delay_cnt1)</p><p><b> {</b></p><p> delay_cnt4=0;</p><p> key_lock4=1;</p><p> key_sec=4
107、;//觸發(fā)4號(hào)鍵</p><p><b> }</b></p><p><b> }</b></p><p> if(key_sr5==1)</p><p><b> {</b></p><p> key_lock5=0;</p>
108、<p> delay_cnt5=0;</p><p> delay_cnt_1=0;</p><p><b> }</b></p><p> else //if(key_lock5==0)</p><p><b> {</b></p><p> ++
109、delay_cnt5;</p><p> if(delay_cnt5>cnt_delay_cnt1) //消抖 </p><p><b> {</b></p><p> if(++delay_cnt_1 >100) // 長(zhǎng)按延時(shí)檢測(cè)</p><p><b> {</b&g
110、t;</p><p> key_sec = 11; // 連發(fā)狀態(tài)</p><p><b> }</b></p><p> else if (key_lock5 == 0)</p><p><b> {</b></p><p> key_lock5=1;<
111、/p><p> key_sec = 5; //單發(fā)</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(key_sr6==1)</p><p
112、><b> {</b></p><p> key_lock6=0;</p><p> delay_cnt6=0;</p><p> delay_cnt=0;</p><p><b> }</b></p><p> else// if(1)//(key_loc
113、k6==0)</p><p><b> {</b></p><p> ++delay_cnt6;</p><p> if(delay_cnt6>cnt_delay_cnt1)</p><p><b> {</b></p><p> if(++delay_cnt
114、 >100)</p><p><b> {</b></p><p> key_sec = 12; // 連發(fā)狀態(tài)</p><p><b> }</b></p><p> else if (key_lock6 == 0)</p><p><b>
115、{</b></p><p> key_lock6=1;</p><p> key_sec = 6; //單發(fā)</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b><
116、;/p><p><b> }</b></p><p> void key_service() // 按鍵服務(wù)函數(shù)</p><p><b> {</b></p><p> static unsigned char x =0;</p><p> switch(key_s
117、ec)</p><p><b> {</b></p><p> case 1:// 開(kāi)始鍵</p><p> switch (wd_sec)</p><p><b> {</b></p><p> case 2: // 秒表 模式</p&g
118、t;<p> start = 1; // 啟動(dòng)秒表</p><p> sec_sec = 1; // 秒表執(zhí)行標(biāo)志 用于窗口轉(zhuǎn)換選擇</p><p><b> break;</b></p><p><b> }</b></p><p> key_sec
119、= 0;</p><p><b> break;</b></p><p> case 2: // 停止鍵</p><p> switch (wd_sec)</p><p><b> {</b></p><p> case 2: // 秒表 模式 &l
120、t;/p><p> start = 0;</p><p> sec_sec = 1;// 秒表執(zhí)行標(biāo)志 用于窗口轉(zhuǎn)換選擇 </p><p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0;//清
121、除鍵值</p><p><b> break;</b></p><p> case 3: // 復(fù)位鍵</p><p> switch (wd_sec)</p><p><b> {</b></p><p> case 2: // 秒表 模式&
122、lt;/p><p> if(!start) // 秒表在停止?fàn)顟B(tài)下 才允許復(fù)位</p><p><b> {</b></p><p> time_sec = 0;</p><p> time_min = 0;</p><p> timesec = 0;</p>&l
123、t;p><b> }</b></p><p> sec_sec = 1; //秒表執(zhí)行標(biāo)志 用于窗口轉(zhuǎn)換選擇 </p><p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0;//清除
124、鍵值</p><p><b> break;</b></p><p> case 4: // 菜單鍵 </p><p> switch(wd_sec)</p><p><b> {</b></p><p> case 1: // 正常顯示<
125、;/p><p><b> wd_sec++;</b></p><p> sec_sec = 0;</p><p><b> break;</b></p><p> case 2: // 秒表模式</p><p> if (sec_sec) // 判斷秒表模式
126、是否執(zhí)行了,若執(zhí)行了切換到 正常顯示模式</p><p> wd_sec = 1;</p><p> else // 否則 轉(zhuǎn)到調(diào)時(shí)間模式</p><p><b> wd_sec++;</b></p><p><b> break;</b></p><p&
127、gt; case 3: // 調(diào)秒</p><p><b> wd_sec++;</b></p><p><b> break;</b></p><p> case 4: // 調(diào)分 </p><p><b> wd_sec++;</b></p
128、><p><b> break;</b></p><p> case 5: // 調(diào)時(shí)</p><p><b> wd_sec=1;</b></p><p> break;</p><p><b> }</b></p
129、><p> key_sec = 0;//清除鍵值</p><p><b> break;</b></p><p> case 5: // 時(shí)間單個(gè)加</p><p> switch (wd_sec)</p><p><b> {</b></p>
130、<p><b> case 3:</b></p><p> if(++sec >59) //秒上限</p><p><b> sec = 0;</b></p><p><b> break;</b></p><p><b> cas
131、e 4:</b></p><p> if(++min >59) // 分上限</p><p><b> min = 0;</b></p><p><b> break;</b></p><p><b> case 5:</b></p>
132、<p> if (++hour > 23) //時(shí)上限</p><p><b> hour = 0;</b></p><p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0; /
133、/清除鍵值</p><p><b> break;</b></p><p> case 6: // 時(shí)間單個(gè)減</p><p> switch (wd_sec)</p><p><b> {</b></p><p><b> case 3:</
134、b></p><p> if (--sec < 0 )</p><p><b> sec = 59;</b></p><p><b> break;</b></p><p><b> case 4:</b></p><p> i
135、f (--min < 0 )</p><p><b> min = 59;</b></p><p><b> break;</b></p><p><b> case 5:</b></p><p> if (--hour <0)</p><
136、;p> hour = 23;</p><p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0; //清除鍵值</p><p><b> break;</b></p>&l
137、t;p> case 11: // 時(shí)間連續(xù)加</p><p> if(++x>80)</p><p><b> {</b></p><p><b> x =0;</b></p><p> switch (wd_sec)</p><p><b&g
138、t; {</b></p><p><b> case 3:</b></p><p> if(++sec >59)</p><p><b> sec = 0;</b></p><p><b> break;</b></p><
139、p><b> case 4:</b></p><p> if(++min >59)</p><p><b> min = 0;</b></p><p><b> break;</b></p><p><b> case 5:</b>&
140、lt;/p><p> if (++hour > 23)</p><p><b> hour = 0;</b></p><p><b> break;</b></p><p><b> }</b></p><p> key_sec = 0
141、; //清除鍵值</p><p><b> }</b></p><p><b> break;</b></p><p> case 12: // 時(shí)間連續(xù)減</p><p> if(++x>80)</p><p><b> {<
142、/b></p><p><b> x =0;</b></p><p> switch (wd_sec)</p><p><b> {</b></p><p><b> case 3:</b></p><p> if (--sec <
143、 0 )</p><p><b> sec = 59;</b></p><p><b> break;</b></p><p><b> case 4:</b></p><p> if (--min < 0 )</p><p><
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子時(shí)鐘 課程設(shè)計(jì)
- 電子時(shí)鐘課程設(shè)計(jì)
- 電子時(shí)鐘課程設(shè)計(jì)
- 課程設(shè)計(jì)--電子時(shí)鐘
- 課程設(shè)計(jì)----電子時(shí)鐘設(shè)計(jì)
- 電子時(shí)鐘課程設(shè)計(jì)--數(shù)字電子時(shí)鐘焊接調(diào)試報(bào)告
- 電子時(shí)鐘接口課程設(shè)計(jì)
- 電子時(shí)鐘課程設(shè)計(jì) (2)
- 電子時(shí)鐘課程設(shè)計(jì)2
- led電子時(shí)鐘課程設(shè)計(jì)
- 電子時(shí)鐘課程設(shè)計(jì)報(bào)告
- eda課程設(shè)計(jì)---電子時(shí)鐘
- 電子時(shí)鐘課程設(shè)計(jì) (2)
- 數(shù)字電子時(shí)鐘課程設(shè)計(jì)
- 數(shù)字電子時(shí)鐘課程設(shè)計(jì)
- eda課程設(shè)計(jì)--電子時(shí)鐘
- 電子時(shí)鐘課程設(shè)計(jì)--proteus環(huán)境下的電子時(shí)鐘設(shè)計(jì)
- 電子時(shí)鐘課程設(shè)計(jì)(論文)
- 數(shù)字電子時(shí)鐘課程設(shè)計(jì)
- 電子時(shí)鐘課程設(shè)計(jì) (3)
評(píng)論
0/150
提交評(píng)論