#IO端口内部结构
8051单片机:有1个8位双向并行I/O口P0,3个准双向并行I/O口P1~P3。
每个端口都是由锁存器、输出驱动器、输入缓冲器组成。
P0端口内部结构
P0端口详解:VCC处高电平,下方接地低电平。VCC下方两个为场效应管,场效应管左侧为高电平时,右侧能由上而下导通。作为输入(读取数据),P0.n(其中n为0-7)引脚到读引脚可以读数据。作为输出:输出可以通过地址总线送入P0端口的某个寄存器,送入之后,锁存器就把数据锁存起来,然后控制Q非端输出一个相应的数据。比如P0端口有8个引脚,往P0.7这个引脚的寄存器送入一个0,那么Q会输出一个0,Q非会输出一个1,通过MUX,会导通场效应管,接通到地(低电平),继而导致P0.7引脚输出一个低电平0。说白了就是往P0.7寄存器送一个0,P0.7引脚就回输出一个低电平。
P1端口内部结构
P1端口详解:P1端口有个上拉电阻。作为输出,当通过内部地址总线给P1.5寄存器送入一个1,则锁存器锁住这个值,Q会输出一个1,Q非会输出一个0,此时场效应管截止,P1.5引脚会输出一个高电平1(大概5V,弱上拉)。作为输入(读取),也是通过P1.n引脚到读引脚这条线。
#IO口使用注意事项
1、P0口做普通I/0
P0口作为普通I/O使用时,由于P0口是开漏结构,作为输出时必须外加上拉电阻,否则无法输出高电平,上拉电阻阻值一般在5~10K之间。
如何正确的理解漏极开路输出跟推挽输出?
GPIO输入输出各种模式(推挽、开漏、准双向端口)详解
2、IO口的驱动特性
P0口每一根I/O口线均可以驱动8个TTL负载,P1、P2、P3口可以驱动4个TTL负载。当负载过多超过限定时,必须在口线上增加驱动器,否则会造成端口工作不稳定。
驱动8个TTL是什么意思?
#汇编程序格式
1、一段代码
ORG 0000H ;伪指令,指定一下汇编程序存放在代码段的起始地址
Start: MOV R0,#30H ;R0=30H
MOV A,#10H ;A=10H
ADD A,R0 ;A=A+R0,计算30H+10H的结果
JMP Start ;程序跳转到Start标号处
END ;伪指令,程序结束标志
整个程序以ORG伪指令开头,END伪指令作为程序结束标志,中间放置各种标号和汇编指令,他们一起组成了汇编语言程序。
#常用的伪指令
1、ORG
本指令的功能是对汇编程序段起始地址进行定位,用来规定汇编程序汇编时,目标程序在程序存储器中存放的起始地址。
2、END
该指令的功能是通知汇编程序结束汇编。这条指令放在程序的末尾,表示程序已结束。
3、EQU
EQU将一个数或特定的汇编符号赋予规定的字符名称。在其他的书中也称之为赋值伪指令。
4、DB、DW、DS
① DB:从指定的地址单元开始,定义若干个8位内存单元;
② DW:从指定的地址单元开始,定义若干个16位内存单元;
③ DS:从指定的地址开始,保留若干字节内存空间备用。
实现代码
ORG 0000H
start: MOV A,#0FFH ;关闭LED灯
MOV P1,A
;延时
MOV R1,#200
DL1: MOV R2,#200
DL2: DJNZ R2,DL2
DJNZ R1,DL1
MOV A, #00H ;开启LED灯
MOV P1,A
;延时
MOV R1,#200
DL3: MOV R2,#200
DL4: DJNZ R2,DL4
DJNZ R1,DL3
JMP start
END
#电路仿真软件 Proteus
常用器件
常用仪表
#流水灯实验
******************************************************************/
* 【课程5】 ****单片机I/O端口的应用***********
* 【说 明】 ****通过本例程了解单片机基本输入输出端口的应用控制
* 【描 述】
******************************************************************/
ORG 0000H ;定义程序地址从0000H开始
MAIN: MOV DPTR,#TAB ;将数据块的首地址#TAB送给DPTR寄存器
CLR A
MOV R1,#14
L1: MOVC A,@A+DPTR ;从数据块中取数据给累加器A
MOV P1,A ;将数据传给P1端口
INC DPTR ;DPTR加1,指向下一个数据
CLR A ;对A累加器清零
MOV R1,#0FFH ;本条语句与下面3条语句一起,完成软件延时功能
W1: MOV R2,#0EFH
W2: DJNZ R2,W2
DJNZ R1,W1
DJNZ R1,L1
JMP MAIN
ORG 0040H ;定义下面存储地址从0040H开始
TAB: DB 01H,02H,04H,08H,10H,20H,40H,80H,7EH
END
#模拟交通灯
******************************************************************/
* 【课程5】 ****单片机I/O端口的应用***********
* 【说 明】 ****通过本例程了解单片机基本输入输出端口的应用控制
* 【描 述】 ****LED模拟交通灯
******************************************************************/
//上下的灯为A0(红)、A1(绿)、A2(黄)(各一对),左右的灯为A3(红)、A4(绿)、A5(黄)(各一对)
//ledns_re、ledns_ge、ledns_ye分别对应P1.0、P1.1、P1.2,控制着上下方六个灯。
//ledws_re、ledws_ge、ledws_ye分别对应P1.3、P1.4、P1.5,控制着左右方六个灯。
#include<reg51.h> //51头文件,
//---------常用的两个宏定义--------------
#define uint8 unsigned char
#define uint16 unsigned int
//---------位定义----------------------
//sbit是定义特殊功能寄存器的位变量。bit和sbit都是C51扩展的变量类型;
//bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。
sbit ledns_re=P1^0; //即定义ledns_re为P1口的第1位,以便进行位操作(下同),后面对变量的操作即是对相应位的操作。
sbit ledns_ge=P1^1;
sbit ledns_ye=P1^2;
sbit ledwe_re=P1^3;
sbit ledwe_ge=P1^4;
sbit ledwe_ye=P1^5;
/********************************************************
** 名称 :void DelayMS(uint16 dly)
** 功能 :毫秒级延时(24M的晶振)
** 入口参数 :dly 用户的延时参数
** 出口参数 :无
*********************************************************/
void DelayMS(uint16 dly)
{
uint16 x,y;
for(x=dly;x>0;x--)
for(y=247;y>0;y--);
// for(y=124;y>0;y--); //12M
}
void main()
{
uint16 i;
while(1)
{
ledns_re=0;
ledwe_ge=0;
ledns_ye=1;
ledwe_ye=1;
for(i=0;i<50;i++)
{
DelayMS(50);
}
ledns_ye=0;
ledwe_ye=0;
ledns_re=1;
ledwe_ge=1;
for(i=0;i<10;i++)
{
DelayMS(50);
}
ledns_ge=0;
ledwe_re=0;
ledns_ye=1;
ledwe_ye=1;
for(i=0;i<30;i++)
{
DelayMS(50);
}
ledns_ye=0;
ledwe_ye=0;
ledns_ge=1;
ledwe_re=1;
for(i=0;i<10;i++)
{
DelayMS(50);
}
}
}