国产在线中文字幕亚洲,一区视频国产精品观看,欧美日韩国产高清片,久久久久久AV无码免费网站,亚洲无码一二三四五区,日韩无码www.,sese444

您好,歡迎來(lái)到維�(kù)電子市場(chǎng)�(wǎng) 登錄 | 免費(fèi)注冊(cè)

8051單片�(jī)
閱讀�18109�(shí)間:2010-11-15 17:53:58

  8051單片�(jī)是早最典型的產(chǎn)品,該系列具它單片機(jī)都是�8051的基�(chǔ)上�(jìn)行功能的�、減、改變而來(lái)的,所以人們習(xí)慣于�8051�(lái)稱呼MCS51系列單片�(jī)�

分類

  8051單片�(jī)可分為無(wú)ROM型和ROM型兩� �(wú)ROM型的芯片,必須外接EPROM才能�(yīng) 用(典型芯片�8031� ROM型芯片又分為EPROM型(典型芯片� 8751�、FLASH型(典型芯片�89C51)� 掩膜ROM型(典型芯片�8051 �、一次� 可編程ROM(One Time Programming,�(jiǎn) 稱OTP)的芯片(典型芯片為97C51��

包含部件

 ?�?)一�(gè)位微處理器CPU��

 ?�?)片�(nèi)�(shù)�(jù)存儲(chǔ)� )片�(nèi)�(shù)�(jù)存儲(chǔ)器RAM和特殊功能寄存器 和特殊功能寄存器 �

 ?�?)片�(nèi)程序存儲(chǔ)� )片�(nèi)程序存儲(chǔ)器ROM�

 ?�?)兩�(gè)定時(shí) �(jì)�(shù)� TO、T1,可用作定時(shí)�,也可用� )兩�(gè)定時(shí)/�(jì)�(shù)� �(duì)外部脈沖�(jìn)行計(jì) �(shù)� I/O端口

 ?�?)四�(gè)8位可編程的并行I/O端口,每�(gè)端口既可作輸 )四�(gè)8位可編程的并行I/O端口� 也可作輸出� �,也可作輸出� 一�(gè)串行端口,用于數(shù)�(jù)的串行通信�

  �6)一�(gè)串行端口,用于數(shù)�(jù)的串行通信� 中斷控制系統(tǒng)�

 ?�?)中斷控制系�(tǒng)� �(nèi)部時(shí)鐘電��

 ?�?)內(nèi)部時(shí)鐘電��

