1.53k likes | 1.69k Views
3.8 单片机外围器件. 型号. 名称. 说明. 8155. 并行接口. 带 256 字节的 RAM 和 14 位定时 / 计数器. 8255. 通用并行接口. 8251. 同步 / 异步通讯接口. 8253. 定时 / 计数器. 8279. 键盘 / 显示接口. 3.8.1 8155 与 8031 的接口. 常用 Intel 系列可编程接口芯片. 1 . 8155 的结构和技术性能 8155 内部具有: ( 1 ) 256 字节的静态 RAM, 存取时间为 400ns 。 ( 2 )三个通用的输入 / 输出口。
E N D
型号 名称 说明 8155 并行接口 带256字节的RAM和14位定时/计数器 8255 通用并行接口 8251 同步/异步通讯接口 8253 定时/计数器 8279 键盘/显示接口 3.8.1 8155与8031的接口 常用Intel 系列可编程接口芯片
1.8155的结构和技术性能 • 8155内部具有: (1)256字节的静态RAM,存取时间为400ns。 (2)三个通用的输入/输出口。 (3)一个14位的可编程定时/计数器。 (4)地址锁存器及多路转换的地址和数据总线。 (5)单一+5V电源,40脚双列直插式封装。
各引脚功能如下: • AD0~AD7:三态地址/数据线。8位。是低8位地址与数据复用线引脚。地址可以是8155内部RAM单元地址或是I/O口地址。AD0~AD7上的地址由ALE的下降沿锁存到8155内部地址锁存器。也就是由ALE信号来区别AD0~AD7上出现的是地址信息还是数据信息。 • ALE:地址锁存允许信号。在ALE信号的下降沿把AD0~AD7上的8位地址信息、片选信号及IO/(IO端口/RAM选择)信号都锁存到8155内部锁存器中。 • IO/M:I/O端口和RAM选择信号。当IO/M=1时,AD0~AD7的地址为8155I/O口地址,选择I/O端口;当IO/M =0时,AD0~AD7的地址为8155内部RAM单元地址,选择RAM存储单元。
CE:片选信号线,低电平有效,由ALE信号的下降沿锁存到8155内部锁存器。CE:片选信号线,低电平有效,由ALE信号的下降沿锁存到8155内部锁存器。 • RD:读选通信号。低电平有效。当RD=0,且CE=0时,开启AD0~AD7的缓冲器,被选中的内部RAM单元(IO/=0)或IO口(IO/=1)的内容送到AD0~AD7上。 • WR:写选通信号。低电平有效。当WR、CE都有效时,CPU输出到AD0~AD7上的信息写到8155内部RAM单元或I/O端口。 • PA0~PA7:A口的I/O线(8位)。 • PB0~PB7:B口的I/O线(8位)。 • PC0~PC7:C口的I/O线(6位)。 • TIN:定时器输入。定时器工作所需的时钟信号由此端输入。 • TOUT:定时器输出。根据定时器工作方式,TOUT端可输出方波或脉冲。 • VCC:+5V电源; • VSS:接地。
8155口地址分布 • 2.8155的地址编码
3.8155的工作方式与基本操作 • (1)作片外256字节RAM使用。 • (2)作扩展I/O口使用。 • (3)作定时器使用
在8155的控制逻辑部件中,设置有一个控制命令寄存器和一个状态标志寄存器;在8155的控制逻辑部件中,设置有一个控制命令寄存器和一个状态标志寄存器; • 8155的工作方式由CPU写入控制命令寄存器中的控制字来确定。控制命令寄存器只能写入不能读出。 • 8155工作方式控制格式:8155的A口,B口可工作于基本I/O方式或选通方式,C口可作为输入输出线,也可作为A口,B口的选通方式工作时的状态控制信号线。 • 在8155中还设置有一个状态标志寄存器,锁存A口,B口和定时器的当前状态,供CPU查询,状态标志寄存器的地址与命令寄存器的地址相同,CPU只能读出,不能写入。
C口工作方式及控制信号分布 (00) (11) (01) (10)
M2 M1 T13 T12 T11 T10 T9 T8 输出方式控制码 T7 T6 T5 T4 T3 T2 T1 T0 8155定时器格式及输出方式
4.MCS-51单片机与8155的接口与操作 MCS-51单片机可直接和8155连接而不需要任何外加逻辑,可以直接为系统增加256字节外部RAM、22根I/O线及一个14位定时器。
5、8155控制的动态LED显示。 命令/状态口 : FFF0H 口A: FFF1H 口B: FFF2H 口C: FFF3H
6位待显示字符从左到右依次放在dis_buf数组中,显示次序从右向左顺序进行。程序中的table 为段选码表,表中段选码表存放的次序为0~F等。以下为循环动态显示6位字符的程序,8155命令字为07H。 • # include < absacc.h > • # include < reg51.h > • #define uchar unsigned char • # define COM8155 XBYTE[ 0xfff0 ] • # define PA8155 XBYTE[ 0xfff1 ] • # define PB8155 XBYTE[ 0xfff2 ] • # define PC8155 XBYTE[ 0xfff3 ]
uchar idata dis_buf[6] = { 2,4,6,8,10,12 } ; uchar code table[18 ]= { 0x3f ,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00 } ; void dl_ms ( uchar d ) ; void display ( uchar idata * p ) { uchar sel ,i ; COM8155 = 0x07 ; /* 送命令字 */ sel = 0x01 ; /* 选出右边的LED */ for ( i= 0 ; i<6 ; i++ ) {PB8155=table [ * p] ; /* 送段码 */
PA8155=sel ; /* 送位选码 */ dl_ms ( 1 ) ; p - - ; /* 缓冲区下移1位 */ sel =sel << 1 /* 左移1 位 */ } } void main ( void ) { display ( dis_buf +5 ) ; }
1.8255A简介 • 8255A有三个8位并行I/O口,PA口、PB口和PC口。这三个口的结构略有差异。 • 从内部结构上看,由数据总线驱动器、 A、B组控制电路、读写控制逻辑电路和三个8位并行I/O端口组成。 • 引脚排列说明 • 数据线(8条):D0~D7为数据总线,用于传送CPU和8255A之间的数据、命令和状态字,是一个双向三态8位的驱动口。
控制线和寻址线(6条): • RESET:复位信号,输入高电平有效。一般和单片机的复位相连,复位后,8255A所有内部寄存器清0,所有口都为输入方式。 • RD、WR读/写信号线,输入,低电平有效。 • CS片选线,输入,低电平有效。 • A0、A1:地址输入线。这两位的4种组合00、01、10、11分别用于选择PA、PB、PC口和控制口寄存器。 • I/O口线(24条):PA0~PA7、PB0~PB7、PC0~PC7为24条双向三态I/O总线,分别与PA、PB、PC口相对应,用于8255A和外设之间传送数据。
2、8255A的控制字:8255A片内有1个8位控制命令寄存器,有两种命令字,即方式控制字和PC口置位/复位控制字,均写入命令寄存器。2、8255A的控制字:8255A片内有1个8位控制命令寄存器,有两种命令字,即方式控制字和PC口置位/复位控制字,均写入命令寄存器。 方式控制字 方式控制字
3、8255的工作方式 • 8255有三种工作方式:方式0、方式1、方式2。 • 方式0(基本输入/输出方式):PA口、PB口及PC口高4位、低4位都可以设置输入或输出,不需要选通信号。单片机可以对8255A进行I/O数据的无条件传送,外设的I/O数据在8255A的各端口能锁存和缓冲。 • 方式1(选通输入/输出方式):PA口和PB口都可以独立的设置为方式1,此时,8255A的PA口和PB口通常用于传送和它们相连外设的I/O数据,PC口作为PA口和PB口的联络线,以实现中断方式传送I/O数据。 • 只有A口可设定为模式2,此时A口用作双向数据总线,C口中有5条线用作握手线
单片机与8255A的连接 • 8255A和单片机的连接,只需要一个8位的地址锁存器即可。地址锁存器用来锁存P0口输出的低8位地址。具体连接方法如下: • 连接数据线:8255A的8根数据线D0~D7直接和P0口相连。 • 连接控制线:8255的复位线RESET与8031的复位端相连。8255A的读写线与8031的 相连。 • 连接地址线和片选信号线:8255A的片选和A1、A0分别由P0.7和P0.1、P0.0经地址锁存器74LS373后提供。 • I/O口线:可以根据用户需要连接外部设备。
例 8255控制打印机。 8031扩展8255与打印机接口的电路中,8255的片选线为P0.7,打印机与8031采用查询方式交换数据。打印机的状态信号输入给PC7,打印机忙时BUSY=1,微型打印机的数据输入采用选通控制,当---STB上负跳变时数据被输入。8255采用方式0由PC0模拟产生---STB信号。 按照接口电路,口A地址为7CH,口C地址为7EH,命令口地址为7FH,PC7~PC4输入,PC3~PC0输出。方式选择命令字为8EH。
向打印机输出字符串"WELCOME"的程序如下: # include <absacc.h> # include <reg51.h> # define uchar unsigned char # define COM8255 XBYTE[0x007f ] /* 命令口地址 */ # define PA8255 XBYTE[ 0x007c] /* 口A地址 */ # define PC8255 XBYTE[ 0x007e] /* 口C 地址 */ void toprn ( uchar *p ) / * 打印字符串函数 */ { while ( * p!= '\0') {while (( 0x80 & PC8255 )! =0 ) ; /* 查询打印机的BUSY状态*/
PA8255 = * p ; /* 输出字符 */ COM8255 = 0x00 ; /* 模拟STB脉冲 */ COM8255=0x01 ; p++ ; } } void main ( void ) { uchar idata prn [ ]= "WELCOME"; /* 设测试用字符串 */ COM8255=0x8e ; /* 输出方式选择命令 */ toprn ( prn ) ; /* 打印字符串 */ }
3.8.3 LCD与8031接口 • WGM12864是一种图形点阵液晶显示模块 • 可完成图形显示,也可以显示4×8个(16×16点阵)汉字 • 电源为+2.7--- +5V • 与CPU接口采用8位数据总线并行输入输出 • 8条控制线 • 七种控制指令 • 模块自带-10V输出电压。
WGM12864主要由行驱动器、列驱动器及128×64全点阵液晶显示器组成,图中IC1、IC2为列驱动器,IC3为行驱动器
IC1、IC2、IC3含有如下主要功能器件: • 指令寄存器(IR):当D/I=0时,在E信号下降沿的作用下,指令码写入IR. • 数据寄存器(DR):当D/I=1时,在E信号的下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7-DB0数据总线。DR和DDRAM之间的数据传输是模块内部自动执行的。 • 忙标志BF:BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据;BF=0时,模块为准备状态,随时可接受外部指令和数据。 • 显示控制触发器DFF:控制模块屏幕显示开和关。DFF=1为开显示,DDRAM的内容就显示在屏幕上,DDF=0为关显示。DDF的状态是指令显示 ON/OFF和RST信号控制的。
XY地址计数器是一个9位计数器,高三位是X地址计数器,低6位为Y地址计数器,XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y地址指针。XY地址计数器是一个9位计数器,高三位是X地址计数器,低6位为Y地址计数器,XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y地址指针。 • X地址计数器没有记数功能,只能用指令设置。Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。 • 显示数据RAM(DDRAM)是存贮图形显示数据的。数据为1表示显示选择,数据为0表示显示非选择。 • Z地址计数器是一个6位计数器,具备循环记数功能,用于显示行扫描同步。当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,RST复位后Z地址计数器为0。 • Z地址计数器可以用指令DISPLAY START LINE预置。因此,显示屏幕的起始行就由此指令控制,即DDRAM的数据从哪一行开始显示在屏幕的第一行。此模块的DDRAM共64行,屏幕可以循环滚动显示64行。
汉字显示程序流程图如图所示。字母和数字采用8×16的点阵,一个16×16点阵汉字字模数据格式是前16个字节为汉字的上半部16×8点阵字模数据,后16个字节为下半部16×8点阵字模数据。汉字显示程序流程图如图所示。字母和数字采用8×16的点阵,一个16×16点阵汉字字模数据格式是前16个字节为汉字的上半部16×8点阵字模数据,后16个字节为下半部16×8点阵字模数据。 • 因此在汉字显示设置页地址时,如果显示的是汉字的后16个字节,需要使页地址在当前页地址的基础上加1。如果需要显示的汉字的列数大于63时,要通过片选信号CS2来选择IC2控制芯片,对它的读写操作同IC1控制芯片。 • 在每次写显示数据和显示指令时都要查看模块当前的工作状态,只有满足条件时才能进行下一步的操作。
unsigned char data hzdot[] = { /*-- 文字: 国 --*/ /*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA, 0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00, 0x00,0x18,0x04,0x14,0x94,0x94,0xD5,0xB6, 0x14,0x14,0x94,0x04,0x14,0x0C,0x04,0x00, 0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F, 0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00, /*-- 文字: 家 --*/ /*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x29,0x29,0x15,0x14,0x4A,0x89,0x44, 0x3F,0x06,0x09,0x09,0x10,0x30,0x10,0x00, }; #include <reg51.h> unsigned char data i,u,w,*xp1, on,setx,sety,setline,read,busy,rst ; sbit rw=P2^0; sbit di=P2^1; sbit wcs1=P2^2; sbit wcs2=P2^3; sbit e=P2^4; sbit res=P2^5;
for(w=0;w<8;w++) //clr { setx=0xb8+w; wcode(setx) ; sety=0x40; wcode(sety) ;for(u=0;u<64;u++) { status(); di=1; rw=0; P1=0x00; e=1; e=0; } } main() { void status(); void delay(unsigned int v); void wcode(unsigned char c) ; EA=0; xp1=hzdot; wcs1=1; wcs2=0; res=0; //reset res=1; on=0x3f; wcode(on);
w=0; for(u=0;u<32;u++) { setx=0xb9; wcode(setx) ; sety=0x40+u; wcode(sety) ; setline=0xc0; wcode(setline) ; status(); di=1; rw=0; e=1; P1=*xp1;xp1++; e=0; } on=0x3e; wcode(on); } w=0; for(u=0;u<32;u++) { setx=0xb8; wcode(setx) ; sety=0x40+u; wcode(sety) ; setline=0xc0; wcode(setline) ; status(); di=1; rw=0; e=1; P1=*xp1;xp1++; e=0; }
void status() { e=1; di=0; rw=1; read=P1; busy=0x80&read; rst=0x10&read; while((busy==0x80)||(rst==0x10)) { e=1; di=0; rw=1; read=P1; busy=0x80&read; rst=0x10&read; } } void delay(unsigned int v) { while(v!=0)v--; } void wcode(unsigned char c) { status(); di=0; rw=0; e=1; P1=c; e=0; }