51单片机IO口使用DE 经验

合集下载

单片机:第八章 51单片机IO接口

单片机:第八章 51单片机IO接口
第八章
51单片机I/O接口
本章内容
8.1 P0-P3口的功能 (重点) 和内部结构(了解) 8.2 I/O口编程举例 (重点) 8.3 用并行口设计LED数码显示器 (掌握) 8.4 用并行口设计键盘电路 (掌握)
8.1 P0-P3口的功能和内部结构
(1)所谓双向,是既能做输入,又能做输出。
所谓准双向口,是指该端口在用作输入线时,必须先 写入“1”。 (2)内部结构是设计芯片时决定的,如果以后不设计单片 机,那么不必在意。只简单的了解即可。
g
d
(b) e
c
e
f
g
1 2 34 5
com ed c
dp
com
dp
xgf ed cba 0 1 0 1 1 0 1 1 =5bh
8.3 用并行口设计LED数码显示器
8.3 用并行口设计LED数码显示器
• (1)数码管显示方式
静态方式
动态方式
8.3 用并行口设计LED数码显示器
• (2)数码管译码方式
8.2 I/O口编程举例
• 解:4个开关对应4个LED灯,因此适合用字节的方式进行操作。
ORG 0000H
ABC: MOV P1, #0FH 的正确读入
;高四位灭,低四位送“1”,确保开关状态
MOV A, P1
;读P1口引脚开关状态至A
SWAP A
;低四位开关状态转换到高四位
ANL A, #0F0H
8.3 用并行口设计LED数码显示器
• (3)举例 –软件译码
【例8-3】 接有五个共阴极数码管的动态显示接口电路, P1.7接开关,当 开关打向位置“1”(GND)时, 显示“12345”字样,当开关打向 “2”(高电平)时,显示“HELLO”字样,试编写其程序。

学习笔记之-51单片机IO口详解

学习笔记之-51单片机IO口详解

学习笔记之-51单片机IO口详解前言 对单片机的控制,其实就是对I/O口的控制,无论单片机对外界进行何种控制,或接受外部的何种控制,都是通过I/O口进行的。

51单片机每个IO端口结构都有差异,都各有各的特点。

在平时的应用中,特别是设计外围硬件的时候,如果不了解其内部结构的话设计起来也许会有问题(特别是用到P0口),所以好好了解每个端口的结构是非常有必要的。

再有一点是51单片机的引脚不像STM32那样可以支持重映射,所以硬件布局的时候也要注意这一点。

下面就是在网上找的一点资料,整理如下:51单片机I/O口内部结构1.1P0端口的结构及工作原理 P0端口8位中的一位结构图 由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。

图的右边,标号为P0.X引脚的图标,也就是说P0.X引脚可以是P0.0到P0.7的任何一位,即在P0口有8个与上图相同的电路组成。

下面,我们先介绍一下组成P0口的每个单元部份:- 输入缓冲器:在P0口中,有两个三态的缓冲器,三态门有三个状态,即在其的输出端可以是高电平、低电平,同时还有一种就是高阻状态(或称为禁止状态)。

要读取D锁存器输出端Q的数据,那就得使读锁存器的这个缓冲器的三态控制端(上图中标号为‘读锁存器’端)有效。

下面一个是读引脚的缓冲器,要读取P0.X引脚上的数据,也要使标号为‘读引脚’的这个三态缓冲器的控制端有效,引脚上的数据才会传输到我们单片机的内部数据总线上。

- D锁存器:构成一个锁存器,通常要用一个时序电路,一个触发器可以保存一位的二进制数(即具有保持功能),在51单片机的32根I/O口线中都是用一个D触发器来构成锁存器的。

上图中的D锁存器,D端是数据输入端,CP是控制端(也就是时序控制信号输入端),Q是输出端,Q非是反向输出端。

对于D触发器来讲,当D输入端有一个输入信号,如果这时控制端CP没有信号(也就是时序脉冲没有到来),这时输入端D的数据是无法传输到输出端Q及反向输出端Q非的。

