cjtdz 发表于 2026-3-17 21:45:13

这种硬件设计目的是什么?

这是某一个控制板电路,复用两个I/O脚,却闲置了几个I/O脚,LED同时亮时不就加重单片机的负担了吗?亮度不也受影响吗?增加了程序的复杂性,厂家这样设计的目的是什么?

angmall 发表于 2026-3-18 20:06:45

厂家这样设计的目的是:

1.成本优先:   用最少引脚的芯片实现最多的功能。
2.电路板简化: 走线简单,甚至可以做成单面板,降低制造成本。
3.功能满足:   在大多数简单的家电控制(如电磁炉、风扇、消毒柜等)中,用户只会在按按键的同时观察灯的状态,或者灯常亮只是指示状态,不需要极高精度的亮度一致性。

这个电路是典型的低成本I/O扩展方案,用软件的复杂性(分时复用)换取了硬件成本的降低。你提到的“单片机负担”和“亮度影响”确实存在,但只要程序写得好(控制好点亮时间和电流),在额定范围内是完全没问题的。

zengchang 发表于 2026-3-18 21:59:45

具体应用在哪种设备上面的

猫虎的 发表于 2026-3-19 08:24:39

他可能上一代产品使用的SOP8或者SOP16管脚的,后来功能升级逐渐完善程序越来越大内存紧张换到TSSOP20后不想改程序了,直接硬件沿用了老的管脚

Ayb_ice 发表于 2026-3-19 10:28:30

预留后续改进空间,

cjtdz 发表于 2026-3-19 20:03:11

STC15W202S有没有定时器1?用它这个电路做串口发送,怎么发不出去?

wulin 发表于 2026-3-19 20:20:17

cjtdz 发表于 2026-3-19 20:03
STC15W202S有没有定时器1?用它这个电路做串口发送,怎么发不出去?

有定时器0和定时器2 (注意:无定时器1)

cjtdz 发表于 2026-3-19 20:47:45

还是发送不了数据,哪的原因?
#include "STC15.H"

// ===================== 核心配置(精准匹配硬件)=====================
#define FOSC 11059200L// 晶振11.0592MHz
#define BAUD 9600       // 波特率9600bps

// ===================== 引脚定义 =====================
sbit K1    = P1^3;
sbit K2    = P1^4;
sbit K3    = P1^2;
sbit LED1= P1^0;
sbit LED2= P1^1;

// ===================== 延时函数(12T模式适配)=====================
void Delay10ms(void)
{
    unsigned char i, j;
    i = 108;
    j = 145;
    do { while (--j); } while (--i);
}

// ===================== 硬件串口初始化(仅定时器0,纯硬件)=====================
void Uart1_Init(void)
{
    // 1. 串口模式配置(8位数据,可变波特率)
    SCON = 0x50;
   
    // 2. 定时器0配置(STC15W202S唯一选择,12T模式)
    AUXR &= 0x7F;      // 强制关闭定时器0的1T模式(用默认12T)
    AUXR |= 0x01;      // 串口1波特率源 = 定时器0溢出
    TMOD &= 0xF0;      // 清空定时器0模式
    TMOD |= 0x02;      // 定时器0 = 8位自动重装模式
   
    // 3. 波特率精准计算(11.0592MHz+9600bps+12T模式唯一正确值)
    TH0 = 0xFD;         
    TL0 = 0xFD;         
   
    // 4. 启动定时器0,关闭中断(纯硬件波特率,无需中断)
    TR0 = 1;            
    ET0 = 0;            
   
    // 5. 清空发送/接收标志
    TI = 0;
    RI = 0;
    EA = 1;               // 开总中断(备用)
   
    // 6. 串口稳定延时
    Delay10ms();
}

// ===================== 硬件串口发送字节(纯硬件,无软件模拟)=====================
void Uart1_Send(unsigned char dat)
{
    SBUF = dat;          // 数据写入硬件发送寄存器
    while(!TI);          // 等待硬件发送完成(TI由硬件置1)
    TI = 0;            // 手动清空发送标志
}

// ===================== 按键扫描(极简,无冗余)=====================
unsigned char Key_Scan(void)
{
    unsigned char key = 0;
   
    // 仅检测低电平(按键接GND)
    if(K1 == 0)
    {
      Delay10ms();
      if(K1 == 0)
      {
            key = 1;
            while(K1 == 0); // 等待按键松开
      }
    }
    else if(K2 == 0)
    {
      Delay10ms();
      if(K2 == 0)
      {
            key = 2;
            while(K2 == 0);
      }
    }
    else if(K3 == 0)
    {
      Delay10ms();
      if(K3 == 0)
      {
            key = 3;
            while(K3 == 0);
      }
    }
    return key;
}

// ===================== 主函数(纯硬件串口,无任何软件模拟)=====================
void main(void)
{
    unsigned char key_val;
   
    // 引脚配置:LED推挽输出,按键准双向输入
    P1M0 = 0x03;
    P1M1 = 0x00;
   
    // 初始化硬件串口
    Uart1_Init();
   
    // 上电发送测试字节(验证硬件串口通路)
    Uart1_Send(0xAA);
   
    // LED初始状态
    LED1 = 1;
    LED2 = 1;
   
    // 主循环
    while(1)
    {
      key_val = Key_Scan();
      if(key_val != 0)
      {
            switch(key_val)
            {
                case 1:
                  LED1 = 0;
                  Uart1_Send(0x01);// 硬件发送01
                  Delay10ms();
                  LED1 = 1;
                  break;
                case 2:
                  LED2 = 0;
                  Uart1_Send(0x02);// 硬件发送02
                  Delay10ms();
                  LED2 = 1;
                  break;
                case 3:
                  LED1 = 0;
                  LED2 = 0;
                  Uart1_Send(0x03);// 硬件发送03
                  Delay10ms();
                  LED1 = 1;
                  LED2 = 1;
                  break;
            }
      }
    }
}

cjtdz 发表于 2026-3-19 21:25:23

终于搞定,STC15W202S没有定时器1,波特率发生器不能用定时器0,必须用定时器2,第二次踩坑了。
页: [1]
查看完整版本: 这种硬件设计目的是什么?