第六集-IO输入输出
GPIO-通用输入输出端口,就是引脚
高电平-接近VCC电压-逻辑1
低电平-GND电压-逻辑0
对地电压-VDD-单片机极限值
IO口工作模式有四种:
PNM1 |
PNM0 |
IO工作模式 |
0 |
0 |
①准双向口(传统8051是弱上拉),灌电流就是从VCC取电,经过1K电阻驱动发光二极管。如果从IO口拉电流,就只有几百微安 |
0 |
1 |
②推挽输出,强上拉输出可到20MA |
1 |
0 |
③高祖输入,相当于断路,电流不能流入也不能流出 |
1 |
1 |
④开漏模式,对外设置输出1,等同于高祖输入;打开内部上拉电阻或者外部加上拉电阻,等同于准双向口 |


按键输入检测
IO(默认高电平)--------R-------BOTTOM------GND
按下按钮后,IO直接和GND连通,GND就是大地,所以按下之后IO变成了低电平
课堂任务(可以很便捷的删除注释,不要再一个个删了哎哟喂
#include<ai8051u.h>
// 定义P32和P20端口
sbit P32 = P3^2; // 假设P32按钮连接在P3.2
sbit P20 = P2^0; // 假设P20灯连接在P2.0
// 定义状态变量
unsigned char state = 0;
// 延时函数,延时20ms
void Delay20ms() {
unsigned int i, j;
for(i = 0; i < 200; i++) {
for(j = 0; j < 123; j++);
}
}
void main() {
while(1) {
// 任务1:按下P32按钮灯亮,松开P32按钮灯灭
if(P32 == 0) { // 判断P32按钮是否按下
P20 = 0; // 按下时灯亮
} else {
P20 = 1; // 松开时灯灭
}
// 任务2:按下P32按钮灯灭,松开P32按钮灯亮
if(P32 == 1) { // 判断P32按钮是否按下
P20 = 0; // 按下时灯灭
} else {
P20 = 1; // 松开时灯亮
}
// 任务3:按一下灯亮,按一下灯灭
if(P32 == 0) { // 判断P32按钮是否按下
Delay20ms(); // 延时20ms消抖
if(P32 == 0) {
state = !state; // 变量取反 0 1 0 1 0 1
P20 = state;
printf("state:%d\r\n", (int)state);
while(P32 == 0); // 等待P32松开
}
}
消除抖动

系统有判断阈值,抖动一般在20ms以内。因此这也是调参的一部分
但是贴心的isp也帮我们准备了便捷的延时生成器


特别强调的是,void要有延时,后面的注释也要加上delay延时,也要有分号
就是我们C语言课上面的主函数和其他的小函数,函数的调用那一章节
void Delay20ms(void) //@24.000MHz Delay20ms();
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
WTST = 0; //设置程序指令延时参数,
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度