#P05803. 负进制

这篇博客探讨了如何使用短除法处理以-2为基数的情况,特别是当余数为负数时的细节问题。文章通过一个示例代码展示了如何在遇到负余数时调整商和余数,确保在-2进制系统中不出现负数。解决方案是将负余数加2并相应增加商。这个算法对于理解负数在不同进制系统中的处理具有启示意义。


思路:

其实就是普通短除法的举一反三,只不过除数改成了-2而已,不过还是有一些细节要改改(后面会讲)。短除法过程如图(其实是应用了位值原理)

 细节问题:在这里假设有a而有时a % -2 < 0该怎么办呢?(比如(-3)%(-2))要知道在以-2为基数的进制中是不许数字为负数这种情况出现的。

解决方法:将该余数+2(因为在这里a是% -2,所以如果余数为负则一定==-1,也就是将该余数变成1),再将商+1即可。


代码:

#include <bits/stdc++.h>
using namespace std;
string s;
long long n;
int main()
{
  cin>>n;
  if(n == 0)
  {
  	cout<<0;
  	return 0;
  }
  while(n)
  {
    int c = (n) / (-2),d = (n) % (-2);
    if(d < 0)
    {
      d = 1;
      c++;
    }
    n = c;
    s += d + '0';
  }
  reverse(s.begin(),s.end());
  cout<<s;
  return 0;
}

