《第4章并行IO口编程课件.ppt》由会员分享,可在线阅读,更多相关《第4章并行IO口编程课件.ppt(63页珍藏版)》请在三一办公上搜索。
1、第4章 并行I/O端口的C51编程,C51的并行I/O口结构,4.1,C51的并行I/O口编程,4.2,LED数码管原理与编程,4.3,数码管动态显示原理与编程,4.4,行列式键盘原理与编程,4.5,4.6,AT89S51共有4个双向的8位并行I/O端口:P0、P1、P2和P3,它们的输出锁存器属于特殊功能寄存器。4个端口除了按字节输入/输出外,还可位寻址,便于实现位控功能。(1)P0口用作地址/数据总线当AT89S51外扩存储器或I/O时,P0口作为单片机系统复用的地址/数据总线使用。真正的双向口,应该是具有高电平、低电平和高阻抗输入3种状态的端口。因此,P0口作为地址/数据总线使用时是一个
2、真正的双向端口,简称双向口。,4.1 AT89S51的并行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口由于有内部上拉电阻,没有高阻抗输入状态,故
3、为准双向口。作为输出口时,不需要在片外接上拉电阻。P2口是一个双功能口,作为地址输出线使用时,P2口可以输出外部存储器的高8位地址,与P0口输出的低8位地址一起构成16位地址,可以寻址64KB的地址空间。当P2口作为高8位地址输出口时,输出锁存器的内容保持不变。P2口作为通用I/O口使用时,P2口为一个准双向口。功能与P1口一样。 由于AT89S51的引脚数目有限,因此在P3口电路中增加了引脚的第二功能P3口内部有上拉电阻,不存在高阻抗输入状态,为准双向口。,P1P3口驱动LED发光二极管的问题在实际应用中,常用P1P3端口驱动LED发光二极管,下面来讨论P1P3端口与LED发光二极管的驱动连
4、接问题。P0口与P1、P2、P3口相比,P0口的驱动能力较大,每位可驱动8个LSTTL输入,而P1、P2、P3口的每一位的驱动能力,只有P0口的一半。当P0口的某位为高电平时,可提供400A的电流;当P0口的某位为低电平(0.45V)时,可提供3.2mA的灌电流,如低电平允许提高,灌电流可相应加所以,任一个口要想获得较大的驱动能力,只能用低电平输出。例如,使用单片机的并行端口P1P3直接驱动发光二极管,电路如图所示。,5,(a)不恰当的连接:高电平驱动 (b)恰当的连接:低电平驱动发光二极管与AT89S51并行口的直接连接,由于P1P3口内部有30k左右的上拉电阻,如果高电平输出,则强行从P1
5、、P2和P3口输出的电流Id会造成单片机端口的损坏,如图(a)所示。如果端口引脚为低电平,能使电流Id从单片机的外部流入内部,则将大大增加流过的电流值,如图(b)所示。所以,当P1P3端口驱动LED发光二极管时,应该采用低电平驱动。,7,输出单元: 发光二极管(Light Emitting Diode )基本输出元件,低电平驱动,限流电阻R = 1001k,高电平驱动,灌电流,拉电流,基本输入输出单元,输入单元: 按钮(Button)或开关(Switch) 基本输入元件,P0口为漏极开路结构需要外接上拉电阻当按键未按下压时,Px.n端口为高电平;按压按键后为低电平。,4.2.1 从左到右的流水
6、灯的制作 片内I/O端口作为输出使用时,最常用的应用是控制相应的I/O引脚上的LED点亮与熄灭。【例4-1】 如图所示,8个发光二极管LED0LED7经限流电阻分别接至P1口的P2.0P2.7引脚上,阳极共同接高电平。编程来实现发光二极管的从左到右的流水点亮,即按照LED0LED1LED7的顺序,每次点亮一个发光二极管,延时一段时间后熄灭这个发光二极管,然后点亮下一个发光二极管,重复循环。参考程序如下:,10,4.2 并行I/O端口的C51编程举例,8个发光二极管与并行口P2的连接,#include #include /*包含移位函数的头文件*/#define uchar unsigned c
7、har #define uint unsigned int void delay(uint i) /*延时函数*/uint t;while (i-);for (t=50000;t0;t-);/循环延时void main( )/*主程序*/P2=0 xfe;while (1)P2=_crol_(P2,1) ; /*C51函数库中的左移函数,P2中的数据循环左移1位*/delay( 2000 ); /*500为延时参数,可根据实际需要调整*/,8个发光二极管与并行口P2的连接,实例2 独立按键识别,【要求】采用独立按键方式实现下述功能:开机时LED全熄,然后根据按键动作使相应灯亮,并将亮灯状态保持
8、到按压其它键时为止。,独立按键每个按键都彼此独立地各占有一位I/O口线。特点是电路简单,但占用I/O口线较多。, 按键的闭合电平为0, 但LED的驱动电平为1,故不能直接将P0口的状态送到P1口,而应使其先取反再送出;, 为使按键抬起后LED能保持先前的点亮状态,需要在按键未压下期间禁止向P2输出P0状态值。,【分析】,参考程序如下:,“取反”操作的优先级高于“与”操作,void main( ) char key = 0; /定义按键变量 P2=0; /初始状态为灯全灭 while(1) key = P0 /有按键动作时,P0状态值送P2 ,编程界面和运行界面分别如下图,实例1X运行效果,实例
9、2 键控流水灯,【要求】 K1为“启动键”,首次按压K1可产生“自下向上” 的流水灯运动; K2 为“停止键”,按压K2可终止流水灯的运动; K3和K4为“方向键”,分别产生 “自上向下”和 “自下向上” 运动。,K1K2K3K4,思路分析:根据键值修改标志位,根据标志位控制灯状态,总体关系流程图,键值:按压K1xxxx 1110B按压K2xxxx 1101B按压K3xxxx 1011B 按压K4xxxx 0111B无按键 xxxx 1111B,按键动作判断(P0 & 0 x0f)是否等于 0 x0f?若是,说明无按键动作,反之则有按键动作。, 0 x0e 0 x0d 0 x0b 0 x07
10、0 x0f,获取按键状态,修改方向和启停标志值,亮灯P2输出码:xxxx 0001xxxx 0010 xxxx 0100 xxxx 1000,D1D4循环方向控制,char led = 0 x01,0 x02,0 x04,0 x08;,for (i=0; i=3; i+) P2 = led i; /移动,for (i=3; i=0; i- ) P2 = led i; /移动,实例2原理图与程序界面图,程序运行效果,4.3 LED数码管原理与编程,LED显示元件人机交互输出设备,其作用是指示中间运行结果与运行状态。,com为公共端,共阳极LED,共阴极LED,引脚配置,七段式LED显示器,(7-
11、Segment Display),不同显示字符采需用不同LED组合关系实现(显示码,字模),以共阴极为例,部分字符的显示码(字模)为:,七段LED数码管的标准显示字符为09,AF,显示字符,显示码(共阴),其它字符:,0011 1000B = 0 x38,“L”字符的显示码,“H”字符的显示码,0111 0110B = 0 x76,实例4 LED数码管显示,在P0口连接一个共阴极数码管,使之循环显示09数字。,分析:将显示码循环输出到P0口即可实现循环显示。但由于数字09的显示段码没有规律可循,需要采取查表方式进行操作:,将显示码按序存放在一个数组中, 顺序号与代表的显示字符相对应。(如,ch
12、ar led_mod =x1,x2,.,xn)通过循环变量指定待送出的数组元素,参考程序,运行结果,实例5 计数显示器,统计按键次数并以十进制形式显示,按键次数大于99后重新由0开始计数。,个位LED接P2口,十位LED接P0口(共阴型),按钮接P3.7口线,按压时为0电平,编程分析:,问题:按键压下时可能被连续计数,如何避免连续计数?,初始化: P2 = P0 = table0;,解决办法: 取模运算(%10)个位 整除10运算(/10)十位,P2 = tablecount%10;,P 0 = tablecount/10;,显示输出:如何将计数值拆成两个独立的数?,参考程序,程序运行效果,4
13、.4 数码管动态显示原理与编程,两种显示接口:静态显示接口和动态显示接口,静态显示接口:一个数码管的引脚独立占据一根I/O口线。优点:被显示数据只要送入并行口后就不再需要CPU干预,因而显示效果稳定。缺点:占用资源较多,动态显示接口:所有数码管的段码线对应并联接在一个并行口上,而每位数码管的公共端分别由一位I/O线控制;由并口输出的显示码可被所有数码管收到,但只有满足导通条件的数码管可以被驱动。,工作原理:采用快速切换方式(如10ms),每一时刻只有一只数码管导通工作。利用视力暂留特性,可获得连续显示效果。优点:占用资源较少缺点:占用机时较多(需要CPU随时刷新显示值),实例6 数码管动态显示
14、,采用共阴极动态LED显示原理,实现如下功能:SW1向下拨时显示字符“L2”,向上拨时显示字符“H3”。,分析:Proteus中的双联LED数码管相当于两个并联的数码管。,7SEG-MPX2-CC-BLUE,Blue,2 Digit,7-segment Cathode Display,A-G “0 x38”, 1#“0”,2# “1”,A-G “0 x5b”, 1#“1”,2# “0”,P2led_mode0, P3 xxxx xx10B =2P2led_mode1, P3 xxxx xx01B =1,led_mode =0 x38,0 x5b,如果不考虑开关switch,动态显示“L2”的程
15、序可以如下:,;,/LED “指针”,/显示字模,A-G “0 x76”, 1#“0”,2# “1”,A-G “0 x4f”, 1#“1”,2# “0”,字符数组 led_mode =0 x38,0 x5b,0 x76,0 x4f,开关状态变量 switch_sta,复合指针变量 led_point + switch_sta,完整的主函数,#include char led_mod = 0 x38,0 x5B,0 x76,0 x4F;void delay(unsigned int time);sbit P17=P17;void main() char led_point = 0, switch
16、_sta = 0; while (1) if (P17 = 1) switch_sta = 2;else switch_sta = 0; P3 = 2 - led_point; P2= led_modswitch_sta+led_point; led_point = 1 - led_point;delay(30);,编程界面,运行效果图,4.5 行列式键盘原理与编程,独立式键盘的电路简单,易于编程,但占用的I/O口线较多,当需要较多按键时可能产生I/O资源紧张问题。,独立式键盘电路,矩阵式键盘与LED显示示例,步骤:判有无键按下、判按下哪个键 、依键号进入相应程序,判有无键按下 行线接输入口,
17、列线接输出口。置所有列线为低电平,然后读行线状态,若行线均为高电平,则没有键按下;若行线状态不全为高电平,则可断定有键按下。,判按下哪个键先让C0列为低电平,其余列线为高电平,读行线状态,如行线状态不全为“1”,则说明所按键在该列;否则所按键不在该列,再使C1列线为低电平,其它列为高电平,判断C1列有无按键按下。,进入相应程序 键号 = 行首号+列号。 根据键号进入相应的功能程序。,(程序略),行列式键盘将I/O口分为行线和列线,按键跨接在行线和列线上,列线通过上拉电阻接正电源。,44行列式键盘,7407六高压输出缓冲器/驱动器,行列式键盘的特点:占用I/O口线少,但软件过程复杂。, 键盘扫描
18、,同时将各行电平置1,分别将各列电平置0。,扫描码:key_scan = 0 xef, 0 xdf, 0 xbf, 0 x7f;写P3: P3=key_scani;,键盘扫描原理(以P3口接44键盘为例),第一次 1110 1111B 第二次 1101 1111B第三次 1011 1111B第四次 0111 1111B,= 0 xef= 0 xdf= 0 xbf= 0 x7f,(P3 & 0 x0f) = 0 x0f 无键压下 (P3 & 0 x0f)0 x0f 有键压下, 按键闭合状态判断,0#: 1110 1110B0 xee 1#: 1101 1110B0 xdeF#: 0111 011
19、1B0 x77,按键闭合前后,所在行线端口电平反转;读P3后,若发现其低4位为f,说明无键压下;反之则相反。,键值按键闭合时从引脚读出的数值。, 查找闭合键键号,for (j = 0 ; j 16 ;j+) if (P3= key_buf j) return j; ,键值数组key_buf = 0 xee, 0 xde, 0 xbe, 0 x7e, 0 xed, 0 xdd, 0 xbd, 0 x7d, 0 xeb, 0 xdb, 0 xbb, 0 x7b, 0 xe7, 0 xd7, 0 xb7, 0 x77;,键号按照一定规则给按键分配的编号,闭合键键号: 闭合键值与键值数组相等时的查询号,实例7,功能:开机黑屏;按下任意按键后,数码管上显示该键的键号(0F);若没有新键按下,维持前次按键结果。,行列式键盘+静态数码显示,实例7程序流程图,完整程序,程序运行效果,按键在闭合和断开瞬间会因弹簧开关的变形产生电压波动,软件消抖法: 延时10ms后再次扫描按键状态。若仍判为“闭合”说明确有键压下;若为“非闭合”说明是误动作。,按键抖动波形,键盘消抖原理:,消抖实例:,(实例5),本章小结,单片机I/O口基本编程应用包括按键(或开关)状态检测、发光二极管输出控制、数码管动态显示以及行列式键盘扫描编程等内容。,