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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p>  單片機(jī)原理及系統(tǒng)課程設(shè)計(jì)</p><p>  專 業(yè):電氣工程及其自動化</p><p>  班 級: 電氣1001班 </p><p>  姓 名: </p><p>  學(xué) 號: </p><p>  

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

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

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

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

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

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

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(外部數(shù)據(jù)存儲器寫選通) </p><p><b>  2、LED數(shù)碼管</b></p><

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

11、p><b>  3、獨(dú)立鍵盤</b></p><p>  利用4個自復(fù)式常開按鈕開關(guān)作為功能鍵,KEY0~KEY3分別為設(shè)置、調(diào)時、鬧鈴、日歷三、硬件電路設(shè)計(jì)圖。</p><p><b>  三、總體電路設(shè)計(jì)</b></p><p>  圖3-1 總體電路圖</p><p><b>

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

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

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

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

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

17、t;  [3] 程相波,衛(wèi)安軍.基于MCS-51單片機(jī)的八路搶答器設(shè)計(jì)方法研究文獻(xiàn)名[J].北京工業(yè)職業(yè)技術(shù)學(xué)院學(xué)報,2007(2).</p><p>  [4] 張齊. 單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)技術(shù)———基于 C 語言編程[M] .北京: 電子工業(yè)出版社,2004. </p><p>  [5] 潘永雄.新編單片機(jī)與應(yīng)用[M].西安 :西安電子科技大學(xué)出版社,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};//每月對應(yīng)的天數(shù)</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;//設(shè)鬧鈴</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();//計(jì)算時間</p><p>  void Calender();//計(jì)算日期</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;//設(shè)置定時器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()//計(jì)算時間</p><p><b>  {</b></p><p>  if(t==10|t==20) tt=!tt;//閃爍標(biāo)志位</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()//計(jì)算日歷</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()//設(shè)置鬧鈴</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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論