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

下載本文檔

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

文檔簡介

1、<p>  PCF8563在電子時鐘設(shè)計中的應用</p><p><b>  引言</b></p><p>  數(shù)字時鐘已成為時鐘設(shè)計的主導方向,廣泛應用于實時控制系統(tǒng)。數(shù)字時鐘實質(zhì)是一個對標準頻率計數(shù)的計數(shù)電路,通常由晶體振蕩電路、分頻電路、時間計數(shù)電路、譯碼驅(qū)動電路等組成。這里提出一種電子時鐘系統(tǒng)設(shè)計方案,是以avr 單片機mega16作為控制核心,采用

2、PCF8563時鐘/日歷器件以及數(shù)碼管顯示,通過硬件設(shè)計及軟件編程實現(xiàn)的。</p><p>  1 mega16簡介</p><p>  ATmega16是基于增強的AVR RISC結(jié)構(gòu)的低功耗8位CMOS微控制器。由于其先進的指令集以及單時鐘周期指令執(zhí)行時間,ATmega16 的數(shù)據(jù)吞吐率高達 1MIPS/MHz,從而可以緩減系統(tǒng)在功耗和處理速度之間的矛盾。 </p>&l

3、t;p>  AVR 內(nèi)核具有豐富的指令集和 32 個通用工作寄存器。所有的寄存器都直接與算邏單元(ALU) 相連接,使得一條指令可以在一個時鐘周期內(nèi)同時訪問兩個獨立的寄存器。這種結(jié)構(gòu)大大提高了代碼效率,并且具有比普通的 CISC微控制器最高至 10倍的數(shù)據(jù)吞吐率。 </p><p>  ATmega16 有如下特點:16K字節(jié)的系統(tǒng)內(nèi)可編程Flash(具有同時讀寫的能力,即RWW),512 字節(jié) EEPRO

4、M,1K字節(jié) SRAM,32 個通用I/O 口線,32 個通用工作寄存器,用于邊界掃描的 JTAG 接口,支持片內(nèi)調(diào)試與編程,三個具有比較模式的靈活的定時器/計數(shù)器(T/C),片內(nèi)/外中斷,可編程串行USART,有起始條件檢測器的通用串行接口,8路10 位具有可選差分輸入級可編程增益 (TQFP 封裝 ) 的 ADC ,具有片內(nèi)振蕩器的可編程看門狗定時器,一個 SPI串行端口,以及六個可以通過軟件進行選擇的省電模式。工作于空閑模式時 C

5、PU 停止工作,而 USART、兩線接口、A/D 轉(zhuǎn)換器、SRAM、T/C、SPI 端口以及中斷系統(tǒng)繼續(xù)工作;掉電模式時晶體振蕩器停止振蕩,所有功能除了中斷和硬件復位之外都停止工作;在省電模式下,異步定時器繼續(xù)運行,允許用戶保持一個時間基準,而其  余功能模塊處于休眠狀態(tài);ADC噪聲抑制模式時終止CPU 和除了異步定時器與ADC以外所有 I/O 模塊的工作,以降低 ADC 轉(zhuǎn)換時的開關(guān)噪聲; Standby 模式下只有晶體或諧振振蕩器&

6、lt;/p><p>  芯片內(nèi), ATmega16 成為一個功能強大的單片機,為許多嵌入式控制應用提供了靈活而低成本的解決方案。 </p><p>  ATmega16 具有一整套的編程與系統(tǒng)開發(fā)工具,包括:C 語言 編譯器、宏匯編、 程序調(diào)試器/軟件仿真器、仿真器及評估板。</p><p>  2 PCF8563簡介</p><p>  PCF

7、8563 是PHILIPS 公司推出的一款帶I2C 總線,具有極低功耗的多功能時鐘/日歷芯片PCF8563 的多種報警功能。定時器功能時鐘輸出功能以及中斷輸出功能能完成各種復雜的定時服務甚至可為單片機提供看門狗功能內(nèi)部時鐘。電路內(nèi)部振蕩電路內(nèi)部低電壓檢測電路1.0V 以及兩線制I2C 總線通訊方式不但使外圍電路及其簡潔而且也增加了芯片的可靠性當然作為時鐘芯片PCF8563 亦解決了2000 年問題因而PCF8563 是一種性價比極高的時

8、鐘芯片。它廣泛應用于電話傳便攜式儀器以及電池供電的儀器儀表等產(chǎn)品領(lǐng)域。</p><p><b>  指標如下:</b></p><p>  1. 寬電壓范圍1.0 ~5.5V 復位電壓Vlow=1.0V;</p><p>  2. 超低功耗典型值為0.25 A;</p><p>  3. 四種報警功能和定時器功能;<

