8051單片�是早最典型的產(chǎn)�,該系列具它單片機都是在8051的基礎上進行功能的增、減、改變而來�,所以人們習慣于�8051來稱呼MCS51系列單片��
8051單片機可分為無ROM型和ROM型兩� 無ROM型的芯片,必須外接EPROM才能� 用(典型芯片�8031� ROM型芯片又分為EPROM型(典型芯片� 8751�、FLASH型(典型芯片�89C51)� 掩膜ROM型(典型芯片�8051 �、一次� 可編程ROM(One Time Programming,� 稱OTP)的芯片(典型芯片為97C51)�
?�?)一個位微處理器CPU。�
?�?)片內數(shù)�(jù)存儲� )片內數(shù)�(jù)存儲器RAM和特殊功能寄存器 和特殊功能寄存器 �
�3)片內程序存儲器 )片內程序存儲器ROM�
?�?)兩個定� 計數(shù)� TO、T1,可用作定時�,也可用� )兩個定�/計數(shù)� 對外部脈沖進行� �(shù)� I/O端口
�5)四�8位可編程的并行I/O端口,每個端口既可作� )四�8位可編程的并行I/O端口� 也可作輸�� �,也可作輸出� 一個串行端�,用于數(shù)�(jù)的串行通信�
?�?)一個串行端口,用于�(shù)�(jù)的串行通信� 中斷控制系統(tǒng)�
?�?)中斷控制系�(tǒng)� 內部時鐘電路�
?�?)內部時鐘電��
由于單片機是一門實踐性很強的課程,如果采用傳�(tǒng)的開�(fā)模式,則要購買價格昂貴的仿真�、編程器等開�(fā)工具來作實驗。其實由于芯片功能的日益完善,我們可以利用芯片的在系�(tǒng)編程(ISP)功能制作出實用而低價的開發(fā)工具。本文旨在幫助DIY愛好者開�(fā)制作出適合自己的開發(fā)工具�
1 當前常用開發(fā)模式
目前,基本上有兩種開�(fā)模式可供選擇:用仿真�、用編程��
� 用仿真器。優(yōu)點:方便,可以設置斷�,可以觀察存儲器及寄存器的內�。缺點:價格昂貴,不同類型的單片機要購買不同的仿真器;仿真器終究不是單片�,有時代碼在仿真器上能通過,但在單片機中不能正常工�,反而增加了調試的難度�
?�?用編程器。優(yōu)點:價格相對便宜,通常一款編程器可編程多種器件。缺點:操作相當不便,每次要將芯片在目標板與編程器之間轉�,并且還要在編譯操作界面與編程器操作界面之間切換,大部分時間在做簡單的重復工��
2 新的開發(fā)模式介紹及芯片選�
本文介紹的開�(fā)工具采用一種新的開�(fā)模式(類似于編程器開�(fā)模式�。由于利用了芯片的在系統(tǒng)編程功能,因此不需要移動芯�。在軟件設計時設計成:一旦代碼文件被重新編過,即自動下載到芯�,并自動復位運行,是真正的“所編即所得��
目前很多單片機都支持在系�(tǒng)編程�8051系列單片機支持在系統(tǒng)編程的也很多,但大多�(shù)是支持通過PC機的串口對單片機進行編程。這樣有四個不方便的地方:一是項目本身與PC機串行通信不方便;二是要增�1片MAX232電平轉換芯片;三是有的芯片要按特定的步驟進入下載模式,編程過程需要手工干�;四是有的芯片需要固件(定制的程序)的支持,如果不小心損壞了固件,則芯片的在系統(tǒng)編程功能也沒有了�
�(jīng)過比�,Atmel公司生產(chǎn)的AT89S8252是一種比較理想的芯片,適合制作開�(fā)工具。此芯片有如下特點:
�8051兼容�
內含8KB可擦�1000次的程序存儲��2KB可擦寫超�100 000次的�(shù)�(jù)存儲器及256字節(jié)8位寬內部RAM�
可通過SPI接口在系�(tǒng)串行編程,與8051兼容
串行編程時有自動擦寫周期,在調試大程序時可以分段下載,節(jié)約時��
低電壓下載,無需12V編程電壓�
3 AT89S8252串行編程
(1)AT89S8252串行編程模式
當芯片的RST引腳置高電平�,所有程序和�(shù)�(jù)存儲器可以通過SPI總線接口[SCK,MOSI(input),MISO(output)]編程。RST變高以后,在編程或擦除操作之前必須首先發(fā)送一條編程允許命�。在串行編程模式�,芯片會在字節(jié)編程之前自動插入一個擦除周�。因�,除非芯片的代碼保護位被編程,編程之前不需要執(zhí)行全片擦除命�。SPI接口之SCK時鐘頻率須低于晶振頻率的1/40�
(2)AT89S8252串行編程步驟
?�?在XTAL1與XTAL2之間連接一�3~24MHz的晶�;在VCC與GND之前加上電源電壓,將RST置高,等�10ms�
?�?�(fā)送串行編程允許命令�
?�?�(fā)送寫/讀/擦除等命令及�(shù)�(jù),串行數(shù)�(jù)高位在前,低位在�,數(shù)�(jù)在時鐘的上升沿鎖定�
?�?如果上一步是寫命�,至少等�2.5ms�
?�?需要時重復⑀④兩步�
?�?將RST置低,芯片開始運��
(3)AT89S8252串行編程命令
AT89S8252串行編程命令如表1所列�
4)AT89S8252串行編程時序�
AT89S8252串行編程時序如圖1所��
4 硬件設計
?�?通過計算機并口與單片機SPI口連接�
?�?為了保護計算機并口,需要增�1�74HC244作為隔離�
實用的原理圖如圖2所示。(已經(jīng)過實踐檢�,可放心使用。)
5 用VB編程進行并口控制
打印端口的基地址一般為0x278�0x378�0x3BC,可以從控制面板中查�。為了方便讀者,�2列出了常用打印端口引腳及寄存器位元的說明�
在Windows�(huán)境下最簡單易學的語言恐怕非VB莫屬,所以我們的開發(fā)工具也選用VB作為編程語言。但由于Windows的保�,VB無法直接讀寫打印端�,因此我們需要另外的程序模塊來實�(xiàn)打印端口的直接讀寫。在Internet�(wǎng)上可以找到許多此類模�,并且相當多的模塊可以免費使�。經(jīng)過試�,筆者推薦使用Winio v2.0。該模塊支持Win9X/NT/2000/XP(https://www.internals.com Yariv Kaplan �,并�?guī)в性敿毜膸椭⒗映绦蚣霸创a。使用時,將Winio.sys、Winio.dll、Winio.vxd及Winio.bas四個文件拷貝到工作目錄下,在VB中直接添加Winio.bas模塊即可。本例中用到的函�(shù)有四個,分別說明如下� � Initialize():允許端口控制函�(shù)。在使用端口輸入輸出函數(shù)之前調用一�,成功返回�1�,失敗返回�0��
?�?Shutdown():關閉端口控制函�(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ù)。讀取成功時返回�1�,失敗時返回�0”�
?�?SetPortVal(ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte) As Boolean:寫端口函數(shù)。PortAddr 為端口地址� Portval為要寫的�,bSize為要寫入的字節(jié)�(shù)。寫入成功返回�1�,失敗返回�0”�
四個函�(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)生的用于寫入芯片的文件都是Intel HEX格式的文�。Intel HEX文件屬于文本文件,可以用記事本查�。一個Intel HEX文件的一行稱為一個記�,每個記錄都是由十六進制字符組成的,兩個字符表示一個字節(jié)的�。Intel HEX文件通常由若干條記錄組成,每個記錄都具有如下的形式:
?。篖LAAAATTDD...DDCC
“:”——記錄的起始標志�
LL——記錄長�,表示該記錄中的�(shù)�(jù)字節(jié)�(shù)�
AAAA——數(shù)�(jù)裝入的首地址�16位)�
TT——記錄類型,00表示�(shù)�(jù)記錄�01表示文件結束�(注意:有的編譯軟件會�(chǎn)生大�01的記錄類�,本應用中對大于01記錄類型的記錄忽略掉即可�)
DD——數(shù)�(jù)值(字節(jié)��
CC——校驗和。(將其本身與記錄中除起始標志外的所有字節(jié)相加應為0,不�0則有�。)
VB編程詳細說明見本刊網(wǎng)絡補充版(https://www.dpj.com.cn�。(由于各子程序的流程都較簡單,所以直接給出源�,而未畫出流程�。程序采用由底至�?shù)脑O計方�。)
� �
雖然上述程序能實�(xiàn)各種基本的功�,但并不完善,并未考慮各種異常情況,讀者可根據(jù)實際情況進行完善。編程功力較差的朋友可直接到筆者的�(wǎng)站(http: //www.mcudiy.com)下載相對較完善的應用程� 。如果充分理解了上述程序,那么DIY一個AVR或PIC單片機的開發(fā)工具也非難事。在筆者的�(wǎng)站也有制作完成的“MCS51/AVR/PIC三合一下載器資料”供愛好者下��
由于AT89S8252的價格還是較貴,所以現(xiàn)在市場上較難�,不過Atmel公司推出的替代AT89C51/52的AT89S51/52也有在系�(tǒng)編程功能,且價格便宜。其在系�(tǒng)編程的實�(xiàn)方法與AT89S8252類似,對本例部分程序稍作修改即可支持該器�。筆者制作的“MCS51/AVR/PIC三合一下載器”增加了對AT89S51/52的支��
本文通過�8051單片機的特點分析,提出了一種低成本的方�,使其軟件可以利用系�(tǒng)已有的通信鏈路在線升級�
1 基本原理
類似于其他引導裝載升級程序的方法,在系統(tǒng)中必須始終存在一段用于程序裝載的代碼(bootloader),該代碼在啟動時被運行。其基本功能是根�(jù)外部條件來判斷是運行�(xiàn)有版本的程序還是從主機下載新程序�8051具有選擇�(zhí)行片內或者片外程序的功能,而對片內E2PROM編程過程相對比較復雜,因此這里將程序引導裝載代碼燒結在內部程序空間�,并不準備改變;而將系統(tǒng)應用程序存放在片外一編程相對簡單和獨立的E2PROM�,是隨時可以更新的部分。通過外圍電路的支�,單片機上電復位時首先執(zhí)行片內的裝載程序,如�1所示。該裝載代碼將應用程序從E2PROM拷貝到外部存儲器(RAM)中以備�(zhí)�,同時還通過通信接口�(jiān)系統(tǒng)程序裝載�(zhí)行過程聽主機命令。當收到主機更新程序的請求后,立即接收新的應用程序內�,并在最終確認后寫入擴展E2PROM內。當片內程序�(zhí)行完畢后,系�(tǒng)軟件復位并執(zhí)行片外RAM中的程序,而RAM的內容正是由裝載所決定�。如果CPU再次復位,那么將重復上述裝載�(zhí)行過��
值得注意的是,在對外部程序存儲器訪問時,8051單片機只提供讀指令(MOVC)而并不具備寫指令。但是從單片機對外部程序和數(shù)�(jù)存儲器的訪問時序上看具有一致�,不同的是讀代碼使用PSEN信號而讀�(shù)�(jù)使用RD信號。同�,單片機的PSEN﹑RD和WR信號不會同時有效,因此將PSEN和RD邏輯合并�,可以使程序和數(shù)�(jù)合二為一讀寫成為可�。這樣同一個地址單元RD、WR(MOVX)和PSEN(MOVC)均可以進行訪問。單片機可以使用MOVX寫指令來更改相當于其外部程序空間中的內容。特別要注意的是,當程序和數(shù)�(jù)共存于一片RAM中時,必須使用編譯器提供的相關連接命令使數(shù)�(jù)區(qū)偏離代碼可能占用的區(qū)�,否則會導致系統(tǒng)混亂� 2 硬件電路
硬件參考電路如�2所�。系�(tǒng)加電�,由于C3兩端電壓不能瞬變,使D觸發(fā)器置1端保持一短暫低電�,強制將單片機EA信號置高。在U4看門狗上電復位信號撤銷后,單片機開始從內部程序空�0地址起執(zhí)�。內部裝載程序先通過P1.4、P1.5模擬I2C總線時序從E2PROMU3中將應用程序代碼拷貝到片外RAM�0地址起的空間�。如果到代碼拷貝結束串行口一直沒有收到預定的程序下載命令,則通過軟件置低P1.6口觸�(fā)看門狗芯片對單片機復�,在復位脈沖的上升沿,D觸發(fā)器鎖存其輸出的信號使EA電平翻轉為低電平。待復位信號撤銷�,單片機開始�(zhí)行位于外部程序空間的系統(tǒng)應用程序代碼。在�(zhí)行外部程序時,如果看門狗再次復�,EA將會恢復高電平并重新�(zhí)行內部裝載程序�
當上位機欲更改終端設備程序時,可通過串口向其�(fā)送特定的握手字符�,無論片外程序還是片內程序都能識別該字符串并且復位單片機(如果是正在運行外部程序)執(zhí)行內部裝載程�。裝載程序就緒后向上位機�(fā)送確認回�,并接收來自上位機的程序代碼。單片機通過置低P1.3允許E2PROM寫操作,將新的內容寫入E2PROM�,完成程序的更新�
3 軟件設計
裝載程序主要有兩個功能,其一是要將E2PROM的內容拷貝到片外RAM�;其二是要響應上位機的更新程序命令并接收代碼內容更新E2PROM�
#define uchar unsigned char
#define uintunsigned int
sbit WDI=P1^7;
sbit RESET=P1^6;
/*聲明外部I2C讀寫函�(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;/*清除程序拷貝好標�*/
WDI=~WDI; /*喂狗*/
system[_]init(); /*初始�*/
for(addh=0;addh<0x10;addh++) {
for(addl=0;addl<0xf0;addl+=16) {
/*讀入E2PROM地址addh:addl16字節(jié)內容到buf*/
I2c[_]wr(addh,addl,buf,16,1);
for(j=0;j<16;j++)
/*將代碼寫入外部地址*/
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ù)負責從上位機獲取程序*/
}
XBYTE[0x1fff]=0xaa;/*置程序拷貝好標志*/
RESET=0;/*復位單片機并�(zhí)行外部RAM內的程序*/
while(1);
}
為了確保程序在裝載完全正確后才開始執(zhí)�,裝載程序使用了外部RAM 0x1fff地址內容作為裝載成功的標�。那么相應的應用程序應判斷此標志后再�(zhí)��
調試結束的裝載程序燒結在單片機中,而實際的系統(tǒng)應用程序則存儲于外部E2PROM�。應用中,將單片機直接焊裝在電路板上,而編程者只需通過串口或者其他形式的通信鏈路甚至無線的方式來更改升級目標應用程序�
4 幾點討論
在實際應用中,使用嚴格的校驗及復查方法來確保程序拷貝無誤� 另外� 在從上位機下載程序時應該制定一個可靠的通信�(xié)�� 從而保證獲取的程序完全正確� 單片機在接收到上位機的代碼數(shù)�(jù)�,不要急于寫入外部E2PROM,而應先全部放在外部RAM區(qū)�,待代碼獲取完畢并且通過校驗檢查后再把RAM的內容一次性寫入E2PROM。這樣防止在獲取程序的時候通信異常中斷而E2PROM內將沒有一個可以執(zhí)行的程序�
從原理上�,如果片外RAM是非易失�,就可以不再使用E2PROM。但是這樣系統(tǒng)成本變高且可靠性降�,因為當單片機程序跑飛時很容易產(chǎn)生MOVX指令而改變RAM區(qū)的內容,造成程序性不可恢�。而在程序跑飛的情況下,很難產(chǎn)生符合外部E2PROM接口的I2C寫時�,同時E2PROM還有寫保護功��
雖然上述方法能使8051單片機系�(tǒng)具有遠程升級代碼的能�,但是程序裝載過程將使系�(tǒng)的啟動時間延長數(shù)�,在對啟動時間要求較短的場合不能應用本文中介紹的方法�
以下提供的鏈接是生產(chǎn)8051家族單片機的廠商的網(wǎng)址及其單片機產(chǎn)品數(shù)�(jù)手冊的地址。如果你還知道其�8051兼容的單片機的廠商及其產(chǎn)品型�,請告知它們的�(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 -
單片機的出現(xiàn)是計算機技術發(fā)展史上的一個里程碑,它使計算機從海量數(shù)值計算進入到控制領域。在單片機中,以8051系列最為經(jīng)�,至今仍是最普及、廣泛使用的8位MCU架構。業(yè)界許多技術人員在其基礎上不斷進行性能擴展,使�8051系列芯片不斷完善,從而形成一個龐大的體系。在傳統(tǒng)�8051系列單片機中,設置了一組雙字節(jié)寄存器(�(shù)�(jù)指針DPTR�,用于訪問外接的64 KB�(shù)�(jù)存儲器和I/O接口電路;但在現(xiàn)今的8051單片機應用中,特別是在嵌入式系統(tǒng)�,往往涉及大規(guī)模的�(shù)�(jù)轉移操作,而傳�(tǒng)8051的一組數(shù)�(jù)指針使用起來則顯得捉襟見�,因此若�8051設計中將�(shù)�(jù)指針設計為兩組或多組,則在執(zhí)行大�(guī)模數(shù)�(jù)轉移操作時會相當簡便、迅�。在這種背景�,本文首先以�(shù)�(jù)轉移�(zhí)行效率為衡量標準,分析了DPTR擴展的意�,并在Oregano公司的MCS8051核[1]上實�(xiàn)了DPTR擴展�
1 DPTR擴展意義
為描�8051中的DPTR擴展的意�,我們針對實�(xiàn)大規(guī)模數(shù)�(jù)轉移,分別對DPTR擴展前后作了對比。為使對比更加清晰明�,提出了�(shù)�(jù)轉移�(zhí)行效率的概念�
�(shù)�(jù)轉移�(zhí)行效率v定義為進行單字節(jié)�(shù)�(jù)轉移所耗費的機器周期數(shù),即v=nt。其�,n表示所轉移�(shù)�(jù)字節(jié)�(shù);t表示所耗費的機器周期,可設定其單位為字節(jié)/機器周期�
在未進行DPTR擴展�8051�,可通過設置地址緩沖區(qū)的方法來實現(xiàn)大規(guī)模的�(shù)�(jù)轉移。具體的例程如下�
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é)),實�(xiàn)將源地址起始64字節(jié)�(shù)�(jù)轉移至目的地址。在8051中,�(zhí)行n字節(jié)�(shù)�(jù)移位操作耗費�14+28×n+2)個機器周�,數(shù)�(jù)轉移�(zhí)行效率為v=n/�14+28×n+2�。在本例程中,n�64,計算得出共需耗費1 808個機器周�,執(zhí)行效率v約為0.035 4字節(jié)/機器周期,而且在此實現(xiàn)方法中需占用8051�4個片內存儲器(RAM)單元�
�8051中擁有兩組DPTR,并可通過特殊指令來實�(xiàn)DPTR選取??稍O定SETDPTR0指令表示選取DPTR0,SETDPTR1指令表示選取DPTR1�#s[_]adr表示�(shù)�(jù)源地址�#t[_]adr表示�(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
程序中, 對于特殊指令SETDPTR0和SETDPTR1,可通過設置特殊功能寄存�(SFR)以表示DPTR狀�(tài),并對此SFR進行操作,以實現(xiàn)DPTR選取。因此DPTR選取指令可由3字節(jié)指令實現(xiàn),則在兩組DPTR情況下執(zhí)行大�(guī)模數(shù)�(jù)轉移需耗費�14+12×n+2)個機器周�,數(shù)�(jù)轉移�(zhí)行效率為v=n/�14+12×n+2)。在本例程中,執(zhí)�64字節(jié)�(shù)�(jù)轉移需耗費784個機器周�,執(zhí)行效率約�0.085 64字節(jié)/機器周期�
通過以上對比�(fā)�(xiàn),擁用兩組DPTR�8051比傳�(tǒng)8051在大�(guī)模數(shù)�(jù)傳輸時的�(shù)�(jù)轉移�(zhí)行效率比為(14+28×n+2�/�14+12×n+2�。由�1可知,隨著所轉移�(shù)�(jù)量的不斷加大,即n值增大時,執(zhí)行效率比也不斷增�,且趨近�2.33�
�1 �(shù)�(jù)轉移�(zhí)行效率對比圖
�(jīng)過以上分析得出:�8051中設置兩組DPTR將會使其在數(shù)�(jù)轉移�(zhí)行效率上有很大提�。從資源占用方面考慮,使用擴展DPTR的方式來實現(xiàn)�(shù)�(jù)轉移,僅需�8051中添加一個SFR,因此在8051中實�(xiàn)DPTR擴展,可在資源占用很少的條件下,明顯加快�(shù)�(jù)轉移速率。這對于在嵌入式系�(tǒng)應用�,進行大規(guī)模數(shù)�(jù)轉移意義重大�
2 具體設計實現(xiàn)
�8051中對DPTR實現(xiàn)擴展,首先需要對DPTR的相關指令進行分析,再確定對其進行擴展會影響到哪些指令操作;并根據(jù)其所涉及的指�,分析相應的模塊,針對各模塊分別進行設計修改�
2.1 相關指令分析
�8051標準指令集的111條指令中,與DPTR有關的指令共�5�,分別為�
?�?nbsp; 程序存儲器查表指令,“MOVC A,@A+DPTR��
� 片外RAM傳送指�,“MOVX A, @DPTR”和“MOVX @ DPTR , A”;
?�?nbsp; 寄存器數(shù)�(jù)傳送指�,即可對DPTR進行讀寫操�,在8051中DPTR由DPH(DPTR�8位字節(jié))和DPL(DPTR�8位字節(jié))構�,且DPH和DPL與一般的SFR一�,都可作為寄存器進行讀�、壓棧等操作�
?�?nbsp; 程序轉移指令,“JMP @A+DPTR�;
� 運算指令,可分別對DPH和DPL進行運算操作�
通過對以上與DPTR相關�5類指令分析可知:第③類指令和第⑤類指令是將DPTR作為SFR進行操作�。第①類指令和第④類指令都是DPTR與PC指針進行的數(shù)�(jù)傳送操�;第②類指令是對片外RAM地址寄存器進行的數(shù)�(jù)傳送操�。因此,DPTR的操作具體涉�8051中以�3個模塊:SFR讀寫模�、PC指針模塊及片外RAM地址模塊,故對DPTR的擴展也在�3個模塊中進行�
2.2 具體模塊設計
對于DPTR狀�(tài)寄存器可設為dptr[_]sel,通過對DPTR狀�(tài)標志位dps操作,實�(xiàn)DPTR選取。當dps�0�,選取DPTR0;當dps�1�,選取DPTR1。在8051�,DPTR分別由DPH和DPL組成,因此對DPTR的選取實際上是對特殊功能寄存器DPH0、DPL0和DPH1、DPL1的選��
基于以上的設計思路,筆者分別在涉及DPTR操作�3個模塊中進行了相應的修改。本設計所選用MCS8051核由VHDL語言設計,完全兼容標�8051指令��
在SFR讀寫模塊中,應針對讀、寫模塊分別進行修改。通過分析MCS8051設計代碼可知,對于DPTR的讀操作,是通過將DPTR中數(shù)�(jù)傳送給�(shù)�(jù)暫存寄存器S[_]REGDATA,再通過對S[_]REGDATA進行讀操作來實�(xiàn)�,因此可在進行DPTR�(shù)�(jù)暫存前,利用選擇位dps來對DPTR進行選取。具體示意如�2所示�
在對DPTR進行寫操作時,實際上是對DPH和DPL進行操作(DPH地址�83H,DPL地址�82H�,因此對DPTR進行寫操作時需對DPH和DPL分別進行操作。在MCS8051中對SFR的寫操作,實際上是先將要寫入的數(shù)�(jù)暫存在S[_]DATA寄存器中,再通過將S[_]DATA�(shù)�(jù)分別寫入DPH和DPL來實�(xiàn)的。因此可在S[_]DATA�(shù)�(jù)寫入前對DPTR0和DPTR1進行選擇判斷,來實現(xiàn)對DPTR0和DPTR1的寫操作,即dps�1�,將S[_]DATA�(shù)�(jù)寫入DPH1和DPL1;dps�0�,將S[_]DATA�(shù)�(jù)寫入DPH0和DPL0,具體結構如�3所��
�2 DPTR讀模塊示意圖 �3 DPTR寫模塊結構圖
在PC指針模塊和片外RAM地址模塊中,由于也是涉及DPTR的讀操作,因此該模塊的修改與SFR讀模塊中的修改類似,也是利用dps來實�(xiàn)DPTR0、DPTR1的選��
3 仿真測試
在MCS8051中,針對以上3個模塊分別作了修�,將DPTR擴展為兩�,通過對DPTR[_]SEL(設定為SFR的E1H)中DPTR狀�(tài)標志位dps進行操作,來實現(xiàn)對DPTR0和DPTR1的選取,并利用仿真軟件Modelsim6.0進行了仿真測�。由于在實現(xiàn)DPTR擴展時主要針對SFR讀寫模�、PC指針模塊和片外RAM地址模塊�3個模塊進行了修�,因此對于DPTR擴展的仿真測試也�3個模塊進行�
3.1 針對SFR讀寫模塊的測試
該模塊的測試主要為測試DPTR0和DPTR1的數(shù)�(jù)傳輸。首先對DPTR狀�(tài)標志dps位進行操作,分別選取DPTR0和DPTR1;其次分別對其進行寫操�;將DPTR0和DPTR1中數(shù)�(jù)值依次輸出寄存器A�。具體波形如�4所��
�4 SFR讀寫測試波�
由圖4可知,在�(zhí)行指�75E100前后(即將dps復位,選取DPTR0),DPH和DPL輸出(執(zhí)行指令E583,E582)到寄存器A中的值不�。指�75E100�(zhí)行前DPH輸出�55,DPL輸出�66,執(zhí)行后輸出分別�11�22,因此表明通過dps進行DPTR選取,讀寫操作無�,即對SFR讀寫模塊的修改無誤�
3.2 針對PC指針的數(shù)�(jù)查表測試
針對此模�,進行了一個查表測�,即向DPTR0和DPTR1中分別寫入data1和data2兩個數(shù)�(jù)表的地址;而后利用dps選取DPTR0和DPTR1,再分別對其進行�(shù)�(jù)查表輸出。具體波形如�5所��
�5 PC指針的數(shù)�(jù)查表波形
選取DPTR1(已存入data2地址,執(zhí)行指�75E180)后,將寄存器A清零(�(zhí)行指�7400),并將查表數(shù)�(jù)輸出(執(zhí)行指�93�,輸出數(shù)�(jù)�11H;而后選取DPTR0,再次將寄存器A清零,并進行查表輸出,輸出數(shù)�(jù)�44H。對比可�(fā)�(xiàn)輸出�(shù)�(jù)與表中數(shù)�(jù)一�。由此表�,通過dps選取DPTR0和DPTR1,進行�(shù)�(jù)查表操作無誤,即對PC指針模塊的修改無��
3.3 片外RAM�(shù)�(jù)讀寫測�
對于片外RAM�(shù)�(jù)讀寫測�,即大規(guī)模數(shù)�(jù)轉移,測試方案為:首先將DPTR0和DPTR1中分別寫入地址adr0和adr1,再分別對這兩個地址寫入�(shù)�(jù),將這兩個地址的數(shù)�(jù)通過DPTR0和DPTR1讀出,將讀出的結果與寫入結果對�,具體測試波形如�6所示�
�6 片外RAM�(shù)�(jù)讀寫波�
將dps置位(執(zhí)行指�75E180)選取DPTR1�,將片外RAM中adr1�(shù)�(jù)讀出,輸出�(shù)�(jù)�77H;將dps復位(執(zhí)行指�75E100)選取DPTR0�,將adr0�(shù)�(jù)讀�,輸出數(shù)�(jù)�44H。經(jīng)對比可發(fā)�(xiàn)與所寫入的數(shù)�(jù)一�。由此可表明,通過dps選擇DPTR0和DPTR1對片外RAM進行�(shù)�(jù)讀寫無�,即表明對片外RAM地址模塊的修改無��
3.4 FPGA仿真測試
基于MCS8051這款8051微控制器,我們還進行了實際的FPGA仿真測試。首先利用RS232接口,在從計算機上將大規(guī)模數(shù)�(jù)接收并寫入到MCS8051片外RAM的地址adr0�;再利用例程2所給方�,進行大規(guī)模數(shù)�(jù)轉移,將�(shù)�(jù)轉移寫入到地址adr1�;通過RS232接口將adr1中數(shù)�(jù)�(fā)送到計算�。通過對比�(fā)送和接收的數(shù)�(jù)�(fā)�(xiàn),筆者對于DPTR的擴展無��
結語
通過擴展DPTR可使8051在大�(guī)模數(shù)�(jù)轉移時的�(zhí)行效率大大提�,這使得采用擴�8051作為微控制器的嵌入式系統(tǒng),在大規(guī)模數(shù)�(jù)轉移�,其處理速度將大大提�。利用文中所闡述的方法也可將DPTR擴展為多組,但其具體應用意義尚需進一步探��
維庫電子�,電子知�,一查百通!
已收錄詞�160444