关于数位dp的一些思考

大致看完了claris的数位dp的pdf,感觉题目很厚实啊QAQ。
然后回过头再总结一下(感觉也不算总结啊,就是日常吐槽。。。。)




首先数位dp这个东西是有格式的。。。。所以明天早上再找道题来把模板联系一下,尽量写的标准化一点。。


由于数位dp的字符集不多,有些时候可以像状压dp一样直接把每种数的简单状态压在一个数里面。


由上面在推广一下,如果说和乘积什么的有关的话,这里面的质数就是有2,3, 5, 7(0 有特殊性。。。),所以就可以单独来记录这几种数的情况。


同样的,很多时候你dp里面的状态可以不用记录沉积,我们充分利用字符集的优势以及一般题目有时候会给你一个比较小的模数的时候,这个时候你就可以在状态里直接记录mod这个数后的值记录在状态里面就好了。


还有就是数位dp有时候不是那么明显的时候,就可能给你一些式子,然后你要推式子推出有一些结论,并且这个结论应该(我猜的)有一些特点就是应该看成二进制或者几进制的运算,所以我们要大胆的尝试(这个很重要),这样才能给我们发现结论提供很多帮助,而且要有意识的去看进制下的运算形式,这样才好向有机会的方向转换。


然后还有一些题即使比较综合的了,要么就是比较结论的题不知道就凉凉,要么就是和其他很多东西结合起来的了,就不好总结了。


最后一点,数位dp毕竟和计数有千丝万缕的联系,那么就必然有组合数,容斥这两对活宝了。。。这个就很考水平了QAQ,从pdf的几道例题看,最常见的就是前导零考不考虑,要满足很多个限制就至少满足一个,至少满足两个的容斥,组合数反而是用来连接dp之间不同的状态的。。。。这些每道题之间有很大的不同,也不多说了。




总的来说就是分析性质,解决问题。小心推理,大胆尝试。(看我这个口号怎么样。。。。啦啦啦)

转载于:https://www.cnblogs.com/LLppdd/p/9508721.html

