基于c語言單片機電子時鐘課程設計_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  課程設計報告</b></p><p>  課程名稱:單片機程序設計</p><p><b>  報告題目:電子時鐘</b></p><p><b>  學生姓名:</b></p><p>  所在學院:信息科學與工程學院</p>&l

2、t;p><b>  專業(yè)班級:</b></p><p><b>  學生學號:</b></p><p><b>  指導教師:</b></p><p>  2013年12月25日</p><p><b>  課程設計任務書</b></p>

3、<p><b>  摘要</b></p><p>  單片計算機即單片微型計算機。由RAM、ROM、CPU構成。定時,計數(shù)和 多種接口于一體的微控制器。它體積小,成本低,功能強,廣泛應用于智能產(chǎn)業(yè)和工業(yè)自動化上。而51系列單片機是各單片機中最為典型和最有代表性的一種。這次課程設計通過對它的學習,應用,從而達到學習、設計、開發(fā)軟、硬的能力。</p><p>

4、;  本設計主要設計了一個基于AT89C51單片機的電子時鐘。并在數(shù)碼管上顯示相應的時間。并通過一個控制鍵用來實現(xiàn)時間的調(diào)節(jié)和是否進入省電模式的轉(zhuǎn)換。應用Proteus的ISIS軟件實現(xiàn)了單片機電子時鐘系統(tǒng)的設計與仿真。該方法仿真效果真實、準確,節(jié)省了硬件資源。</p><p>  關鍵詞:單片機;子時鐘;鍵控制</p><p><b>  目錄</b></p&

5、gt;<p>  概述………………………………………………………………………5</p><p>  1.1電子時鐘簡介………………………………………………………………5</p><p>  1.2電子時鐘的基本特點………………………………………………………5</p><p>  1.3電子時鐘的原理……………………………………………………………5<

6、;/p><p>  二、方案設計選擇………………………………………………………………5</p><p>  2.1計時方案……………………………………………………………………5</p><p>  2.2顯示方案……………………………………………………………………5</p><p>  三、硬件設計………………………………………………………………

7、…………6</p><p>  3.1單片機型號選擇……………………………………………………………6</p><p>  3.2數(shù)碼管顯示工作原理………………………………………………………6</p><p>  3.3鍵盤電路設計………………………………………………………………7</p><p>  3.4電路原理圖…………………………………

8、………………………………7</p><p>  四、軟件設計…………………………………………………………………………7</p><p>  五、結論與心得………………………………………………………………………15</p><p>  六、參考文獻……………………………………………………………………16</p><p><b>  一

9、、概述</b></p><p>  1.1 電子時鐘簡介</p><p>  1957年,Ventura發(fā)明了世界上第一個電子表,從而奠定了電子時鐘的基礎, 電子時鐘開始迅速發(fā)展起來?,F(xiàn)代的電子時鐘是基于單片機的一種計時工具,采用延時程序產(chǎn)生一定的時間中斷用于一秒的定義,通過計數(shù)方式進行滿六十秒分鐘進一,滿六十分小時進一,滿二十四小時小時清零。從而達到計時的功能,是人民日常生活

10、補課缺少的工具。</p><p>  1.2 電子時鐘的基本特點</p><p>  現(xiàn)在高精度的計時工具大多數(shù)都使用了石英晶體振蕩器,由于電子鐘、石英鐘、石英表都采用了石英技術,因此走時精度高,穩(wěn)定性好,使用方便,不需要經(jīng)常調(diào)試,數(shù)字式電子鐘用集成電路計時時,譯碼代替機械式傳動,用LED顯示器代替指針顯示進而顯示時間,減小了計時誤差,這種表具有時、分、秒顯示時間的功能,還可以進行時和分的

11、校對,片選的靈活性好。</p><p>  1.3 電子時鐘的原理</p><p>  該電子時鐘由89C51,BUTTON,六段數(shù)碼管等構成,采用晶振電路作為驅(qū)動電路,由延時程序和循環(huán)程序產(chǎn)生的一秒定時,達到時分秒的計時,六十秒為一分鐘,六十分鐘為一小時,滿二十四小時為一天。而電路中唯一的一個控制鍵卻擁有多種不同的功能,按下又松開,可以實現(xiàn)屏蔽數(shù)碼管顯示的功能,達到省電的目的;直接按下不