9、;/p><p>  4. 內(nèi)部復位電路內(nèi)部振蕩器電路和內(nèi)部低壓檢測電路;</p><p>  5. 中斷輸出和可編程時鐘輸出功能;</p><p>  6. 400kHzI2C 總線</p><p>  圖1為PCF8563內(nèi)部結(jié)構(gòu)。PCF8563內(nèi)部包括16個8位寄存器,可自動增量的地址寄存器,內(nèi)置32.768Hz的振蕩器(帶有一個內(nèi)部集成的電

10、容),分頻器(用于給實時時鐘RTC提供源時鐘),可編程時鐘輸出,定時器,報警器,掉電檢測器和400 kHz的I2C總線接口。</p><p>  所有16個寄存器設(shè)計成可尋址的8位并行寄存器,但不是所有位都有用。前2個寄存器(內(nèi)存地址00H,01H)用于控制寄存器和狀態(tài)寄存器,其中內(nèi)存地址02H~08H用于時鐘計數(shù)器(秒~年計數(shù)器),地址09H~0CH用于報警寄存器(定義報警條件),地址ODH控制CLKOUT引腳

11、的輸出頻率,地址OEH和OFH分別用于定時器控制寄存器和定時器寄存器。秒、分鐘、小時、日、月、年、分鐘報警、小時報警、日報警寄存器,編碼格式為BCD,星期和星期報警寄存器不以BCD格式編碼。</p><p>  PCF8563 的管腳排列及描述如下圖及表所示:</p><p>  3 系統(tǒng)硬件設(shè)計    硬件電路設(shè)計包括PCF8563時鐘與mega16單片機

12、的接口電路、數(shù)碼顯示電路以及鍵盤電路3個部分。PCF8563采用32.768 kHz可編程時鐘輸出頻率,I2C總線是由數(shù)據(jù)線SDA和時鐘SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。單片機與PCF8563之間雙向傳送數(shù)據(jù),最高傳送速率為100 Kb/s。FC總線的優(yōu)點是簡單和有效。由于接口直接在組件之上,因此,I2C總線占用的空間非常小,減少了電路板的空間和器件引腳的數(shù)量,降低了成本。圖2為PCF8563與mega16單片機的接口電路,PCF

13、8563的SCL與單片機的引腳PC0連接;SDA與單片機的引腳PC1連接,實現(xiàn)時間、日期等數(shù)據(jù)的讀取。</p><p>  PCF8563的外圍器件圖:</p><p>  4做好的pcf8563頭文件程序:</p><p>  #include <mega16.h></p><p>  #include <delay.h&

14、gt; </p><p>  #include <my_usart.h></p><p>  #define TWINT 7 </p><p>  #define TWEN 2 </p><p>  #define TWSTA 5</p><p>  #define TWSTO 4</p&g

15、t;<p>  #define TWEA 6</p><p>  #define I2C_START() TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTA) </p><p>  #define I2C_STOP() TWCR = (1<<TWINT)|(1<<TWEN)|

16、(1<<TWSTO) </p><p>  #define I2C_ACK() TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA) </p><p>  #define I2C_NAK() TWCR = (1<<TWINT)|(1<<TWEN) </p><p>

17、  #define I2C_CHECK_STATUS(X) {while(!(TWCR&(1<<TWINT))); if((TWSR&0xF8)!=(X)) return 0;} </p><p>  #define I2C_WRITE(X) TWDR = (X) </p><p>  #define I2C_READ(X) (X) = TWDR &

18、lt;/p><p>  //TWSR&0xF8 狀態(tài)碼 </p><p>  #define START 0x08 </p><p>  #define RE_START 0x10 </p><p>  #define MT_SLA_ACK 0x18 </p><p>  #define MT_SLA_

19、NAK 0x20 </p><p>  #define MT_DATA_ACK 0x28 </p><p>  #define MT_DATA_NAK 0x30 </p><p>  #define SLA_DATA_FAIL 0x38 </p><p>  #define MR_SLA_ACK 0x40 </p&g

20、t;<p>  #define MR_SLA_NAK 0x48 </p><p>  #define MR_DATA_ACK 0x50 </p><p>  #define MR_DATA_NAK 0x58 </p><p>  #define SLA_R_PCF8563 0xA3 </p><p>  #def

21、ine SLA_W_PCF8563 0xA2 </p><p>  #define PAGE_SIZE_PCF8563 16 </p><p>  #define NUM_PAGE_PCF8563 1 </p><p>  /*****************************************************************

22、******* </p><p>  I2C主機寫N字節(jié)數(shù)據(jù)到從器件 </p><p>  編程:許工 QQ11520389 </p><p>  時間:2010.03.05 </p><p><b>  參數(shù)說明: </b></p><p>  SLA_W: 從器件寫地址 </p>

