您好,欢迎访问三七文档
256B的静态RAM两个可编程的8位并行I/O口(PA、PB)一个可编程的6位并行I/O口(PC)一个可编程的14位减法计数器8155的片内资源568第七章8051常用扩展资源编程7.1综合扩展芯片8155568AD0~AD7:地址/数据总线IO/M:高电平选择I/O口,低电平选择RAMCE:片选信号ALE:地址允许锁存信号输入线RD:读选通信号输入线WR:写选通信号输入线TI:计数器的计数脉冲输入线TO:计数器的输出信号线RESETPA0~PA7、PB0~PB7、PC0~PC58155的RAM和I/O地址编码当8155作为单片机的扩展芯片时,是按外部数据存储器统一编址的,为16位地址数据,其高8位由片选线提供,而低8位地址为片内地址。当IO/=0时,单片机对8155片内RAM读/写,RAM低8位编址为00H~0FFH;当IO/=1时,单片机对8155的I/O口进行读写。8155共有6个I/O口寄存器,它们各自占有的地址如表7-1-1所示。MM8155的工作方式与基本操作1)作片外256字节RAM使用。2)作扩展I/O口使用。命令控制字TM2TM1IEBIEAPC2PC1PBPA00—PA、PB为基本I/O,PC为输入口11--PA、PB为基本I/O,PC为输出口01—PA为选通I/O,PB为基本I/O,PC0~2为控制线,PC3~5输出10—PA、PB为选通I/O,PC为控制线命令字只能写不能读0—PA输入口1—PA输出口0—PB输入口1—PB输出口0—禁止PA中断1—允许PA中断0—禁止PB中断1—允许PB中断00—空操作,不影响定时器/计数器工作01—立即停止定时器/计数器计数10—待定时器/计数器溢出时停止计数11—启动定时器/计数器计数8155状态字状态字只能读不能写TIMERINTEBBFBINTRBINTEABFAINTRAPA中断请求标志PA中断允许标志定时器/计数器中断请求标志。定时器/计数器溢出时置位,CPU读8155状态后清零。PA缓冲器满标志PB中断请求标志PB中断允许标志PB缓冲器满标志定时器的使用8155的定时器是一个14位的减法计数器。在TIMERIN端输入计数脉冲,当计数满时由TIMEROUT端输出脉冲或方波。当TIMERIN接外脉冲时为计数方式;接系统时钟时,可作为定时方式,但须注意芯片的最高计数频率(4MHz)。8155定时器格式及输出方式RAM地址:MCS-51和8155的接口方法011111100000000001111110111111117E00H~7EFFH8155命令状态寄存器地址:命令/状态:01111111000000007f00PA:01111111000000017f01PB:01111111000000107f02PC:01111111000000117f03T/C低字节:01111111000001007f04T/C高字节:01111111000001017f05P2.0P2.7P2.7P2.08051与8155的接口与编程例用8155扩展8051I/O接口,并将A口定义为基本输入、B口定义为基本输出、C口为输出,定时器/计数器作方波发生器,对输入脉冲进行24分频。命令字:11001110B(ceH)放入命令寄存器7F00H。所谓进行24分频其实就是计24个脉冲输出1个脉冲,即把18H(24)作计数值低8位送入寄存器7F04H;连续方波输出:即01000000B(40H)应放入寄存器7F05H。P2.7P2.0绝对地址访问在进行8051单片机应用系统程序设计时,用户十分关心如何直接操作系统的各个存储器地址空间。方法一:为了能够在C51程序中直接对任意指定的存储器地址进行操作,可以采用指针的办法来实现。例如:voidtestmodule(void){charxdata*xdp;/*定义一个指向XDATA存储器空间的指针*/chardata*dp;/*定义一个指向DATA存储器空间的指针*/xdp=0x0002;/*XDATA指针赋值,指向XDATA存储器地址0002H*/*xdp=0xAA;/*将数据0xAA送往指定的地址*/dp=0x30;/*DATA指针赋值,指向DATA存储器地址30H*/*dp=0xBB;/*将数据0xBB送往指定的地址*/}C程序代码:#includereg51.h#includestdio.h#includeintrins.hvoidmain(void){unsignedcharxdata*i;i=0x7f04;//指向计数长度低8位寄存器*i=0x18;//置计数长度低8位*(++i)=0x40;//计数长度高6位及输出方式i=0x7f00;//指向命令/状态寄存器*i=0xce;//设命令字while(1);}方二:另外一种直接操作存储器空间地址的方法是利用C51运行库中提供的一套预定义宏“ABSACC.H”,例如:#includeabsacc.hcharc_var=‘c’;inti_var;XBYTE[0x0012]=c_var;/*向XDATA存储器地址0012H写入数据c_var*/i_var=XWORD[0x0100];/*从XDATA存储器地址0100H中读取数据并赋值给i_var*/上面第二条赋值语句中采用的是XWORD[0x0100],其意义是将字节地址0x0100和0x0101中内容取出来并赋值给int型变量i_var。#includereg51.h#includeabsacc.h/*包含绝对地址操作预定义头文件*/#defineCOM8155XBYTE[0x7f00]#definePA8155XBYTE[0x7f01]#definePB8155XBYTE[0x7f02]#defineTL8155XBYTE[0x7f04]#defineTH8155XBYTE[0x7f05]#includereg51.h#includeabsacc.h#defineucharunsignedchar#defineuintunsignedint#defineCOM8155XBYTE[0x7f00]#definePA8155XBYTE[0x7f01]#definePB8155XBYTE[0x7f02]#defineTL8155XBYTE[0x7f04]#defineTH8155XBYTE[0x7f05]voidmain(void){TL8155=0x18;/*定时器低8位,计数常数18H=24*/TH8155=0x40;/*定时器高8位,输出为连续方波(M2M1=01)*/COM8155=0xce;/*装入命令字,设定各口方式并启动定时器*/while(1);}7_1_1用8155A口定义为基本输入、B口定义为基本输出、C口为输入,将数据从PA口读入,取反后从PB口输出。#includereg51.h#includeabsacc.h#defineucharunsignedchar#defineuintunsignedint#defineCOM8155XBYTE[0x7f00]#definePA8155XBYTE[0x7f01]#definePB8155XBYTE[0x7f02]#defineTL8155XBYTE[0x7f04]#defineTH8155XBYTE[0x7f05]voidmain(void){COM8155=0xce;/*装入命令字*/while(1){Collect_Data=PA8155;/*读PA口数据*/PB8155=~Collect_Data;/*采集的数据按位取反从PB口输出*/}}
本文标题:接口技术-7
链接地址:https://www.777doc.com/doc-3338946 .html