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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  單片機原理及系統課程設計</p><p>  專 業:電氣工程及其自動化</p><p>  班 級: 電氣1001班 </p><p>  姓 名: </p><p>  學 號: </p><p>  

2、指導教師: </p><p>  2013 年 3 月 7 日</p><p><b>  摘要</b></p><p>  此設計以AT89C51單片機為核心控制元件,與數碼管和蜂鳴器和按鍵結合,在應用C語言來實現電子時鐘的顯示和調制功能。本次設計運用了KEIL和Protues仿真軟件來進行調試,并給出了完整的設計

3、電路和KEIL程序代碼,并畫出了編程的邏輯流程圖。通過調試和運行,最終完成了一個完整的電路仿真,其功能是實現時間和日歷的現實并且都能進行相應的調整,同時還能進行鬧鈴的設置并在達到預定的時間時鬧鈴。</p><p>  一、電子時鐘功能概述</p><p>  本次電子時鐘作品分由單片機部分、數碼管顯示部分、按鍵部分和蜂鳴器電路相互連接組成。這樣硬件部分就組成了一個電子時鐘的基本完整的電路。

4、電子時鐘的工作過程是:接通電源時時鐘開始工作,時鐘分為三個狀態:正常計時、顯示日歷、顯示鬧鈴,分別按下鬧鈴按鍵和日歷按鍵就可以顯示當前的日歷和設置的鬧鈴時間。在這三個狀態下按下設置鍵就可以對相應的狀態進行設置,同時對應的數碼管位開始閃爍,當按下調時鍵時就可以對相應的位進行調整,當再次切換相應的功能時數碼管就停止閃爍,同時設置完成。當時間到達鬧鈴設置時間視蜂鳴器就會響起并響一分鐘結束。</p><p><b&

5、gt;  二、硬件電路和資料</b></p><p>  1、AT89C51單片機</p><p>  本設計采用 Atmel公司生產的單片機AT89C51實現主要功能, AT89C51 的引腳圖如2-1所示: </p><p>  圖2-1 單片機的引腳</p><p><b>  各引腳功能情況為:</b>

6、;</p><p>  Vcc:供電電壓。 </p><p><b>  GND:接地。 </b></p><p>  P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門流。當P1口的管腳第一次寫1時,被定義為高阻輸入。</p><p>  P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器

7、可接收,輸出4TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。在給出地址“1”時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。</p><p>  P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL 門電流。當P3口寫入“1”后,它們被內部

8、上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 </p><p>  P3口功能引腳簡介: </p><p>  P3.0:RXD(串行口輸入) </p><p>  P3.1:TXD(串行口輸出) </p><p>  P3.2:INT0(外部中斷0) </p><

9、;p>  P3.3:INT1(外部中斷1) </p><p>  P3.4:T0(定時器0外部脈沖輸入) </p><p>  P3.5:T1(定時器1外部脈沖輸入) </p><p>  P3.6:WR(外部數據存儲器寫選通) </p><p><b>  2、LED數碼管</b></p><

10、p>  為了節省I/O口的使用,本設計采用的是動態顯示,其工作原理為:采用各數碼管循環輪流顯示的方法,當循環顯示的頻率較高時,利用人眼的暫留特性,看不出閃爍顯示現象。將所有LED的段選線并聯在一起,由一個八位I/O口控制,而位選線分別由相應的I/O口線控制。其中一個控制段選碼,另一個控制位選。動態顯示器電路如圖2-2所示。</p><p>  圖2-2 八位LED動態顯示電路</p><

11、p><b>  3、獨立鍵盤</b></p><p>  利用4個自復式常開按鈕開關作為功能鍵,KEY0~KEY3分別為設置、調時、鬧鈴、日歷三、硬件電路設計圖。</p><p><b>  三、總體電路設計</b></p><p>  圖3-1 總體電路圖</p><p><b>

12、  四、程序流程圖</b></p><p>  根據以上硬件電路和單片機控制原理,搭建編程思路,程序流程圖如圖4-1所示:</p><p>  圖4-1 程序流程圖</p><p><b>  五、仿真及其結果</b></p><p><b>  仿真方法是: </b></p>

13、;<p>  (1)在Keil C51仿真軟件下創建項目,并把上述源程序添加到項目中,通過編譯產生一個".hex"為后綴的文件,此文件就是用于燒寫到Proteus軟件中AT89C51芯片的文件,參考文獻[2]。 </p><p>  (2)把生成的".hex"為后綴的文件添加到Proteus軟件中繪制的AT89C51芯片中作為控制程序。</p>

