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

ai8051U--学习记录

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-09-30 05:52:11
已绑定手机

1

主题

16

回帖

217

积分

中级会员

积分
217
发表于 2025-8-23 21:48:06 | 显示全部楼层

ai8051U--虚拟键盘LED和数码管--打卡8

灵活调用各各接口进行使用。

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-09-30 05:52:11
已绑定手机

1

主题

16

回帖

217

积分

中级会员

积分
217
发表于 2025-9-2 08:49:36 | 显示全部楼层

ai8051U矩阵按键--打卡9

矩阵按键原理

行端口列端口。当行端口为高电平时,列端口为低电平,按键按下会将按下行的高电平改为低电平,确认按键所在行;当行端口为低电平时,列端口为高电平,按键会将按下的列的高电平改为低电平,确认按键所在列。行号和列号确认即可找到对应的按键。
缺点只能有一个按键按下,检测一个按钮被按下。不支持多按键按下。

图片.png

图片.png

按键内容

第一种写法:顺序操作判断每个端口

// 键号
unsigned char keyNum = 0xFF;
// 行号
#define ROW1 端口号(例如P00)
#define ROW2
// 列号
#define COLUMN1 端口号(例如P05)
#define COLUMN2
#define COLUMN3
#define COLUMN4
void matrixButtons(){
// 1.先确认行号,行端口:高电平,列端口:低电平,行端口判断低电平
COLUMN1 = 0;
COLUMN2 = 0;
COLUMN3 = 0;
COLUMN4 = 0;
ROW1= 1;
ROW2= 1;

if((ROW1 == 0) || (ROW2 == 0)){
    if(ROW1 == 0) && (ROW2 ==0)){
      ROW1 = 1;
      ROW2 = 1;
      keyNum = 0;
      printf_usb(" 非法操作,有多个按键被按下 \r\n");
    }else if((ROW1 == 0) &&(ROW2 == 1)) || ((ROW1 == 1) &&(ROW2 == 0)){
        // 2.确认列号,行端口:低电平,列端口:高电平,列端口判断低电平
        COLUMN1 = 1;
        COLUMN2 = 1;
        COLUMN3 = 1;
        COLUMN4 = 1;
        ROW1= 0;
        ROW2= 0;
        if(ROW1 == 0){
            // 行按键起始号
            keyNum = 1;
            if((COLUMN1 == 0) && (COLUMN2 == 1) && (COLUMN3 == 1) && (COLUMN4 == 1){
               keyNum = keyNum + 1;
              printf_usb(" 按键位置:第1行第1列 \r\n");
            }else if(COLUMN1 == 1) && (COLUMN2 == 0) && (COLUMN3 == 1) && (COLUMN4 == 1){
               keyNum = keyNum + 2;
               printf_usb(" 按键位置:第1行第2列 \r\n");
            }else if(COLUMN1 == 1) && (COLUMN2 == 1) && (COLUMN3 == 0) && (COLUMN4 == 1){
               keyNum = keyNum + 3;
              printf_usb(" 按键位置:第1行第3列 \r\n");
            }else if(COLUMN1 == 1) && (COLUMN2 == 1) && (COLUMN3 == 1) && (COLUMN4 == 0){
               keyNum = keyNum + 4;
              printf_usb(" 按键位置:第1行第4列 \r\n");
            }
        }else if(ROW2 == 0){
            // 行按键起始号
            keyNum = 4;
            if((COLUMN1 == 0) && (COLUMN2 == 1) && (COLUMN3 == 1) && (COLUMN4 == 1){
               keyNum = keyNum + 1;
              printf_usb(" 按键位置:第2行第1列 \r\n");
            }else if(COLUMN1 == 1) && (COLUMN2 == 0) && (COLUMN3 == 1) && (COLUMN4 == 1){
               keyNum = keyNum + 2;
               printf_usb(" 按键位置:第2行第2列 \r\n");
            }else if(COLUMN1 == 1) && (COLUMN2 == 1) && (COLUMN3 == 0) && (COLUMN4 == 1){
               keyNum = keyNum + 3;
              printf_usb(" 按键位置:第2行第3列 \r\n");
            }else if(COLUMN1 == 1) && (COLUMN2 == 1) && (COLUMN3 == 1) && (COLUMN4 == 0){
               keyNum = keyNum + 4;
              printf_usb(" 按键位置:第2行第4列 \r\n");
            }
        }

        // 3.恢复初始值,过滤闪烁问题,行端口:高电平,列端口:低电平
        COLUMN1 = 0;
        COLUMN2 = 0;
        COLUMN3 = 0;
        COLUMN4 = 0;
        ROW1= 1;
        ROW2= 1;
  
    }else if((ROW1 == 1) && (ROW2 == 1)){
         // 清空键值
        keyNum = 0xFF;
    }

}



}

第二种写法:使用十六进制数表示端口,端口组合模式判断匹配
低位:行,高位:列

例如第一行第一列
0x0F = 0000 1111
ROW = P1 & 0x0F = 0000 1110 & 0000 1111 = 0000 1110
0xF0 = 1111 0000
COLUMN = P1 & 0xF0 = 1110 0000 & 1111 0000 = 1110 0000
ROW + COLUMN = 0000 1110 + 1110 0000 = 1110 1110 = 0xEE
所以第一行第一列的按键可以用0xEE来指向。

按位与(&):只有两个数的二进制同时为1,结果才为1,否则为0。(负数按补码形式参加按位与运算)
按位或(|):参加运算的两个数只要两个数中的一个为1,结果就为1。
按位异或(^):参加运算的两个数,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
即 0 ^ 0=0 , 0 ^ 1= 1 , 1 ^ 0= 1 , 1 ^ 1= 0 。

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-09-30 05:52:11
已绑定手机

1

主题

16

回帖

217

积分

中级会员

积分
217
发表于 2025-9-3 17:57:40 | 显示全部楼层

ai8051U复位系统--打卡10

系统复位

系统复位类型:硬复位软复位

0511F216-D5D7-414F-A8BE-A5D03D30EE2F.png

硬复位

  • 硬复位

    • 上电复位
    • DB5997D8-7BA0-403F-8DFC-F202D6D8FD6E.png
    • 低压复位
    • 408A825C-0182-42A5-8869-95D6595825B9.png
    • 复位脚复位(低电平复位)
    • BD0FDCE5-37A1-4416-B758-D82D95E846B2.png
    • 看门狗复位
    • FFC9300A-CA31-4EEF-ADAA-6D85FBA752D2.png

软复位

2C2B9877-9352-4164-B544-96F7FC9EB113.png
程序有USB功能需要先在前面加USB复位

IAP_CONTR = 0x60;进入下载模式:点击按键实现下载准备,然后将程序下载进入。

IAP_CONTR = 0x20;从头开始运行用户程序,只有程序实现了上电起始的状态。

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-09-30 05:52:11
已绑定手机

1

主题

16

回帖

217

积分

中级会员

积分
217
发表于 2025-9-7 09:09:57 | 显示全部楼层

ai8051U外部中断--打卡11

外部中断:主程序事件运行中,有一紧急事件需要立即去执行处理,此时中断主程序去执行紧急事件,当紧急事件完成后,再继续执行主程序事件。

00222F8C-23FA-4CBE-8CC6-D36ED6F50753.png

中断系统

73ABBCED-76C8-4412-8F46-930F9F3D03CA.png

中断级别:数值越小,中断等级越高优先执行。0高

DC5A5D3D-87DD-4015-9AB4-003492B3ACC9.png

外部中断

由外部硬件或其他因素,使单片机引脚发生电平变化,观测变化去执行中断程序。

引脚有INTx标识可以作为外部中断口。

不同编号引脚支持不同类型中断(上升沿,下降沿)。

E043337E-B505-4293-8634-9C1621645AC9.png

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-09-30 05:52:11
已绑定手机

1

主题

16

回帖

217

积分

中级会员

积分
217
发表于 2025-9-7 11:05:38 | 显示全部楼层

ai8051U--IO中断--打卡12

IO中断介绍

IO中断和外部中断的区别

  1. IO中断仅支持一种中断模式(上升沿,下降沿),可以用两个IO端口实现双边沿检测;
  2. IO中断可以配置上升沿,下降沿,高电平,低电平;
  3. 所有IO口都可以开启或关闭IO中断;
  4. 外部中断支持上升沿/下降沿中断,上升下降沿中断,外部中断只有特定的引脚可以进行中断。

66EB5750-BD45-4E6A-81F8-35B761588C97.png

IO中断使用

  1. 端口中断配置
    BD67624C-A820-4775-B8E2-806C12CBCF8F.png
  2. 端口中断使能
    F428F201-88D1-4833-B210-359B9B3D2E62.png
  3. 中断号处理
    2DB76FC6-BCD4-4CCB-8C08-D174C2B6164B.png
    需要安装中断号支持插件

中断优先级配置

1126A298-493B-4299-BB33-8DA31BA6FC6E.png

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-09-30 05:52:11
已绑定手机

1

主题

16

回帖

217

积分

中级会员

积分
217
发表于 2025-9-7 15:10:27 | 显示全部楼层

ai8051U--定时器做计数器--打卡13

计数器

23968CD9-FD32-43B5-AAA7-58BA06105655.png

FD422F04-5292-4691-800B-96E3837F1664.png

AAD526B4-2D53-4A97-8655-3AC2507BF2BA.png

// 设置为计数器--外部计数
T1_CT = 1;
// 计数器工作模式--16位自动重载
T1_M1 = 0;
T1_M0 = 0;
// 控制计数器1--值为1,打开
T1_GATE = 1;

TH1
TL1

// 打开总中断
EA = 1;
// 打开定时器1中断允许
ET1 = 1;
// 打开定时器
TR1 = 1;

定时器1测量INT1引脚低电平脉冲宽度,常见案例就是按键按下到按键抬起的时间。

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-09-30 05:52:11
已绑定手机

1

主题

16

回帖

217

积分

中级会员

积分
217
发表于 2025-9-7 16:47:47 | 显示全部楼层

ai8051U--DS18B20测温--打卡14

DS18B20温度传感器简介

6AE7A871-E343-4E98-8414-5FFC6B299D23.png

DS18B20硬件连接

8AEEA194-A541-4E55-9510-4B99640BC9BD.png

DS18B20功能

AD296C46-75E8-494D-8FAF-9CE04B20B8D6.png

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-09-30 05:52:11
已绑定手机

1

主题

16

回帖

217

积分

中级会员

积分
217
发表于 2025-9-7 17:33:25 | 显示全部楼层

计算机原码,反码,补码详解

一. 机器数和真值

在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.

1、机器数

一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.

比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。

那么,这里的 00000011 和 10000011 就是机器数。

2、真值

因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。

例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1

二. 原码, 反码, 补码的基础概念和计算方法.

在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式.

1. 原码

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:

[+1]~原 = 0000 0001

[-1]~原 = 1000 0001

第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:

[1111 1111 , 0111 1111]

[-127 , 127]

原码是人脑最容易理解和计算的表示方式.

2. 反码

反码的表示方法是:

正数的反码是其本身

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

[+1] = [00000001]~原 = [00000001]~反

[-1] = [10000001]~原 = [11111110]~反

可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.

3. 补码

补码的表示方法是:

正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

[+1] = [00000001]~原 = [00000001]~反 = [00000001]~补

[-1] = [10000001]~原 = [11111110]~反 = [11111111]~补

对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

引用文章:计算机原码,反码,补码详解https://blog.csdn.net/u011080472/article/details/51280919

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-09-30 05:52:11
已绑定手机

1

主题

16

回帖

217

积分

中级会员

积分
217
发表于 2025-9-7 17:35:23 | 显示全部楼层

ai8051U--串口的简单应用--打卡15

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 10:27 , Processed in 0.122518 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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