23、;<p>  ADDR: 從器件內(nèi)部寫數(shù)據(jù)起始地址 </p><p>  N: 寫數(shù)據(jù)字節(jié)數(shù) </p><p>  DAT: 源數(shù)據(jù)起始地址 </p><p>  ************************************************************************/ </p><

24、;p>  unsigned char i2c_write_n_bytes(unsigned char SLA_W, unsigned int ADDR, </p><p>  unsigned int N, unsigned char *DAT) </p><p><b>  { </b></p><p>  unsigned int i

25、; </p><p>  I2C_START(); </p><p>  I2C_CHECK_STATUS(START); </p><p>  I2C_WRITE(SLA_W); </p><p>  I2C_NAK(); </p><p>  I2C_CHECK_STATUS(MT_SLA_ACK); </p

26、><p>  if(SLA_W!=SLA_W_PCF8563) </p><p><b>  { </b></p><p>  I2C_WRITE((unsigned char)ADDR>>8); </p><p>  I2C_NAK(); </p><p>  I2C_CHECK_STA

27、TUS(MT_DATA_ACK); </p><p><b>  } </b></p><p>  I2C_WRITE((unsigned char)ADDR); </p><p>  I2C_NAK(); </p><p>  I2C_CHECK_STATUS(MT_DATA_ACK); </p><

28、;p>  for(i=0;i<N;i++) </p><p><b>  { </b></p><p>  I2C_WRITE(DAT[i]); </p><p>  I2C_NAK(); </p><p>  I2C_CHECK_STATUS(MT_DATA_ACK); </p><p&

29、gt;<b>  } </b></p><p>  I2C_STOP(); </p><p>  return 1; </p><p><b>  } </b></p><p>  /*********************************************************

30、*************** </p><p>  I2C主機從從器件讀N字節(jié)數(shù)據(jù) </p><p>  編程:許工 QQ11520389 </p><p>  時間:2010.03.05 </p><p><b>  參數(shù)說明: </b></p><p>  SLA_R: 從器件讀地址 &

31、lt;/p><p>  ADDR: 從器件內(nèi)部讀數(shù)據(jù)起始地址 </p><p>  N: 讀數(shù)據(jù)字節(jié)數(shù) </p><p>  DAT: 目標數(shù)據(jù)起始地址 </p><p>  ************************************************************************/ </p

32、><p>  unsigned char i2c_read_n_bytes(unsigned char SLA_R, unsigned int ADDR, </p><p>  unsigned int N, unsigned char *DAT) </p><p><b>  { </b></p><p>  unsign

33、ed int i; </p><p>  I2C_START(); </p><p>  I2C_CHECK_STATUS(START); </p><p>  I2C_WRITE((SLA_R)-1); </p><p>  I2C_NAK(); </p><p>  I2C_CHECK_STATUS(MT_SLA_

34、ACK); </p><p>  if(SLA_R!=SLA_R_PCF8563) </p><p><b>  { </b></p><p>  I2C_WRITE((unsigned char)ADDR>>8); </p><p>  I2C_NAK(); </p><p>  I

35、2C_CHECK_STATUS(MT_DATA_ACK); </p><p><b>  } </b></p><p>  I2C_WRITE((unsigned char)ADDR); </p><p>  I2C_NAK(); </p><p>  I2C_CHECK_STATUS(MT_DATA_ACK); <

36、;/p><p>  I2C_START(); </p><p>  I2C_CHECK_STATUS(RE_START); </p><p>  I2C_WRITE(SLA_R); </p><p>  I2C_NAK(); </p><p>  I2C_CHECK_STATUS(MR_SLA_ACK); </p&g

37、t;<p><b>  if(N>1) </b></p><p><b>  { </b></p><p>  for(i=0;i<N-1;i++) </p><p><b>  { </b></p><p>  I2C_ACK(); </p&g

38、t;<p>  I2C_CHECK_STATUS(MR_DATA_ACK); </p><p>  I2C_READ(DAT[i]); </p><p><b>  } </b></p><p><b>  } </b></p><p>  I2C_NAK(); </p>

39、<p>  I2C_CHECK_STATUS(MR_DATA_NAK); </p><p>  DAT[N-1]=TWDR; </p><p>  I2C_STOP(); </p><p>  return 1; </p><p><b>  } </b></p><p>  //P

40、CF8563時鐘停止指令 </p><p>  void PCF8563_stop(void) </p><p><b>  { </b></p><p>  unsigned char stopcode=0x20; </p><p>  i2c_write_n_bytes(SLA_W_PCF8563,0,1,&

41、stopcode); </p><p><b>  } </b></p><p>  //PCF8563時鐘啟動指令 </p><p>  void PCF8563_start(void) </p><p><b>  { </b></p><p>  unsigned ch