14、<p>  (3)在Proteus軟件仿真電路圖中點擊左下角的運行按鈕,電子時鐘就會開始計時,并顯示如圖所示:</p><p><b>  圖5-1 顯示時間</b></p><p><b>  圖5-2 顯示鬧鈴</b></p><p><b>  圖5-3 顯示日期</b></p&

15、gt;<p><b>  六、總結</b></p><p>  本設計以AT89C51單片機為核心,運用Proteus仿真軟件來實現整個設計流程,借助其功能強大的仿真系統對設計的系統進行實時仿真,以檢測系統設計的正確性與合理性,并可以根據仿真電路圖制作硬件電路,這種設計具有傳統邏輯設計方法所無法比擬的優越性。設計整體性好、人性化強、可靠性高,實現了數字顯示控制的智能化。<

16、/p><p><b>  七、參考文獻:</b></p><p>  [1] 周潤景.基于 Proteus的電路與單片機系統設計與仿真 [M].北京:北京航空航天大學出版社,2005.</p><p>  [2] 金炯泰,金奎煥.如何使用KEIL8051C編譯器[M].北 京:北京航空航天大學出版社,2002.</p><p&g

17、t;  [3] 程相波,衛安軍.基于MCS-51單片機的八路搶答器設計方法研究文獻名[J].北京工業職業技術學院學報,2007(2).</p><p>  [4] 張齊. 單片機應用系統設計技術———基于 C 語言編程[M] .北京: 電子工業出版社,2004. </p><p>  [5] 潘永雄.新編單片機與應用[M].西安 :西安電子科技大學出版社,2003.</p>

18、<p><b>  八、附錄:</b></p><p>  完整C語言代碼如下:</p><p>  #include <reg52.h></p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p&

19、gt;<p>  uint numwe,tt,t,numdu,set,aclock,rili;</p><p>  unsigned long int time,time1=0;</p><p>  unsigned long int second,minute,hour,year=2012,month=12,day=31;</p><p>  uch

20、ar code du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,</p><p>  0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};</p><p>  uchar code we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};</p><p>

21、  uchar Mth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//每月對應的天數</p><p>  uchar YMth[13]={0,2,9,2,1,2,1,2,2,1,2,1,2};</p><p>  sbit dula=P2^0;</p><p>  sbit wela=P2^1;</p>

22、<p>  sbit KEY0=P3^2;//選位</p><p>  sbit KEY1=P3^1;//加一</p><p>  sbit KEY2=P3^0;//設鬧鈴</p><p>  sbit KEY3=P3^3;</p><p>  sbit beep=P2^2;//響鈴</p><p>  v

23、oid Delay(uint del);//延時程序</p><p>  void Display(uint sd,uint mm,uint hy);//顯示程序</p><p>  void add();//加一</p><p>  void alarmclock();//鬧鐘</p><p>  void init();//初始化<

24、/p><p>  int clock();//計算時間</p><p>  void Calender();//計算日期</p><p>  void main()</p><p><b>  {</b></p><p><b>  P2=0xff;</b></p>

25、<p><b>  init();</b></p><p><b>  while(1){</b></p><p><b>  add();</b></p><p>  if(rili==1)//分日歷和時間顯示</p><p>  Display(day,mon

26、th,year);</p><p><b>  else</b></p><p>  Display(second,minute,hour);</p><p>  alarmclock();</p><p><b>  }</b></p><p><b>  }&l