<think>我们正在设计一个12引脚3位数码管的驱动电路。首先,需要明确12引脚数码管的结构。通常,12引脚数码管包含3个共阳或共阴的7段数码管(可能包含小数点,所以实际上是8段)。引脚分配通常是:每个数码管有8个段(a,b,c,d,e,f,g,dp)和3个公共端(每个数码管一个公共端)。但12个引脚如何分配?常见的有两种方式: 1. 每个数码管独立占用8个段引脚(这样就需要24个引脚,显然不现实,所以通常采用多路复用方式)。 2. 多路复用:所有数码管的相同段连接在一起(即8个段引脚是共用的),然后每个数码管有一个公共端(共3个公共端),这样总共8+3=11个引脚。但题目说是12引脚,因此可能还有一个引脚用于其他功能(比如冒号、或者额外的控制)?或者可能是共阴/共阳的选择不同?实际上,常见的12引脚3位数码管引脚排列如下: 通常,12引脚排列为: 引脚1: 数码管1的e段 引脚2: 数码管1的d段 引脚3: 数码管1的dp段(小数点) 引脚4: 数码管1的c段 引脚5: 数码管1的g段 引脚6: 数码管1的b段 引脚7: 数码管1的a段 引脚8: 数码管1的f段 引脚9: 数码管2的公共端(或数码管3的公共端,具体看型号) 引脚10: 数码管2的a段(或者公共端,需要具体分析) 等等。实际上,不同厂家生产的数码管引脚排列可能不同,因此必须查阅具体型号的数据手册。 但是,如果没有具体型号,我们可以假设一个常见的12引脚3位数码管(共阴或共阳)的引脚配置。通常,12引脚可能是: 8个段(a,b,c,d,e,f,g,dp)加上4个其他(可能是3个公共端和1个空脚或冒号等)?但这样是12引脚。另一种可能是:3个公共端,8个段,但其中1个段(比如dp)可能独立,或者有多个小数点?实际上,我们常见的3位12引脚数码管,其内部连接方式是多路复用的,即: 3个公共端(对应3个数码管的公共极)和8个段(a,b,c,d,e,f,g,dp)共11个引脚,但多出的一个引脚可能是用于整个模块的共阴/共阳的电源?或者用于冒号?实际上,通常12引脚数码管的引脚排列是固定的,我们需要通过测试或数据手册确定。 为了设计驱动电路,我们需要知道: 1. 数码管是共阴还是共阳? 2. 每个引脚的功能是什么? 由于没有具体型号,我们假设一个常见的12引脚3位共阴数码管(例如:3461AS-1)的引脚排列(具体请以实际型号手册为准): 引脚1: e (digit1) 引脚2: d (digit1) 引脚3: dp (digit1) 引脚4: c (digit1) 引脚5: g (digit1) 引脚6: b (digit1) 引脚7: a (digit1) 引脚8: f (digit1) 引脚9: f (digit2) // 注意:这里不同数码管的相同段是连在一起的?但实际不是,多路复用的数码管,相同段是连在一起的,所以应该是所有数码管的相同段连在一起。但这里引脚1~8是第一个数码管的段,那么其他数码管的段呢?实际上,多路复用的数码管,相同段是连接在一起的,所以每个段(如a段)只有一个引脚,这个引脚同时连接到三个数码管的a段。因此,上面的假设不对。 重新思考:多路复用的数码管,引脚应该是: 8个段引脚(a,b,c,d,e,f,g,dp)是三个数码管共用的,然后有3个公共端(com1, com2, com3)分别控制每个数码管的阴极(如果是共阴)或阳极(如果是共阳)。这样总共11个引脚。那么12引脚可能是将其中一个段引脚重复(比如两个dp引脚)?或者有一个引脚是接地或电源?或者用于冒号? 实际上,常见的12引脚3位数码管(如SA52-11)的引脚排列如下(共阴): 引脚1: digit1的e段 引脚2: digit1的d段 引脚3: digit1的dp段 引脚4: digit1的c段 引脚5: digit1的g段 引脚6: digit1的b段 引脚7: digit1的a段 引脚8: digit1的f段 引脚9: digit2的a段? // 不对,多路复用应该是公共端控制,段共用。所以这里应该是公共端。 实际上,正确的连接应该是: 段线是共用的,所以每个段在12个引脚中只出现一次。而公共端有3个。另外1个引脚可能是用于连接冒号(如果有)或者空置。 查阅资料:常见的12引脚3位7段数码管(共阴)的引脚排列: 引脚1: e (所有数码管共用) 引脚2: d (共用) 引脚3: dp (共用) 引脚4: c (共用) 引脚5: g (共用) 引脚6: digit1的公共端(com1) 引脚7: b (共用) 引脚8: digit3的公共端(com3) 引脚9: digit2的公共端(com2) 引脚10: f (共用) 引脚11: a (共用) 引脚12: 空(或冒号)?或者有些型号将冒号连接到某个引脚。 因此,我们需要根据实际数码管型号确定。这里我们假设一个典型的12引脚3位共阴数码管引脚功能: 段引脚(共8个):a(11), b(7), c(4), d(2), e(1), f(10), g(5), dp(3) 公共端(3个):com1(6), com2(9), com3(8) 注意:这个排列可能因型号而异,设计前务必确认。 驱动电路设计: 由于是多路复用的共阴数码管,我们需要使用动态扫描驱动。动态扫描的原理是:每次只点亮一个数码管,依次循环,利用人眼视觉暂留效应,看起来是同时亮的。 驱动电路需要: 1. 段选控制:控制8个段(a,b,c,d,e,f,g,dp)的电平,即要显示的数字的编码。 2. 位选控制:控制3个公共端(com1, com2, com3)的电平,共阴数码管中,当公共端为低电平时,对应数码管被选中(可以点亮)。 由于单片机I/O口有限,通常使用专门的驱动芯片(如74HC595移位寄存器、MAX7219等)或者使用三极管放大电流(因为公共端电流较大,每个段电流乘以8,所以公共端需要较大电流)。 设计步骤: 1. 确定驱动方式:使用动态扫描。 2. 段选信号:由单片机(或其他控制器)通过一个8位锁存器(如74HC573)或移位寄存器(如74HC595)输出段码。注意:共阴数码管,段选为高电平时段亮。 3. 位选信号:由单片机控制三个位选信号(通过三极管或驱动芯片控制公共端)。位选信号需要能够承受较大的电流(每个数码管的总电流,假设每个段电流5mA,则一个数码管最大电流40mA,三个数码管不同时亮,但每个公共端在点亮时电流为8个段电流之和,即40mA)。所以位选控制可以使用三极管(如NPN三极管,如8050)来驱动公共端(共阴,所以公共端接三极管的集电极,发射极接地,基极通过电阻接单片机I/O,当I/O高电平时,三极管导通,公共端接地,数码管被选中)。 连接示意图: 单片机I/O口 -> 段选锁存器(输出8位段码) -> 8个段引脚(a,b,c,d,e,f,g,dp) 单片机3个I/O口 -> 分别通过限流电阻(如1kΩ)连接到NPN三极管的基极 -> 三极管的集电极接数码管的公共端(com1,com2,com3),发射极接地。 注意:段选锁存器的输出也需要驱动能力,如果锁存器输出电流不够(每个段需要5-10mA),可以在锁存器和数码管之间加驱动(如74HC245)或者使用具有足够驱动能力的锁存器(74HC573可以提供20-25mA的电流,足够)。 动态扫描程序流程: 1. 设置位选信号:关闭所有位选(即三个公共端都不接地,可以设置单片机I/O为低电平,使三极管截止)。 2. 输出第一个数码管的段码到段选锁存器。 3. 打开第一个数码管的位选(即com1对应的三极管导通)。 4. 延时几毫秒(例如1-5ms)。 5. 关闭第一个数码管的位选。 6. 输出第二位数码管的段码。 7. 打开第二位数码管的位选。 8. 延时,关闭。 9. 同样处理第三个数码管。 10. 循环。 注意事项: - 扫描频率:一般大于50Hz,即每秒钟扫描整个数码管50次以上,这样人眼不会感到闪烁。因此,每个数码管点亮的时间为整个周期的1/3,即每位数码管点亮时间大约为1/(3*50)=6.6ms,所以延时时间可以设置为5ms左右(这样扫描周期为15ms,频率66Hz)。 - 电流限制:每个段的电流需要限制,通常在段选线上串联限流电阻(每个段一个电阻,阻值根据电源电压和LED正向压降计算)。例如,红色LED正向压降约1.8V,电源5V,则电阻=(5-1.8)/0.005=640Ω,可以取680Ω或1kΩ(如果亮度足够,可以取大一点)。注意:电阻是接在段选线上(即每个段引脚一个电阻),而不是公共端。 电路图关键部分: 数码管段引脚(a,b,c,d,e,f,g,dp)分别通过8个限流电阻连接到段选锁存器的输出。 数码管的公共端com1, com2, com3分别连接到三个NPN三极管的集电极,三极管的发射极接地,基极通过一个电阻(如1kΩ)连接到单片机的三个I/O口(位选控制)。 另外,如果使用移位寄存器(如74HC595)来节省I/O口,可以使用3个I/O口(数据、时钟、锁存)控制多个74HC595级联,从而驱动段选和位选。 总结: 设计一个12引脚3位数码管的驱动电路,需要先确定数码管的引脚定义(共阴/共阳,各引脚功能),然后采用动态扫描驱动方式,使用段选锁存器和位选驱动三极管(或驱动芯片)来实现。 由于没有具体型号,建议用户查阅数码管的数据手册,确定引脚排列。如果没有数据手册,可以用万用表测试(二极管档位,分别测试各引脚与公共端的关系)。 相关问题: 1. 如何测试12引脚数码管的引脚排列? 2. 动态扫描驱动电路的具体电路图是怎样的? 3. 如何计算动态扫描驱动电路中的限流电阻值? 4. 使用74HC595驱动数码管的电路设计? 5. 如何编程实现动态扫描?</think>### 12引脚3位数码管驱动电路设计指南 #### 一、数码管结构解析 1. **引脚定义** 典型12引脚3位共阴数码管引脚配置(以常见型号为例): ``` 引脚1: e段(共用) 引脚7: b段(共用) 引脚2: d段(共用) 引脚8: com3(位选3) 引脚3: dp段(共用) 引脚9: com2(位选2) 引脚4: c段(共用) 引脚10: f段(共用) 引脚5: g段(共用) 引脚11: a段(共用) 引脚6: com1(位选1) 引脚12: 空/冒号控制 ``` **关键特性**: - 8个段引脚(a-g + dp)**共用**于所有数码管 - 3个位选引脚(com1-com3)独立控制每位 - 共阴型:位选低电平时选中该位 2. **电气参数**(典型值): - 单段正向压降:1.8-2.2V - 单段工作电流:5-20mA - 位选峰值电流:8×单段电流(需驱动芯片支持) #### 二、驱动电路设计 **动态扫描原理**: 高速轮流点亮各位(>60Hz扫描频率),利用视觉暂留效应实现稳定显示。 **电路拓扑**: ```mermaid graph LR A[MCU] --> B[段驱动] A --> C[位驱动] B --> D[段引脚 a-g/dp] C --> E[位引脚 com1-3] ``` 1. **段驱动设计** - **方案1:锁存器驱动**(推荐) 使用74HC573锁存器: - 数据端接MCU GPIO - 输出端经限流电阻接段引脚 - 锁存使能端由MCU控制 ```python # 伪代码:段码更新流程 set_data(seg_code) # 输出段码到数据线 pulse_latch() # 锁存信号上升沿 ``` - **方案2:移位寄存器**(节省IO) 74HC595级联方案: - SER: 串行数据 - SRCLK: 移位时钟 - RCLK: 输出锁存 2. **位驱动设计** **NPN三极管驱动电路**: ``` MCU_GPIO → 1kΩ电阻 → NPN基极 NPN发射极 → GND NPN集电极 → com引脚 ``` - 推荐型号:S8050(Ic_max=500mA) - 设计要点: $$R_b = \frac{V_{oh} - V_{be}}{I_b}, \quad I_b \geq \frac{I_c}{\beta}$$ (例:Voh=3.3V, β=100, Ic=100mA → Rb≤2.7kΩ) 3. **限流电阻计算** 电阻值计算公式: $$R = \frac{V_{cc} - V_f - V_{ce(sat)}}{I_{seg}}$$ - 示例:Vcc=5V, Vf=2V, Vce(sat)=0.2V, Iseg=10mA $$R = \frac{5 - 2 - 0.2}{0.01} = 280Ω \quad (取270Ω)$$ #### 三、完整电路示例 ```mermaid graph BT subgraph MCU[控制器] GPIO[GPIO端口] end subgraph DRIVER[驱动电路] GPIO -->|D0-D7| 74HC573[74HC573锁存器] 74HC573 -->|Q0-Q7| RES[270Ω×8电阻网络] RES --> SEG[数码管 a-g/dp] GPIO -->|B0| TR1[S8050] GPIO -->|B1| TR2[S8050] GPIO -->|B2| TR3[S8050] TR1 --> COM1 TR2 --> COM2 TR3 --> COM3 end subgraph DISPLAY[数码管] SEG --> DIGIT1 SEG --> DIGIT2 SEG --> DIGIT3 COM1 --> DIGIT1 COM2 --> DIGIT2 COM3 --> DIGIT3 end ``` #### 四、软件设计要点 1. **动态扫描流程**: ```c while(1) { set_segments(DIG1_DATA); // 输出第一位段码 digitalWrite(COM1, LOW); // 选通第一位 delay(5); // 保持5ms digitalWrite(COM1, HIGH); // 关闭第一位 set_segments(DIG2_DATA); // 重复流程 digitalWrite(COM2, LOW); delay(5); digitalWrite(COM2, HIGH); set_segments(DIG3_DATA); digitalWrite(COM3, LOW); delay(5); digitalWrite(COM3, HIGH); } ``` 2. **段码表生成**(共阴): ```c // 0-9段码(a-g顺序) const uint8_t SEG_CODES[] = { 0b00111111, // 0 0b00000110, // 1 0b01011011, // 2 0b01001111, // 3 0b01100110, // 4 0b01101101 // 5 // ...补充其他数字 }; ``` #### 五、设计注意事项 1. **电流匹配**:确保驱动芯片最大电流 > 单段电流×8 2. **消隐处理**:切换位选时关闭段输出,防止鬼影 3. **扫描频率**:推荐60-200Hz(每位点亮2-5ms) 4. **功耗控制**:高亮度场合需加散热设计 > 提示:实际设计前务必用万用表验证数码管引脚定义,不同厂家可能存在差异[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值