第4章并行IO口编程_第1页
第4章并行IO口编程_第2页
第4章并行IO口编程_第3页
第4章并行IO口编程_第4页
第4章并行IO口编程_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章并行I/O端口的C51编程C51的并行I/O口结构4.1C51的并行I/O口编程4.2LED数码管原理与编程4.3数码管动态显示原理与编程4.4行列式键盘原理与编程4.54.6AT89S51共有4个双向的8位并行I/O端口:P0、P1、P2和P3,它们的输出锁存器属于特殊功能寄存器。4个端口除了按字节输入/输出外,还可位寻址,便于实现位控功能。(1)P0口用作地址/数据总线当AT89S51外扩存储器或I/O时,P0口作为单片机系统复用的地址/数据总线使用。真正的双向口,应该是具有高电平、低电平和高阻抗输入3种状态的端口。因此,P0口作为地址/数据总线使用时是一个真正的双向端口,简称双向口。4.1AT89S51的并行I/O端口的结构及工作原理当P0口不作为系统的地址/数据总线使用时,也可作为通用I/O使用。须外接上拉电阻才能有高电平输出;(2)P0口用作通用I/O口(3)P0口的特点P0口有如下特点:P0口为双功能口——地址/数据复用口和通用I/O口。当P0口用作地址/数据复用口时,是一个真正的双向口,用作与外部存储器的连接,输出低8位地址和输出/输入8位数据。当P0口用作通用I/O口时,由于需在片外接上拉电阻,端口不存在高阻抗(悬浮)状态,因此是一个准双向口。P1口只能作为通用的I/O口使用。P1口由于有内部上拉电阻,没有高阻抗输入状态,故为准双向口。作为输出口时,不需要在片外接上拉电阻。P2口是一个双功能口,作为地址输出线使用时,P2口可以输出外部存储器的高8位地址,与P0口输出的低8位地址一起构成16位地址,可以寻址64KB的地址空间。当P2口作为高8位地址输出口时,输出锁存器的内容保持不变。P2口作为通用I/O口使用时,P2口为一个准双向口。功能与P1口一样。由于AT89S51的引脚数目有限,因此在P3口电路中增加了引脚的第二功能P3口内部有上拉电阻,不存在高阻抗输入状态,为准双向口。P1~P3口驱动LED发光二极管的问题在实际应用中,常用P1~P3端口驱动LED发光二极管,下面来讨论P1~P3端口与LED发光二极管的驱动连接问题。P0口与P1、P2、P3口相比,P0口的驱动能力较大,每位可驱动8个LSTTL输入,而P1、P2、P3口的每一位的驱动能力,只有P0口的一半。当P0口的某位为高电平时,可提供400A的电流;当P0口的某位为低电平(0.45V)时,可提供3.2mA的灌电流,如低电平允许提高,灌电流可相应加所以,任一个口要想获得较大的驱动能力,只能用低电平输出。例如,使用单片机的并行端口P1~P3直接驱动发光二极管,电路如图所示。

5(a)不恰当的连接:高电平驱动(b)恰当的连接:低电平驱动发光二极管与AT89S51并行口的直接连接由于P1~P3口内部有30kΩ左右的上拉电阻,如果高电平输出,则强行从P1、P2和P3口输出的电流Id会造成单片机端口的损坏,如图(a)所示。如果端口引脚为低电平,能使电流Id从单片机的外部流入内部,则将大大增加流过的电流值,如图(b)所示。所以,当P1~P3端口驱动LED发光二极管时,应该采用低电平驱动。7输出单元:

发光二极管(LightEmittingDiode)——基本输出元件低电平驱动限流电阻R=100Ω~1kΩ高电平驱动灌电流拉电流基本输入输出单元输入单元:

按钮(Button)或开关(Switch)——基本输入元件

P0口为漏极开路结构——需要外接上拉电阻当按键未按下压时,Px.n端口为高电平;按压按键后为低电平。4.2.1从左到右的流水灯的制作片内I/O端口作为输出使用时,最常用的应用是控制相应的I/O引脚上的LED点亮与熄灭。【例4-1】

