单片机数据采集板(设计资料,非实物) 以STC系列的51单片机为主控,集合了多种外设; 有232串口通信; 2路PWM信号转模拟量输出; 以TLC2543为核心的模拟量输入; 计数器和中断输入端子接口; MAX517和DAC0832为核心的模拟量输出; 74LS48为核心的数码管驱动电路; LM324为主体的有源低通滤波电路; 是单片机爱好者学习基础功能的绝佳资料

最近在整理工作室的时候翻出一块老古董——基于STC51的数据采集板设计资料。这板子简直是把传统单片机外设玩出花来了,特别适合刚入坑的硬件爱好者练手。今天就带大家拆解几个有意思的模块,手把手教你怎么玩转这些经典电路。

先看最核心的PWM转模拟量模块。板子上的两路PWM通过RC滤波转成0-5V电压,配合STC自带的PWM模块特别省事。初始化代码大概长这样:

void PWM_Init(void) {
    P1M1 |= 0x03;  // P1.0/P1.1推挽输出
    CMOD = 0x02;   // 时钟源=系统时钟/2
    CL = 0x00;     // 清零计数器
    CH = 0x00;
    CCAPM0 = 0x42; // PWM0模式
    CCAPM1 = 0x42; // PWM1模式
    CR = 1;        // 启动PCA计数器
}

这里有个坑要注意:STC的PCA模块默认是12T模式,如果主频跑在24MHz的话,PWM频率大概在24MHz/(256*12)=7.8kHz左右。实际用示波器看波形时,如果发现纹波太大,可以适当增大滤波电容值。

模拟量采集用TLC2543这枚12位ADC,典型的三线SPI接口操作。读取通道1的代码示例:

unsigned int ReadADC(unsigned char ch) {
    unsigned int val = 0;
    ADCS = 0; // 片选使能
    ch <<= 4;
    for(unsigned char i=0; i<12; i++){
        DIN = (ch & 0x80) ? 1 : 0;
        CLK = 1;
        val <<= 1;
        if(DOUT) val |= 1;
        CLK = 0;
        ch <<= 1;
    }
    ADCS = 1; // 片选关闭
    return val;
}

这个时序要注意数据是在时钟下降沿采样的,调试时可以用LED先验证高低位是否正常。实测发现当输入电压接近参考电压时,读值偶尔会跳变,这时候需要在软件里做滑动平均滤波。

单片机数据采集板(设计资料,非实物) 以STC系列的51单片机为主控,集合了多种外设; 有232串口通信; 2路PWM信号转模拟量输出; 以TLC2543为核心的模拟量输入; 计数器和中断输入端子接口; MAX517和DAC0832为核心的模拟量输出; 74LS48为核心的数码管驱动电路; LM324为主体的有源低通滤波电路; 是单片机爱好者学习基础功能的绝佳资料

板子上的DAC模块混搭了MAX517(I2C接口)和DAC0832(并行接口)两套方案,挺有意思的对比。个人更推荐用MAX517,毕竟I2C布线方便。输出0-2.5V的典型代码:

void SetDAC(unsigned char val) {
    I2C_Start();
    I2C_SendByte(0x58); // 器件地址
    I2C_SendByte(0x00); // 命令字节
    I2C_SendByte(val);  // 数据
    I2C_Stop();
}

调试时记得先确认I2C总线上有没有设备应答,可以用逻辑分析仪抓波形。遇到过最奇葩的问题是I2C上拉电阻没焊,结果数据线一直保持低电平...

数码管驱动部分用了74LS48 BCD译码器,这种设计现在看有点复古了。动态扫描的核心代码:

unsigned char code segTable[] = {0x3F,0x06...}; // 共阴段码表

void Display(unsigned int num) {
    unsigned char digits[4];
    digits[0] = num/1000;
    digits[1] = num%1000/100;
    digits[2] = num%100/10;
    digits[3] = num%10;
    
    for(unsigned char i=0; i<4; i++){
        P2 = ~(1 << i);      // 位选
        P0 = segTable[digits[i]]; // 段码
        delay_ms(2);
    }
}

这里有个视觉暂留的技巧:每个数码管点亮时间不要超过5ms,否则会有明显闪烁。实测发现当主循环有其他耗时操作时,显示会变暗,这时候需要优化代码结构或者上定时器中断。

板子上的LM324低通滤波电路参数挺讲究,截止频率设在1kHz左右。不过实际测试时发现运放输出有约50mV的直流偏移,后来在软件里做了自动校零才解决。模拟电路和数字电路果然还是得做好隔离,血的教训啊...

这板子虽然用的都是老芯片,但用来理解底层硬件原理特别合适。现在的新手可能习惯了Arduino那种傻瓜式操作,但真正要深入嵌入式开发,还是得从寄存器操作开始练起。下次准备用这块板改个简易示波器玩玩,有兴趣的可以关注后续更新~

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