12、松開,則可以通過按鍵實現(xiàn)分鐘的累加,每按一次分鐘加一;而連續(xù)兩次按下按鍵不放松,則可實現(xiàn)小時的調(diào)節(jié),同樣每按一次小時加一。</p><p><b>  二、方案設計選擇</b></p><p><b>  2.1計時方案 </b></p><p>  方案1:采用實時時鐘芯片</p><p>  現(xiàn)

13、在市場上有很多實時時鐘集成電路,如DS1287、DS12887、DS1302等。這些實時時鐘芯片具備年、月、日、時、分、秒計時功能和多點定時功能,計時數(shù)據(jù)的更新每秒自動進行一次,不需要程序干預。因此,在工業(yè)實時測控系統(tǒng)中多采用這一類專用芯片來實現(xiàn)實時時鐘功能。</p><p>  方案2:使用單片機內(nèi)部的可編程定時器。</p><p>  利用單片機內(nèi)部的定時計數(shù)器進行中端定時,配合軟件延

14、時實現(xiàn)時、分、秒的計時。該方案節(jié)省硬件成本,但程序設計較為復雜。</p><p><b>  2.2顯示方案</b></p><p>  對于實時時鐘而言,顯示顯然是另一個重要的環(huán)節(jié)。通常LED顯示有兩種方式:動態(tài)顯示和靜態(tài)顯示。</p><p>  靜態(tài)顯示的優(yōu)點是程序簡單、顯示亮度有保證、單片機CPU的開銷小,節(jié)約CPU的工作時間。但占有I

15、/O口線多,每一個LED都要占有一個I/O口,硬件開銷大,電路復雜。需要幾個LED就必須占有幾個并行口,比較適用于LED數(shù)量較少的場合。當然當LED數(shù)量較多的時候,可以使用單片機的串行口通過移位寄存器的方式加以解決,但程序編寫比較麻煩。</p><p>  LED動態(tài)顯示硬件連接簡單,但動態(tài)掃描的顯示方式需要占有CPU較多的時間,在單片機沒有太多實時測控任務的情況下可以采用。</p><p&g

16、t;  本系統(tǒng)需要采用6位LED數(shù)碼管來分別顯示時、分、秒,因數(shù)碼管個數(shù)較多,故本系統(tǒng)選擇動態(tài)顯示方式。</p><p><b>  三、硬件設計</b></p><p>  3.1單片機型號的選擇</p><p>  通過對多種單片機性能的分析,最終認為89C51是最理想的電子時鐘開發(fā)芯片。89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器

17、的低電壓,高性能CMOS8 位微處理器,器件采用ATMEL高密度非易失存儲器制造技術制造,與工業(yè)標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的89C5是一種高效微控制器,而且它與MCS-51兼容,且具有4K字節(jié)可編程閃爍存儲器和1000寫/擦循環(huán),數(shù)據(jù)保留時間為10年等特點,是最好的選擇。</p><p>  3.2數(shù)碼管顯示工作原理</p>

18、<p>  數(shù)碼管是一種把多個LED顯示段集成在一起的顯示設備。有兩種類型,一種是共陽型,一種是共陰型。共陽型就是把多個LED顯示段的陽極接在一起,又稱為公共端。共陰型就是把多個LED顯示段的陰極接在一起,即為公共商。陽極即為二極管的正極,又稱為正極,陰極即為二極管的負極,又稱為負極。通常的數(shù)碼管又分為8段,即8個LED顯示段,這是為工程應用方便如設計的,分別為A、B、C、D、E、F、G、DP,其中DP是小數(shù)點位段。而多位

19、數(shù)碼管,除某一位的公共端會連接在一起,不同位的數(shù)碼管的相同端也會連接在一起。即所有的A段都會連在一起,其它的段也是如此,這是實際最常用的用法。數(shù)碼管顯示方法可分為靜態(tài)顯示和動態(tài)顯示兩種。靜態(tài)顯示就是數(shù)碼管的8段輸入及其公共端電平一直有效。動態(tài)顯示的原理是,各個數(shù)碼管的相同段連接在一起,共同占用8位段引管線;每位數(shù)碼管的陽極連在一起組成公共端。利用人眼的視覺暫留性,依次給出各個數(shù)碼管公共端加有效信號,在此同時給出該數(shù)碼管加有效的數(shù)據(jù)信號,

