找回密码
 立即注册
楼主: udeigkon

ai8051u学习贴-Eric_tseng

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-01-29 22:42:29
已绑定手机

1

主题

9

回帖

49

积分

新手上路

积分
49
发表于 2025-1-25 23:01:10 | 显示全部楼层

第六集-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,等同于高祖输入;打开内部上拉电阻或者外部加上拉电阻,等同于准双向口

image.png

image.png

按键输入检测

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松开
        }
    }

消除抖动

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

image.png

image.png

特别强调的是,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速度

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-19 04:34 , Processed in 0.133175 second(s), 48 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表