一、实验目的
- 熟悉Keil uVision5和Proteus集成开发软件的工作环境和使用方法;
- 掌握通用I/O口基本工作原理;
- 掌握通用I/O接口电路设计方法;
- 熟练运用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();
}
}
}