20、當全段掃描速度大于視覺暫留速度時,顯示就會清晰顯示出來。</p><p><b>  3.3鍵盤電路設計</b></p><p>  該設計只用了一個鍵盤,但實現(xiàn)的功能卻是比較完善,減少了硬件資源的損耗,該鍵盤可以實現(xiàn)小時和分鐘的調(diào)節(jié);直接按下不松開,則可以通過按鍵實現(xiàn)分鐘的累加,每按一次分鐘加一;而連續(xù)兩次按下按鍵不放松,則可實現(xiàn)小時的調(diào)節(jié),同樣每按一次小時加一。達

21、到時間調(diào)節(jié)的目的。</p><p><b>  3.4電路原理圖</b></p><p><b>  四、軟件設計</b></p><p>  #include <reg52.h></p><p>  #include <intrins.h></p><p

22、>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();} //宏定義掩延時函數(shù)</p><p>  sbit K1=P3^0; //位定義<

23、/p><p>  sbit K2=P3^1;</p><p>  sbit K3=P3^2;</p><p>  sbit K4=P3^3;</p><p>  sbit D34=P3^4;</p><p>  sbit SCL = P2^0;</p><p>  sbit SDA = P2^1;&

24、lt;/p><p>  void diyi();</p><p>  void xianshi();//函數(shù)聲明</p><p>  void panduan(); //函數(shù)聲明</p><p>  void delay(uchar z); //函數(shù)聲明</p><p>  uchar t=0,n=1,m=59,

25、a,temp;//定義變量</p><p>  uchar code at[]={0xe0,0xd0,0xb0,0x70}; //定義數(shù)組</p><p>  uchar code as[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};</p><p>  uchar code b[]={0x80,0

26、x40,0x20,0x10,0x08,0x04,0x02,0x01};</p><p><b>  uint cnt;</b></p><p>  void delay_us(uchar tt) //短延時函數(shù)</p><p>  { </p><p>  while(tt--);<

27、/p><p><b>  }</b></p><p>  /****************************/</p><p>  /***********初始化***********/ </p><p>  /**************************/</p><p

28、>  /********at24c02***********/</p><p>  void I2C_start()//I^2C模塊</p><p><b>  {</b></p><p><b>  SDA = 1;</b></p><p><b>  _nop_();</b

29、></p><p><b>  SCL = 1;</b></p><p><b>  somenop;</b></p><p><b>  SDA = 0;</b></p><p><b>  somenop;</b></p><

30、p><b>  SCL = 0;</b></p><p><b>  }</b></p><p>  void I2C_stop()</p><p><b>  {</b></p><p><b>  SDA = 0;</b></p>

31、<p><b>  _nop_();</b></p><p><b>  SCL = 1;</b></p><p><b>  somenop;</b></p><p><b>  SDA = 1;</b></p><p><b>  

32、}</b></p><p>  void I2C_ack(bit ackbit)</p><p><b>  {</b></p><p>  if(ackbit)</p><p><b>  SDA = 0;</b></p><p><b>  else

33、</b></p><p><b>  SDA = 1;</b></p><p><b>  somenop;</b></p><p><b>  SCL = 1;</b></p><p><b>  somenop;</b></p>

34、<p><b>  SCL = 0;</b></p><p><b>  SDA = 1;</b></p><p><b>  somenop;</b></p><p><b>  }</b></p><p>  bit I2C_waitac