42、ar startcode=0x00; </p><p>  i2c_write_n_bytes(SLA_W_PCF8563,0,1,&startcode); </p><p><b>  }</b></p><p>  /**********************************************************

43、************** </p><p>  PCF8563時鐘設(shè)置 </p><p>  編程:許工 QQ11520389 </p><p>  時間:2010.03.05 </p><p>  參數(shù)說明:(BCD碼) </p><p>  yy: 年(0x00到0x99) </p><p

44、>  mm: 月(0x01到0x12) </p><p>  dd: 日(0x01到0x31) </p><p>  hh: 時(0x00到0x23) </p><p>  mi: 分(0x00到0x59) </p><p>  ss: 秒(0x00到0x59) </p><p>  da: 星期(0

45、x01到0x07) </p><p>  ************************************************************************/ </p><p>  void PCF8563_set(unsigned char yy,unsigned char mm,unsigned char dd, </p><p>

46、  unsigned char da,unsigned char hh,unsigned char mi,unsigned char ss) </p><p><b>  { </b></p><p>  unsigned char time[7]; </p><p>  time[6]=yy;//年 </p><p>

47、  time[5]=mm;//月 </p><p>  time[4]=da;//星期 </p><p>  time[3]=dd;//日 </p><p>  time[2]=hh;//時 </p><p>  time[1]=mi;//分 </p><p>  time[0]=ss;//秒 </p>

48、<p>  PCF8563_stop(); </p><p>  i2c_write_n_bytes(SLA_W_PCF8563,2,7,time); </p><p>  PCF8563_start(); </p><p><b>  } </b></p><p>  /*******************

49、***************************************************** </p><p>  PCF8563時鐘讀取 </p><p>  編程:許工 QQ11520389 </p><p>  時間:2010.03.05 </p><p>  參數(shù)說明:(BCD碼) </p><p&g

50、t;  time: 存放讀出時間的數(shù)組名 </p><p>  time[6]: 年(0x00到0x99) </p><p>  time[5]: 月(0x01到0x12) </p><p>  time[3]: 日(0x01到0x31) </p><p>  time[2]: 時(0x00到0x23) </p>&

51、lt;p>  time[1]: 分(0x00到0x59) </p><p>  time[0]: 秒(0x00到0x59) </p><p>  time[4]: 星期(0x01到0x07) </p><p>  ***********************************************************************

52、*/ </p><p>  unsigned char BCD2Val(unsigned char x)</p><p><b>  {</b></p><p>  return (x>>4)*10+(x&0x0f); //高4位乘以10,再加上低4位,即得到數(shù)值</p><p><b> 

53、 }</b></p><p>  void PCF8563_read(unsigned char *time) </p><p><b>  { </b></p><p>  i2c_read_n_bytes(SLA_R_PCF8563,2,7,time); </p><p>  //time[6]

54、 //年 </p><p>  time[5]=BCD2Val(time[5]&0x7f);//月 </p><p>  time[4]=BCD2Val(time[4]&0x7f);//星期 </p><p>  time[3]=BCD2Val(time[3]&0x7f);//日 </p><p>  time[2]

55、=BCD2Val(time[2]&0x7f);//時 </p><p>  time[1]=BCD2Val(time[1]&0x7f);//分 </p><p>  time[0]=BCD2Val(time[0]&0x7f);//秒 </p><p>  USART_Send_Char(time[2]/10%10+0x30); </p&

56、gt;<p>  USART_Send_Char(time[2]%10+0x30);</p><p>  USART_Send_Str(":");</p><p>  USART_Send_Char(time[1]/10%10+0x30); </p><p>  USART_Send_Char(time[1]%10+0x30);&l

57、t;/p><p>  USART_Send_Str(":");</p><p>  USART_Send_Char(time[0]/10%10+0x30); </p><p>  USART_Send_Char(time[0]%10+0x30);</p><p>  USART_Send_Str("\n")

58、;</p><p><b>  } </b></p><p>  void main(void)</p><p><b>  { </b></p><p>  unsigned char dat[132];</p><p>  USART_Init();</p>

59、<p>  PORTC=0x00;</p><p>  DDRC=0x03;</p><p>  PORTD=0x01;</p><p>  DDRD=0x02;</p><p>  TWSR=0x00;</p><p>  TWBR=0x04;</p><p>  TWAR=0x0

60、0;</p><p>  TWCR=0x44;</p><p>  PCF8563_set(0x10,0x05,0x01,0x17,0x16,0x20,0x23); </p><p><b>  while (1)</b></p><p>  { delay_ms(1000); </p><p>

61、  PCF8563_read(dat); </p><p>  // Place your code here</p><p><b>  };</b></p><p>  }5 結(jié)束語    介紹采用avr單片機為主控器件的電子時鐘系統(tǒng)的設(shè)計與實現(xiàn)。設(shè)計電子時鐘系統(tǒng)時選用PCF8563時鐘/日歷器件,由3.3

溫馨提示

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

評論

0/150

提交評論