如图所示,8个发光二极管LED0~LED7经限流电阻分别接至P1口的P2.0~P2.7引脚上,阳极共同接高电平。编程来实现发光二极管的从左到右的流水点亮,即按照LED0→LED1→┉→LED7的顺序,每次点亮一个发光二极管,延时一段时间后熄灭这个发光二极管,然后点亮下一个发光二极管,重复循环。参考程序如下:

104.2并行I/O端口的C51编程举例8个发光二极管与并行口P2的连接#include<reg51.h>#include<intrins.h> /*包含移位函数的头文件*/#defineucharunsignedchar #defineuintunsignedint

voiddelay(uinti) /*延时函数*/{ uintt; while(i--); { for(t=50000;t>0;t--);//循环延时

}}voidmain() /*主程序*/{ P2=0xfe; while(1) { P2=_crol_(P2,1);/*C51函数库中的左移函数,P2中的数据循环左移1位*/ delay(2000);/*500为延时参数,可根据实际需要调整*/ }}8个发光二极管与并行口P2的连接实例2独立按键识别【要求】采用独立按键方式实现下述功能:开机时LED全熄,然后根据按键动作使相应灯亮,并将亮灯状态保持到按压其它键时为止。独立按键——每个按键都彼此独立地各占有一位I/O口线。特点是电路简单,但占用I/O口线较多。①按键的闭合电平为0,但LED的驱动电平为1,故不能直接将P0口的状态送到P1口,而应使其先取反再送出;②为使按键抬起后LED能保持先前的点亮状态,需要在按键未压下期间禁止向P2输出P0状态值。【分析】参考程序如下:

