找回密码
 立即注册
查看: 101|回复: 8

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2026-03-23 17:06:18

188

主题

251

回帖

467

积分

中级会员

积分
467
发表于 6 天前 | 显示全部楼层 |阅读模式
这是某一个控制板电路,复用两个I/O脚,却闲置了几个I/O脚,LED同时亮时不就加重单片机的负担了吗?亮度不也受影响吗?增加了程序的复杂性,厂家这样设计的目的是什么?
QQ20260317-213559.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:838
  • 最近打卡:2026-03-23 06:19:26

12

主题

1328

回帖

7148

积分

论坛元老

积分
7148
发表于 5 天前 | 显示全部楼层
厂家这样设计的目的是:

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

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2026-03-22 22:11:58

2

主题

160

回帖

1008

积分

金牌会员

积分
1008
发表于 5 天前 | 显示全部楼层
具体应用在哪种设备上面的
学无止境
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:228
  • 最近打卡:2026-03-21 08:48:34

16

主题

234

回帖

462

积分

中级会员

积分
462
发表于 4 天前 | 显示全部楼层
他可能上一代产品使用的SOP8或者SOP16管脚的,后来功能升级逐渐完善程序越来越大内存紧张换到TSSOP20后不想改程序了,直接硬件沿用了老的管脚
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:253
  • 最近打卡:2026-03-23 08:44:19
已绑定手机

22

主题

627

回帖

2324

积分

金牌会员

积分
2324
发表于 4 天前 | 显示全部楼层
预留后续改进空间,
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2026-03-23 17:06:18

188

主题

251

回帖

467

积分

中级会员

积分
467
发表于 4 天前 | 显示全部楼层
STC15W202S有没有定时器1?用它这个电路做串口发送,怎么发不出去?
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:24
  • 最近打卡:2026-03-23 07:36:56
已绑定手机

2

主题

26

回帖

154

积分

注册会员

积分
154
发表于 4 天前 | 显示全部楼层
cjt*** 发表于 2026-3-19 20:03
STC15W202S有没有定时器1?用它这个电路做串口发送,怎么发不出去?

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2026-03-23 17:06:18

188

主题

251

回帖

467

积分

中级会员

积分
467
发表于 4 天前 | 显示全部楼层
还是发送不了数据,哪的原因?
#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;
            }
        }
    }
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2026-03-23 17:06:18

188

主题

251

回帖

467

积分

中级会员

积分
467
发表于 4 天前 | 显示全部楼层
终于搞定,STC15W202S没有定时器1,波特率发生器不能用定时器0,必须用定时器2,第二次踩坑了。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-23 23:11 , Processed in 0.124176 second(s), 87 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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