根据要求,设计一个基于数字电路的实时数据采集与显示系统,不使用单片机。以下是Multisim中的电路原理图设计思路和关键模块说明: ### 系统框图 ``` [温度传感器] → [8位ADC] → [RAM存储器] → [地址控制器] → [BCD转换器] → [数码管显示] ↑ ↑ ↑ [时钟发生器] [写入控制] [地址选择器] ``` ### 电路原理图设计(Multisim实现) #### 1. 时钟发生器(10分钟采样周期) - 使用555定时器构成多谐振荡器 - 元件:NE555,电阻R1=470kΩ,R2=470kΩ,电容C1=100μF - 周期计算:T=0.693×(R1+2R2)×C1 ≈ 600秒(10分钟) - 输出接LED(采样指示) #### 2. 地址计数器(24小时=144个点) - 使用2片74LS161(4位二进制计数器)级联 - 时钟输入:555的输出 - 复位电路:当计数到144(10010000₂)时复位 - 检测电路:74LS20(4输入NAND)检测高4位=9(1001₂),74LS02(NOR)检测低4位=0 - 复位信号:74LS00(NAND)输出清零信号 #### 3. 数据存储模块 - 存储器:2片6116 SRAM(2K×8位,实际使用144字节) - 数据输入:8位温度数据(模拟输入用拨码开关) - 地址线:低8位接地址计数器 - 控制信号: - WE(写使能):555时钟经74LS123单稳态触发器产生负脉冲(宽度=1μs) - OE(读使能):常接地(始终使能读) #### 4. 地址选择与读取 - 手动地址选择:8位DIP开关 → 74LS245缓冲器 - 自动扫描:另1组74LS161计数器 + 1Hz时钟(显示刷新) - 2选1多路器:74LS157(由模式开关选择手动/自动) #### 5. 显示模块 - BCD转换:2片74LS185(6位二进制转BCD) - 显示驱动: - 百位:74LS47 + 7段数码管 - 十位:74LS47 + 7段数码管 - 个位:74LS47 + 7段数码管 - 超范围指示:当温度>255时点亮报警LED ### 关键电路说明 1. **写入时序**: - 555时钟上升沿触发单稳态电路(74LS123)产生1μs负脉冲 - 此时地址计数器已稳定,数据写入当前地址 2. **地址控制**: ```plaintext 手动模式:DIP开关 → 地址选择 → 显示指定点 自动模式:扫描计数器 → 循环显示0-143地址数据 ``` 3. **BCD转换逻辑**: - 输入:RAM输出的8位二进制 - 输出:12位BCD(3×4位) - 示例:二进制11001000₂(200) → BCD0010 0000 0000 ### 仿真设置建议 1. 缩短采样周期:将555的C1改为1μF(周期≈1秒)便于仿真 2. 温度输入:用8位拨码开关模拟传感器数据 3. 存储验证:写入后切换地址,确认数码管显示正确 ### 电路特点 - 全硬件实现,无需编程 - 支持单点/连续数据回放 - 自动循环覆盖旧数据(24小时) - 超温报警指示 > 在Multisim中搭建时,注意电源/地线连接,芯片使能端处理,以及信号延迟匹配。实际电路需添加去耦电容提高稳定性。 ![简化电路示意图](https://via.placeholder.com/400x200?text=Multisim+Schematic+Here) (注:实际Multisim文件需包含:4个计数器芯片、2片RAM、3片显示驱动、逻辑门若干及时钟电路)根据上面知识绘画电路图
06-16
### 基于数字电路的实时数据采集与显示系统设计 根据你的要求,下面是在Multisim中设计一个不使用单片机的实时数据采集与显示系统的详细电路原理图和关键模块说明。我们将逐步实现各个模块,并确保最终系统功能完整。 ### 系统框图 ```plaintext [温度传感器] → [8位ADC] → [RAM存储器] → [地址控制器] → [BCD转换器] → [数码管显示] ↑ ↑ ↑ [时钟发生器] [写入控制] [地址选择器] ``` ### 电路原理图设计(Multisim实现) #### 1. 时钟发生器(10分钟采样周期) - **555定时器**:配置为多谐振荡器模式,生成定时脉冲。 - **元件选择**: - NE555 - R1 = 470 kΩ - R2 = 470 kΩ - C1 = 100 μF - **周期计算**: \[ T = 0.693 \times (R1 + 2 \times R2) \times C1 \approx 600 \text{秒} \] - **输出接LED**(采样指示) ```plaintext +9V | R2 (470kΩ) | +---+---+---+---+---+---+---+---+---+ | | | | | | | | | | 1 2 3 4 5 6 7 8 G T O R C T D V N R U E O H I C D I P S M R S C | G T | M E C | | | P | E | | | | | | | | | | | +--R1(470kΩ)--+ C1(100μF) | | | | GND LED ``` #### 2. 地址计数器(24小时=144个点) - **74LS161计数器**:2片级联,实现144个地址计数。 - **时钟输入**:连接555定时器的输出。 - **复位电路**:当计数到144(10010000₂)时复位。 - **检测电路**:使用74LS20(4输入NAND)检测高4位=9(1001₂),74LS02(NOR)检测低4位=0。 - **复位信号**:使用74LS00(NAND)输出清零信号。 ```plaintext +------------------+ +------------------+ +------------------+ | 555定时器 | ----> | 74LS161计数器 | ----> | 74LS161计数器 | | (多谐振荡器) | | (低4位) | | (高4位) | +------------------+ +------------------+ +------------------+ | | | | | | v v v +------------------+ | 复位电路 | +------------------+ ``` #### 3. 数据存储模块 - **存储器**:2片6116 SRAM(2K×8位,实际使用144字节) - **数据输入**:8位温度数据(模拟输入用拨码开关) - **地址线**:低8位接地址计数器 - **控制信号**: - WE(写使能):555时钟经74LS123单稳态触发器产生负脉冲(宽度=1μs) - OE(读使能):常接地(始终使能读) ```plaintext +------------------+ +------------------+ +------------------+ | 555定时器 | ----> | 74LS123单稳态 | ----> | 6116 SRAM | | (多谐振荡器) | | 触发器 | | (2片级联) | +------------------+ +------------------+ +------------------+ | | | | | | v v v +------------------+ | 写入控制 | +------------------+ ``` #### 4. 地址选择与读取 - **手动地址选择**:8位DIP开关 → 74LS245缓冲器 - **自动扫描**:另1组74LS161计数器 + 1Hz时钟(显示刷新) - **2选1多路器**:74LS157(由模式开关选择手动/自动) ```plaintext +------------------+ +------------------+ +------------------+ | 8位DIP开关 | ----> | 74LS245缓冲器 | ----> | 74LS157多路器 | | (手动地址) | | | | (手动/自动切换) | +------------------+ +------------------+ +------------------+ | | | | | | v v v +------------------+ | 地址选择器 | +------------------+ ``` #### 5. 显示模块 - **BCD转换**:2片74LS185(6位二进制转BCD) - **显示驱动**: - 百位:74LS47 + 7段数码管 - 十位:74LS47 + 7段数码管 - 个位:74LS47 + 7段数码管 - **超范围指示**:当温度>255时点亮报警LED ```plaintext +------------------+ +------------------+ +------------------+ | 6116 SRAM | ----> | 74LS185 BCD转换器 | ----> | 74LS47显示驱动器 | | (数据输出) | | (8位二进制转BCD) | | (3个7段数码管) | +------------------+ +------------------+ +------------------+ | | | | | | v v v +------------------+ | 显示模块 | +------------------+ ``` ### 关键电路说明 1. **写入时序**: - 555时钟上升沿触发单稳态电路(74LS123)产生1μs负脉冲。 - 此时地址计数器已稳定,数据写入当前地址。 2. **地址控制**: ```plaintext 手动模式:DIP开关 → 地址选择 → 显示指定点 自动模式:扫描计数器 → 循环显示0-143地址数据 ``` 3. **BCD转换逻辑**: - 输入:RAM输出的8位二进制。 - 输出:12位BCD(3×4位)。 - 示例:二进制11001000₂(200) → BCD0010 0000 0000。 ### 仿真设置建议 1. **缩短采样周期**:将555的C1改为1μF(周期≈1秒)便于仿真。 2. **温度输入**:用8位拨码开关模拟传感器数据。 3. **存储验证**:写入后切换地址,确认数码管显示正确。 ### 电路特点 - **全硬件实现**,无需编程。 - **支持单点/连续数据回放**。 - **自动循环覆盖旧数据(24小时)**。 - **超温报警指示**。 ### Multisim中的具体实现步骤 1. **打开Multisim 14.3**:启动软件并创建一个新的电路文件。 2. **放置所需元件**: - 使用“Place Component”功能,搜索并选择所需的元件(如NE555、74LS161、74LS123、6116、74LS245、74LS157、74LS185、74LS47、DIP开关、7段数码管等)。 3. **连接电路**:按照上述连接图连接各元件。 4. **添加电源和地线**:确保电路有稳定的电源和地线连接。 5. **运行仿真**:点击“Run Simulation”按钮,观察555定时器的输出波形,确保其周期正确。 6. **调试和优化**:根据仿真结果,调整元件参数和连接,确保系统功能符合要求。 ### 简化电路示意图(Multisim中) ```plaintext +------------------+ +------------------+ +------------------+ | 555定时器 | ----> | 74LS161计数器 | ----> | 6116 SRAM | | (多谐振荡器) | | (地址计数器) | | (数据存储) | +------------------+ +------------------+ +------------------+ | | | | | | v v v +------------------+ +------------------+ +------------------+ | 8位DIP开关 | ----> | 74LS245缓冲器 | ----> | 74LS157多路器 | | (手动地址) | | | | (手动/自动切换) | +------------------+ +------------------+ +------------------+ | | | | | | v v v +------------------+ | 地址选择器 | +------------------+ | | | v v v +------------------+ +------------------+ +------------------+ | 6116 SRAM | ----> | 74LS185 BCD转换器 | ----> | 74LS47显示驱动器 | | (数据输出) | | (8位二进制转BCD) | | (3个7段数码管) | +------------------+ +------------------+ +------------------+ | | | | | | v v v +------------------+ | 显示模块 | +------------------+ ``` ### 注意事项 - **电源和地线**:确保所有IC的电源和地线连接正确。 - **芯片使能端处理**:确保所有芯片的使能端正确配置。 - **信号延迟匹配**:考虑信号延迟,确保信号同步。 通过上述设计和步骤,你可以在Multisim中成功搭建并仿真一个不使用单片机的实时数据采集与显示系统。如果有任何问题或需要进一步的帮助,请随时告知!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值