STC51单片机IO口模式快速设置

STC51单片机IO口模式快速设置

STC51单⽚机IO⼝模式快速设置STC51单⽚机I0 ⼝模式快速设置-CAL-FENGHAI-(2O2OYEAR-YICAI) JINGBIANSTC51单⽚机IO ⼝模式的快速设置新型51单⽚机STC系列,较传统51单⽚机在性能和速度上有根⽊性的提⾼。

速度提⾼8-12倍;⽚上RAM⼤量增加;⽚上外围模块⼤量增加,等等。

其中10 ⼝的模式增加为4种(传统51只有2中),以P0 ⼝为例:这⾥,每个端⼝新增两个寄存器PxMO, PxMl(x=0,l?2,3)o在设置每⼀个10端的模式时都需要对这两个寄存器进⾏操作。

⽐如:要将设为推挽输出,设为准双向⼝,设为⾼阻输⼊;设为开路模式,都设为准双向⼝,那么需要如下的代码:IO_lnit(){P0M0=0x30;//0011 0000P0Ml=0x90;//1001 0000}这样的设置不便于记忆,很容易写错,且写好的代码可读性差,为此,我们可以通过⼀个宏定义来解决,具体如下:#define PORTO 0#define PORT1 1#define PORT2 2#define PORT3 3#define BITO 0#define BIT1 1#define BIT2 2#define BIT3 3#define BIT4 4#define BIT5 5#define BIT6 6#define BIT7 7#define STANDARD 0#define PP.OUT 1#define ZJN 2#define OD 3#define IOMODE(Port‘bit_n,mode) { \switch(Port)\{\case 0:\switch(mode) { \case STANDARD: P0M0&=^(l?bit_n); POMl&=^(l?bit_n); break; \ case PP_OUT: P0M0&=~(l?bit_n); P0M11 = (l?bit_n);break; \case ZJN: POMO|=(l?bit_n); P0M1 &=~(l?bit_n); break;\ ~case OD: POMO|=(l?bit_n); POMl|=(l?bit_n); break; \} \break;\case 1:\switch(mode) { \case STANDARD: PlMO&=~(l?bit_n); P1M1&⼦(l?bit_n); break; \ case PP_OUT: PlMO&=^(l?bit_n); P1M1|= (l?bit_n);break; \case ZJN: PlMO|=(l?bit_n); P1M1 &=~(l?bit_n); break;\ "case OD: PlMO|=(l?bit_n); PlMl|=(l?bit_n); break; \} \ _ _break;\case 2:\switch(mode) { \case STANDARD: P2M0&=^(l?bit_n); P2Ml&=^(l?bit_n); break; \ case PP_OUT: P2M0&=^(l?bit_n); P2M1| = (l?bit_n); break; \ case Z_IN: P2M0|=(l?bit_n); P2Ml&=zx/(l?bit_n); break;\ ~case OD: P2M0|=(l?bit_n); P2Ml|=(l?bit_n); break; \} \ _ "break;\case 3:\switch(mode) { \case STANDARD: P3MO&=^(l?bit_n); P3Ml&=^(l?bit_n); break; \ case PP_OUT: P3M0&=~(l?bit_n); P3M1|= (l?bit_n);break; \case Z_IN: P3MO|=(l?bit_n); P3M1 &=~(l?bit_n); break; \ ~ case OD: P3M0|=(l?bit_n); P3Ml|=(l?bit_n); break; \} \ _ _break;\}\}有了上⾯的宏定义,在初始化程序中可以直接这样写IOJnit(){IOMODE(PORTO,BIT7/PP_OUT)IOMODE(PORTO,BIT6, STANDARD)IOMODE(PORTO,BIT5/ ZJN)IOMODE(PORTO,BIT4, OD)IOMODE(PORTO,BIT3/ STANDARD)IOMODE(PORTO,BIT2, STANDARD)IOMODE(PORTO/BIT1/ STANDARD)IOMODE(PORTO,BITO, STANDARD)。

STC51单片机IO口模式快速设置

STC51单片机IO口模式快速设置

STC51单片机IO口模式的快速设置新型51单片机STC系列,较传统51单片机在性能和速度上有根本性的提高。

速度提高8—12倍;片上RAM大量增加;片上外围模块大量增加,等等。

其中IO口的模式增加为4种(传统51只有1中),以P0口为例:这里,每个端口新增两个寄存器PxM0, PxM1(x=0,1,2,3)。

在设置每一个IO端的模式时都需要对这两个寄存器进行操作。

比如:要将P0.7设为推挽输出,P0.6设为准双向口,P0.5设为高阻输入;P0.4设为开路模式,P0.3---P0.0都设为准双向口,那么需要如下的代码:IO_Init(){P0M0=0x30;//0011 0000P0M1=0x90;//1001 0000}这样的设置不便于记忆,很容易写错,且写好的代码可读性差,为此,我们可以通过一个宏定义来解决,具体如下:#define PORT0 0#define PORT1 1#define PORT2 2#define PORT3 3#define BIT0 0#define BIT1 1#define BIT2 2#define BIT3 3#define BIT4 4#define BIT5 5#define BIT6 6#define BIT7 7#define STANDARD 0#define PP_OUT 1#define Z_IN 2#define OD 3#define IOMODE(Port,bit_n,mode) { \switch(Port)\{\case 0:\switch(mode) { \case STANDARD: P0M0&=~(1<<bit_n); P0M1&=~(1<<bit_n); break; \case PP_OUT: P0M0&=~(1<<bit_n); P0M1|= (1<<bit_n); break; \case Z_IN: P0M0|=(1<<bit_n); P0M1&=~(1<<bit_n); break; \case OD: P0M0|=(1<<bit_n); P0M1|=(1<<bit_n); break; \} \break;\case 1:\switch(mode) { \case STANDARD: P1M0&=~(1<<bit_n); P1M1&=~(1<<bit_n); break; \case PP_OUT: P1M0&=~(1<<bit_n); P1M1|= (1<<bit_n); break; \case Z_IN: P1M0|=(1<<bit_n); P1M1&=~(1<<bit_n); break; \case OD: P1M0|=(1<<bit_n); P1M1|=(1<<bit_n); break; \} \break;\case 2:\switch(mode) { \case STANDARD: P2M0&=~(1<<bit_n); P2M1&=~(1<<bit_n); break; \case PP_OUT: P2M0&=~(1<<bit_n); P2M1|= (1<<bit_n); break; \case Z_IN: P2M0|=(1<<bit_n); P2M1&=~(1<<bit_n); break; \case OD: P2M0|=(1<<bit_n); P2M1|=(1<<bit_n); break; \} \break;\case 3:\switch(mode) { \case STANDARD: P3M0&=~(1<<bit_n); P3M1&=~(1<<bit_n); break; \case PP_OUT: P3M0&=~(1<<bit_n); P3M1|= (1<<bit_n); break; \case Z_IN: P3M0|=(1<<bit_n); P3M1&=~(1<<bit_n); break; \case OD: P3M0|=(1<<bit_n); P3M1|=(1<<bit_n); break; \} \break;\}\}有了上面的宏定义,在初始化程序中可以直接这样写IO_Init(){IOMODE(PORT0,BIT7,PP_OUT)IOMODE(PORT0,BIT6, STANDARD)IOMODE(PORT0,BIT5, Z_IN)IOMODE(PORT0,BIT4, OD)IOMODE(PORT0,BIT3, STANDARD)IOMODE(PORT0,BIT2, STANDARD)IOMODE(PORT0,BIT1, STANDARD)IOMODE(PORT0,BIT0, STANDARD)}。

51单片机IO端口的四种输入输出模式知识讲解

51单片机IO端口的四种输入输出模式知识讲解

51单片机IO端口的四种输入输出模式知识讲解51单片机I O端口的四种输入输出模式51单片机IO端口的四种输入输出模式 (by wuleisly)单片机I O口的使用对所有单片机玩家来说都是“家常便饭”,但是你真的了解I O口吗?你真的能按你的需要配置I O口吗?一、准双向口输出准双向口输出类型可用作输出和输入功能而不需重新配置口线输出状态。

这是因为当口线输出为1时驱动能力很弱,允许外部装置将其拉低。

当引脚输出为低时,它的驱动能力很强,可吸收相当大的电流。

(准双向口有3个上拉晶体管适应不同的需要)准双向口读外部状态前,要先锁存为‘1’,才可读到外部正确的状态.二、强推挽输出推挽输出配置的下拉结构与开漏输出以及准双向口的下拉结构相同,但当锁存器为1时提供持续的强上拉。

推挽模式一般用于需要更大驱动电流的情况。

三、仅为输入(高阻)输入口带有一个施密特触发输入以及一个干扰抑制电路。

四、开漏输出配置(若外加上拉电阻,也可读)当口线锁存器为0时,开漏输出关闭所有上拉晶体管。

当作为一个逻辑输出时,这种配置方式必须有外部上拉,一般通过电阻外接到V cc。

如果外部有上拉电阻,开漏的I/O口还可读外部状态,即此时被配置为开漏模式的I/O口还可作为输入I/O口。

这种方式的下拉与准双向口相同。

开漏端口带有一个施密特触发输入以及一个干扰抑制电路。

关于I/O口应用注意事项:1.有些是I/O口由低变高读外部状态时,读不对,实际没有损坏,软件处理一下即可。

因为1T的8051单片机速度太快了,软件执行由低变高指令后立即读外部状态,此时由于实际输出还没有变高,就有可能读不对,正确的方法是在软件设置由低变高后加1到2个空操作指令延时,再读就对了.有些实际没有损坏,加上拉电阻就O K了有些是外围接的是NP N三极管,没有加上拉电阻,其实基极串多大电阻,I/O口就应该上拉多大的电阻,或者将该I/O口设置为强推挽输出.2.驱动L E D发光二极管没有加限流电阻,建议加1K以上的限流电阻,至少也要加470欧姆以上做行列矩阵按键扫描电路时,实际工作时没有加限流电阻,实际工作时可能出现2个I/O口均输出为低,并且在按键按下时,短接在一起,我们知道一个C MO S电路的2个输出脚不应该直接短接在一起,按键扫描电路中,此时一个口为了读另外一个口的状态,必须先置高才能读另外一个口的状态,而8051单?片机的弱上拉口在由0变为1时,会有2 时钟的强推挽高输出电流输出到另外一个输出为低的I/O口,就有可能造成I/O口损坏.建议在其中的一侧加1K限流电阻,或者在软件处理上,不要出现按键两端的I/O口同时为低.一种典型三极管控制电路:如果用弱上拉控制,建议加上拉电阻R1(3.3K~10K),如果不加上拉电阻R1(3.3K~10 K),建议R2的值在15K以上,或用强推挽输出。

很全的51单片机IO端口详解(带图)

很全的51单片机IO端口详解(带图)

80C51的I/O端口结构及应用特性一,I/O端口的结构1,锁存器加引脚的典型结构80C51的I/O端口都有内部总线实现操作控制。

P0-P3四个I/O 口都可以做普通I/O口,因此,要求具有输出锁存功能。

内部总线有事分时操作,因此每个I/O端口都有相应的锁存器。

然而I/O端口又是外部的输入/输出通道,必须有相应的引脚,故形成了I/O端口的锁存器加引脚的典型结构。

2,I/O口的复用功能(1)I/O口的总线复用。

80C51在使用并行总线扩展时,P0口可作为数据总线口和低8位地址总线口,这是,P0为三态双向口。

P0口输出总线的地址数据信号,P2口输出高8位地址信号。

(2)I/O口的功能复用。

I/O口的P3为功能复用的I/O端口。

端口有复用输出的控制端;引脚也有复用输入的控制端。

3,准双向结构P0,P1,P2,P3口做普通I/O口使用时,都是准双向口结构。

准双向口的典型结构见P1口位结构图。

准双向口的输入操作和输出操作本质不同,输入操作时读引脚状态;输出操作时对口锁存器的写入操作。

有口锁存器和引脚电路可知:当有内部总线对只1或只0时,锁存器的0、1状态立即反应到引脚上。

但是输入操作(读引脚)时,如果口锁存器的状态为0,引脚被嵌位在0状态,导致无法读出引脚的高电平输入。

二,I/O端口的应用特性1,引脚的自动识别。

无论P0,P2口的总线复用,还是P3口的功能复用,内部资源会自动选择,不需要通过指令的状态选择。

2,口锁存器的读、该、写操作。

许多涉及到I/O端口的操作,只是涉及口锁存器的读出、修改、写入的操作。

这些指令都是一些逻辑运算指令、置位/清除指令、条件转移指令以及将I/O口作为目的地址的操作指令。

3,读引脚的操作指令。

如果某个I/O口被指定为源操作数,则为读引脚的操作指令。

例如,执行MOV A,P1时,P1口的引脚状态传送到累加器中,执行MOV P1,A是,指令则将累加器的内容传送到P1口锁存器中。

4,准双向口的使用。

51单片机-IO口实验报告

51单片机-IO口实验报告

《信息技术综合实践》课程实验报告
1.打开KeiluVision2应用程序,新建一个工程,将IO.c文件添加到新建的工程中(将头文件中的头文件中的regx修改为reg),在输出中选择生成相应的HEX文件并保存到相应文件夹中
2.打开KeiluVision2应用程序,新建一个工程,将IO.c文件添加到新建的工程中(将头文件中的头文件中的regx修改为reg),在输出中选择生成相应的HEX文件并保存到相应文件夹中,进行文件的编译和调试。

3.进行实验箱的连线。

4.打开下载器,擦除并将生成的HEX文件调入Flash,然后选择“自动”。

5.通过示波器观察实验现象
5.1 示波器波形图
5.1.1(i的范围是小于500,波形图如下所示)
由图可知:当不修改i的范围时,波形的频率比较高,约在150Hz左右。

5.1.2(将代码中i的范围修改为小于20000,波形图如下所示)
由图可知:将i的范围变大以后,波形的频率变低并且稳定在5Hz左右。

5.2 小灯闪烁视频
(灯亮时的图片)。

51单片机实战指南-51单片机IO口简单应用

51单片机实战指南-51单片机IO口简单应用

2.2 闪烁灯的制作
在日常生活中,有各种各样的闪烁灯,有的应用于娱乐场 所,有的应用于店面等的装饰,有的起警示作用。如舞台 灯、汽车转向灯、十字路口的黄闪灯等。
在单片机控制系统中,通过I/O口进行开关量的控制占用较 大的比重,如LED发光二极管的亮灭、电动机的启停等控 制都属于单片机的开关量输出控制。
2.1 单片机最小应用系统
单片机最小系统是指维持单片机正常工作所必需的电路连接。
对于51单片机,将时钟电路(晶振电路)和复位电路接入即可 构成单片机最小应用系统,该系统接+5V电源,配以相应的程 序就能够独立工作,完成一定的功能。
2.1 单片机最小应用系统
图2-1 单片机最小应用系统
2.1 单片机最小应用系统
2.2.1 硬件电路设计
图2-2 发光二极管控制电路
2.2.2 单片机C语言编程的基本方法
#include <reg52.h> //52系列单片机头文件
sbit A0=P1^5; //将P1.5定义为74HC138的A0引脚
sbit A1=P1^6; //将P1.6定义为74HC138的A1引脚
//主程序main函数
{
while(1)
//主程序中设置死循环程序,保证周而复始运行
{
A2=A1=A0=0;
P0=0xff; //全灭。此语句可省略,因复位后P0即为0xff
Led10=0;
//点亮LED 10
Led10=1;
//熄灭LED 10
实际运行这个程序发
}
现二极管一直在亮
}
2.2.3 程序设计
//将P1.7定义为74HC138的A2引脚
int main(void)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DANPAINJI
51单片机I/O口使用经验
字体大小: 小中大作者:来源:日期:2006-08-18 点击:364
按常规,在51端口(P1、P2、P3)某位用作输入时,必须先向对应的锁存器写入1,使FET 截止。

一般情况是这样,也有例外。

所谓IO口内部与电源相连的上拉电阻而非一常规线性电阻,实质上,该电阻是由两个场效应管并联在一起:一个FET为负载管,其阻值固定;另一个FET可工作在导通或截止两种状态(姑且叫可变FET)。

使其总电阻值变化近似为0或阻值较大(20千欧--40千欧)两种情况。

当和端口锁存器相连的FET由导通至截止时,该阻值近似为0,可将引脚快速上拉至高电平;当和锁存器相连的FET由截止至导通时,该电阻呈现较大阻值,限制了和端口锁存器相连的FET的导通电流。

51I/O口作为输入端和外部信号相连有时必须考虑上述特性,本人在设计LTP1245热敏打印头驱动板时,资料上推介热敏头“抬头”和“纸尽”信号由头中内嵌检测电路提供,MCU IO口采集该信号时需加缓冲(如74HC04)。

当时本人认为51IO口上拉电阻为一较大阻值的固定电阻,对输入信号无影响,故未加缓冲电路(为降低成本能省则省)。

可到调试PCBA时发现,“抬头”、“纸尽”状态变化时,采集信号只在3.90V--5.10V之间变化,应为低电平时无低电平输出。

究其原因,打印头的“抬头”、“缺纸”信号输出为一光敏三极管的集电极输出,集电极和电源间原有一个负载电阻,饱和导通设计工作电流仅为450--1100微安,当该集电极直接和MCU IO口某位相连时,IO口上拉电阻和光敏三极管负载电阻并联,当IO口上拉时,上拉电阻极小致使光敏三极管直流负载线斜率陡然增大,工作状态进入放大区而非希望的饱和区。

当时在不改硬件的条件下,我几乎无计可施,甚至想到了准备烧断IO口上拉电阻(前两天我曾发帖求救怎么烧断IO口上拉电阻的方法)后来听网友建议该方法风险较大,所以总想用软件方法解决。

后来我的解决方法是:采样信号前不是先向对应锁存器写1,而是先写入0,再写入1,延时约10毫秒以上,然后再采样(当然此法只适应于采样频率很低的情况)。

这样作的目的是:先写入0迫使IO口上拉电阻先为一较大值,此时如果外部光敏三极管本来处于截止状态,当完成上述一系列锁存器的写入过程后光敏管仍为截止态,IO口正确采样到高电平;此时如果外部光敏三极管基极电流足够大有容许三极管饱和导通的条件(即基极吸收到充分光强),虽然采样一开始集电极被人为钳位在低电平,但当下一时隙和IO口相连的锁存器被写入1时,在IO口上拉电阻中的可变FET导通之前,光敏三极管已先进入饱和态而又把引脚钳位在实际输出的低电平,此时MCU IO口的上拉电阻仍为较大阻值,同时和原光敏三极管集电极负载电阻并联(考虑并联后阻值变化,原光敏三极管集电极负载电阻需增大到适当阻值)充当饱和导通后光敏三极管的负载电阻,事实上,IO口上拉电阻中的可变FET未来得及导通又被截止了,由此又保证了信号低电平的正确采样。

经过波形测试问题得。

相关文档
最新文档