�(kāi)�(fā)工具DIY

  由于單片�(jī)是一門�(shí)踐性很�(qiáng)的課程,如果采用傳統(tǒng)的開(kāi)�(fā)模式,則要購(gòu)買價(jià)格昂貴的仿真器、編程器等開(kāi)�(fā)工具�(lái)作實(shí)�(yàn)。其�(shí)由于芯片功能的日益完�,我們可以利用芯片的在系�(tǒng)編程(ISP)功能制作出�(shí)用而低�(jià)的開(kāi)�(fā)工具。本文旨在幫助DIY�(ài)好者開(kāi)�(fā)制作出適合自己的�(kāi)�(fā)工具�

  1 �(dāng)前常用開(kāi)�(fā)模式

  目前,基本上有兩種開(kāi)�(fā)模式可供選擇:用仿真�、用編程��

 ?�?用仿真器。優(yōu)�(diǎn):方�,可以設(shè)置斷�(diǎn),可以觀察存�(chǔ)器及寄存器的�(nèi)�。缺�(diǎn):價(jià)格昂�,不同類型的單片�(jī)要購(gòu)買不同的仿真�;仿真器終究不是單片�(jī),有�(shí)代碼在仿真器上能通過(guò),但在單片機(jī)中不能正常工�,反而增加了�(diào)試的難度�

 ?�?用編程器。優(yōu)�(diǎn):價(jià)格相�(duì)便宜,通常一款編程器可編程多種器�。缺�(diǎn):操作相�(dāng)不便,每次要將芯片在目標(biāo)板與編程器之間轉(zhuǎn)�,并且還要在編譯操作界面與編程器操作界面之間切換,大部分�(shí)間在做簡(jiǎn)單的重復(fù)工作�

  2 新的�(kāi)�(fā)模式介紹及芯片選�

  本文介紹的開(kāi)�(fā)工具采用一種新的開(kāi)�(fā)模式(類似于編程器開(kāi)�(fā)模式�。由于利用了芯片的在系統(tǒng)編程功能,因此不需要移�(dòng)芯片。在軟件�(shè)�(jì)�(shí)�(shè)�(jì)成:一旦代碼文件被重新編過(guò),即自動(dòng)下載到芯�,并自動(dòng)�(fù)位運(yùn)�,是真正的“所編即所得”�

  目前很多單片�(jī)都支持在系統(tǒng)編程�8051系列單片�(jī)支持在系�(tǒng)編程的也很多,但大多�(shù)是支持通過(guò)PC�(jī)的串口對(duì)單片�(jī)�(jìn)行編�。這樣有四�(gè)不方便的地方:一是項(xiàng)目本身與PC�(jī)串行通信不方�;二是要增加1片MAX232電平�(zhuǎn)換芯片;三是有的芯片要按特定的步驟�(jìn)入下載模�,編程過(guò)程需要手工干�(yù);四是有的芯片需要固件(定制的程序)的支�,如果不小心損壞了固件,則芯片的在系�(tǒng)編程功能也沒(méi)有了�

  �(jīng)�(guò)比較,Atmel公司生產(chǎn)的AT89S8252是一種比較理想的芯片,適合制作開(kāi)�(fā)工具。此芯片有如下特�(diǎn)�

  �8051兼容�

  �(nèi)�8KB可擦�(xiě)1000次的程序存儲(chǔ)器,2KB可擦�(xiě)超過(guò)100 000次的�(shù)�(jù)存儲(chǔ)器及256字節(jié)8位寬�(nèi)部RAM�

  可通過(guò)SPI接口在系�(tǒng)串行編程,與8051兼容

  串行編程�(shí)有自�(dòng)擦寫(xiě)周期,在�(diào)試大程序�(shí)可以分段下載,節(jié)約時(shí)��

  低電壓下�,無(wú)需12V編程電壓�

  3 AT89S8252串行編程

  (1)AT89S8252串行編程模式

  �(dāng)芯片的RST引腳置高電平�(shí),所有程序和�(shù)�(jù)存儲(chǔ)器可以通過(guò)SPI總線接口[SCK,MOSI(input�,MISO(output)]編程。RST變高以后,在編程或擦除操作之前必須首先發(fā)送一條編程允許命令。在串行編程模式�,芯片會(huì)在字節(jié)編程之前自動(dòng)插入一�(gè)擦除周期。因�,除非芯片的代碼保護(hù)位被編程,編程之前不需要執(zhí)行全片擦除命�。SPI接口之SCK�(shí)鐘頻率須低于晶振頻率�1/40�

  (2)AT89S8252串行編程步驟

 ?�?在XTAL1與XTAL2之間連接一�(gè)3~24MHz的晶�;在VCC與GND之前加上電源電壓,將RST置高,等�10ms�

 ?�?�(fā)送串行編程允許命令�

 ?�?�(fā)送寫(xiě)/讀/擦除等命令及�(shù)�(jù),串行數(shù)�(jù)高位在前,低位在�,數(shù)�(jù)在時(shí)鐘的上升沿鎖��

 ?�?如果上一步是�(xiě)命令,至少等�2.5ms�

 ?�?需要時(shí)重復(fù)�、④兩步�

 ?�?將RST置低,芯片開(kāi)始運(yùn)行�

  (3)AT89S8252串行編程命令

  AT89S8252串行編程命令如表1所��

AT89S8252串行編程命令如表

  4)AT89S8252串行編程�(shí)序圖

  AT89S8252串行編程�(shí)序如�1所��

AT89S8252串行編程時(shí)序圖

  4 硬件�(shè)�(jì)

 ?�?通過(guò)�(jì)算機(jī)并口與單片機(jī)SPI口連接�

  � 為了保護(hù)�(jì)算機(jī)并口,需要增�1�74HC244作為隔離�

  �(shí)用的原理圖如�2所�。(已經(jīng)�(guò)�(shí)踐檢�(yàn),可放心使用。)

實(shí)用的原理圖

  5 用VB編程�(jìn)行并口控�

  打印端口的基地址一般為0x278�0x378�0x3BC,可以從控制面板中查�。為了方便讀�,表2列出了常用打印端口引腳及寄存器位元的�(shuō)��

常用打印端口引腳及寄存器

  在Windows�(huán)境下最�(jiǎn)單易�(xué)的語(yǔ)言恐怕非VB莫屬,所以我們的�(kāi)�(fā)工具也選用VB作為編程�(yǔ)言。但由于Windows的保�(hù),VB�(wú)法直接讀�(xiě)打印端口,因此我們需要另外的程序模塊�(lái)�(shí)�(xiàn)打印端口的直接讀�(xiě)。在Internet�(wǎng)上可以找到許多此類模塊,并且相當(dāng)多的模塊可以免費(fèi)使用。經(jīng)�(guò)試用,筆者推薦使用Winio v2.0。該模塊支持Win9X/NT/2000/XP(https://www.internals.com Yariv Kaplan ),并且?guī)в性敿?xì)的幫�、例子程序及源碼。使用時(shí),將Winio.sys、Winio.dll、Winio.vxd及Winio.bas四�(gè)文件拷貝到工作目錄下,在VB中直接添加Winio.bas模塊即可。本例中用到的函�(shù)有四�(gè),分別說(shuō)明如�� � Initialize():允許端口控制函�(shù)。在使用端口輸入輸出函數(shù)之前�(diào)用一�,成功返回�1�,失敗返回�0��

 ?�?Shutdown():關(guān)閉端口控制函�(shù)。在退出程序時(shí)�(zhí)行一�,成功返回�1�,失敗返回�0��

  � GetPortVal(ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte) As Boolean:讀取端口函�(shù),PortAddr 為端口地址� Portval為端口�,bSize為要讀取的字節(jié)�(shù)。讀取成功時(shí)返回�1�,失敗時(shí)返回�0”�

 ?�?SetPortVal(ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte) As Boolean:寫(xiě)端口函數(shù)。PortAddr 為端口地址� Portval為要�(xiě)的�,bSize為要�(xiě)入的字節(jié)�(shù)。寫(xiě)入成功返回�1�,失敗返回�0��

  四�(gè)函數(shù)在Winio.bas模塊中的聲明如下�

  Declare Function InitializeWinIo Lib 揥inIo.dll� () As Boolean

  Declare Function ShutdownWinIo Lib 揥inIo.dll� () As Boolean

  Declare Function GetPortVal Lib 揥inIo.dll� (ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte) As Boolean

  Declare Function SetPortVal Lib 揥inIo.dll� (ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte) As Boolean

  6 Intel HEX 格式文件

  由于一般編譯軟件產(chǎn)生的用于�(xiě)入芯片的文件都是Intel HEX格式的文�。Intel HEX文件屬于文本文件,可以用記事本查�。一�(gè)Intel HEX文件的一行稱為一�(gè)記錄,每�(gè)記錄都是由十六�(jìn)制字符組成的,兩�(gè)字符表示一�(gè)字節(jié)的�。Intel HEX文件通常由若干條記錄組成,每�(gè)記錄都具有如下的形式�

 ?。篖LAAAATTDD...DDCC

  “:”——記錄的起始�(biāo)��

  LL——記錄長(zhǎng)度,表示該記錄中的數(shù)�(jù)字節(jié)�(shù)�

  AAAA——數(shù)�(jù)裝入的首地址�16位)�

  TT——記錄類��00表示�(shù)�(jù)記錄�01表示文件�(jié)��(注意:有的編譯軟件會(huì)�(chǎn)生大�01的記錄類型,本應(yīng)用中�(duì)大于01記錄類型的記錄忽略掉即可�)

  DD——數(shù)�(jù)值(字節(jié));

  CC——校�(yàn)�。(將其本身與記錄中除起始標(biāo)志外的所有字節(jié)相加�(yīng)�0,不�0則有�(cuò)。)

  VB編程詳細(xì)�(shuō)明見(jiàn)本刊�(wǎng)�(luò)�(bǔ)充版(https://www.dpj.com.cn�。(由于各子程序的流程都較簡(jiǎn)�,所以直接給出源�,而未�(huà)出流程圖。程序采用由底至�?shù)脑O(shè)�(jì)方法。)

  �(jié) �(yǔ)

  雖然上述程序能實(shí)�(xiàn)各種基本的功�,但并不完善,并未考慮各種異常情況,讀者可根據(jù)�(shí)際情況�(jìn)行完�。編程功力較差的朋友可直接到筆者的�(wǎng)站(http: //www.mcudiy.com)下載相�(duì)較完善的�(yīng)用程� 。如果充分理解了上述程序,那么DIY一�(gè)AVR或PIC單片�(jī)的開(kāi)�(fā)工具也非難事。在筆者的�(wǎng)站也有制作完成的“MCS51/AVR/PIC三合一下載器資料”供�(ài)好者下��

  由于AT89S8252的價(jià)格還是較�,所以現(xiàn)在市�(chǎng)上較難買,不�(guò)Atmel公司推出的替代AT89C51/52的AT89S51/52也有在系�(tǒng)編程功能,且�(jià)格便�。其在系�(tǒng)編程的實(shí)�(xiàn)方法與AT89S8252類似,對(duì)本例部分程序稍作修改即可支持該器�。筆者制作的“MCS51/AVR/PIC三合一下載器”增加了�(duì)AT89S51/52的支持�

在線升級(jí)軟件的方�

  本文通過(guò)�(duì)8051單片�(jī)的特�(diǎn)分析,提出了一種低成本的方法,使其軟件可以利用系統(tǒng)已有的通信鏈路在線升級(jí)�

  1 基本原理

  類似于其他引�(dǎo)裝載升級(jí)程序的方法,在系�(tǒng)中必須始終存在一段用于程序裝載的代碼(bootloader�,該代碼在啟�(dòng)�(shí)被運(yùn)�。其基本功能是根�(jù)外部條件�(lái)判斷是運(yùn)行現(xiàn)有版本的程序還是從主�(jī)下載新程序�8051具有選擇�(zhí)行片�(nèi)或者片外程序的功能,而對(duì)片內(nèi)E2PROM編程�(guò)程相�(duì)比較�(fù)�,因此這里將程序引�(dǎo)裝載代碼燒結(jié)在內(nèi)部程序空間中,并不準(zhǔn)備改�;而將系統(tǒng)�(yīng)用程序存放在片外一編程相對(duì)�(jiǎn)單和�(dú)立的E2PROM�(nèi),是隨時(shí)可以更新的部�。通過(guò)外圍電路的支�,單片機(jī)上電�(fù)位時(shí)首先�(zhí)行片�(nèi)的裝載程序,如圖1所�。該裝載代碼將應(yīng)用程序從E2PROM拷貝到外部存�(chǔ)器(RAM)中以備�(zhí)行,同時(shí)還通過(guò)通信接口�(jiān)系統(tǒng)程序裝載�(zhí)行過(guò)程聽(tīng)主機(jī)命令。當(dāng)收到主機(jī)更新程序的請(qǐng)求后,立即接收新的應(yīng)用程序內(nèi)�,并在最終確�(rèn)后寫(xiě)入擴(kuò)展E2PROM�(nèi)。當(dāng)片內(nèi)程序�(zhí)行完畢后,系�(tǒng)軟件�(fù)位并�(zhí)行片外RAM中的程序,而RAM的內(nèi)容正是由裝載所決定�。如果CPU再次�(fù)�,那么將重復(fù)上述裝載�(zhí)行過(guò)程�

  值得注意的是,在�(duì)外部程序存儲(chǔ)器訪�(wèn)�(shí)�8051單片�(jī)只提供讀指令(MOVC)而并不具備寫(xiě)指令。但是從單片�(jī)�(duì)外部程序和數(shù)�(jù)存儲(chǔ)器的訪問(wèn)�(shí)序上看具有一致�,不同的是讀代碼使用PSEN信號(hào)而讀�(shù)�(jù)使用RD信號(hào)。同�(shí),單片機(jī)的PSEN﹑RD和WR信號(hào)不會(huì)同時(shí)有效,因此將PSEN和RD邏輯合并�,可以使程序和數(shù)�(jù)合二為一讀�(xiě)成為可能。這樣同一�(gè)地址單元RD、WR(MOVX)和PSEN(MOVC)均可以�(jìn)行訪�(wèn)。單片機(jī)可以使用MOVX�(xiě)指令�(lái)更改相當(dāng)于其外部程序空間中的�(nèi)容。特別要注意的是,當(dāng)程序和數(shù)�(jù)共存于一片RAM中時(shí),必須使用編譯器提供的相�(guān)連接命令使數(shù)�(jù)區(qū)偏離代碼可能占用的區(qū)�,否則會(huì)�(dǎo)致系�(tǒng)混亂� 2 硬件電路

  硬件參考電路如�2所�。系�(tǒng)加電�,由于C3兩端電壓不能瞬變,使D觸發(fā)器置1端保持一短暫低電平,�(qiáng)制將單片�(jī)EA信號(hào)置高。在U4看門狗上電復(fù)位信�(hào)撤銷�,單片機(jī)�(kāi)始從�(nèi)部程序空�0地址起執(zhí)行。內(nèi)部裝載程序先通過(guò)P1.4、P1.5模擬I2C總線�(shí)序從E2PROMU3中將�(yīng)用程序代碼拷貝到片外RAM�0地址起的空間�。如果到代碼拷貝�(jié)束串行口一直沒(méi)有收到預(yù)定的程序下載命令,則通過(guò)軟件置低P1.6口觸�(fā)看門狗芯片對(duì)單片�(jī)�(fù)�,在�(fù)位脈沖的上升沿,D觸發(fā)器鎖存其輸出的信�(hào)使EA電平翻轉(zhuǎn)為低電平。待�(fù)位信�(hào)撤銷�,單片機(jī)�(kāi)始執(zhí)行位于外部程序空間的系統(tǒng)�(yīng)用程序代碼。在�(zhí)行外部程序時(shí),如果看門狗再次復(fù)�,EA將會(huì)恢復(fù)高電平并重新�(zhí)行內(nèi)部裝載程序�

  �(dāng)上位�(jī)欲更改終端設(shè)備程序時(shí),可通過(guò)串口向其�(fā)送特定的握手字符�,無(wú)論片外程序還是片�(nèi)程序都能�(shí)別該字符串并且復(fù)位單片機(jī)(如果是正在�(yùn)行外部程序)�(zhí)行內(nèi)部裝載程序。裝載程序就緒后向上位機(jī)�(fā)送確�(rèn)回應(yīng),并接收�(lái)自上位機(jī)的程序代碼。單片機(jī)通過(guò)置低P1.3允許E2PROM�(xiě)操作,將新的�(nèi)容寫(xiě)入E2PROM�,完成程序的更新�

  3 軟件�(shè)�(jì)

  裝載程序主要有兩�(gè)功能,其一是要將E2PROM的內(nèi)容拷貝到片外RAM�;其二是要響�(yīng)上位�(jī)的更新程序命令并接收代碼�(nèi)容更新E2PROM�

  #define uchar unsigned char

  #define uintunsigned int

  sbit WDI=P1^7;

  sbit RESET=P1^6;

  /*聲明外部I2C讀�(xiě)函數(shù)*/

  extern void I2c[_]wr(uchar addh,uchar addl,uchar buf[],uchar num,bit wr);

  void main(void) {

  uchar data addh,addl;

  uchar data buf[16];

  uchar j;

  uint I=0;

  XBYTE[0x1fff]=0;/*清除程序拷貝好標(biāo)�*/

  WDI=~WDI; /*喂狗*/

  system[_]init(); /*初始�*/

  for(addh=0;addh<0x10;addh++) {

  for(addl=0;addl<0xf0;addl+=16) {

  /*讀入E2PROM地址addh:addl16字節(jié)�(nèi)容到buf*/

  I2c[_]wr(addh,addl,buf,16,1);

  for(j=0;j<16;j++)

  /*將代碼寫(xiě)入外部地址*/

  XBYTE[I++]=buf[j];

  }

  I2c[_]wr(addh,0xf0,buf,16,1);

  for(j=0;j<16;j++)

  XBYTE[I++]=buf[j];

  WDI=~WDI;

  }

  if(shake[_]hand==1) {

  /*shake[_]hand由串口中斷收到握手命令后�1*/

  rcv[_]data(); /*該函�(shù)�(fù)�(zé)從上位機(jī)獲取程序*/

  }

  XBYTE[0x1fff]=0xaa;/*置程序拷貝好�(biāo)�*/

  RESET=0;/*�(fù)位單片機(jī)并執(zhí)行外部RAM�(nèi)的程�*/

  while(1);

  }

  為了確保程序在裝載完全正確后才開(kāi)始執(zhí)行,裝載程序使用了外部RAM 0x1fff地址�(nèi)容作為裝載成功的�(biāo)�。那么相�(yīng)的應(yīng)用程序應(yīng)判斷此標(biāo)志后再執(zhí)��

  �(diào)試結(jié)束的裝載程序燒結(jié)在單片機(jī)�,而實(shí)際的系統(tǒng)�(yīng)用程序則存儲(chǔ)于外部E2PROM�(nèi)。應(yīng)用中,將單片�(jī)直接焊裝在電路板上,而編程者只需通過(guò)串口或者其他形式的通信鏈路甚至�(wú)線的方式�(lái)更改升級(jí)目標(biāo)�(yīng)用程��

  4 幾點(diǎn)討論

  在實(shí)際應(yīng)用中,使用嚴(yán)格的校驗(yàn)及復(fù)查方法來(lái)確保程序拷貝�(wú)誤� 另外� 在從上位�(jī)下載程序�(shí)�(yīng)該制定一�(gè)可靠的通信�(xié)議, 從而保證獲取的程序完全正確� 單片�(jī)在接收到上位�(jī)的代碼數(shù)�(jù)�(shí),不要急于�(xiě)入外部E2PROM,而應(yīng)先全部放在外部RAM區(qū)�(nèi),待代碼獲取完畢并且通過(guò)校驗(yàn)檢查后再把RAM的內(nèi)容一次性寫(xiě)入E2PROM。這樣防止在獲取程序的�(shí)候通信異常中斷而E2PROM�(nèi)將沒(méi)有一�(gè)可以�(zhí)行的程序�

  從原理上�,如果片外RAM是非易失�,就可以不再使用E2PROM。但是這樣系統(tǒng)成本變高且可靠性降低,�?yàn)�?dāng)單片�(jī)程序跑飛�(shí)很容易產(chǎn)生MOVX指令而改變RAM區(qū)的內(nèi)�,造成程序性不可恢�(fù)。而在程序跑飛的情況下,很難產(chǎn)生符合外部E2PROM接口的I2C�(xiě)�(shí)序,同時(shí)E2PROM還有�(xiě)保護(hù)功能�

  雖然上述方法能使8051單片�(jī)系統(tǒng)具有�(yuǎn)程升�(jí)代碼的能力,但是程序裝載�(guò)程將使系�(tǒng)的啟�(dòng)�(shí)間延�(zhǎng)�(shù)秒,在對(duì)啟動(dòng)�(shí)間要求較短的�(chǎng)合不能應(yīng)用本文中介紹的方��

家族�(shù)�(jù)手冊(cè)鏈接大全

  以下提供的鏈接是生產(chǎn)8051家族單片�(jī)的廠商的�(wǎng)址及其單片�(jī)�(chǎn)品數(shù)�(jù)手冊(cè)的地址。如果你還知道其�8051兼容的單片機(jī)的廠商及其產(chǎn)品型�(hào),請(qǐng)告知它們的�(wǎng)址�

  Analog Devices

  Micro PORTs UARTs TMR I2C IRAM OCPRG OCRAM A/D D/A WD CLK

  ADuC812 4 1 3 Yes 256 EP=8k SR=640 Yes Yes Yes -

  Atmel

  Micro PORTs UARTs TMR I2C IRAM OCPRG OCRAM A/D D/A WD CLK

  AT89C1051 2 - 1 - 64 F=1k - - - - -

  AT89C2051 2 1 2 - 128 F=2k - - - - -

  AT89C51 4 1 2 - 128 F=4k - - - - -

  AT89C52 4 1 3 - 256 F=8k - - - - -

  AT89LV51 4 1 2 - 128 F=4k - - - - -

  AT89LV52 4 1 3 - 256 F=8k - - - - -

  AT89LV55L 4 1 3 - 256 F=20k - - - - -

  Dallas Semiconductor

  Micro PORTs UARTs TMR I2C IRAM OCPRG OCRAM A/D D/A WD CLK

  80C310 4 1 3 - 256 - - - - - -

  80C320 4 2 3 - 256 - - - - Yes -

  80C323 4 2 3 - 256 - - - - Yes -

  87C520 4 2 3 - 256 EP=16k - - - Yes -

  87C530 4 2 3 - 256 EP=16k - - - Yes Yes

  87C550 7 2 3 - 256 EP=8k SRAM=1k Yes - Yes -

  Intel

  83C51KB

  87C51

  87C54

  8xC151

  8xC152

  8xC251

  8xC52 Online Tutorial

  ISSI

  Micro PORTs UARTs TMR I2C IRAM OCPRG OCRAM A/D D/A WD CLK

  80C31 4 1 2 - 128 - - - - - -

  80C51 4 1 2 - 128 R=4k - - - - -

  80C32 4 1 3 - 256 - - - - - -

  80C52 4 1 3 - 256 R=8k - - - - -

  Okidata

  MSM80C48/49/50

  MSM80C154S/83C154S

  MSM85C154HVS

  Triscend Corporation

  Micro PORTs UARTs TMR I2C IRAM OCPRG OCRAM A/D D/A WD CLK

  TE505 12 1 3 - 256 - SR=8Kx8 - - Yes -

  TE512 15 1 3 - 256 - SR=16Kx8 - - Yes -

  TE520 31 1 3 - 256 - SR=40Kx8 - - Yes -

  TE532 39 1 3 - 256 - SR=64Kx8 - - Yes -

  TDK Semiconductor

  Micro PORTs UARTs TMR I2C IRAM OCPRG OCRAM A/D D/A WD CLK

  73M2910 4 1 3 - 256 - - - - - -

  Philips

  8xC51/80C

  8XC32/51/52/54/58/FX/RX+

  80/83/87C451

  80/83/87C550

  83C562

  80/83/87C575

  83/87C576

  83/87C750

  83/87C751

  83/87C752

  87C524

  87C528

  87C552

  87C652

  87C654

  83/87C508

  P80/83C56

  89C535/53

  P83C434/8

  TELX FAMILY

  8XC592

  8XCE598

  83/87C748

  83/87C749

  83C524

  80/83C528

  80/83C552

  OM5202

  OM5232

  OM5234/5284

  OM5238

  80/83/89CE558

  P80/83CE559

  80/83C851

  83C654

  80/83C851

  83CE654

  83C/055/145/845/87C055

  TPM749

  TPM754

  80/83/87C453

  83/87C754

  Infineon (previously Siemens)

  C501

  C504

  C505

  C509

  C511/C513

  C515

  C517A

  C540/C541

  SMC

  Micro PORTs UARTs TMR I2C IRAM OCPRG OCRAM A/D D/A WD CLK

  COM20051 4 1 3 - 256 - - - - - -

  TEMIC (now part of Atmel)

  Micro PORTs UARTs TMR I2C IRAM OCPRG OCRAM A/D D/A WD CLK

  80C31 4 1 2 - 128 - - - - - -

  80C51 4 1 2 - 128 R=4k - - - - -

  80C32 4 1 3 - 256 - - - - - -

  80C52 4 1 3 - 256 R=8k - - - - -

  TSC80CL31 4 1 2 - 128 - - - - - -

  TSC80CL51 4 1 2 - 128 R=4k - - - - -

  TSC87C51 4 1 2 - 128 EP=4k - - - - -

  TSC87C52 4 1 3 - 256 EP=8k - - - - -

  80C154 4 1 3 - 256 - - - - Yes -

  83C154 4 1 3 - 256 R=16k - - - Yes -

  83C154D 4 1 3 - 256 R=32k - - - Yes -

中DPTR的擴(kuò)展設(shè)�(jì)

  單片�(jī)的出�(xiàn)是計(jì)算機(jī)技�(shù)�(fā)展史上的一�(gè)里程�,它使計(jì)算機(jī)從海量數(shù)值計(jì)算�(jìn)入到控制�(lǐng)�。在單片�(jī)�,以8051系列最為經(jīng)典,至今仍是最普及、廣泛使用的8位MCU架構(gòu)。業(yè)界許多技�(shù)人員在其基礎(chǔ)上不斷�(jìn)行性能�(kuò)展,使得8051系列芯片不斷完善,從而形成一�(gè)龐大的體�。在傳統(tǒng)�8051系列單片�(jī)中,�(shè)置了一組雙字節(jié)寄存器(�(shù)�(jù)指針DPTR�,用于訪�(wèn)外接�64 KB�(shù)�(jù)存儲(chǔ)器和I/O接口電路;但在現(xiàn)今的8051單片�(jī)�(yīng)用中,特別是在嵌入式系統(tǒng)�,往往涉及大規(guī)模的�(shù)�(jù)�(zhuǎn)移操�,而傳�(tǒng)8051的一組數(shù)�(jù)指針使用起來(lái)則顯得捉襟見(jiàn)肘,因此若在8051�(shè)�(jì)中將�(shù)�(jù)指針�(shè)�(jì)為兩組或多組,則在執(zhí)行大�(guī)模數(shù)�(jù)�(zhuǎn)移操作時(shí)�(huì)相當(dāng)�(jiǎn)�、迅速。在這種背景�,本文首先以�(shù)�(jù)�(zhuǎn)移執(zhí)行效率為衡量�(biāo)�(zhǔn),分析了DPTR�(kuò)展的意義,并在Oregano公司的MCS8051核[1]上實(shí)�(xiàn)了DPTR�(kuò)��

  1  DPTR�(kuò)展意�

  為描�8051中的DPTR�(kuò)展的意義,我們針�(duì)�(shí)�(xiàn)大規(guī)模數(shù)�(jù)�(zhuǎn)�,分別對(duì)DPTR�(kuò)展前后作了對(duì)比。為使對(duì)比更加清晰明�,提出了�(shù)�(jù)�(zhuǎn)移執(zhí)行效率的概念�

  �(shù)�(jù)�(zhuǎn)移執(zhí)行效率v定義為�(jìn)行單字節(jié)�(shù)�(jù)�(zhuǎn)移所耗費(fèi)的機(jī)器周期數(shù),即v=nt。其�,n表示所�(zhuǎn)移數(shù)�(jù)字節(jié)�(shù);t表示所耗費(fèi)的機(jī)器周期,可設(shè)定其單位為字節(jié)/�(jī)器周��

  在未�(jìn)行DPTR�(kuò)展的8051�,可通過(guò)�(shè)置地址緩沖區(qū)的方法來(lái)�(shí)�(xiàn)大規(guī)模的�(shù)�(jù)�(zhuǎn)移。具體的例程如下�

  MOVPRE:

  MOV50H, #s[_]adrh

  MOV51H, #s[_]adrl

  MOV52H,#t[_]adrh

  MOV53H,#t[_]adrl

  MOVR2, #64

  REMOVE:MOV DPH, 50H

  MOV DPL, 51H

  MOVX A, @DPTR

  INC DPTR

  MOV 50H, DPH

  MOV 51H, DPL

  MOV DPH, 52H

  MOV DPL, 53H

  MOVX @DPTR,A

  INC DPTR

  MOV 52H, DPH

  MOV 53H, DPL

  DJNZ R2, REMOVE

  在此例程��50H�51H用于存放�(shù)�(jù)源地址s[_]adr(s[_]adrh為高字節(jié), s[_]adrl為低字節(jié))�52H�53H用于存放�(shù)�(jù)目的地址t[_]adr(t[_]adrh為高字節(jié), t[_]adrl為低字節(jié)),實(shí)�(xiàn)將源地址起始64字節(jié)�(shù)�(jù)�(zhuǎn)移至目的地址。在8051�,執(zhí)行n字節(jié)�(shù)�(jù)移位操作耗費(fèi)�14+28×n+2)�(gè)�(jī)器周期,�(shù)�(jù)�(zhuǎn)移執(zhí)行效率為v=n/�14+28×n+2�。在本例程中,n�64,計(jì)算得出共需耗費(fèi)1 808�(gè)�(jī)器周�,執(zhí)行效率v約為0.035 4字節(jié)/�(jī)器周�,而且在此�(shí)�(xiàn)方法中需占用8051�4�(gè)片內(nèi)存儲(chǔ)器(RAM)單元�

  �8051中擁有兩組DPTR,并可通過(guò)特殊指令�(lái)�(shí)�(xiàn)DPTR選取。可�(shè)定SETDPTR0指令表示選取DPTR0,SETDPTR1指令表示選取DPTR1�#s[_]adr表示�(shù)�(jù)源地址�#t[_]adr表示�(shù)�(jù)目的地址,則程序可設(shè)�(jì)為:

  MOVPRE:

  SETDPTR0

  MOVDPTR,#s[_]adr

  SETDPTR1

  MOV DPTR,#t[_]adr

  MOV R2,#64

  REMOVE2:

  SETDPTR0

  MOVX A,@DPTR

  INC DPTR

  SETDPTR1

  MOVX @DPTR,A

  INC DPTR

  DJNZ R2,REMOVE2

  程序�� �(duì)于特殊指令SETDPTR0和SETDPTR1,可通過(guò)�(shè)置特殊功能寄存器(SFR)以表示DPTR狀�(tài),并�(duì)此SFR�(jìn)行操�,以�(shí)�(xiàn)DPTR選取。因此DPTR選取指令可由3字節(jié)指令�(shí)�(xiàn),則在兩組DPTR情況下執(zhí)行大�(guī)模數(shù)�(jù)�(zhuǎn)移需耗費(fèi)�14+12×n+2)�(gè)�(jī)器周�,數(shù)�(jù)�(zhuǎn)移執(zhí)行效率為v=n/�14+12×n+2)。在本例程中,執(zhí)�64字節(jié)�(shù)�(jù)�(zhuǎn)移需耗費(fèi)784�(gè)�(jī)器周�,執(zhí)行效率約�0.085 64字節(jié)/�(jī)器周��

  通過(guò)以上�(duì)比發(fā)�(xiàn),擁用兩組DPTR�8051比傳�(tǒng)8051在大�(guī)模數(shù)�(jù)傳輸�(shí)的數(shù)�(jù)�(zhuǎn)移執(zhí)行效率比為(14+28×n+2�/�14+12×n+2�。由�1可知,隨著所�(zhuǎn)移數(shù)�(jù)量的不斷加大,即n值增大時(shí),執(zhí)行效率比也不斷增�,且趨近�2.33�

數(shù)據(jù)轉(zhuǎn)移執(zhí)行效率對(duì)比圖

  �1  �(shù)�(jù)�(zhuǎn)移執(zhí)行效率對(duì)比圖

  �(jīng)�(guò)以上分析得出:在8051中設(shè)置兩組DPTR將會(huì)使其在數(shù)�(jù)�(zhuǎn)移執(zhí)行效率上有很大提�。從資源占用方面考慮,使用擴(kuò)展DPTR的方式來(lái)�(shí)�(xiàn)�(shù)�(jù)�(zhuǎn)移,僅需�8051中添加一�(gè)SFR,因此在8051中實(shí)�(xiàn)DPTR�(kuò)�,可在資源占用很少的條件�,明顯加快數(shù)�(jù)�(zhuǎn)移速率。這對(duì)于在嵌入式系�(tǒng)�(yīng)用中,�(jìn)行大�(guī)模數(shù)�(jù)�(zhuǎn)移意義重��

  2  具體�(shè)�(jì)�(shí)�(xiàn)

  �8051中對(duì)DPTR�(shí)�(xiàn)�(kuò)�,首先需要對(duì)DPTR的相�(guān)指令�(jìn)行分析,再確定對(duì)其�(jìn)行擴(kuò)展會(huì)影響到哪些指令操�;并根據(jù)其所涉及的指令,分析相應(yīng)的模�,針�(duì)各模塊分別�(jìn)行設(shè)�(jì)修改�

  2.1  相關(guān)指令分析

  �8051�(biāo)�(zhǔn)指令集的111條指令中,與DPTR有關(guān)的指令共�5�,分別為�

 ?�?nbsp; 程序存儲(chǔ)器查表指令,“MOVC A,@A+DPTR��

 ?�?nbsp; 片外RAM傳送指令,“MOVX A, @DPTR”和“MOVX @ DPTR , A��

  �  寄存器數(shù)�(jù)傳送指�,即可對(duì)DPTR�(jìn)行讀�(xiě)操作,在8051中DPTR由DPH(DPTR�8位字節(jié))和DPL(DPTR�8位字節(jié))構(gòu)成,且DPH和DPL與一般的SFR一�,都可作為寄存器�(jìn)行讀�(xiě)、壓棧等操作�

  �  程序�(zhuǎn)移指�,“JMP @A+DPTR�;

 ?�?nbsp; �(yùn)算指�,可分別�(duì)DPH和DPL�(jìn)行運(yùn)算操��

  通過(guò)�(duì)以上與DPTR相關(guān)�5類指令分析可知:第③類指令和第⑤類指令是將DPTR作為SFR�(jìn)行操作的。第①類指令和第④類指令都是DPTR與PC指針�(jìn)行的�(shù)�(jù)傳送操�;第②類指令是對(duì)片外RAM地址寄存器�(jìn)行的�(shù)�(jù)傳送操�。因�,DPTR的操作具體涉�8051中以�3�(gè)模塊:SFR讀�(xiě)模塊、PC指針模塊及片外RAM地址模塊,故�(duì)DPTR的擴(kuò)展也在�3�(gè)模塊中�(jìn)��

  2.2  具體模塊�(shè)�(jì)

  �(duì)于DPTR狀�(tài)寄存器可�(shè)為dptr[_]sel,通過(guò)�(duì)DPTR狀�(tài)�(biāo)志位dps操作,實(shí)�(xiàn)DPTR選取。當(dāng)dps�0�(shí),選取DPTR0;當(dāng)dps�1�(shí),選取DPTR1。在8051�,DPTR分別由DPH和DPL組成,因此對(duì)DPTR的選取實(shí)際上是對(duì)特殊功能寄存器DPH0、DPL0和DPH1、DPL1的選��

  基于以上的設(shè)�(jì)思路,筆者分別在涉及DPTR操作�3�(gè)模塊中�(jìn)行了相應(yīng)的修�。本�(shè)�(jì)所選用MCS8051核由VHDL�(yǔ)言�(shè)�(jì),完全兼容標(biāo)�(zhǔn)8051指令��

  在SFR讀�(xiě)模塊中,�(yīng)針對(duì)讀、寫(xiě)模塊分別�(jìn)行修�。通過(guò)分析MCS8051�(shè)�(jì)代碼可知,對(duì)于DPTR的讀操作,是通過(guò)將DPTR中數(shù)�(jù)傳送給�(shù)�(jù)暫存寄存器S[_]REGDATA,再通過(guò)�(duì)S[_]REGDATA�(jìn)行讀操作�(lái)�(shí)�(xiàn)的,因此可在�(jìn)行DPTR�(shù)�(jù)暫存�,利用選擇位dps�(lái)�(duì)DPTR�(jìn)行選�。具體示意如�2所��

  在對(duì)DPTR�(jìn)行寫(xiě)操作�(shí),實(shí)際上是對(duì)DPH和DPL�(jìn)行操作(DPH地址�83H,DPL地址�82H�,因此對(duì)DPTR�(jìn)行寫(xiě)操作�(shí)需�(duì)DPH和DPL分別�(jìn)行操作。在MCS8051中對(duì)SFR的寫(xiě)操作,實(shí)際上是先將要�(xiě)入的�(shù)�(jù)暫存在S[_]DATA寄存器中,再通過(guò)將S[_]DATA�(shù)�(jù)分別�(xiě)入DPH和DPL�(lái)�(shí)�(xiàn)�。因此可在S[_]DATA�(shù)�(jù)�(xiě)入前�(duì)DPTR0和DPTR1�(jìn)行選擇判�,來(lái)�(shí)�(xiàn)�(duì)DPTR0和DPTR1的寫(xiě)操作,即dps�1�(shí),將S[_]DATA�(shù)�(jù)�(xiě)入DPH1和DPL1;dps�0�(shí),將S[_]DATA�(shù)�(jù)�(xiě)入DPH0和DPL0,具體結(jié)�(gòu)如圖3所��

DPTR讀模塊示意圖 

  �2  DPTR讀模塊示意圖    �3  DPTR�(xiě)模塊�(jié)�(gòu)�

  在PC指針模塊和片外RAM地址模塊�,由于也是涉及DPTR的讀操作,因此該模塊的修改與SFR讀模塊中的修改類似,也是利用dps�(lái)�(shí)�(xiàn)DPTR0、DPTR1的選��

  3  仿真�(cè)�

  在MCS8051�,針�(duì)以上3�(gè)模塊分別作了修改,將DPTR�(kuò)展為兩組,通過(guò)�(duì)DPTR[_]SEL(設(shè)定為SFR的E1H)中DPTR狀�(tài)�(biāo)志位dps�(jìn)行操�,來(lái)�(shí)�(xiàn)�(duì)DPTR0和DPTR1的選取,并利用仿真軟件Modelsim6.0�(jìn)行了仿真�(cè)�。由于在�(shí)�(xiàn)DPTR�(kuò)展時(shí)主要針對(duì)SFR讀�(xiě)模塊、PC指針模塊和片外RAM地址模塊�3�(gè)模塊�(jìn)行了修改,因此對(duì)于DPTR�(kuò)展的仿真�(cè)試也�3�(gè)模塊�(jìn)行�

  3.1  針對(duì)SFR讀�(xiě)模塊的測(cè)�

  該模塊的�(cè)試主要為�(cè)試DPTR0和DPTR1的數(shù)�(jù)傳輸。首先對(duì)DPTR狀�(tài)�(biāo)志dps位�(jìn)行操�,分別選取DPTR0和DPTR1;其次分別對(duì)其�(jìn)行寫(xiě)操作;將DPTR0和DPTR1中數(shù)�(jù)值依次輸出寄存器A�。具體波形如�4所��

 SFR讀寫(xiě)測(cè)試波形

  �4  SFR讀�(xiě)�(cè)試波�

  由圖4可知,在�(zhí)行指�75E100前后(即將dps�(fù)�,選取DPTR0),DPH和DPL輸出(執(zhí)行指令E583,E582)到寄存器A中的值不�。指�75E100�(zhí)行前DPH輸出�55,DPL輸出�66,執(zhí)行后輸出分別�11�22,因此表明通過(guò)dps�(jìn)行DPTR選取,讀�(xiě)操作�(wú)�,即�(duì)SFR讀�(xiě)模塊的修改無(wú)誤�

  3.2  針對(duì)PC指針的數(shù)�(jù)查表�(cè)�

  針對(duì)此模�,�(jìn)行了一�(gè)查表�(cè)試,即向DPTR0和DPTR1中分別寫(xiě)入data1和data2兩�(gè)�(shù)�(jù)表的地址;而后利用dps選取DPTR0和DPTR1,再分別�(duì)其�(jìn)行數(shù)�(jù)查表輸出。具體波形如�5所��

PC指針的數(shù)據(jù)查表波形

  �5  PC指針的數(shù)�(jù)查表波形

  選取DPTR1(已存入data2地址,執(zhí)行指�75E180)后,將寄存器A清零(�(zhí)行指�7400),并將查表數(shù)�(jù)輸出(執(zhí)行指�93),輸出�(shù)�(jù)�11H;而后選取DPTR0,再次將寄存器A清零,并�(jìn)行查表輸出,輸出�(shù)�(jù)�44H。對(duì)比可�(fā)�(xiàn)輸出�(shù)�(jù)與表中數(shù)�(jù)一致。由此表�,通過(guò)dps選取DPTR0和DPTR1,�(jìn)行數(shù)�(jù)查表操作�(wú)�,即�(duì)PC指針模塊的修改無(wú)誤�

  3.3  片外RAM�(shù)�(jù)讀�(xiě)�(cè)�

  �(duì)于片外RAM�(shù)�(jù)讀�(xiě)�(cè)�,即大規(guī)模數(shù)�(jù)�(zhuǎn)�,測(cè)試方案為:首先將DPTR0和DPTR1中分別寫(xiě)入地址adr0和adr1,再分別對(duì)這兩�(gè)地址�(xiě)入數(shù)�(jù),將這兩�(gè)地址的數(shù)�(jù)通過(guò)DPTR0和DPTR1讀�,將讀出的�(jié)果與�(xiě)入結(jié)果對(duì)比,具體�(cè)試波形如�6所��

片外RAM數(shù)據(jù)讀寫(xiě)波形

  �6  片外RAM�(shù)�(jù)讀�(xiě)波形

  將dps置位(執(zhí)行指�75E180)選取DPTR1后,將片外RAM中adr1�(shù)�(jù)讀�,輸出數(shù)�(jù)�77H;將dps�(fù)位(�(zhí)行指�75E100)選取DPTR0�,將adr0�(shù)�(jù)讀�,輸出數(shù)�(jù)�44H。經(jīng)�(duì)比可�(fā)�(xiàn)與所�(xiě)入的�(shù)�(jù)一�。由此可表明,通過(guò)dps選擇DPTR0和DPTR1�(duì)片外RAM�(jìn)行數(shù)�(jù)讀�(xiě)�(wú)�,即表明�(duì)片外RAM地址模塊的修改無(wú)誤�

  3.4  FPGA仿真�(cè)�

  基于MCS8051這款8051微控制器,我們還�(jìn)行了�(shí)際的FPGA仿真�(cè)試。首先利用RS232接口,在從計(jì)算機(jī)上將大規(guī)模數(shù)�(jù)接收并寫(xiě)入到MCS8051片外RAM的地址adr0中;再利用例�2所給方法,�(jìn)行大�(guī)模數(shù)�(jù)�(zhuǎn)�,將�(shù)�(jù)�(zhuǎn)移寫(xiě)入到地址adr1�;通過(guò)RS232接口將adr1中數(shù)�(jù)�(fā)送到�(jì)算機(jī)。通過(guò)�(duì)比發(fā)送和接收的數(shù)�(jù)�(fā)�(xiàn),筆者對(duì)于DPTR的擴(kuò)展無(wú)��

  �(jié)�(yǔ)

  通過(guò)�(kuò)展DPTR可使8051在大�(guī)模數(shù)�(jù)�(zhuǎn)移時(shí)的執(zhí)行效率大大提�,這使得采用擴(kuò)�8051作為微控制器的嵌入式系統(tǒng),在大規(guī)模數(shù)�(jù)�(zhuǎn)移時(shí),其處理速度將大大提�。利用文中所闡述的方法也可將DPTR�(kuò)展為多組,但其具體應(yīng)用意義尚需�(jìn)一步探討�

維庫(kù)電子�,電子知�(shí),一查百��

已收錄詞�168868�(gè)