基于Proteus仿真51单片机基本输入输出端口实验

一、实验目的

  1. 熟悉Keil uVision5Proteus集成开发软件的工作环境和使用方法;
  2. 掌握通用I/O口基本工作原理;
  3. 掌握通用I/O接口电路设计方法;
  4. 熟练运用C语言或汇编语言对I/O端口进行操作;

二、实验任务

1.基本任务

单片机P0口作输出口,驱动8个发光二极管,P1口作输入口,接两个按键,要求按下键1,8个发光二极管轮流点亮(每次只有一个灯亮),循环3次后退出;按下键2,8个发光二极管同时闪烁3次(亮灭各3次)后退出。请在Proteus中画出电路原理图,并编写程序仿真实现上述功能。

2.拓展任务(若未做,则实验报告也无需体现,以保证实验视频和实验报告的一致性!)

修改延时时间,观察LED灯的闪烁状态改变。

修改程序,改变8只发光二极管的闪烁方式,按你自己设定的方式进行变化,可是多种方式的组合。

  • 实验说明

P1口是准双向口。它作为输出口时与一般的双向口使用方法相同。由准双向口结构可知当P1口用为输入口时,必须先对它置“1”。若不先对它置“1”,读入的数据是不正确的。

//基本任务
#include "stc15.h"  //单片机头文件
#include "intrins.h" //延时函数 左右移函数头文件
sbit k1=P1^0;  //定义按键1
sbit k2=P1^1;  //定义按键2
void Delay500ms()		//@11.0592MHz 500ms延时函数
{
	unsigned char i, j, k;
	_nop_();
	_nop_();
	i = 22;
	j = 3;
	k = 227;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void main() //主函数
{
unsigned char i;  //定义字符i
  P0M1=0x00;P0M0=0x00;P1M1=0x00;P1M0=0x00;  //配置P0/P1端口为准双向口
	k1=1;k2=1;  //对P1两个输入口 置1
	while(1)
 {
	if(k1==0)  //开关低电平触发,判断k1是否按下
	{
		for(i=0;i<24;i++)  //1次循环共右移8下,3次循环共24下
		{
			P0=_cror_(0x7F,i);  //右移函数 初值0x7F低电平有效 从P0^7右移
	    Delay500ms();
	    P0=0xFF;  //右移函数循环结束后 P0端全为高电平 所有灯灭
		}
	}
	if(k2==0)  //开关低电平触发,判断k2是否按下
	{
		for(i=0;i<3;i++)  //3次循环 1次循环为1次所有灯的亮灭
		{
		P0=0x00;  //低电平有效P0端所有灯亮
		Delay500ms();
		P0=0xFF;  //高电平无效效P0端所有灯灭
		Delay500ms();
		}
	}
 }
}
//拓展任务
#include "stc15.h"  //单片机头文件
#include "intrins.h" //延时函数 左右移函数头文件
sbit k1=P1^0;  //定义按键1
sbit k2=P1^1;  //定义按键2
void Delay1000ms()		//@11.0592MHz  1000ms延时函数
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 43;
	j = 6;
	k = 203;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main() //主函数
{
unsigned char i;  //定义字符i
  P0M1=0x00;P0M0=0x00;P1M1=0x00;P1M0=0x00;  //配置P0/P1端口
	k1=1;k2=1;  //对P1两个输入口 置1
	if(k1==0)  //开关低电平触发,判断k1是否按下
	{
		for(i=0;i<24;i++)  //1次循环共右移8下,3次循环共24下
		{
			P0=_crol_(0xFE,i);  //左移函数 初值0x7F低电平有效 从P0^0左移
	    Delay1000ms();
	    P0=0xFF;  //左移函数循环结束后 P0端全为高电平 所有灯灭
		}
	}
	if(k2==0)  //开关低电平触发,判断k2是否按下
	{
		for(i=0;i<3;i++)  //3次循环 1次循环为1次所有灯的亮灭
		{
		P0=0x00;  //低电平有效P0端所有灯亮
		Delay1000ms();
		P0=0xFF;  //高电平无效效P0端所有灯灭
		Delay1000ms();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/u010356933/article/details/106931378