27、t;/b></p><p>  void Display(uint sd,uint mm,uint hy)</p><p>  {int y0,y1,y2;</p><p>  if(rili==1)</p><p><b>  {</b></p><p>  y0=hy/1000,y1=

28、hy%1000;y2=hy%100;</p><p><b>  }</b></p><p>  for(numwe=0;numwe<8;numwe++)</p><p><b>  {</b></p><p><b>  P0=0xff;</b></p>

29、<p><b>  wela=1;</b></p><p>  P0=we[numwe];</p><p><b>  wela=0;</b></p><p><b>  P0=0xff;</b></p><p><b>  dula=1;</b>

30、;</p><p>  switch(numwe)</p><p><b>  {</b></p><p><b>  case 0:</b></p><p>  P0=(tt==1&set==1)?0x00:(rili==1)?du[y0]:du[hy/10];break;</p&g

31、t;<p><b>  case 1:</b></p><p>  P0=(tt==1&set==2)?0x00:(rili==1)?du[y1/100]:du[hy%10];break;</p><p><b>  case 2:</b></p><p>  P0=(rili!=1)?0x40:(t

32、t==1&set==3)?0x00:du[y2/10];break;</p><p><b>  case 3:</b></p><p>  P0=(tt==1&set==4)?0x00:(rili==1)?du[hy%10]+0x80:du[mm/10];break;</p><p><b>  case 4:<

33、;/b></p><p>  P0=(tt==1&set==5)?0x00:(rili==1)?du[mm/10]:du[mm%10];break;</p><p><b>  case 5:</b></p><p>  P0=(rili!=1)?0x40:(tt==1&set==6)?0x00:du[mm%10]+0x8

34、0;break;</p><p><b>  case 6:</b></p><p>  P0=(tt==1&set==7)?0x00:du[sd/10];break;</p><p><b>  case 7:</b></p><p>  P0=(tt==1&set==8)?0x0

35、0:du[sd%10];break;</p><p><b>  }</b></p><p><b>  dula=0;</b></p><p><b>  Delay(5);</b></p><p><b>  }</b></p>&

36、lt;p><b>  }</b></p><p>  void init()//初始化</p><p><b>  {</b></p><p><b>  wela=0;</b></p><p><b>  dula=0;</b></p>

37、<p>  TMOD=0x01;//設置定時器0為工作方式1</p><p>  TH0=(65536-50000)/256;//定時器高八位//定時5ms</p><p>  TL0=(65536-50000)%256;//定時器低八位</p><p>  IE=0x8f;//開啟中斷</p><p>  TCON=0x15;

38、//啟動定時器及工作方式</p><p><b>  }</b></p><p>  int clock()//計算時間</p><p><b>  {</b></p><p>  if(t==10|t==20) tt=!tt;//閃爍標志位</p><p><b>

