实验原理
P1口为准双向口,P1口的每一位都能独立地定义为输入位或输出位。作为输入位时,必须向锁存器相应位写入“1”,该位才能作为输入。MCS-51单片机中所有口锁存器在复位时均置为“1”,如果在IO口锁存器写过“0”,在需要输入时应写入一个“1”,使它成为一个输入。MCS-51单片机的4个I/O端口中,P1、P2、P3口各引脚内部均有上拉电阻,唯独P0口没有上拉电阻,因此P0口在做通用IO口使用时,P0口外部要加上拉电阻,而P1、P2、P3口每个引脚可以直接加开关接地。
实验内容
-
流水灯实验:P1口做输出口,接八只发光二极管,编写程序,使发光二极管以流水灯形式循环点亮。
-
I/O口输入输出实验:P0口做输入口,接八个按纽开关;P1口做输出口,接八只发光二极管。编写程序读取8个开关状态,分别在八只发光二极管上显示出来。
-
开关控制流水灯方向
实验1
流水灯实验:P1口做输出口,接八只发光二极管,编写程序,使发光二极管以流水灯形式循环点亮。
使用Proteus搭建电路如下图:
单片机程序如下
#include <reg52.h>
void delays(void);
void main()
{
while(1)
{
P1 = 0xff;
delays();
P1 = 0x7f;
delays();
P1 = 0x3f;
delays();
P1 = 0x1f;
delays();
P1 = 0x0f;
delays();
P1 = 0x07;
delays();
P1 = 0x03;
delays();
P1=0x01;
delays();
P1 = 0x00;
delays();
}
}
void delays()
{
int i,j;
for(i = 0; i<100;++i)
for(j = 0; j<1000;++j) ;
}
将程序编译入Proteus模拟电路中
运行程序,流水灯依次点亮,实验成功。
实验二
I/O口输入输出实验:P0口做输入口,接八个按纽开关;P1口做输出口,接八只发光二极管。编写程序读取8个开关状态,分别在八只发光二极管上显示出来。
电路图如图
程序如下
#include <reg52.h>
void main()
{
P0=0xff;
while(1)
{
P1=P0;
}
}
将程序编译入Proteus电路,运行程序,右侧开关打开时,左侧对应灯亮,试验成功。
实验三
设计思路如下
电路图如下
程序如下
#include <reg52.h>
void delays(void) ;
sbit a1=P2^0;
void main()
{
while(1)
{
if(a1==0)
{
P1 = 0xff;
delays();
P1 = 0x7f;
delays();
P1 = 0x3f;
delays();
P1 = 0x1f;
delays();
P1 = 0x0f;
delays();
P1 = 0x07;
delays();
P1 = 0x03;
delays();
P1=0x01;
delays();
P1 = 0x00;
delays();
}
else
{
P1 = 0xff;
delays();
P1 = 0xfe;
delays();
P1 = 0xfc;
delays();
P1 = 0xf8;
delays();
P1 = 0xf0;
delays();
P1 = 0xe0;
delays();
P1 = 0xc0;
delays();
P1=0x80;
delays();
P1 = 0x00;
delays();
}
}
}
void delays()
{
int i,j;
for(i = 0; i<100;++i)
for(j = 0; j<1000;++j) ;
}
运行程序,开关打开时,左侧流水灯自上而下亮起,开关闭合是,流水灯自下而上亮起。实验成功。