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

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論