也谈接口和抽象类区别(一)

本文对比了抽象类和接口在面向对象程序设计中的作用及差异。抽象类强调继承关系,接口则关注实现关系,两者都能定义行为规范,但在类的发展自由度上有所不同。
http://www.cnblogs.com/KeithDan/archive/2007/05/21/754164.html


好象这是一个老生常谈的问题,最近有个学生问我他们的区别,于是我就又想起这个话题。

有不少的文章在描述这两者,但好象都没有怎么从初学者的浅显角度来看。

其实这两者有很多相识之处,当然也有很多不同之处。要理解它们,应该先从面向对象思想开始。面向对象思想里面,最基本的就是封装,继承和多态。所谓封装,说的小,方法(函数)也就是对一种操作的封装,说的大,用类来描述一个具体的对象。

那么在面向对象程序中应该说对封装还有一层新的定义,即将类的描述抽象化,也就是说描述类的外貌而不去考虑它的实际。

那么我们回过头来看抽象类,它必须被继承使用,描述的其实是一种继承关系,即"is a"的关系。类继承它,也就是说类拥有它所有抽象方法等,那么也就是类遵循了它所定义的规范。但是呢,这种规范是通过继承而来,类的发展必须依赖它的父类。

abstract class 工作
{
abstract void 上班()
}
class 张三 : 工作{}

abstract class 工作
{
abstract void 上班()
}

class 人: 工作{}
class 李四 : 人{}

我们从这个例子中不难看出,张三和李四同样都遵循抽象工作的规范,都拥有上班这个方法,但是呢,他们的发展始终受到父类的影响。

当然,我这里只是从它们使用的角度来看,我们还能从他们设计角度度来看。上面我们虽然实现了人.上班()的过程,但是,这却违反了面向对象设计中的一个核心原则ISP(Interface Segregation Priciple),我们把李四的作为人的行为和他工作的行为混在一起。

那我们再来看看接口(interface),引用航天奇侠兄的一句话,接口,就是一个类的函数规范。 一个类 “继承”一个接口,等于说这个类必须提供接口所要求的所有函数。但是呢他们是一种实现关系,虽然在C#里我们还叫它为继承接口,但实际它是一种"like a"的关系。

interface 工作
{
public void 上班();
}

class 张三 : 工作{}

interface 工作
{
public void 上班();
}

class 人 {}

class 李四 : 人,工作{}


interface 工作
{
public void 上班();
}
class 动物 {}

class 人 : 动物 {}

class 王五 : 人,工作{}

此时我们来看,张三和李四同样遵循着interface工作所定义的规范,但是呢,他们(类)的发展并不受到父类的影响,张三、李四、王五都可以自由的发展自身类,具备有很高的自由度,我们再来从面向对象设计角度看,李四、王五继承人(因为他本质就是人),实现了工作。
应该说,接口的使用面比抽象类更广一些,而抽象类呢比接口更具限制性,体现的是继承关系。
当类的发展不需要受到限制和约束时,我们可以使用接口,此类可以自由的发展,此时继承接口的这个类它就是一个稳定的类,这也体现了接口保持类的稳定性。