“取反”操作的优先级高于“与”操作voidmain(){charkey=0; //定义按键变量P2=0; //初始状态为灯全灭while(1){key=~P0&0x0f; //读取按键状态,高4位清零if(key!=0)P2=key;//有按键动作时,P0状态值送P2}}编程界面和运行界面分别如下图实例1X运行效果实例2键控流水灯

【要求】K1为“启动键”,首次按压K1可产生“自下向上”的流水灯运动;K2为“停止键”,按压K2可终止流水灯的运动;

K3和K4为“方向键”,分别产生“自上向下”和“自下向上”运动。K1K2K3K4思路分析:根据键值修改标志位,根据标志位控制灯状态总体关系流程图键值:按压K1——xxxx1110B按压K2——xxxx1101B按压K3——xxxx1011B按压K4——xxxx0111B无按键——xxxx1111B按键动作判断——(P0&0x0f)是否等于0x0f?若是,说明无按键动作,反之则有按键动作。→0x0e→0x0d→0x0b→0x07→0x0f获取按键状态修改方向和启停标志值亮灯P2输出码:xxxx0001xxxx0010xxxx0100xxxx1000D1~D4循环方向控制charled[]={0x01,0x02,0x04,0x08};for(i=0;i<=3;i++){P2=led[i];}//↓移动for(i=3;i>=0;i--){P2=led[i];}//↑移动实例2原理图与程序界面图程序运行效果4.3LED数码管原理与编程

LED显示元件——人机交互输出设备,其作用是指示中间运行结果与运行状态。点式字段式LED光柱式LED的类型com为公共端共阳极LED共阴极LED引脚配置七段式LED显示器(7-SegmentDisplay)不同显示字符采需用不同LED组合关系实现(显示码,字模)以共阴极为例,部分字符的显示码(字模)为:七段LED数码管的标准显示字符为0~9,A~F显示字符显示码(共阴)其它字符:——00111000B=0x38“L”字符的显示码“H”字符的显示码——01110110B=0x76实例4LED数码管显示在P0口连接一个共阴极数码管,使之循环显示0~9数字。分析:将显示码循环输出到P0口即可实现循环显示。但由于数字0~9的显示段码没有规律可循,需要采取查表方式进行操作:循环10次?N

延时循环指针i赋值(10)P0←数组[i]Y①将显示码按序存放在一个数组中,顺序号与代表的显示字符相对应。(如,charled_mod[]={x1,x2,….,xn)②通过循环变量指定待送出的数组元素参考程序运行结果实例5计数显示器统计按键次数并以十进制形式显示,按键次数大于99后重新由0开始计数。个位LED接P2口,十位LED接P0口(共阴型)按钮接P3.7口线,按压时为0电平编程分析:问题:按键压下时可能被连续计数如何避免连续计数?初始化:P2=P0=table[0];解决办法:取模运算(%10)→个位整除10运算(/10)→十位P2=table[count%10];P

0=table[count/10];显示输出:如何将计数值拆成两个独立的数?参考程序程序运行效果

4.4数码管动态显示原理与编程

两种显示接口:静态显示接口和动态显示接口静态显示接口:一个数码管的引脚独立占据一根I/O口线。优点:被显示数据只要送入并行口后就不再需要CPU干预,因而显示效果稳定。缺点:占用资源较多动态显示接口:所有数码管的段码线对应并联接在一个并行口上,而每位数码管的公共端分别由一位I/O线控制;由并口输出的显示码可被所有数码管收到,但只有满足导通条件的数码管可以被驱动。工作原理:采用快速切换方式(如10ms),每一时刻只有一只数码管导通工作。利用视力暂留特性,可获得连续显示效果。优点:占用资源较少缺点:占用机时较多(需要CPU随时刷新显示值)实例6数码管动态显示采用共阴极动态LED显示原理,实现如下功能:SW1向下拨时显示字符“L2”,向上拨时显示字符“H3”。分析:Proteus中的双联LED数码管相当于两个并联的数码管。7SEG-MPX2-CC-BLUEBlue,2Digit,7-segmentCathodeDisplayA-G→“0x38”,1#→“0”,2#→“1”A-G→“0x5b”,1#→“1”,2#→“0”P2←led_mode[0],P3←xxxxxx10B=2P2←led_mode[1],P3←xxxxxx01B=1led_mode[]={0x38,0x5b}led_point=0P2=led_mode[led_point]led_point=1-led_pointP3=2-led_point如果不考虑开关switch,动态显示“L2”的程序可以如下:;//LED“指针”//显示字模led_point=0P2=led_mode[led_point]led_point=1-led_pointP3=2-led_pointA-G→“0x76”,1#→“0”,2#→“1”A-G→“0x4f”,1#→“1”,2#→“0”字符数组led_mode[]={0x38,0x5b,0x76,0x4f}开关状态变量

switch_sta复合指针变量led_point+switch_sta显示字符L2H3switch_sta+led_point0123led_point

0101switch_sta0022P3=2-led_point2121led_point=0P2=led_mode[led_point+switch_sta]led_point=1-led_pointP3=2-led_pointswitch_sta=0,2完整的主函数#include<REG51.H>charled_mod[]={0x38,0x5B,0x76,0x4F}; voiddelay(unsigned

inttime);sbitP17=P1^7;voidmain(){charled_point=0,switch_sta=0;while(1){ if(P17==1)switch_sta=2;

elseswitch_sta=0;

P3=2-led_point;

P2=led_mod[switch_sta+led_point];

led_point=1-led_point;

delay(30); }}led_point=0P2=led_mode[led_point+switch_sta]led_point=1-led_pointP3=2-led_pointswitch_sta=0,2编程界面运行效果图4.5行列式键盘原理与编程

独立式键盘的电路简单,易于编程,但占用的I/O口线较多,当需要较多按键时可能产生I/O资源紧张问题。独立式键盘电路行列式键盘——将I/O口分为行线和列线,按键跨接在行线和列线上,列线通过上拉电阻接正电源。4×4行列式键盘7407——六高压输出缓冲器/驱动器行列式键盘的特点:占用I/O口线少,但软件过程复杂。①键盘扫描

同时将各行电平置1,分别将各列电平置0。扫描码:key_scan[]={0xef,0xdf,0xbf,0x7f};写P3: P3=key_scan[i];键盘扫描原理(以P3口接4×4键盘为例)第一次11101111B第二次11011111B第三次10111111B第四次01111111B=0xef=0xdf=0xbf=0x7f(P3&0x0f)=0x0f

→无键压下

(P3&0x0f)≠0x0f

→有键压下

按键闭合状态判断0#:11101110B——0xee1#:

11011110B——0xdeF#:

01110111B——0x77按键闭合前后,所在行线端口电平反转;读P3后,若发现其低4位为f,说明无键压下;反之则相反。键值——

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论