一、要求
1、单片机P1.0和P1.1引脚分别接开关S0和S1。
2、单片机P2.0~P2.3引脚接LED0~LED3。
3、当S0,S1均闭合时,LED0亮,其余灭;S0打开,S1闭合,LED1亮,其余灭;S0闭合,S1打开,LED2亮,其余灭;S0,S1均打开时,LED3亮,其余灭。
二、代码部分
#include<reg51.h> // 包含8051单片机的寄存器定义头文件
void main() // 主函数,程序入口点
{
char state; // 声明一个字符型变量state,用于存储P1端口的状态
do // 进入无限循环
{
P1 = 0xff; // 将P1端口的所有引脚设置为输入模式(逻辑高电平)
state = P1; // 读取P1端口的当前状态并存储到state变量中
state = state & 0x03; // 只保留state变量的最低两位(即只关心P1.0和P1.1的状态)
switch(state) // 根据state变量的值进行分支判断
{
case 0: // 如果state为0(即P1.0和P1.1都为低电平)
P2 =~ 0x01; // 将P2.0引脚设置为相反的状态(原来是高电平则变为低电平,反之亦然)
break;
case 1: // 如果state为1(即只有P1.0为高电平)
P2 =~ 0x02; // 将P2.1引脚设置为相反的状态
break;
case 2: // 如果state为2(即只有P1.1为高电平)
P2 =~ 0x04; // 将P2.2引脚设置为相反的状态
break;
case 3: // 如果state为3(即P1.0和P1.1都为高电平)
P2 =~ 0x08; // 将P2.3引脚设置为相反的状态
break;
}
}
while(1); // 无限循环,程序持续执行上述操作
}
三、硬件仿真
(1)原理图
(2)仿真结果
(1)当S0,S1均闭合时:
(2)S0打开,S1闭合:
(3)S0闭合,S1打开
(4)S0,S1均打开时:
四、思考题
1、读取P1口状态之前为什么要向P1口写0xff?
答:在单片机编程中,通常需要先将某个端口的所有引脚都拉到一个确定的电平状态,然后再去读取这个端口的输入状态。这样做的目的是为了确保在读取输入状态时,所有的输入都是稳定的。在本次实验中,通过将P1口的所有引脚都拉到高电平,可以确保在读取P1口的输入状态时,所有的输入都是高电平,从而避免由于输入不稳定导致的读数错误。
2、C51程序中为什么要包含头文件reg51.h?
答:在C51编程中,<reg51.h>是一个包含了许多特殊功能寄存器的头文件。这些寄存器是8051单片机的一部分,它们用于存储特定的控制信息和状态信息。由于这些寄存器在大多数51单片机程序中都会用到,因此将它们的定义放在一个单独的头文件中,可以方便程序员在编写程序时直接引用,从而提高编程效率。