版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 單片機(jī)課程實(shí)驗(yàn)報(bào)告</b></p><p> 班 級(jí) J計(jì)算機(jī)1302 </p><p> 學(xué) 號(hào) 4131110037 </p><p> 姓 名 楊嵐 </p><p> 指導(dǎo)老師 余景華
2、 </p><p> 2016.07.09</p><p> 多功能數(shù)字鐘的設(shè)計(jì)要求:</p><p> 1.能在LED顯示器上實(shí)現(xiàn)正常的時(shí)分秒計(jì)時(shí)</p><p> 2.能通過(guò)鍵盤輸入當(dāng)前時(shí)間,并從該時(shí)間開始計(jì)時(shí)</p><p> 3.有校時(shí)、校分功能</p><p>
3、 4.有報(bào)時(shí)功能,通過(guò)指示燈表示</p><p> 5.有鬧時(shí)功能,鬧時(shí)時(shí)間可以設(shè)定,通過(guò)指示燈表示</p><p> 二、課程設(shè)計(jì)電路圖:</p><p><b> 圖1 設(shè)計(jì)電路圖</b></p><p> ?HD7279A的片選引腳CS連在P5.7;</p><p>
4、3;通過(guò)C8051F020的P1.6、P1.7連接7279A的CLK和DATA實(shí)現(xiàn)串行數(shù)據(jù)編程;</p><p> ?KEY連在比較器1的同相輸入端CP1P</p><p><b> 三、設(shè)計(jì)思路:</b></p><p> 根據(jù)課程設(shè)計(jì)要求,我們要設(shè)計(jì)一個(gè)多功能數(shù)字電子時(shí)鐘,隨著人類科技文明的發(fā)展,高精度、多功能、小體積、低功耗,是現(xiàn)代
5、時(shí)鐘發(fā)展的趨勢(shì)。在這種趨勢(shì)下,時(shí)鐘的數(shù)字化、多功能化已經(jīng)成為現(xiàn)代時(shí)鐘生產(chǎn)研究的主導(dǎo)設(shè)計(jì)方向。本實(shí)驗(yàn)正是基于這種設(shè)計(jì)方向,以單片機(jī)(C8051F020)為控制核心,設(shè)計(jì)制作一個(gè)多功能的數(shù)字時(shí)鐘。在這些當(dāng)中,必須要求要有時(shí)鐘功能、校時(shí)校分功能、整點(diǎn)報(bào)時(shí)和鬧鐘功能等。</p><p> 1.1首先要實(shí)現(xiàn)數(shù)碼管的正常時(shí)分秒計(jì)時(shí)必須初始化系統(tǒng)時(shí)鐘,初始化I/O端口以及定時(shí)器和使能比較器等,為系統(tǒng)的運(yùn)行做必要的準(zhǔn)備。<
6、;/p><p> 1.2其次通過(guò)鍵盤輸入當(dāng)前時(shí)間并從當(dāng)前時(shí)間開始計(jì)時(shí),這個(gè)過(guò)程中搞清楚,通過(guò)鍵盤輸入的數(shù)據(jù)送到了哪里,是通過(guò)什么樣的方式送進(jìn)去的,同時(shí)對(duì)時(shí)間的計(jì)時(shí)有一個(gè)嚴(yán)密的算法來(lái)控制。</p><p> 1.3在時(shí)間通過(guò)鍵盤輸入并正常顯示后,可以通過(guò)按鍵來(lái)進(jìn)行校時(shí)、校分的功能。并顯示出校正后的時(shí)間</p><p> 1.4通過(guò)按鍵實(shí)現(xiàn)鬧鐘功能,在設(shè)置鬧鐘的同時(shí),
7、原時(shí)間能確保正確行走。</p><p> 7279指令說(shuō)明:88H,閃爍控制指令,d1-d8對(duì)應(yīng)8個(gè)數(shù)碼管,0表示閃爍,1表示不閃爍。</p><p><b> 開始</b></p><p> 輸入按鍵(ABCD) 輸入按鍵(F) 當(dāng)達(dá)到整點(diǎn)時(shí),</p><p> A (校時(shí)
8、的高位) F(輸入鬧鐘) 數(shù)碼管閃爍3秒</p><p> B(校時(shí)的低位) 當(dāng)當(dāng)前時(shí)間與鬧鐘時(shí)間相等時(shí),</p><p> C(校分的高位) 數(shù)碼管閃爍2秒。</p><p><b> D(校分的低位)</b></p><p><b> 圖
9、2 功能模塊圖</b></p><p> ?輸入按鍵A使得時(shí)鐘的時(shí)高位加1,若時(shí)高位值超過(guò)2則返回0值。</p><p> ?輸入按鍵B使得時(shí)鐘的時(shí)低位加1,若時(shí)低位值超過(guò)9則返回0值同時(shí)時(shí)高位加1,最后判斷時(shí)高位>1且時(shí)低位>3則時(shí)高位=0,時(shí)低位0。</p><p> ?輸入按鍵C使得時(shí)鐘的分高位加1,若分高位值超過(guò)5,則時(shí)低位加
10、1,分高位至0。</p><p> ?輸入按鍵D使得時(shí)鐘的分低位加1,若分低位值超過(guò)9,則分高位加1,分低位至0。</p><p> ?輸入按鍵E使得時(shí)鐘的秒高位加1,若秒高位值超過(guò)5,則分低位加1,秒高位至0。</p><p> ?按鍵F進(jìn)入鬧鐘模塊。</p><p><b> 四、程序的結(jié)構(gòu)圖</b><
11、/p><p><b> 否</b></p><p><b> 是</b></p><p> 圖3 主程序流程圖</p><p> 五、具體功能模塊的設(shè)計(jì)及實(shí)現(xiàn):</p><p><b> 1、端口初始化:</b></p><p
12、> 將允許SMBus、SPI0和UART0,使能交叉開關(guān)和弱上拉。</p><p><b> 實(shí)現(xiàn)代碼:</b></p><p> void PORT_Init (void)</p><p><b> {</b></p><p> XBR0 = 0x07; //允許SMBu
13、s、SPI0和UART0</p><p> XBR1 = 0x00;</p><p> XBR2 = 0x44; //使能交叉開關(guān)和弱上拉</p><p><b> }</b></p><p><b> 定時(shí)器初始化</b></p><p> 將T0
14、以方式一,系統(tǒng)時(shí)鐘頻率計(jì)數(shù),1000個(gè)脈沖為一秒。</p><p><b> 實(shí)現(xiàn)代碼:</b></p><p> void Timer0_Init (void)</p><p><b> {</b></p><p> CKCON|=0x8; //T0按系統(tǒng)時(shí)鐘頻率計(jì)數(shù)</p&g
15、t;<p> TMOD|=0x1; //T0方式1</p><p> Count1ms=10;</p><p> TR0 = 0; //停止T0</p><p> TH0 = (-SYSCLK/1000) >> 8; //定時(shí)1ms的時(shí)間常數(shù)</p><p> TL0 = -SY
16、SCLK/1000;</p><p> TR0 = 1; //啟動(dòng)T0</p><p> IE|= 0x2; //開T0中斷</p><p><b> }</b></p><p><b> 讀取按鍵值</b></p><p> 首先需要判斷是
17、否按鍵,若未按鍵則返回-1,若按鍵則記錄保存按鍵的值,將其放在keyvalue中保存。</p><p><b> 實(shí)現(xiàn)代碼:</b></p><p> unsigned char GetKeyValue(void)</p><p><b> {</b></p><p> unsigned c
18、har KeyValue;</p><p> if(CPT1CN&0x40) return -1;//if (P17==1) return -1;//無(wú)鍵按下 </p><p> Send7279Byte(0x15);//發(fā)讀鍵盤命令 </p><p> KeyValue=Receive7279Byte();</p><p>
19、; NOSELECT7279; </p><p> return KeyValue; </p><p><b> }</b></p><p><b> 否</b></p><p><b> 是</b></p><p> 圖4 讀取
20、按鍵值流程圖</p><p> 首次啟動(dòng)程序時(shí)輸入初始時(shí)間</p><p> 首先在顯示器上顯示-,提示程序開始運(yùn)行,其后將按鍵進(jìn)來(lái)的六個(gè)數(shù)字依次保存在num中(若按鍵不是0-9則無(wú)效),然后再顯示器上顯示。</p><p><b> 實(shí)現(xiàn)代碼:</b></p><p> unsigned long InputN
21、um(void)</p><p><b> {</b></p><p> unsigned long Num=0;</p><p> unsigned char i=0, KeyValue;</p><p> DispLED(" -",0);//輸入提示</p><
22、p> FlashLED(0); //第一位閃爍</p><p> Delay1s(1);</p><p><b> while(1)</b></p><p><b> {</b></p><p> KeyValue=GetKeyValue();</p><p
23、> if (i==6) //6位數(shù)據(jù)輸入完,返回</p><p><b> {</b></p><p> FlashLED(8);//關(guān)閃爍</p><p> return Num;</p><p><b> }</b></p><p>
24、 if((KeyValue>=0) && (KeyValue<=9)) //只接收十進(jìn)制的0到9</p><p><b> {</b></p><p><b> i++;</b></p><p> Send7279Byte(0xC8); //發(fā)送鍵碼值,按方式1譯碼下載顯示 <
25、/p><p> Send7279Byte(KeyValue);</p><p> MoveLeft(); //顯示并左移一位,仍使低位顯示并閃爍。</p><p> Send7279Byte(0x90);</p><p> Send7279Byte(0x01);</p><p> NOSELE
26、CT7279; </p><p> WaitKeyOff();</p><p> Num*=10; //轉(zhuǎn)換成十進(jìn)制</p><p> Num+=KeyValue;</p><p> Delay1ms(200);</p><p><b> } </b>
27、;</p><p><b> } </b></p><p><b> } </b></p><p><b> 顯示功能</b></p><p> 依次將小時(shí)的十位、個(gè)位,分鐘的十位、個(gè)位,秒鐘的十位、個(gè)位顯示在顯示器的相應(yīng)LED上。</p>&l
28、t;p><b> 實(shí)現(xiàn)代碼:</b></p><p> void DispTime(void)</p><p><b> { </b></p><p> Send7279Byte(0x85); //在最高位(第5位)LED顯示小時(shí)的高位</p><p> Send7279B
29、yte(HourH);</p><p> Send7279Byte(0x84); //在第4位LED顯示小時(shí)的低位</p><p> Send7279Byte(HourL);</p><p> Send7279Byte(0x83); //在第3位LED顯示分鐘的高位</p><p> Send7279Byte(Mi
30、nuteH);</p><p> Send7279Byte(0x82); //在第2位LED顯示分鐘的低位</p><p> Send7279Byte(MinuteL);</p><p> Send7279Byte(0x81); //在第1位LED顯示秒鐘的高位</p><p> Send7279Byte(Seco
31、ndH);</p><p> Send7279Byte(0x80); //在第0位LED顯示秒鐘的低位</p><p> Send7279Byte(SecondL);</p><p><b> }</b></p><p> 圖5 顯示功能流程圖</p><p><b>
32、 時(shí)鐘計(jì)時(shí)功能</b></p><p> 每接受1000次脈沖,保存秒鐘個(gè)位值的SecondL加一,判斷如果SecondL>9,則SecondL=0,SecondH加一。再判斷SecondH是否大于5,若SecondH>5,則SecondH=0,MinuteL加一。再判斷MinuteL是否大于9,若MinuteL>9,則MinuteL=0,MinuteH加一。再判斷MinuteH是
33、否大于5,若MinuteH>5,則MinuteH=0,HourL加一。再判斷HourL是否大于9,若HourL>9,則HourL=0,HourH加一。再判斷HourH是否大于2,若HourH>2,則HourH=0。最后判斷HourH>1且HourL>3則HourH=0,HourL=0。</p><p><b> 實(shí)現(xiàn)代碼:</b></p><
34、;p> SecondL++;</p><p> if (SecondL>9) {SecondH++,SecondL=0;}</p><p> if(SecondH>5){SecondH=0,MinuteL++; }</p><p> if (MinuteL>9) {MinuteH++,MinuteL=0;}</p>&l
35、t;p> if(MinuteH>5){MinuteH=0,HourL++; }</p><p> if(HourL>9) {HourH++;HourL=0;}</p><p> if(HourH>2) HourH=0;</p><p> if(HourH>1&HourL>3){HourH=0,HourL=0;}&l
36、t;/p><p><b> 校時(shí)校分功能</b></p><p> 根據(jù)按鍵來(lái)判斷運(yùn)行,若按鍵是A,則執(zhí)行HourH+1的操作。若按鍵是B,則執(zhí)行HourL+1的操作。若按鍵是C,則執(zhí)行MinuteH+1操作。若按鍵是D,則執(zhí)行MinuteL+1操作。若按鍵是E,則執(zhí)行SecondH+1操作。</p><p><b> 實(shí)現(xiàn)代碼:&
37、lt;/b></p><p> if(KeyValue==10){HourH++;}</p><p> if(KeyValue==11){HourL++;}</p><p> if(KeyValue==12){MinuteH++;}</p><p> if(KeyValue==13){MinuteL++;}</p>
38、<p><b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p><
39、p><b> 是</b></p><p><b> 是</b></p><p> 圖7 校時(shí)校分功能流程圖</p><p><b> 整點(diǎn)報(bào)時(shí)功能</b></p><p> 在SecondL在0到3之間時(shí)并且SecondH=、MinuteL=0、MinuteH
40、=0時(shí)顯示器內(nèi)容閃爍表示報(bào)時(shí)。SecondL超過(guò)3后取消閃爍,回復(fù)正常。</p><p><b> 實(shí)現(xiàn)代碼</b></p><p> if((SecondL>=0&&SecondL<=3)&SecondH==0&MinuteL==0&MinuteH==0)</p><p> {Send
41、7279Byte(0x88);Send7279Byte(0x00);}</p><p> if((SecondL>3)&SecondH==0&MinuteL==0&MinuteH==0)</p><p> {FlashLED(8);}</p><p><b> 否</b></p><p&g
42、t;<b> 是</b></p><p><b> 否</b></p><p> 圖8 整理報(bào)時(shí)功能流程圖</p><p><b> 鬧鐘功能</b></p><p> 在按鍵為F的時(shí)候進(jìn)入鬧鐘模式。輸入設(shè)定時(shí)間,系統(tǒng)保存設(shè)定的時(shí)間,并在計(jì)時(shí)的每秒上面與保存的時(shí)間進(jìn)行
43、比較,若一致,則顯示器閃爍,時(shí)間暫停計(jì)時(shí),表示鬧鐘。</p><p><b> 實(shí)現(xiàn)代碼:</b></p><p> KeyValue=GetKeyValue();</p><p> if(KeyValue==15)</p><p><b> {</b></p><p&
44、gt; SetTime=InputNum();</p><p> NowTime[0]=(unsigned char)((SetTime/100000)<<4);//時(shí)</p><p> SetTime=SetTime%100000;</p><p> NowTime[0]=NowTime[0]|(SetTime/10000);</p>
45、;<p> SetTime=SetTime%10000;</p><p> NowTime[1]=(unsigned char)((SetTime/1000)<<4);//分</p><p> SetTime=SetTime%1000;</p><p> NowTime[1]=NowTime[1]|(SetTime/100);<
46、;/p><p> SetTime=SetTime%100;</p><p> NowTime[2]=(unsigned char)((SetTime/10)<<4);//秒</p><p> SetTime=SetTime%10;</p><p> NowTime[2]=NowTime[2]|SetTime;</p>
47、;<p> S[0]=NowTime[0]/16;//轉(zhuǎn)換成10進(jìn)制</p><p> S[1]=NowTime[0]%16;</p><p> S[2]=NowTime[1]/16;</p><p> S[3]=NowTime[1]%16;</p><p> S[4]=NowTime[2]/16;</p>
48、<p> S[5]=NowTime[2]%16;</p><p><b> }</b></p><p> if(SecondL==S[5]&&SecondH==S[4]&&MinuteL==S[3]&&MinuteH==S[2]&&HourL==S[1]&&HourH=
49、=S[0])</p><p><b> {</b></p><p> Send7279Byte(0x88);</p><p> Send7279Byte(0x00);</p><p> a=SecondL;</p><p><b> a=a+2;</b></p
50、><p><b> }</b></p><p> if (a==SecondL) </p><p> FlashLED(8);</p><p><b> 否 </b></p><p><b> 是</b></p><p>
51、<b> 是</b></p><p> 否 否 </p><p><b> 是</b></p><p> 圖9 鬧鐘功能流程圖</p><p> 顯示指針DisplLED所指6個(gè)單元數(shù)據(jù)流程圖:</p><p><b>
52、 否</b></p><p><b> 是</b></p><p><b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p><p><b> 是<
53、;/b></p><p> 否 否</p><p><b> 是</b></p><p><b> 是</b></p><p> 圖10 顯示指針DisplLED所指6個(gè)單元數(shù)據(jù)流程圖</p><p>
54、;<b> 六、實(shí)驗(yàn)小結(jié):</b></p><p> 本次課程設(shè)計(jì)的基本要求是實(shí)現(xiàn)多功能時(shí)鐘具備整點(diǎn)報(bào)時(shí),校時(shí)校分的功能以及鬧鐘功能。整點(diǎn)報(bào)時(shí)模塊實(shí)現(xiàn)的是當(dāng)時(shí)間達(dá)到整點(diǎn)時(shí),數(shù)碼管開始閃爍,并閃爍4秒。校時(shí)校分模塊實(shí)現(xiàn)的是當(dāng)按下ABCD四個(gè)按鍵的任意一個(gè),相對(duì)應(yīng)的時(shí)分位會(huì)通過(guò)自加來(lái)實(shí)現(xiàn)校時(shí)校分。鬧鐘模塊實(shí)現(xiàn)的是當(dāng)時(shí)間達(dá)到設(shè)定的時(shí)間時(shí),數(shù)碼管開始閃爍,并閃爍2秒。</p>&l
55、t;p> 在這一個(gè)星期的時(shí)間里,我經(jīng)歷從迷茫到清晰的全過(guò)程,首先要分析好自己的設(shè)計(jì)目的及要求,在設(shè)計(jì)程序前不一定要有一個(gè)清晰的思路和一個(gè)完整的流程圖,并且學(xué)會(huì)單步調(diào)試來(lái)找錯(cuò)誤。這就好比是人類成長(zhǎng)的過(guò)程,常有一些不如意和挫折,但只要勇于挑戰(zhàn)勇于去嘗試總能找到解決的方法。在這學(xué)期的課程序設(shè)計(jì)中,收獲知識(shí)的同時(shí),還收獲了閱歷,收獲了成熟,通過(guò)查找大量資料,請(qǐng)教老師,以及不懈的努力,不僅培養(yǎng)了獨(dú)立思考、 動(dòng)手制作的能力,在各種其它能力上
56、也都有了提高。更重要的是,在課程序設(shè)計(jì)里,我也學(xué)會(huì)了很多學(xué)習(xí)的方法,知道了理論和實(shí)踐的巨大差別。而這是以后最實(shí)用的,真的是受益匪淺。要面對(duì)社會(huì)的挑戰(zhàn),只有不斷的學(xué)習(xí)、實(shí)踐,再學(xué)習(xí)、再實(shí)踐。同時(shí)在與老師和同學(xué)幫助下將知識(shí)融會(huì)貫通且通過(guò)自己的努力設(shè)計(jì)了一個(gè)數(shù)字時(shí)鐘,這也激起了我的學(xué)習(xí)興趣和開發(fā)創(chuàng)新思維,讓我懂得了學(xué)習(xí)的重要性,了解到理論知識(shí)與實(shí)踐相結(jié)合的重要性,學(xué)會(huì)了堅(jiān)持。這將為自己今后的學(xué)習(xí)和工作作出了最好的榜樣。再次感謝老師的熱心指導(dǎo),
57、沒(méi)有老師的指導(dǎo)我們不可能完成。</p><p><b> 七、附錄</b></p><p> #include <c8051f020.h> </p><p> #include <intrins.h></p><p> //*****軟件仿真I2C總線與HD7279A連接的兩根并行口線**
58、***//</p><p> sbit HD7279_DAT=P1^7;</p><p> sbit HD7279_CLK=P1^6;</p><p> //*****宏定義,HD7279A片選信號(hào)、數(shù)據(jù)信號(hào)和時(shí)鐘信號(hào)定義*****//</p><p> #define NOSELECT7279 P5 |= 0x80 //
59、P5^7接片選信號(hào),選種</p><p> #define SELECT7279 P5 &= ~(0x80) //未選種</p><p> #define Set7279DAT HD7279_DAT=1 //數(shù)據(jù)線置1</p><p> #define Clr7279DAT HD7279_DAT=0 //數(shù)據(jù)線置0</p
60、><p> #define Set7279CLK HD7279_CLK=1 //時(shí)鐘高電平</p><p> #define Clr7279CLK HD7279_CLK=0 //時(shí)鐘底電平</p><p> unsigned char Count1ms;</p><p> unsigned char xdata Now
61、Time[3]; //當(dāng)前時(shí)間,用于當(dāng)前時(shí)間的設(shè)置</p><p> unsigned char xdata Hour,HourH,HourL,Minute,MinuteH,MinuteL,SecondH,SecondL;</p><p> unsigned char xdata S[6];</p><p> //*****對(duì)所調(diào)用其它文件中函數(shù)的聲明****
62、*//</p><p> void Delay1ms(unsigned char T); //延時(shí)T毫秒</p><p> void Delay1s(unsigned char T); //延時(shí)T秒</p><p> void Delay1us(unsigned char T); //延時(shí)T微秒</p><p> //****
63、*仿真I2C總線時(shí)序發(fā)送一字節(jié)*****//</p><p> void SYSCLK_Init (void)</p><p><b> {</b></p><p> int i; </p><p> OSCXCN = 0x67; //外部晶振22.
64、1184MHz</p><p> for (i=0; i < 256; i++) ; </p><p> while (!(OSCXCN & 0x80)) ; //等待外部晶振穩(wěn)定</p><p> OSCICN = 0x88; //選擇外部晶振作系統(tǒng)時(shí)鐘源,允許時(shí)鐘丟失檢測(cè)</p><p><b>
65、 }</b></p><p> //*****端口初始化*****//</p><p> void PORT_Init (void)</p><p><b> {</b></p><p> //XBR0 = 0x07; //允許SMBus、SPI0和UART0</p><
66、p> XBR1 = 0x00;</p><p> XBR2 = 0x44; //使能交叉開關(guān)和弱上拉</p><p><b> }</b></p><p> //*****定時(shí)器T0初始化*****//</p><p> void Timer0_Init (void)</p>
67、<p><b> {</b></p><p> CKCON|=0x8; //T0按系統(tǒng)時(shí)鐘頻率計(jì)數(shù)</p><p> TMOD|=0x1; //T0方式1</p><p> Count1ms=10;</p><p> TR0 = 0; //停止T0</p>
68、<p> TH0 = (-SYSCLK/1000) >> 8; //定時(shí)1ms的時(shí)間常數(shù)</p><p> TL0 = -SYSCLK/1000;</p><p> TR0 = 1; //啟動(dòng)T0</p><p> IE|= 0x2; //開T0中斷</p><p><b>
69、; }</b></p><p> //*****定時(shí)器T0中斷服務(wù)程序(每隔1ms中斷1次) *****//</p><p> void Timer0_ISR (void) interrupt 1</p><p><b> {</b></p><p> TH0 = (-SYSCLK/1000) &g
70、t;> 8; //重新裝入初值</p><p> TL0 = -SYSCLK/1000;</p><p> if (Count1ms) Count1ms--; //定時(shí)時(shí)間減1</p><p><b> }</b></p><p> //******延時(shí)Tμs(軟件實(shí)現(xiàn))******//</p
71、><p> void Delay1us(unsigned char T)</p><p><b> {</b></p><p><b> while (T)</b></p><p><b> {</b></p><p> _nop_(); _nop
72、_(); _nop_(); _nop_(); _nop_();</p><p><b> --T;</b></p><p><b> }</b></p><p><b> }</b></p><p> //******延時(shí)Tms(定時(shí)器T0實(shí)現(xiàn))******//<
73、/p><p> void Delay1ms(unsigned char T)</p><p><b> {</b></p><p> Count1ms=T;</p><p> while (Count1ms); //在T0中斷服務(wù)程序中減1</p><p><b> }</b
74、></p><p> //*****延時(shí)Ts(定時(shí)器T0實(shí)現(xiàn))******//</p><p> void Delay1s(unsigned char T) </p><p><b> {</b></p><p><b> while (T)</b></p><p&
75、gt;<b> {</b></p><p> Delay1ms(200);</p><p> Delay1ms(200);</p><p> Delay1ms(200);</p><p> Delay1ms(200);</p><p> Delay1ms(200);</p>
76、<p><b> T--;</b></p><p><b> }</b></p><p><b> }</b></p><p> void Send7279Byte(unsigned char ch)</p><p><b> {</b
77、></p><p><b> char i;</b></p><p> SELECT7279; //置CS低電平 </p><p> Delay1us(50);//延時(shí)50μ</p><p> for (i=0;i<8;i++)</p><p><b>
78、 {</b></p><p> if (ch&0x80)//輸出1位到HD7279A的DATA端 </p><p> Set7279DAT;</p><p><b> else</b></p><p> Clr7279DAT;</p><p> Set7279CL
79、K;</p><p> ch=ch<<1;//待發(fā)數(shù)據(jù)左移 </p><p> Delay1us(8);</p><p> Clr7279CLK; </p><p> Delay1us(8);</p><p><b> }</b></p><
80、p> Clr7279DAT;//發(fā)送完畢,DATA端置低,返回 </p><p><b> }</b></p><p> //*****仿真I2C總線時(shí)序接收一字節(jié)*****//</p><p> unsigned char Receive7279Byte(void)</p><p><b>
81、 {</b></p><p> unsigned char i,ch=0;</p><p> Set7279DAT;//DATA端置為高電平(輸入狀態(tài))</p><p> Delay1us(50);</p><p> for (i=0;i<8;i++)</p><p><b&
82、gt; {</b></p><p> Set7279CLK;</p><p> Delay1us(8);</p><p> ch=ch<<1;//接收數(shù)據(jù)左移1位</p><p> if (HD7279_DAT) ch+=1;//接收1位數(shù)據(jù)</p><p> Clr72
83、79CLK;</p><p> Delay1us(8);</p><p><b> }</b></p><p> Clr7279DAT;//接收完畢,DATA端重新置成低電平(輸出狀態(tài))</p><p> return ch;</p><p><b> }</
84、b></p><p> //*****讓第No(0到5)位LED閃爍*****//</p><p> void FlashLED(unsigned char No)</p><p><b> {</b></p><p> unsigned char i;</p><p> Send
85、7279Byte(0x88);//發(fā)閃爍指令 </p><p><b> i=0x01;</b></p><p> while (No) //將1移到第No位</p><p><b> {</b></p><p><b> i=i<<1;</
86、b></p><p><b> No--;</b></p><p><b> }</b></p><p> Send7279Byte(~i); //0閃爍、1不閃爍</p><p> NOSELECT7279; </p><p><b>
87、; } </b></p><p> //******HD7279A左移命令*****//</p><p> void MoveLeft(void)</p><p><b> {</b></p><p> Send7279Byte(0xA1);//發(fā)左移指令 </p><p>
88、; NOSELECT7279; </p><p><b> }</b></p><p> //******采用不譯碼方式顯示時(shí)數(shù)字0到F的段碼******//</p><p> unsigned char code BdSeg[]={</p><p> 0x7e,0x30,0x6d,0x79, //
89、0 1 2 3 </p><p> 0x33,0x5b,0x5f,0x70, // 4 5 6 7</p><p> 0x7f,0x7b,0x77,0x1f, // 8 9 a b</p><p> 0x4e,0x3d,0x4f,0x47, // c d e f</p><p> 0x00,0x01}; </p><
90、;p> //*顯示指針DispBuf所指6個(gè)單元數(shù)據(jù),點(diǎn)亮第ShowDot(1到6)個(gè)LED的小數(shù)點(diǎn)*//</p><p> void DispLED(unsigned char *DispBuf,unsigned char ShowDot) </p><p><b> {</b></p><p> char i,ch;</
91、p><p> ShowDot--;</p><p> for (i=0;i<6;i++)</p><p><b> {</b></p><p> ch=DispBuf[i]; //取一字符</p><p> if ((ch>='a') &
92、;& (ch<='f')) //轉(zhuǎn)換成數(shù)字</p><p><b> {</b></p><p> ch-='a';ch+=0xa;</p><p><b> }</b></p><p> if ((ch>='A') &a
93、mp;& (ch<='F'))</p><p><b> {</b></p><p> ch-='A';ch+=0xa;</p><p><b> }</b></p><p> Send7279Byte(0x90+5-i);//用不譯碼方式顯示
94、在第i位</p><p> if (ch==' ') //發(fā)送不譯碼方式顯示命令的第2字節(jié)</p><p> Send7279Byte(0x00); </p><p><b> else</b></p><p> if (ch=='-')</p&g
95、t;<p> Send7279Byte(0x01); </p><p><b> else </b></p><p><b> {</b></p><p> if (ShowDot==i) //查表顯示,同時(shí)點(diǎn)亮小數(shù)點(diǎn)</p><p> Send7279Byte(0x80|
96、BdSeg[ch&0x0f]); </p><p><b> else</b></p><p> Send7279Byte(BdSeg[ch&0x0f]); </p><p><b> }</b></p><p><b> }</b></p>
97、<p> NOSELECT7279; //置CS高電平 </p><p><b> }</b></p><p> //*****讀取按鍵值*****//</p><p> unsigned char GetKeyValue(void)</p><p><b> {</b&
98、gt;</p><p> unsigned char KeyValue;</p><p> if(CPT1CN&0x40) return -1;//if (P17==1) return -1;//無(wú)鍵按下 </p><p> Send7279Byte(0x15);//發(fā)讀鍵盤命令 </p><p> KeyValue=Re
99、ceive7279Byte();</p><p> NOSELECT7279; </p><p> return KeyValue; </p><p><b> }</b></p><p> //***等待按鍵釋放,用C8051F020的比較器硬件檢測(cè),也可以用軟件延時(shí)實(shí)現(xiàn)***//</p>
100、<p> void WaitKeyOff(void)</p><p><b> {</b></p><p> while (!(CPT1CN&0x40));</p><p><b> }</b></p><p> //*****顯示任意長(zhǎng)整型數(shù)據(jù)*****//<
101、;/p><p> void DispValue(unsigned long xx)</p><p><b> {</b></p><p> unsigned char buf[6];</p><p> buf[0]=(xx%1000000)/100000; //最高位</p><p> b
102、uf[1]=(xx%100000)/10000;</p><p> buf[2]=(xx%10000)/1000;</p><p> buf[3]=(xx%1000)/100;</p><p> buf[4]=(xx%100)/10;</p><p> buf[5]=(xx%10); //最低位</p><p&g
103、t; DispLED(buf,0); //調(diào)用顯示函數(shù),所有小數(shù)點(diǎn)都不點(diǎn)亮</p><p><b> }</b></p><p> //**從鍵盤讀取6位數(shù)據(jù),用于存儲(chǔ)時(shí)間,格式是HHMMSS,所讀數(shù)據(jù)轉(zhuǎn)換成長(zhǎng)整型**//</p><p> unsigned long InputNum(void)</p><p&g
104、t;<b> {</b></p><p> unsigned long Num=0;</p><p> unsigned char i=0, KeyValue;</p><p> DispLED(" -",0);//輸入提示</p><p> FlashLED(0); //第一
105、位閃爍</p><p> Delay1s(1);</p><p><b> while(1)</b></p><p><b> {</b></p><p> KeyValue=GetKeyValue();</p><p> if (i==6) //
106、6位數(shù)據(jù)輸入完,返回</p><p><b> {</b></p><p> FlashLED(8);//關(guān)閃爍</p><p> return Num;</p><p><b> }</b></p><p> if((KeyValue>=0) &&
107、amp; (KeyValue<=9)) //只接收十進(jìn)制的0到9</p><p><b> {</b></p><p><b> i++;</b></p><p> Send7279Byte(0xC8); //發(fā)送鍵碼值,按方式1譯碼下載顯示 </p><p> Send7279
108、Byte(KeyValue);</p><p> MoveLeft(); //顯示并左移一位,仍使低位顯示并閃爍。</p><p> Send7279Byte(0x90);</p><p> Send7279Byte(0x01);</p><p> NOSELECT7279; </p>&
109、lt;p> WaitKeyOff();</p><p> Num*=10; //轉(zhuǎn)換成十進(jìn)制</p><p> Num+=KeyValue;</p><p> Delay1ms(200);</p><p><b> } </b></p><p><b
110、> } </b></p><p><b> }</b></p><p> void DispTime(void)</p><p><b> { </b></p><p> Send7279Byte(0x85); //在最高位(第5位)LED顯示小時(shí)的高位&
111、lt;/p><p> Send7279Byte(HourH);</p><p> Send7279Byte(0x84); //在第4位LED顯示小時(shí)的低位</p><p> Send7279Byte(HourL);</p><p> Send7279Byte(0x83); //在第3位LED顯示分鐘的高位</p&
112、gt;<p> Send7279Byte(MinuteH);</p><p> Send7279Byte(0x82); //在第2位LED顯示分鐘的低位</p><p> Send7279Byte(MinuteL);</p><p> Send7279Byte(0x81); //在第1位LED顯示秒鐘的高位</p>
113、;<p> Send7279Byte(SecondH);</p><p> Send7279Byte(0x80); //在第0位LED顯示秒鐘的低位</p><p> Send7279Byte(SecondL);</p><p><b> }</b></p><p> void main
114、(void)</p><p><b> { </b></p><p> unsigned long CurrentTime=0;</p><p> unsigned char i=0,a=0;</p><p> unsigned long SetTime=0;</p><p> uns
115、igned char KeyValue;</p><p> WDTCN = 0xde; //關(guān)看門狗</p><p> WDTCN = 0xad; </p><p> SYSCLK_Init(); //初始化系統(tǒng)時(shí)鐘</p><p> PORT_Init();
116、 //初始化I/O口</p><p> Timer0_Init(); //初始化定時(shí)器 </p><p> CPT1CN|=0x80; //使能比較器1</p><p> ET0 =1; //開定時(shí)器0中斷</p><p> EA=1; //開總體中斷<
117、;/p><p> //Delay1ms(25); //7279上電復(fù)位的延時(shí)時(shí)間</p><p> //Send7279Byte(0xA4); //7279復(fù)位</p><p> do { //從鍵盤輸入時(shí)間,格式HHMMSS</p><p> CurrentTime=Inp
118、utNum();</p><p> DispValue(CurrentTime);</p><p> NowTime[0]=(unsigned char)((CurrentTime/100000)<<4);//時(shí)</p><p> CurrentTime=CurrentTime%100000;</p><p> NowTi
119、me[0]=NowTime[0]|(CurrentTime/10000);</p><p> CurrentTime=CurrentTime%10000;</p><p> NowTime[1]=(unsigned char)((CurrentTime/1000)<<4);//分</p><p> CurrentTime=CurrentTime%1
120、000;</p><p> NowTime[1]=NowTime[1]|(CurrentTime/100);</p><p> CurrentTime=CurrentTime%100;</p><p> NowTime[2]=(unsigned char)((CurrentTime/10)<<4);//秒</p><p>
121、 CurrentTime=CurrentTime%10;</p><p> NowTime[2]=NowTime[2]|CurrentTime;</p><p> }while ((NowTime[0]>0x24)|(NowTime[1]>0x59)|(NowTime[2]>0x59));</p><p> HourH=NowTime[0]/
122、16;//轉(zhuǎn)換成10進(jìn)制</p><p> HourL=NowTime[0]%16;</p><p> MinuteH=NowTime[1]/16;</p><p> MinuteL=NowTime[1]%16;</p><p> SecondH=NowTime[2]/16;</p><p> SecondL
123、=NowTime[2]%16;</p><p><b> while(1)</b></p><p><b> {</b></p><p> Delay1s(1);</p><p> SecondL++;</p><p> if (SecondL>9) {Sec
124、ondH++,SecondL=0;}</p><p> if(SecondH>5){SecondH=0,MinuteL++; }</p><p> if (MinuteL>9) {MinuteH++,MinuteL=0;}</p><p> if(MinuteH>5){MinuteH=0,HourL++; }</p><p
125、> if(HourL>9) {HourH++;HourL=0;}</p><p> if(HourH>2) HourH=0;</p><p> if(HourH>1&HourL>3){HourH=0,HourL=0;}</p><p><b> //校時(shí)校分功能</b></p><
126、;p> if(KeyValue==10){HourH++;}</p><p> if(KeyValue==11){HourL++;}</p><p> if(KeyValue==12){MinuteH++;}</p><p> if(KeyValue==13){MinuteL++;}</p><p><b> //整
127、點(diǎn)報(bào)時(shí)功能</b></p><p> if((SecondL>=0&&SecondL<=3)&SecondH==0&MinuteL==0&MinuteH==0)</p><p> {Send7279Byte(0x88);Send7279Byte(0x00);}</p><p> if((Secon
128、dL>3)&SecondH==0&MinuteL==0&MinuteH==0)</p><p> {FlashLED(8);}</p><p> DispTime(); //顯示實(shí)時(shí)時(shí)間</p><p><b> //鬧鐘功能</b></p><p> KeyValue=Ge
129、tKeyValue();</p><p> if(KeyValue==15)</p><p><b> {</b></p><p> SetTime=InputNum();</p><p> NowTime[0]=(unsigned char)((SetTime/100000)<<4);//時(shí)<
130、;/p><p> SetTime=SetTime%100000;</p><p> NowTime[0]=NowTime[0]|(SetTime/10000);</p><p> SetTime=SetTime%10000;</p><p> NowTime[1]=(unsigned char)((SetTime/1000)<<
131、;4);//分</p><p> SetTime=SetTime%1000;</p><p> NowTime[1]=NowTime[1]|(SetTime/100);</p><p> SetTime=SetTime%100;</p><p> NowTime[2]=(unsigned char)((SetTime/10)<&
132、lt;4);//秒</p><p> SetTime=SetTime%10;</p><p> NowTime[2]=NowTime[2]|SetTime;</p><p> S[0]=NowTime[0]/16;//轉(zhuǎn)換成10進(jìn)制</p><p> S[1]=NowTime[0]%16;</p><p>
133、S[2]=NowTime[1]/16;</p><p> S[3]=NowTime[1]%16;</p><p> S[4]=NowTime[2]/16;</p><p> S[5]=NowTime[2]%16;</p><p><b> }</b></p><p> if(Second
134、L==S[5]&&SecondH==S[4]&&MinuteL==S[3]&&MinuteH==S[2]&&HourL==S[1]&&HourH==S[0])</p><p><b> {</b></p><p> Send7279Byte(0x88);</p><
135、p> Send7279Byte(0x00);</p><p> a=SecondL;</p><p><b> a=a+2;</b></p><p><b> }</b></p><p> if (a==SecondL) </p><p> FlashLED
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)多功能電子數(shù)字鐘課程設(shè)計(jì)報(bào)告
- 單片機(jī)數(shù)字鐘課程設(shè)計(jì)
- 單片機(jī)數(shù)字鐘課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---數(shù)字鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--基于單片機(jī)數(shù)字鐘的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--- 簡(jiǎn)易數(shù)字鐘
- 單片機(jī)課程設(shè)計(jì)數(shù)字鐘
- 基于單片機(jī)的數(shù)字鐘課程設(shè)計(jì)
- 簡(jiǎn)易數(shù)字鐘的單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字鐘電子鐘
- 多功能數(shù)字鐘課程設(shè)計(jì)
- 課程設(shè)計(jì)-- 多功能 數(shù)字鐘
- 基于單片機(jī)的數(shù)字鐘課程設(shè)計(jì)
- 課程設(shè)計(jì)--單片機(jī)控制的數(shù)字鐘
- 單片機(jī)課程設(shè)計(jì)報(bào)告-數(shù)字鐘的設(shè)計(jì)
- 課程設(shè)計(jì)--多功能數(shù)字鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--多功能數(shù)字電子鐘
- 單片機(jī)課程設(shè)計(jì)— 多功能數(shù)字電子鐘
- 單片機(jī)數(shù)字時(shí)鐘課程設(shè)計(jì)--單片機(jī)多功能電子鐘設(shè)計(jì)
- 基于單片機(jī)的多功能數(shù)字鐘的設(shè)計(jì)本科設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論