35、k()</p><p><b>  {</b></p><p><b>  SDA = 1;</b></p><p><b>  somenop;</b></p><p><b>  SCL = 1;</b></p><p><

36、;b>  somenop;</b></p><p><b>  if(SDA)</b></p><p><b>  {</b></p><p><b>  SCL = 0;</b></p><p>  I2C_stop();</p><p&

37、gt;<b>  return 0;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  SCL = 0;</b></

38、p><p><b>  return 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void I2C_write(uchar dat)</p><p><b>  {</b&

39、gt;</p><p><b>  uchar i;</b></p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  if(dat&0x80)</p><p><b>  SDA = 1;<

40、;/b></p><p><b>  else </b></p><p><b>  SDA = 0;</b></p><p><b>  somenop;</b></p><p><b>  SCL = 1;</b></p><

41、p>  dat <<= 1;</p><p><b>  somenop;</b></p><p><b>  SCL = 0;</b></p><p><b>  }</b></p><p><b>  }</b></p>

42、<p>  uchar I2C_read()</p><p><b>  {</b></p><p>  uchar dat;</p><p><b>  uchar i;</b></p><p>  for(i=0;i<8;i++)</p><p>&l

43、t;b>  {</b></p><p><b>  SCL = 1;</b></p><p><b>  somenop;</b></p><p>  dat <<= 1;</p><p><b>  if(SDA)</b></p>

44、<p>  dat |= 0x01;</p><p><b>  SCL = 0;</b></p><p><b>  somenop;</b></p><p><b>  }</b></p><p>  return dat;</p><p>

45、;<b>  }</b></p><p>  void W_at24c02(uchar add,uchar dat)</p><p><b>  {</b></p><p>  I2C_start();</p><p>  I2C_write(0xa0);</p><p> 

46、 I2C_waitack();</p><p>  I2C_write(add);</p><p>  I2C_waitack();</p><p>  I2C_write(dat);</p><p>  I2C_waitack();</p><p>  I2C_stop();</p><p>

47、  delay_us(300);</p><p><b>  }</b></p><p>  uchar R_at24c02(uchar add)</p><p><b>  {</b></p><p>  uchar AT_temp;</p><p>  I2C_start

48、();</p><p>  I2C_write(0xa0);</p><p>  I2C_waitack();</p><p>  I2C_write(add);</p><p>  I2C_waitack();</p><p>  I2C_start();</p><p>  I2C_writ

49、e(0xa1);</p><p>  I2C_waitack();</p><p>  AT_temp = I2C_read();</p><p>  I2C_ack(0);</p><p>  I2C_stop();</p><p>  return AT_temp; </p><p><

50、;b>  }</b></p><p>  /**************************/</p><p>  /************main**********/</p><p>  void main()</p><p><b>  {</b></p><p>&

51、lt;b>  diyi();</b></p><p>  t= R_at24c02(24); //程序運行時,讀取掉電前數(shù)據(jù)</p><p>  m= R_at24c02(23);</p><p>  n= R_at24c02(25);</p><p><b>  while(1)</b><

52、/p><p><b>  {</b></p><p>  panduan();//判斷子函數(shù)</p><p>  xianshi();//顯示子函數(shù)</p><p><b>  }</b></p><p><b>  }</b></p><

53、;p>  void diyi()//定義子函數(shù)</p><p><b>  {</b></p><p><b>  P2=0xbf;</b></p><p><b>  P0=0xbf;</b></p><p>  TMOD=0x01;</p><p

54、>  TH0=(65536-50000)/256;</p><p>  TL0=(65536-50000)%256;</p><p><b>  EA=1;</b></p><p><b>  ET0=1;</b></p><p><b>  TR0=1;</b><

55、/p><p><b>  }</b></p><p>  void exer1() interrupt 1 //定時器/計數(shù)器 1</p><p><b>  {</b></p><p><b>  uchar t1;</b></p><p>  TH0=(

56、65536-50000)/256;</p><p>  TL0=(65536-50000)%256;</p><p><b>  t1++;</b></p><p>  if(t1==10)</p><p>  {P2=0x9f;P0=0x00;}</p><p>  if(t1==20)<

57、/p><p><b>  {</b></p><p>  P2=0x9f;P0=0xff;</p><p><b>  t1=0;</b></p><p><b>  t++;</b></p><p>  W_at24c02(24,t ); //每隔一秒

58、,保存當前數(shù)據(jù)</p><p><b>  delay(3);</b></p><p>  W_at24c02(23,m);</p><p><b>  delay(3);</b></p><p>  W_at24c02(25,n); </p><p><b> 

59、 if(t==60)</b></p><p>  { t=0; m++; </p><p><b>  if(m==60)</b></p><p>  { m=0; n++; }</p><p><b>  if(n==24)</b></p><p>

60、;<b>  n=0;</b></p><p><b>  } </b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void xianshi()//顯示函數(shù) </p>&l

61、t;p><b>  {</b></p><p>  P2 = 0xdf;P0 =b[0]; P2=0x1f; P0=0xff; P2 = 0xff; P0 =as[t%10]; P2=0x1f;P0=0x00;delay(3);</p><p>  P2 = 0xdf;P0 =b[1]; P2=0x1f; P0=0xff; P2 = 0xff; P0 =a

62、s[(t/10)%10]; P2=0x1f;P0=0x00;delay(3);</p><p>  P2 = 0xdf;P0 =b[2]; P2=0x1f; P0=0xff; P2 = 0xff; P0 =0xbf; P2=0x1f;P0=0x00;delay(3);</p><p>  P2 = 0xdf;P0 =b[3]; P2=0x1f; P0=0xff; P2 = 0xff

63、; P0 =as[m%10]; P2=0x1f;P0=0x00;delay(3);</p><p>  P2 = 0xdf;P0 =b[4]; P2=0x1f; P0=0xff; P2 = 0xff; P0 =as[(m/10)%10]; P2=0x1f;P0=0x00;delay(3);</p><p>  P2 = 0xdf;P0 =b[5]; P2=0x1f; P0=0

64、xff; P2 = 0xff; P0 =0xbf; P2=0x1f;P0=0x00;delay(3);</p><p>  P2 = 0xdf;P0 =b[6]; P2=0x1f; P0=0xff; P2 = 0xff; P0 =as[n%10]; P2=0x1f;P0=0x00;delay(3);</p><p>  P2 = 0xdf;P0 =b[7]; P2=0x1f; P

65、0=0xff; P2 = 0xff; P0 =as[(n/10)%10]; P2=0x1f;P0=0x00;delay(3);</p><p><b>  }</b></p><p>  void delay(uchar z)//延時函數(shù)</p><p><b>  {</b></p><p> 

66、 uchar i,j;</p><p>  for(i=0;i<z;i++)</p><p>  for(j=0;j<110;j++);</p><p><b>  }</b></p><p>  void panduan()//判斷函數(shù)</p><p><b>  {<

67、;/b></p><p><b>  P3=0xfe; </b></p><p><b>  delay(5);</b></p><p><b>  temp=P3;</b></p><p>  temp=temp&0xf0;</p><p&g

68、t;  if(temp!=0xf0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p>  if(temp!=0xf0)</p><p><b>  {</b></p><p>  w

69、hile(P3!=0xfe);</p><p>  if(temp==at[0])</p><p><b>  { </b></p><p>  a++;TR0=0; if(a==4) {a=0;TR0=1;}</p><p><b>  }</b></p><p>  i

70、f(temp==at[1])</p><p><b>  {</b></p><p><b>  if(a==1)</b></p><p>  { t++; if(t==60){ t=0;} }</p><p><b>  if(a==2)</b></p><

71、;p>  {m++;if(m==60){m=0;}}</p><p><b>  if(a==3)</b></p><p>  { n++;if(n==24){n=0;}}</p><p><b>  }</b></p><p>  if(temp==at[2])</p><

72、;p><b>  {</b></p><p><b>  if(a==1)</b></p><p>  {if(t==0){t=60;}t--;}</p><p><b>  if(a==2)</b></p><p>  {if(m==0){m=60;}m--;}<

73、/p><p><b>  if(a==3)</b></p><p>  {if(n==0){n=24;}n--;}</p><p><b>  }</b></p><p>  P2 = 0xc0;P0 =b[7]; P2=0x00;P0=0xff;P2 = 0xe0;P0 =0xff;P2=0x00;P

74、0=0x00;delay(3);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  五、結論與心得</b></p><p>  在廖亦

75、凡和曹鐵軍老師耐心的指導下,我順利完成了這次單片機課程設計課題中的電子時鐘設計,過這次的設計使我認識到本人對單片機方面的知識知道的太少了,對于書本上的很多知識還不能靈活運用,尤其是對程序設計語句的理解和運用,不能夠充分理解每個語句的具體含義,導致編程的程序過于復雜,使得需要的存儲空間增大。損耗了過多的內(nèi)存資源。</p><p>  本次的設計使我從中學到了一些很重要的東西,那就是如何從理論到實踐的轉(zhuǎn)化,怎樣將我所

76、學到的知識運用到我以后的工作中去。在大學的課堂的學習只是在給我們灌輸專業(yè)知識,而我們應把所學的用到我們現(xiàn)實的生活中去,此次的電子時鐘設計給我奠定了一個實踐基礎,我會在以后的學習、生活中磨練自己,使自己適應于以后的競爭,同時在查找資料的過程中我也學到了許多新的知識,在和同學協(xié)作過程中增進同學間的友誼,使我對團隊精神的積極性和重要性有了更加充分的理解。</p><p>  最后,感謝廖亦凡和曹鐵軍老師對我的細心的指導

77、,正是由于老師們的細心的輔導和他們提供給我們的參考資料,使得我的課程設計能夠順利的完成,同時在課程設計過程中,我們鞏固和學習了我們的單片機知識。相信這對我以后的課程設計和畢業(yè)設計將會有很大的幫助!</p><p><b>  六、參考文獻</b></p><p>  [1] 張毅剛.《單片機原理及應用》.高等教育出版社,2009</p><p>

溫馨提示

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

評論

0/150

提交評論