1 / 153

3.8 单片机外围器件

3.8 单片机外围器件. 型号. 名称. 说明. 8155. 并行接口. 带 256 字节的 RAM 和 14 位定时 / 计数器. 8255. 通用并行接口. 8251. 同步 / 异步通讯接口. 8253. 定时 / 计数器. 8279. 键盘 / 显示接口. 3.8.1 8155 与 8031 的接口. 常用 Intel 系列可编程接口芯片. 1 . 8155 的结构和技术性能 8155 内部具有: ( 1 ) 256 字节的静态 RAM, 存取时间为 400ns 。 ( 2 )三个通用的输入 / 输出口。

Download Presentation

3.8 单片机外围器件

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 3.8 单片机外围器件

  2. 型号 名称 说明 8155 并行接口 带256字节的RAM和14位定时/计数器 8255 通用并行接口 8251 同步/异步通讯接口 8253 定时/计数器 8279 键盘/显示接口 3.8.1 8155与8031的接口 常用Intel 系列可编程接口芯片

  3. 1.8155的结构和技术性能 • 8155内部具有: (1)256字节的静态RAM,存取时间为400ns。 (2)三个通用的输入/输出口。 (3)一个14位的可编程定时/计数器。 (4)地址锁存器及多路转换的地址和数据总线。 (5)单一+5V电源,40脚双列直插式封装。

  4. 8155的逻辑结构及引脚

  5. 各引脚功能如下: • 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存储单元。

  6. 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:接地。

  7. 8155口地址分布 • 2.8155的地址编码

  8. 3.8155的工作方式与基本操作 • (1)作片外256字节RAM使用。 • (2)作扩展I/O口使用。 • (3)作定时器使用

  9. 在8155的控制逻辑部件中,设置有一个控制命令寄存器和一个状态标志寄存器;在8155的控制逻辑部件中,设置有一个控制命令寄存器和一个状态标志寄存器; • 8155的工作方式由CPU写入控制命令寄存器中的控制字来确定。控制命令寄存器只能写入不能读出。 • 8155工作方式控制格式:8155的A口,B口可工作于基本I/O方式或选通方式,C口可作为输入输出线,也可作为A口,B口的选通方式工作时的状态控制信号线。 • 在8155中还设置有一个状态标志寄存器,锁存A口,B口和定时器的当前状态,供CPU查询,状态标志寄存器的地址与命令寄存器的地址相同,CPU只能读出,不能写入。

  10. 8155命令控制字格式

  11. C口工作方式及控制信号分布 (00) (11) (01) (10)

  12. 8155状态字格式

  13. M2 M1 T13 T12 T11 T10 T9 T8 输出方式控制码 T7 T6 T5 T4 T3 T2 T1 T0 8155定时器格式及输出方式

  14. 4.MCS-51单片机与8155的接口与操作 MCS-51单片机可直接和8155连接而不需要任何外加逻辑,可以直接为系统增加256字节外部RAM、22根I/O线及一个14位定时器。

  15. 5、8155控制的动态LED显示。 命令/状态口 : FFF0H 口A: FFF1H 口B: FFF2H 口C: FFF3H

  16. 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 ]

  17. 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] ; /* 送段码 */

  18. PA8155=sel ; /* 送位选码 */ dl_ms ( 1 ) ; p - - ; /* 缓冲区下移1位 */ sel =sel << 1 /* 左移1 位 */ } } void main ( void ) { display ( dis_buf +5 ) ; }

  19. 3.8.2 8255与8031接口

  20. 1.8255A简介 • 8255A有三个8位并行I/O口,PA口、PB口和PC口。这三个口的结构略有差异。 • 从内部结构上看,由数据总线驱动器、 A、B组控制电路、读写控制逻辑电路和三个8位并行I/O端口组成。 • 引脚排列说明 • 数据线(8条):D0~D7为数据总线,用于传送CPU和8255A之间的数据、命令和状态字,是一个双向三态8位的驱动口。

  21. 控制线和寻址线(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和外设之间传送数据。

  22. 2、8255A的控制字:8255A片内有1个8位控制命令寄存器,有两种命令字,即方式控制字和PC口置位/复位控制字,均写入命令寄存器。2、8255A的控制字:8255A片内有1个8位控制命令寄存器,有两种命令字,即方式控制字和PC口置位/复位控制字,均写入命令寄存器。 方式控制字 方式控制字

  23. 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条线用作握手线

  24. 8255A接口工作状态选择表

  25. 单片机与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口线:可以根据用户需要连接外部设备。  

  26. 例 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。

  27. 8031扩展8255与打印机接口的电路

  28. 向打印机输出字符串"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状态*/

  29. PA8255 = * p ; /* 输出字符 */ COM8255 = 0x00 ; /* 模拟STB脉冲 */ COM8255=0x01 ; p++ ; } } void main ( void ) { uchar idata prn [ ]= "WELCOME"; /* 设测试用字符串 */ COM8255=0x8e ; /* 输出方式选择命令 */ toprn ( prn ) ; /* 打印字符串 */ }

  30. 3.8.3 LCD与8031接口 • WGM12864是一种图形点阵液晶显示模块 • 可完成图形显示,也可以显示4×8个(16×16点阵)汉字 • 电源为+2.7--- +5V • 与CPU接口采用8位数据总线并行输入输出 • 8条控制线 • 七种控制指令 • 模块自带-10V输出电压。

  31. WGM12864主要由行驱动器、列驱动器及128×64全点阵液晶显示器组成,图中IC1、IC2为列驱动器,IC3为行驱动器

  32. 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信号控制的。

  33. 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行。

  34. 汉字显示程序流程图如图所示。字母和数字采用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控制芯片。 • 在每次写显示数据和显示指令时都要查看模块当前的工作状态,只有满足条件时才能进行下一步的操作。

  35. 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;

  36. 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);

  37. 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; }

  38. 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; }

More Related