2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩38頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論