39、;  if(t==20)</b></p><p><b>  {</b></p><p><b>  t=0;</b></p><p>  if(!(set!=0&aclock==0))</p><p><b>  time++;</b></p>

40、<p>  if(time>=time1&time<time1+60)</p><p><b>  beep=0;</b></p><p><b>  else</b></p><p><b>  beep=1;</b></p><p>  C

41、alender();</p><p>  if(aclock==0)</p><p><b>  {</b></p><p>  second=time%60;</p><p>  minute=(time%3600)/60;</p><p>  hour=time/3600;</p>

42、<p>  if(hour==24)</p><p><b>  {</b></p><p><b>  time=0;</b></p><p><b>  hour=0;</b></p><p><b>  }</b></p>

43、<p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  second=time1%60;</p><p>  minute=(time1%3600)/60;</p>&

44、lt;p>  hour=time1/3600;</p><p>  if(hour==24)</p><p><b>  {</b></p><p><b>  time=0;</b></p><p><b>  hour=0;</b></p><p

45、><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void Delay(uint del)</p><p>&

46、lt;b>  {</b></p><p><b>  uint i,j;</b></p><p>  for(i=0; i<del; i++)</p><p>  for(j=0; j<100; j++);</p><p><b>  }</b></p>

47、<p>  void timer0() interrupt 1//定時器0中斷</p><p><b>  {</b></p><p>  TH0=(65536-50000)/256;//定時器高八位//定時5ms</p><p>  TL0=(65536-50000)%256;//定時器低八位</p><p>

48、;<b>  t++;</b></p><p><b>  clock();</b></p><p><b>  }</b></p><p>  void settime() interrupt 0//it0</p><p><b>  {</b><

49、;/p><p>  if(KEY0==0)</p><p><b>  {</b></p><p><b>  Delay(2);</b></p><p>  if(KEY0==0)</p><p>  {if(rili!=1)</p><p>  {i

50、f(set==2|set==5) set=set+2; else set++;}</p><p><b>  else</b></p><p><b>  set++;</b></p><p>  if(set==9)</p><p>  {set=0;t=0;}</p><

51、;p>  //while(!KEY0);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void calendar() interrupt 2//日歷</p>&l

52、t;p><b>  {</b></p><p>  if(KEY3==0)</p><p><b>  { </b></p><p><b>  Delay(2);</b></p><p>  if(KEY3==0)</p><p>  ril

53、i=!rili;</p><p>  set=0;aclock=0;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void Calender()//計算日歷</p><p><b>  {</b>&

54、lt;/p><p>  if(time==86400)</p><p><b>  {</b></p><p><b>  day++;</b></p><p>  if((year%4==0&year%100!=0)|(year%400==0)) </p><p>  

55、Mth[2]=29;</p><p><b>  else</b></p><p>  Mth[2]=28;</p><p>  if(day>Mth[month])</p><p><b>  {</b></p><p><b>  day=1;</b

56、></p><p><b>  month++;</b></p><p>  if(month>12)</p><p><b>  {month=1;</b></p><p><b>  year++;}</b></p><p><b&

57、gt;  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void add()//自加一</p><p><b>  {</b></p><p>  int ge,ge1,ge2

58、,shi,shi1,shi2,bai2,qian2;</p><p>  if(rili==1)</p><p><b>  {</b></p><p>  ge=day%10;ge1=month%10;ge2=year%10;</p><p>  shi=day/10;shi1=month/10;shi2=year%1

59、00/10;</p><p>  bai2=year%1000/100;qian2=year/1000;</p><p><b>  }else</b></p><p><b>  {</b></p><p>  ge=second%10;ge1=minute%10;ge2=hour%10;<

60、/p><p>  shi=second/10;shi1=minute/10;shi2=hour/10;</p><p><b>  }</b></p><p>  if(KEY1==0)</p><p><b>  {</b></p><p><b>  Delay(2

61、);</b></p><p>  if(KEY1==0)</p><p><b>  {</b></p><p>  if(rili==1)</p><p><b>  {</b></p><p>  if((year%4==0&year%100!=0)|

62、(year%400==0)) </p><p>  YMth[2]=10;</p><p><b>  else</b></p><p>  YMth[2]=9;</p><p>  switch(set)</p><p><b>  {</b></p><

63、;p>  case 1:qian2=(qian2+1)%10;break;</p><p>  case 2:bai2=(bai2+1)%10;break;</p><p>  case 3:shi2=(shi2+1)%10;break;</p><p>  case 4:ge2=(ge2+1)%10;break;</p><p>  

64、case 5:shi1=(shi1+1)%2;break;</p><p>  case 6:ge1=(shi1==1)?(ge1+1)%3:(ge1+1)%10;break;</p><p>  case 7:shi=(month==2)?(shi+1)%3:(shi+1)%4;break;</p><p>  case 8:ge=(shi==3)?(ge+1)%

65、YMth[month]:(month==2)?(ge+1)%YMth[2]:(ge+1)%10;break;</p><p><b>  }</b></p><p>  year=qian2*1000+bai2*100+shi2*10+ge2;</p><p>  month=shi1*10+ge1;</p><p> 

66、 day=shi*10+ge;</p><p><b>  }else</b></p><p><b>  {</b></p><p>  switch(set)</p><p><b>  {</b></p><p>  case 1: shi2=(s

67、hi2+1)%3;break;</p><p>  case 2: ge2=(ge2+1)%4;break;</p><p>  case 4: shi1=(shi1+1)%6;break;</p><p>  case 5: ge1=(ge1+1)%10;break;</p><p>  case 7: shi=(shi+1)%6;bre

68、ak;</p><p>  case 8: ge=(ge+1)%10;break;</p><p><b>  }</b></p><p>  second=shi*10+ge; minute=shi1*10+ge1;hour=shi2*10+ge2;</p><p>  if(aclock==0)</p>

69、<p>  time=hour*3600+minute*60+second;</p><p><b>  else</b></p><p>  time1=hour*3600+minute*60+second;</p><p><b>  }</b></p><p>  while(!K

70、EY1);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void alarmclock()//設置鬧鈴</p><p><b>  {</b&

71、gt;</p><p>  if(KEY2==0)</p><p><b>  {</b></p><p><b>  Delay(2);</b></p><p>  if(KEY2==0)</p><p><b>  {</b></p>

72、<p>  while(!KEY2);</p><p><b>  aclock=1;</b></p><p><b>  rili=0;</b></p><p><b>  set=0;</b></p><p><b>  while(1)</b&g

73、t;</p><p><b>  {</b></p><p>  if(rili==1)</p><p>  Display(day,month,year);</p><p><b>  else</b></p><p>  Display(second,minute,hou

74、r);</p><p><b>  add();</b></p><p>  if(KEY2==0)</p><p><b>  {</b></p><p>  while(!KEY2);</p><p><b>  aclock=0;</b></

75、p><p><b>  set=0;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論