新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 與51單片機(jī)擴(kuò)展有關(guān)的知識(shí)點(diǎn)

        與51單片機(jī)擴(kuò)展有關(guān)的知識(shí)點(diǎn)

        作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò) 收藏
        這些日子做項(xiàng)目,用到外部ram擴(kuò)展,很是汗顏,很多基本知識(shí)點(diǎn)都不會(huì),現(xiàn)在把不會(huì)的東西記下來(lái),做個(gè)筆記,也和大家共享,學(xué)點(diǎn)知識(shí),更好開(kāi)發(fā)產(chǎn)品。

        1.單片機(jī)中的關(guān)鍵字_at_:定義變量的存儲(chǔ)地址。

        本文引用地址:http://www.104case.com/article/201611/318422.htm

        2.這段程序是什么意思?

        1. #define XBYTE((char*)0x20000L)
        2. XBYTE[0x8000]=0x41;

        define XBYTE ((char*)0x20000L) 定義了XBYTE是個(gè)指向地址 0x0000L 的字符型指針(或者數(shù)組)變量XBYTE[0x8000]=0x41; 對(duì)數(shù)組XBYTE的第 0x8000個(gè)變量進(jìn)行賦值,賦值為0x41。即對(duì)地址0x8000L的內(nèi)存單元賦值為0x41。這說(shuō)明你用的是帶外部數(shù)據(jù)總線的51芯片,外部的存儲(chǔ)器多半是RAM,RAM的容量至少有 0x8000(32k)字節(jié)-RAM的容量可能是64k字節(jié)?L代表 long,這說(shuō)明 0x20000L 是一個(gè)長(zhǎng)整數(shù)。一般來(lái)說(shuō),8位單片機(jī)如51,整數(shù)用16位二進(jìn)制表示,長(zhǎng)整數(shù)用32位二進(jìn)制表示.0x20000L當(dāng)中的2是存儲(chǔ)器類型xdata,而不是地址的一部分.

        3.51單片機(jī)的存儲(chǔ)類型:

        data--->可尋址片內(nèi)ram
        bdata--->可位尋址的片內(nèi)ram
        idata--->可尋址片內(nèi)ram,允許訪問(wèn)全部?jī)?nèi)部ram
        pdata--->分頁(yè)尋址片外ram (MOVX @R0) (256 BYTE/頁(yè))
        xdata--->可尋址片外ram (64k 地址范圍)
        code--->程序存儲(chǔ)區(qū) (64k 地址范圍),對(duì)應(yīng)MOVC @DPTR

        4.absacc.h

        1. /*--------------------------------------------------------------------------
        2. ABSACC.H
        3. Direct access to 8051, extended 8051 and Philips 80C51MX memory areas.
        4. Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
        5. All rights reserved.
        6. --------------------------------------------------------------------------*/
        7. #ifndef __ABSACC_H__
        8. #define __ABSACC_H__
        9. #define CBYTE ((unsigned char volatile code *) 0)
        10. #define DBYTE ((unsigned char volatile data *) 0)
        11. #define PBYTE ((unsigned char volatile pdata *) 0)
        12. #define XBYTE ((unsigned char volatile xdata *) 0)
        13. #define CWORD ((unsigned int volatile code *) 0)
        14. #define DWORD ((unsigned int volatile data *) 0)
        15. #define PWORD ((unsigned int volatile pdata *) 0)
        16. #define XWORD ((unsigned int volatile xdata *) 0)
        17. #ifdef __CX51__
        18. #define FVAR(object, addr) (*((object volatile far *) (addr)))
        19. #define FARRAY(object, base) ((object volatile far *) (base))
        20. #define FCVAR(object, addr) (*((object const far *) (addr)))
        21. #define FCARRAY(object, base) ((object const far *) (base))
        22. #else
        23. #define FVAR(object, addr) (*((object volatile far *) ((addr)+0x10000L)))
        24. #define FCVAR(object, addr) (*((object const far *) ((addr)+0x810000L)))
        25. #define FARRAY(object, base) ((object volatile far *) ((base)+0x10000L))
        26. #define FCARRAY(object, base) ((object const far *) ((base)+0x810000L))
        27. #endif
        28. #endif

        例如:
        rval=CBYTE[0x0002];指向程序存貯器的0002h地址
        rval=XWORD [0x0002];指向外RAM的0004h地址 //WORD是一個(gè)字,兩個(gè)字節(jié),故為0004h

        #define COM8255 XBYTE[0X060FF] //后面若出現(xiàn)COM8255,則單片機(jī)端口P0和P2聯(lián)合輸出0X060FF絕對(duì)物理地址(地址指向82C55指令寄存器)
        #define PA8255 XBYTE[0X000FF] //后面若出現(xiàn)PA8255,則單片機(jī)端口P0和P2聯(lián)合輸出0X000FF絕對(duì)物理地址(地址指向82C55的A組端口寄存器)
        #define PB8255 XBYTE[0X020FF] //后面若出現(xiàn)PB8255,則單片機(jī)端口P0和P2聯(lián)合輸出0X020FF絕對(duì)物理地址(地址指向82C55的B組端口寄存器)
        #define PC8255 XBYTE[0X040FF] //后面若出現(xiàn)PC8255,則單片機(jī)端口P0和P2聯(lián)合輸出0X040FF絕對(duì)物理地址(地址指向82C55的C組端口寄存器)

        4.驅(qū)動(dòng)外部ram的例程

        1. /**************************************************************************
        2. *程序名稱: 51單片機(jī)片外擴(kuò)展RAM測(cè)試
        3. *程序功能: 把數(shù)據(jù)寫(xiě)入片外RAM,再?gòu)钠釸AM讀取數(shù)據(jù),點(diǎn)亮P1口的8個(gè)LED
        4. *開(kāi)發(fā)工具:WSF-51DB開(kāi)發(fā)板
        5. * MCU型號(hào):AT89S52-24PU
        6. *時(shí)鐘頻率:12MHZ
        7. *程序作者: 吳師傅
        8. *版權(quán)說(shuō)明:吳師傅版權(quán)所有,轉(zhuǎn)載請(qǐng)注明來(lái)源地址和作者。
        9. **************************************************************************/
        10. #include
        11. #include //包含片外存儲(chǔ)空間絕對(duì)地址訪問(wèn)函數(shù):XBYTE[]
        12. sbit oe=P2^7;//片外RAM芯片片選和地址鎖存器74HC573使能
        13. unsigned char code ramdata[100]= //定義100個(gè)數(shù)據(jù)
        14. {
        15. 0,1,2,3,4,5,6,7,8,9,
        16. 10,11,12,13,14,15,16,17,18,19,
        17. 20,21,22,23,24,25,26,27,28,29,
        18. 30,31,32,33,34,35,36,37,38,39,
        19. 40,41,42,43,44,45,46,47,48,49,
        20. 50,51,52,53,54,55,56,57,58,59,
        21. 60,61,62,63,64,65,66,67,68,69,
        22. 70,71,72,73,74,75,76,77,78,79,
        23. 80,81,82,83,84,85,86,87,88,89,
        24. 90,91,92,93,94,95,96,97,98,99
        25. };
        26. //延時(shí)ms函數(shù):
        27. void Delayms(unsigned int t)
        28. {
        29. unsigned int i,j;
        30. for(i=t;i>0;i--)
        31. for(j=120;j>0;j--);
        32. }
        33. //主函數(shù):
        34. int main(void)
        35. {
        36. unsigned char i;
        37. oe=0;//使能RAM芯片片選和地址鎖存器
        38. for(i=0;i<100;i++)
        39. XBYTE[300+i]=ramdata[i];
        40. //將100個(gè)數(shù)據(jù)寫(xiě)入片外RAM,起始地址為:300
        41. while(1)
        42. {
        43. for(i=0;i<100;i++)
        44. {
        45. P1=XBYTE[300+i];//從片外RAM讀取數(shù)據(jù),點(diǎn)亮P1口的8個(gè)LED
        46. Delayms(500);
        47. }
        48. }
        49. return 0;
        50. }


        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 普宁市| 永善县| 昌图县| 张家界市| 赣榆县| 栾城县| 南宫市| 新丰县| 斗六市| 巴马| 行唐县| 大连市| 柳河县| 宜阳县| 利川市| 凤冈县| 仪陇县| 通许县| 海安县| 房山区| 综艺| 榕江县| 宁海县| 高碑店市| 澄江县| 定安县| 金湖县| 冕宁县| 伊春市| 深州市| 金寨县| 琼结县| 临西县| 浦东新区| 青川县| 漾濞| 新河县| 大同县| 黔东| 苗栗市| 浑源县|