实验内容
此次实验为利用单片机读取开关的状态从而控制LED的亮灭。
实验环境
- 仿真软件
Protue 8.9 sp2 - IDE
Keil5 C51 - 单片机
AT89C51
Protues仿真图
所用器件
- VCC
- VDD
- LED红灯
- 开关
- 排阻(后面用到)
仿真图介绍
LED1的一端接VCC,一端接P0.0
开关的一端接VDD,一端接P0.1
Keil工程
项目结构
代码
#include <REG52.H>
//用P0.0控制LED1
sbit led1 = P0 ^ 0;
//用P0.1获取开关状态
sbit sw= P0 ^ 1;
int main(void)
{
//关闭LED1
led1=1;
//将开关的控制口P0.1拉高以备输入
sw=1;
while (1)
{
//获得开关的状态并控制LED1的相应亮灭
led1=sw;
}
}
结果
从上图可以看出并没有达到我们想要的效果,这是为什么呢?请看下面
问题的提出
问题描述
我们程序写的并没有错误,而仿真接法也无误,可是为什么LED1是一直亮着的呢?
问题解决
于是我百度了一下AT89C51这款单片机,发现他是这样描述P0 ~ P4 IO的
P0口
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0
口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
是的,P0口为一个8位漏级开路双向I/O口
什么又是漏级开路双向I/O口?
漏极开路型指的是漏极没有接上拉电阻也没与电源正级相连,我们还是看一个通俗易懂的图吧,如下所示
一看发现这样输入不始终为0了,即接在VDD上,于是我们手动给它加上不就行了呗
更新后的仿真电路
将P0接一个上拉电阻