肆:IO端口的输出应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17017545/article/details/80870092

#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);
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_17017545/article/details/80870092