快速读入板子

//#include <bits/stdc++.h>
#include<vector>
#include<iostream>
#include<string.h>

using namespace std;
//#include <bits/stdc++.h>
using namespace std;
int n, t[5000010 * 4];
namespace io {
    const int SIZE = (1 << 21) + 1;
    char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = oS + SIZE - 1, c, qu[55]; int f, qr;
    // getchar
#define gc() (iS == iT ? (iT = (iS = ibuf) + fread (ibuf, 1, SIZE, stdin), (iS == iT ? EOF : *iS ++)) : *iS ++)
    // print the remaining part
    inline void flush () {
        fwrite (obuf, 1, oS - obuf, stdout);
        oS = obuf;
    }
    // putchar
    inline void putc (char x) {
        *oS ++ = x;
        if (oS == oT) flush ();
    }
    template<typename A>
    inline bool read (A &x) {
        for (f = 1, c = gc(); c < '0' || c > '9'; c = gc()) if (c == '-') f = -1;else if(c==EOF)return 0;
        for (x = 0; c <= '9' && c >= '0'; c = gc()) x = x * 10 + (c & 15); x *= f;
        return 1;
    }
    template<typename A>
    inline bool write (A x) {
        if (!x) putc ('0'); if (x < 0) putc ('-'), x = -x;
        while (x) qu[++ qr] = x % 10 + '0',  x /= 10;
        while (qr) putc (qu[qr --]);
        return 0;
    }
    inline bool write (char x) {
        putc(x);
        return 0;
    }
    //no need to call flush at the end manually!
    struct Flusher_ {~Flusher_(){flush();}}io_flusher_;
}
void up(int x) {
    t[x] = t[x << 1] + t[x << 1 | 1];
}
void modify(int x, int l, int r, int pos, int val) {
    if (l == r) {
        t[x] = val;
        return;
    }
    int mid = l + r >> 1;
    if (pos <= mid) modify(x << 1, l, mid, pos, val);
    else modify(x << 1 | 1, mid + 1, r, pos, val);
    up(x);
}
int query(int x, int l, int r) {
    if (l == r) return t[x];
    int mid = l + r >> 1;
    if (t[x << 1] == (mid - l + 1)) return t[x << 1] + query(x << 1 | 1, mid + 1, r);
    return query(x << 1, l, mid);
}
using io :: read;
using io :: putc;
using io :: write;
char buf[16 * 1024 * 1024 + 5]; // 10 MiB Buffer
int curpos = 0, iseof;
int nextInt()
{
    int ret = 0;
    if (iseof) return 0;
    while (!('0' <= buf[curpos] && buf[curpos] <= '9'))
    {
        if (buf[curpos] == 0)
        {
            if (fgets(buf, 16 * 1024 * 1024, stdin) == NULL) iseof = true;
            curpos = 0;
            continue;
        }
        curpos++;
    }
    int flg = 0;
    if (curpos && buf[curpos - 1] == '-') flg = -1;
    else flg = 1;
    while ('0' <= buf[curpos] && buf[curpos] <= '9')
    {
        ret = ret * 10 + (buf[curpos] - '0');
        curpos++;
    }
    return ret * flg;
}
int main() {
//    scanf("%d", &n);
//    read(n);
    n=nextInt();
    for (int i = 1; i <= n; i++) {
        int opt, x;
        opt=nextInt();
        x=nextInt();
//        read(opt), read(x);
        if (opt == 1) modify(1, 1, n, x, 1);
        else {
            modify(1, 1, n, x, 1);
            write(query(1, 1, n) + 1);
            putc('\n');
            modify(1, 1, n, x, 0);
        }
    }
}

标题“51单片机通过MPU6050-DMP获取姿态角例程”解析 “51单片机通过MPU6050-DMP获取姿态角例程”是一个基于51系列单片机(一种常见的8位微控制器)的程序示例,用于读取MPU6050传感器的数据,并通过其内置的数字运动处理器(DMP)计算设备的姿态角(如倾斜角度、旋转角度等)。MPU6050是一款集成三轴加速度计和三轴陀螺仪的六自由度传感器,广泛应用于运动控制和姿态检测领域。该例程利用MPU6050的DMP功能,由DMP处理复杂的运动学算法,例如姿态融合,将加速度计和陀螺仪的数据进行整合,从而提供稳定且实时的姿态估计,减轻主控MCU的计算负担。最终,姿态角数据通过LCD1602显示屏以字符形式可视化展示,为用户提供直观的反馈。 从标签“51单片机 6050”可知,该项目主要涉及51单片机和MPU6050传感器这两个关键硬件组件。51单片机基于8051内核,因编程简单、成本低而被广泛应用;MPU6050作为惯性测量单元(IMU),可测量设备的线性和角速度。文件名“51-DMP-NET”可能表示这是一个与51单片机及DMP相关的网络资源或代码库,其中可能包含C语言等适合51单片机的编程语言的源代码、配置文件、用户手册、示例程序,以及可能的调试工具或IDE项目文件。 实现该项目需以下步骤:首先是硬件连接,将51单片机与MPU6050通过I2C接口正确连接,同时将LCD1602连接到51单片机的串行数据线和控制线上;接着是初始化设置,配置51单片机的I/O端口,初始化I2C通信协议,设置MPU6050的工作模式和数据输出速率;然后是DMP配置,启用MPU6050的DMP功能,加载预编译的DMP固件,并设置DMP输出数据的中断;之后是数据读取,通过中断服务程序从DMP接收姿态角数据,数据通常以四元数或欧拉角形式呈现;再接着是数据显示,将姿态角数据转换为可读的度数格
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值