这两者具备有很大的相似性,都源直面向对象思想,在使用何时抽象类,何时接口并没有一个定论,应该根据自己程序的大小,设计的方式,程序发展的空间来看,这就需要大家自己斟酌了。
<think> 首先,用户的问题是:“我想查找ec11旋转编码器电路相关内容 请问ec11旋转编码器电路设计与原理”。用户引用了站内引用[1],其中描述了EC11旋转编码器的C语言程序和一些电路细节。 关键点: - 用户想了解EC11旋转编码器电路设计和原理。 - 引用[1]中提到:旋钮不需要供电,它通过拉低高电平或不改变状态来工作。输出引脚需要输出高电平。 - 电路设计包括使用单片机的PORTD和DDRD设置。 - 为了减少噪声,使用了RC滤波电路(0.1uF电容和10K电阻)。 我的回答需要: - 使用中文。 - 结构清晰,逐步解释。 - 使用行内数学表达式用$...$格式,如果有变量或方程。 - 独立公式用$$...$$格式。 - LaTeX语法正确。 - 在回答末尾添加引用标识到引用[1]。 - 生成相关问题。 结构回答: 1. **介绍EC11旋转编码器**:简要说明它是什么和基本工作原理。 2. **电路设计**:基于引用,解释电路设计。 - 旋钮的工作原理:不需要供电,通过接地拉低电平。 - 单片机的设置:输出高电平。 - RC滤波电路:减少噪声。 3. **原理**:解释信号产生和如何处理。 4. **代码示例**:如果相关,提供C语言代码片段。 5. **引用**:在相关段落末尾添加引用标识。 6. **生成相关问题**:在最后添加相关问题。 确保真实可靠:基于标准知识和引用内容。EC11是常见的旋转编码器,原理是输出脉冲序列。 详细内容: - **工作原理**:EC11旋转编码器是增量式编码器,有两个输出通道(A和B),用于检测旋转方向和步数。 - **电路设计**: - 旋钮连接到地,输出引脚通过上拉电阻连接到高电平。当旋钮旋转时,它会将输出拉低,产生脉冲。 - 引用中提到:PORTD = 0xC3 DDRD = 0xFF,这表示设置端口方向为输出,并输出高电平到特定引脚。 - RC滤波:使用电阻和电容滤除噪声;0.1uF电容和10K电阻构成低通滤波器。 - **原理**:当旋转时,A和B信号产生正交信号(90度相位差),用于确定方向。 数学表达式: - 可能没有复杂数学,但如果有频率或滤波相关,可以加入。 - 例如,RC时间常数:$\tau = R \times C = 10k\Omega \times 0.1\mu F = 1ms$。 - 滤波截止频率:$f_c = \frac{1}{2\pi RC}$。 代码示例:引用中提供了C语言片段,我可以类似地展示。 回答结构: 1. **引言**:解释EC11旋转编码器。 2. **电路设计**:详细描述。 3. **原理**:包括信号处理。 4. **代码示例**(可选)。 5. **结论**。 6. **相关问题**。 生成相关问题: - 基于主题,如应用、优化等。 - 例如: 1. 如何提高EC11旋转编码器的抗噪声能力? 2. EC11旋转编码器在嵌入式系统中的常见应用场景? 3. 如何编程解码EC11的旋转方向? </think> ### EC11旋转编码器电路设计与原理 EC11旋转编码器是一种常见的增量式旋转编码器,广泛应用于嵌入式系统中检测旋转方向和步数(如音量控制、菜单导航)。其核心原理是通过机械接触或光学方式生成正交脉冲信号(A相和B相),利用相位差判断旋转方向。以下基于引用内容[^1],逐步解释其电路设计和工作原理,确保内容真实可靠。 #### 1. **电路设计** EC11旋转编码器电路设计关键在于信号输出和噪声抑制。引用提到,旋钮不需要独立供电,而是通过改变电平状态工作。具体设计包括: - **输出引脚设置**:旋钮的输出引脚(通常为A相和B相)需连接到微控制器(如单片机)。旋钮通过接地(GND)将输出拉低,因此旋钮的输出引脚必须保持高电平,以便检测低电平变化。例如,使用Atmel Mega8单片机时,设置端口方向寄存器(DDR)和数据寄存器(PORT)以实现高电平输出: - `PORTD = 0xC3`:设置端口D的输出值,确保相关引脚输出高电平。 - `DDRD = 0xFF`:配置端口D为输出模式。 这样,当旋钮旋转时,其内部开关会连接到GND,将输出引脚拉低(产生脉冲信号);否则,引脚保持高电平[^1]。 - **RC滤波电路**:直接连接旋钮到单片机易引入噪声(如接触抖动)。引用建议添加经典RC滤波电路(电阻-电容网络): - 使用一个10kΩ电阻和0.1μF电容组成低通滤波器(如图示),连接到每个输出引脚。 - **原理**:电阻串联在信号线上,电容并联到地(GND)。该电路滤除高频噪声,只允许低频信号通过。截止频率计算为: $$f_c = \frac{1}{2\pi RC}$$ 代入值:$R = 10k\Omega$, $C = 0.1\mu F$,得: $$f_c \approx \frac{1}{2 \times 3.14 \times 10^4 \times 10^{-7}} = 159.2 \text{ Hz}$$ 这能有效抑制旋转时的噪声(如示波器显示的毛刺),确保波形稳定[^1]。 #### 2. **工作原理** EC11的工作原理基于正交脉冲序列: - **信号生成**:旋钮旋转时,内部开关交替接触,产生两路相位差90°的脉冲信号(A相和B相)。 - 当顺时针旋转时,A相信号领先B相90°。 - 当逆时针旋转时,B相信号领先A相90°。 例如,信号序列表示为:顺时针时,A相在时间$t$上升沿,B相在$t + \Delta t$上升沿(其中$\Delta t$为相位差)。 - **解码逻辑**:微控制器通过检测A和B的边沿变化和相位差判断方向: - 当A相从高变低时,检查B相状态: - 如果B相为高,则为顺时针。 - 如果B相为低,则为逆时针。 这可通过中断或轮询方式实现(见代码示例)。 #### 3. **简单代码示例** 以下C语言代码片段(基于Mega8单片机)展示了如何初始化引脚和读取旋转状态。注意:代码需结合RC滤波电路使用,以确保信号稳定。 ```c #include <avr/io.h> #include <avr/interrupt.h> // 定义引脚:假设A相连PD0, B相连PD1 #define PIN_A PD0 #define PIN_B PD1 // 初始化设置 void ec11_init() { DDRD = 0xFF; // 设置PORTD为输出模式 PORTD = 0xC3; // 输出高电平到相关引脚(如PD0和PD1) // 启用外部中断(可选) EICRA |= (1 << ISC00); // 配置INT0为任何变化触发 EIMSK |= (1 << INT0); // 使能INT0中断 } // 中断服务程序:处理旋转事件 ISR(INT0_vect) { if (!(PIND & (1 << PIN_A))) { // 检查A相是否变低 if (PIND & (1 << PIN_B)) { // 检查B相状态 // 顺时针旋转处理 } else { // 逆时针旋转处理 } } } ``` 此代码初始化引脚并设置中断,当A相信号变化时判断方向。RC滤波确保信号无噪声干扰[^1]。 #### 总结 EC11旋转编码器电路设计以电平输出和滤波为核心:输出引脚保持高电平,旋钮通过接地拉低电平生成脉冲;RC滤波(10kΩ电阻+0.1μF电容)消除噪声。原理依赖于正交脉冲的解码,实现简单高效。实际应用中,确保电路布局紧凑以减少干扰[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值