阅读下面的引文,然后研究这个术语微控制器看它对Quote有什么相关性:
我让你做这个问题的家庭作业!
这句话不仅有趣,而且令人吃惊,尤其是对我们这些出生时家中没有电脑,更不用说多个个人电脑的人来说。
在让学生们研究“微控制器”这个术语时,我想指出的一点是,现有的大多数计算机都不是人们通常认为的“计算机”类型。“Those doorknob computers - as well as engine control computers in automobiles, kitchen appliances, cellular telephones, biomedical implants, talking birthday cards, and other small devices - are much smaller and much more specialized than the “general purpose” computers people use at their desks to write documents or surf the internet. They are the silent, unseen side of the modern “computer revolution,” and in many ways are more appropriate for beginning students of digital electronics to explore than their larger, general-purpose counterparts.
一种微控制器单元, 或者单片机是一种专门的数字计算机,用于提供自动排序或系统控制。微控制器与普通数字计算机的不同之处在于它非常小(通常是一个单一集成电路芯片),有几个专用的引脚用于数字信号的输入和/或输出,并且内存有限。编入微控制器内存的指令告诉它如何对输入条件作出反应,以及发送什么类型的信号到输出。
微控制器的最简单的信号“理解”是离散电压电平:在芯片上的指定引脚上测量的“高”(大约V)或“低”(大致地电位)。微控制器内部的晶体管在输出引脚中产生这些“高”和“低”信号,它们由SPDT开关为简单的SAKE建模的动作:
|
可以对微控制器进行编程为模拟数字逻辑门(以及,或,NAND,NOR等)的功能,除了各种组合和多脉线功能之外。微控制器可以做的是存储器的唯一真实限制是存储器(可以存储程序中的大量)和MCU芯片上的输入/输出引脚。
然而,微控制器本身是由数千(或数百万)个逻辑门电路组成的。为什么使用微控制器来执行逻辑功能,它的一小部分组成门可以直接完成?换句话说,当人们可以用更少的门电路来建立他们所需要的逻辑网络时,为什么还要费心去给微控制器编程来执行数字功能呢?
易于配置和灵活性!
请注意,我没有费心解释我非常简洁的答案。这是一个我渴望学生思考长而难以思考的主题,对于这个问题的真实答案是推动可编程数字设备的所有开发的原因。
一个学生决定用一个微控制器来建造一个闪光电路,而不是555定时器或其他一些硬接线的不稳定电路。不幸的是,有些地方出了问题。第一次通电时,LED灯亮1秒,然后熄灭,永不再亮。LED重新亮起的唯一方式是MCU复位或电源循环关闭并亮起:
|
Pseudocode列表将PIN0声明为输出
开始
设置PIN0高
暂停1秒
设置PIN0 LOW.
结尾
一位同学在被请求帮助时,修改了程序列表,并通过编程电缆从正在编辑程序的个人电脑重新发送到微控制器。程序列表现在是这样的:
Pseudocode列表将PIN0声明为输出
环形
设置PIN0高
暂停1秒
设置PIN0 LOW.
endloop.
使用新程序重置MCU时,LED开始闪烁打开和关闭。。。有点。LED大多数时间是“开启”,但一旦每秒都关闭,然后立即回来。事实上,“关闭”时期是如此简短,它几乎没有明显。
这个学生想要的是50%的占空比:“开”1秒,然后“关”1秒,无限重复这个循环。首先说明同学程序修改的意义,然后再修改程序列表,让LED做学生想做的事情。
MCU必须重复ON / PAUSE / OFF序列所需的“循环”。现在需要的是循环中的另一个时间延迟:
Pseudocode列表将PIN0声明为输出
环形
设置PIN0高
暂停1秒
设置PIN0 LOW.
暂停1秒(新代码行)
endloop.
这个问题的目的是让学生意识到通过光闪烁指令必须告知微控制器“循环”。真的,这只是在实际背景下的循环的插图。
如果您想知道为什么我用伪代码写作,这里有几个原因:
如果我决定展示实际在微控制器中运行的代码,我会将问题注定是过时的问题。这样,我可以传达程序的精神,而不被链接到实际的编程标准。唯一的缺点是学生必须将我的伪代码转换为实际在其特定的MCU硬件上运行的真正代码,但这是一个问题,无论我选择哪种真正的编程语言如何。
当然,我本可以采取唐纳德Knuth方法,并发明了我自己的(虚构的)硬件和指令集。。。
学生决定使用微控制器构建光闪光灯电路。LED仅在按下按钮开关时才能闪烁和关闭。当释放交换机时,它应该关闭:
|
Pseudocode列表将PIN0声明为输出
将Pin1声明为输入
虽然pin1很高
设置PIN0高
暂停0.5秒
设置PIN0 LOW.
暂停0.5秒
ENDWHILE
只要按住MCU通电或重置时,只要按住PUSHBUTTON开关即可,LED闪烁即可。一旦开关释放,LED就会关闭,从未重新启动。如果在启动期间从未按下交换机,则LED永远不会出现!解释发生的事情,并根据需要修改程序以解决此问题。
条件“WHILE”循环需要放在无条件循环中:
Pseudocode列表将PIN0声明为输出
将Pin1声明为输入
环形
虽然pin1很高
设置PIN0高
暂停0.5秒
设置PIN0 LOW.
暂停0.5秒
ENDWHILE
endloop.
后续问题:电阻器r的有什么用途拉下在按钮电路中服务?
这个问题的目的是为了学生,以实际术语表示“虽然”循环代表:一个带有条件的循环。它还对比无条件循环的条件循环,并展示了如何在诸如此之类的交互式系统中扮演零件。
如果您想知道为什么我用伪代码写作,这里有几个原因:
如果我决定展示实际在微控制器中运行的代码,我会将问题注定是过时的问题。这样,我可以传达程序的精神,而不被链接到实际的编程标准。唯一的缺点是学生必须将我的伪代码转换为实际在其特定的MCU硬件上运行的真正代码,但这是一个问题,无论我选择哪种真正的编程语言如何。
当然,我本可以采取唐纳德Knuth方法,并发明了我自己的(虚构的)硬件和指令集。。。
检查以下示意图和程序列表(以“伪代码”而非正式编程语言编写),以确定在此微控制器单元中正在实现哪种类型的基本逻辑功能:
|
Pseudocode列表将PIN0声明为输出
将PIN1和PIN2声明为输入
环形
如果PIN1高,请设置PIN0高
elestif pin2高,设置pin0高
否则设置PIN0低
ENDIF
endloop.
此微控制器实现逻辑或功能。
虽然这种逻辑功能可以在硬连线(门)逻辑中可以更容易和更便宜,但目的是让学生思考可编程设备(MCU)内的测序指令集执行逻辑操作。这是一个概念的飞跃,基本但非常重要。
如果您想知道为什么我用伪代码写作,这里有几个原因:
如果我决定展示实际在微控制器中运行的代码,我会将问题注定是过时的问题。这样,我可以传达程序的精神,而不被链接到实际的编程标准。唯一的缺点是学生必须将我的伪代码转换为实际在其特定的MCU硬件上运行的真正代码,但这是一个问题,无论我选择哪种真正的编程语言如何。
当然,我本可以采取唐纳德Knuth方法,并发明了我自己的(虚构的)硬件和指令集。。。
检查以下示意图和程序列表(以“伪代码”而非正式编程语言编写),以确定在此微控制器单元中正在实现哪种类型的基本逻辑功能:
|
Pseudocode列表将PIN0声明为输出
将PIN1和PIN2声明为输入
环形
如果PIN1低,请将PIN0低
ELSEIF Pin2为LOW,则设置Pin0为LOW
否则设置PIN0高
ENDIF
endloop.
此微控制器实现了逻辑和功能。
虽然这种逻辑功能可以在硬连线(门)逻辑中可以更容易和更便宜,但目的是让学生思考可编程设备(MCU)内的测序指令集执行逻辑操作。这是一个概念的飞跃,基本但非常重要。
如果您想知道为什么我用伪代码写作,这里有几个原因:
如果我决定展示实际在微控制器中运行的代码,我会将问题注定是过时的问题。这样,我可以传达程序的精神,而不被链接到实际的编程标准。唯一的缺点是学生必须将我的伪代码转换为实际在其特定的MCU硬件上运行的真正代码,但这是一个问题,无论我选择哪种真正的编程语言如何。
当然,我本可以采取唐纳德Knuth方法,并发明了我自己的(虚构的)硬件和指令集。。。
检查以下示意图和程序列表(以“伪代码”而非正式编程语言编写),以确定在此微控制器单元中正在实现哪种类型的基本逻辑功能:
|
Pseudocode列表将PIN0声明为输出
将PIN1和PIN2声明为输入
环形
如果Pin1为“低”,则将Pin0设置为“高”
ELSEIF Pin2为LOW,则将Pin0设置为HIGH
否则设置PIN0低
ENDIF
endloop.
该微控制器实现了逻辑NAND函数。
虽然这种逻辑功能可以在硬连线(门)逻辑中可以更容易和更便宜,但目的是让学生思考可编程设备(MCU)内的测序指令集执行逻辑操作。这是一个概念的飞跃,基本但非常重要。
如果您想知道为什么我用伪代码写作,这里有几个原因:
如果我决定展示实际在微控制器中运行的代码,我会将问题注定是过时的问题。这样,我可以传达程序的精神,而不被链接到实际的编程标准。唯一的缺点是学生必须将我的伪代码转换为实际在其特定的MCU硬件上运行的真正代码,但这是一个问题,无论我选择哪种真正的编程语言如何。
当然,我本可以采取唐纳德Knuth方法,并发明了我自己的(虚构的)硬件和指令集。。。
检查以下示意图和程序列表(以“伪代码”而非正式编程语言编写),以确定在此微控制器单元中正在实现哪种类型的基本逻辑功能:
|
Pseudocode列表将PIN0声明为输出
将PIN1和PIN2声明为输入
环形
如果PIN1高,请设置PIN0低电平
ELSEIF Pin2为高,则Pin0为低
否则设置PIN0高
ENDIF
endloop.
该微控制器实现了逻辑下载或功能。
虽然这种逻辑功能可以在硬连线(门)逻辑中可以更容易和更便宜,但目的是让学生思考可编程设备(MCU)内的测序指令集执行逻辑操作。这是一个概念的飞跃,基本但非常重要。
如果您想知道为什么我用伪代码写作,这里有几个原因:
如果我决定展示实际在微控制器中运行的代码,我会将问题注定是过时的问题。这样,我可以传达程序的精神,而不被链接到实际的编程标准。唯一的缺点是学生必须将我的伪代码转换为实际在其特定的MCU硬件上运行的真正代码,但这是一个问题,无论我选择哪种真正的编程语言如何。
当然,我本可以采取唐纳德Knuth方法,并发明了我自己的(虚构的)硬件和指令集。。。
检查以下示意图和程序列表(以“伪代码”而非正式编程语言编写),以确定在此微控制器单元中正在实现哪种类型的基本逻辑功能:
|
Pseudocode列表将PIN0声明为输出
将PIN1和PIN2声明为输入
环形
若Pin1和Pin2相同,则将Pin0设置为“LOW”
否则设置PIN0高
ENDIF
endloop.
该微控制器实现逻辑异或功能。
虽然这种逻辑功能可以在硬连线(门)逻辑中可以更容易和更便宜,但目的是让学生思考可编程设备(MCU)内的测序指令集执行逻辑操作。这是一个概念的飞跃,基本但非常重要。
如果您想知道为什么我用伪代码写作,这里有几个原因:
如果我决定展示实际在微控制器中运行的代码,我会将问题注定是过时的问题。这样,我可以传达程序的精神,而不被链接到实际的编程标准。唯一的缺点是学生必须将我的伪代码转换为实际在其特定的MCU硬件上运行的真正代码,但这是一个问题,无论我选择哪种真正的编程语言如何。
当然,我本可以采取唐纳德Knuth方法,并发明了我自己的(虚构的)硬件和指令集。。。
一种微控制器是一种专用类型的数字计算机,用于提供系统的自动排序或控制。微控制器与普通数字计算机的不同之处在于它非常小(通常是一个单一集成电路芯片),有几个专用的引脚用于数字信号的输入和/或输出,并且内存有限。编入微控制器内存的指令告诉它如何对输入条件作出反应,以及发送什么类型的信号到输出。
微控制器的最简单的信号“理解”是离散电压电平:在芯片上的指定引脚上测量的“高”(大约V)或“低”(大致地电位)。微控制器内部的晶体管在输出引脚中产生这些“高”和“低”信号,它们由SPDT开关为简单的SAKE建模的动作:
|
它不需要许多想象力来可视化微控制器如何在实际系统中使用:根据输入引脚和/或时间条件打开和关闭外部设备。示例包括器具控制(烤箱定时器,温度控制器),汽车发动机控制(燃料喷射器,点火正时,自诊断系统)和机器人(伺服驱动,感官处理,导航逻辑)。事实上,如果你住在一个工业化的国家,你可能拥有几十个微控制器(嵌入各种设备),甚至没有意识到这一点!
但是,微控制器的实际限制之一是它们的低输出驱动电流限制:通常小于50 mA。微控制器的内部电路的小型化禁止包含具有任何显着额定功率的输出晶体管,因此我们必须将晶体管连接到输出引脚,以驱动任何显着的负载。
假设我们希望用一个微控制器驱动一个需要2安培24伏特电流的直流驱动电磁阀。一个简单的解决方案是在微控制器和电磁阀之间使用一个NPN晶体管作为“插入”装置,就像这样:
|
不幸的是,单个BJT不提供足够的电流增益来致动电磁阀。通过微控制器引脚的输出电流和仅为25的β(典型的电源晶体管),这仅提供大约500 mA到电磁阀。
对此问题的解决方案涉及两个双极晶体管达林顿对安排:
|
然而,还有另一种解决方案——用一个MOSFET来替换单个BJT,它完全不需要驱动电流。说明如何做到这一点:
|
|
这个长篇大论的问题的目的不仅仅是让学生们弄清楚如何用MOSFET取代BJT,而且是向他们介绍微控制器的概念,这是现代电子系统中越来越重要的设备。
有些学生可以询问该电路中二极管的目的。向他们解释这是一个整流二极管,有时也被称为自由轮二极管,必要的是防止晶体管通过电磁线圈产生的高压瞬变过度传感器,当断电时(“电感回滚”)。
微控制器用于为AC负载提供自动功率因数校正:
|
检查此示意图,然后回答以下问题:
我会让你和你的同学讨论MCU如何检测功率因数。这样做有一个以上的有效解决方案!
20μF和80μF电容器都将被啮合:MCU输出DCBA将是0101(注意输出必须关闭低的激励他们各自的继电器!)。使用此输出,校正的功率因数将为0.99939而不是原始0.77。
这个问题提出了一些有趣的概念供学生复习,同时也综合了电子学的新旧概念供学生思考。雷竞技最新app一定要留出足够的时间来讨论这个问题,以及功率因数计算所需的复习时间!
该微控制器被编程为通过PIN 0输出的脉冲宽度调制(PWM)控制来改变LED的感知亮度:
|
Pseudocode列表将PIN0声明为输出
将X声明为整数变量
环形
设置PIN0 LOW.
暂停100 - x微秒
设置PIN0高
暂停x微秒
endloop.
确定价值X必须以80%设置LED的亮度,以及PWM信号的频率是多少。
通过绘制PIN 0的输出时序图,可能最好地回答这个问题,注意到100 - X.μs和Xμs。
后续问题:考虑到这一点,这个PWM控制的解决是什么X是一个整数变量吗?我们如何改善该PWM控制方案的解决方案?
脉冲宽度调制(PWM)是产生仅具有“高”和“低”电压电平输出的微控制器(或其他数字电子电路)的模拟输出的非常常见的和有用的方式。用pwm,时间(或更具体地,占空比)为模拟域,幅值为数字域。这允许我们通过数字(开关)数据通道“偷偷地”发送模拟信号。
如果您想知道为什么我用伪代码写作,这里有几个原因:
如果我决定展示实际在微控制器中运行的代码,我会将问题注定是过时的问题。这样,我可以传达程序的精神,而不被链接到实际的编程标准。唯一的缺点是学生必须将我的伪代码转换为实际在其特定的MCU硬件上运行的真正代码,但这是一个问题,无论我选择哪种真正的编程语言如何。
当然,我本可以采取唐纳德Knuth方法,并发明了我自己的(虚构的)硬件和指令集。。。
许多微控制器都配有内置的PWM功能,这样你就不必自己编写自定义的PWM算法。这一事实表明脉宽调制作为一种控制方案的流行。解释为什么PWM如此流行,并给出一些如何使用它的实际例子。
我会让你为这个问题做自己的研究!答案是/不难找到。
脉冲宽度调制(PWM)是产生仅具有“高”和“低”电压电平输出的微控制器(或其他数字电子电路)的模拟输出的非常常见的和有用的方式。用pwm,时间(或更具体地,占空比)为模拟域,幅值为数字域。这允许我们通过数字(开关)数据通道“偷偷地”发送模拟信号。
脉宽调制(PWM)不仅适用于用微控制器产生模拟输出,而且也适用于通过只处理开-关(高-低)数字电压水平的引脚接收模拟输入。下面的电路将模拟电压信号送入比较器,产生PWM,然后将该PWM信号发送到微控制器的输入端:
|
Pseudocode列表将PIN0声明为输入
声明Last_Pin0为布尔变量
将Time_High声明为整数变量
将Time_Low声明为整数变量
将DUTED_CYCLE声明为浮点变量
将Time_High和Time_Low都设置为0
环形
设置Last_Pin0等于Pin0
如果PIN0高,则递增Time_high
如果PIN0低,则递增Time_low
如果last_pin0不等于pin0,则转到子程序
endloop.
子例程
设置职责等于(time_high /(time_high time_low))
将Time_High和Time_Low都设置为0
返回调用循环
tendubroutine.
解释这个程序是如何工作的。提示:last_pin0.布尔变量用于检测何时的状态Pin0已从0变为1或1到0。
该计划的最棘手的部分是弄明白的last_pin0.变量的函数,以及它如何决定何时执行子例程。我强烈建议您执行一个“思想实验”与一个缓慢的方波输入信号到微控制器,检查如何Time_high.和time_low.变量随方波的状态而增加。
脉冲宽度调制(PWM)是产生仅具有“高”和“低”电压电平输出的微控制器(或其他数字电子电路)的模拟输出的非常常见的和有用的方式。在这里,我们也看到它用作一种形式输入信号调制。用pwm,时间(或更具体地,占空比)为模拟域,幅值为数字域。这允许我们通过数字(开关)数据通道“偷偷地”发送模拟信号。
如果您想知道为什么我用伪代码写作,这里有几个原因:
如果我决定展示实际在微控制器中运行的代码,我会将问题注定是过时的问题。这样,我可以传达程序的精神,而不被链接到实际的编程标准。唯一的缺点是学生必须将我的伪代码转换为实际在其特定的MCU硬件上运行的真正代码,但这是一个问题,无论我选择哪种真正的编程语言如何。
当然,我本可以采取唐纳德Knuth方法,并发明了我自己的(虚构的)硬件和指令集。。。
数字计算机与外部设备通过港口:通常以4,8,16或更多组排列的终端(4位= 1)nybble., 8位= 1字节,16位= 2个字节)。这些终端可以被设置为高或低的逻辑状态,通过为计算机编写一个程序,发送一个数值到端口。例如,这是一个微控制器被指示发送十六进制数的图解F3港口A和2C到B港:
|
假设我们希望在八步序列中使用PORT A(引脚7,6,5和4)的较高四位,以驱动步进电机的线圈:
当每个引脚走高,它驱动功率MOSFET上,它发送电流通过相应的线圈步进电机。按照下图所示的“移位”顺序,电机将在每个周期内旋转少量。
以十六进制方式,写要发送到端口A的必要的数字序列,以生成这个特定的位移位顺序。保持端口A的低四位都处于低逻辑状态。
后续问题:在十进制而不是十六进制时编写相同的序列:
虽然这个问题的根本只不过是二进制到十六进制转换,但它还通过写入十六进制值将学生介绍了在微计算机端口中控制位状态的概念。因此,这个问题是非常实际的!
如果学生问,让他们知道美元符号前缀有时用于表示十六进制数。其他时间,使用前缀0x(例如,$ F3和0xF3意味着同样的事情)。
检查以下示意图和程序列表(以“伪代码”而非正式编程语言编写),以确定在此微控制器单元中正在实现哪种类型的基本逻辑功能:
|
Pseudocode列表将PIN0声明为输出
将PIN1和PIN2声明为输入
环形
如果PIN1与PIN2相同,请设置PIN0高
否则设置PIN0低
ENDIF
endloop.
该微控制器实现了逻辑独占式或功能。
虽然这种逻辑功能可以在硬连线(门)逻辑中可以更容易和更便宜,但目的是让学生思考可编程设备(MCU)内的测序指令集执行逻辑操作。这是一个概念的飞跃,基本但非常重要。
如果您想知道为什么我用伪代码写作,这里有几个原因:
如果我决定展示实际在微控制器中运行的代码,我会将问题注定是过时的问题。这样,我可以传达程序的精神,而不被链接到实际的编程标准。唯一的缺点是学生必须将我的伪代码转换为实际在其特定的MCU硬件上运行的真正代码,但这是一个问题,无论我选择哪种真正的编程语言如何。
当然,我本可以采取唐纳德Knuth方法,并发明了我自己的(虚构的)硬件和指令集。。。
数字计算机与外部设备通过港口:端子组通常按4组、8组、16组或更多组排列。这些终端可以被设置为高或低的逻辑状态,通过为计算机编写一个程序,发送一个数值到端口。例如,这是一个微控制器被指示发送十六进制数的图解2B.港口A和A9到B港:
|
假设我们希望使用每个端口的前七位(引脚0到6)来驱动两个7段,共阴极显示器,而不是使用BCD-to-7段解码器IC:
|
在端口A和B处写出要输出的必要的十六进制值,以在两个7段显示单元中生成显示“42”。
端口A = 5B16.港口B = 6616.
请注意,以下答案也有效:
端口A = DB16.端口B = E616.
后续问题:把这些相同的数值写成十进制而不是十六进制。
这个问题的根源仅仅是二进制到十六进制的转换,但它也向学生介绍了通过写入十六进制值在微机端口中控制位状态的概念。因此,这个问题是非常实际的!虽然在构建两位数十进制显示时,某人不太可能省略BCD-to-7段解码器(因为这种方式使用这么多珍贵的微控制器I / O引脚),但肯定是可能的!除此之外,您还需要获取微控制器以输出高低状态的某种组合,以及编程最快的方法是将十六进制值输出到端口。
如果学生问,让他们知道美元符号前缀有时用于表示十六进制数。其他时间,使用前缀0x(例如,$ F3和0xF3意味着同样的事情)。
在基于网格的显示器中驱动像素的一种方法是将像素组织成行和列,然后通过特定行线和特定列线的交叉点选择用于照明的单独像素。在此示例中,我们通过微控制器的两个8位(1字节)端口控制了8×8网格的LED:
|
注意A.高在Port B的PIN中需要状态,以激活一行,以及低的激活柱子需要端口A的一个引脚的状态,因为LED的阳极连接端口A, LED的阴极连接端口B。
确定我们需要在端口A和B处输出的十六进制代码,以激励8×8电网的远左下角的LED。
PORT A =
港口B =
端口A = $ FE
港口B = 80美元
检查以下示意图和程序列表(以“伪代码”而非正式编程语言编写),以确定在此微控制器单元中正在实现哪种类型的基本逻辑功能:
|
Pseudocode列表将PIN0声明为输出
将Pin1、Pin2和Pin3声明为输入
环形
如果PIN1高,请设置PIN0高
elestif pin2高,设置pin0高
ELSEIF Pin3为高,请将Pin0设置为高
否则设置PIN0低
ENDIF
endloop.
该微控制器实现了3输入逻辑或功能。
虽然这种逻辑功能可以在硬连线(门)逻辑中可以更容易和更便宜,但目的是让学生思考可编程设备(MCU)内的测序指令集执行逻辑操作。这是一个概念的飞跃,基本但非常重要。
如果您想知道为什么我用伪代码写作,这里有几个原因:
如果我决定展示实际在微控制器中运行的代码,我会将问题注定是过时的问题。这样,我可以传达程序的精神,而不被链接到实际的编程标准。唯一的缺点是学生必须将我的伪代码转换为实际在其特定的MCU硬件上运行的真正代码,但这是一个问题,无论我选择哪种真正的编程语言如何。
当然,我本可以采取唐纳德Knuth方法,并发明了我自己的(虚构的)硬件和指令集。。。
学生建立一个微控制器电路,用于打开LED一次,用于输入开关的每五个动力。电路很简单,使用条件循环的微控制器每次按下交换机时都会增加变量:
|
Pseudocode列表将PIN0声明为输出
将Pin1声明为输入
将X声明为整数变量
环形
虽然pin1很高
添加1到x(x = x 1)
ENDWHILE
如果x等于5,请将pin0设置为高并设置x到0
否则设置PIN0低
ENDIF
endloop.
不幸的是,程序没有按照计划执行。LED不是每五个开关启动一次,而是在开关释放时随机启动。有时,LED在第一个开关驱动后就会打开,而其他时候,需要推5次以上的开关才能打开。
经过一些仔细的分析,它发生在学生中,问题在于尽管环形。由于微控制器比人类的手要快得多,因此该循环执行多次,而交换机被按下而不是一次,这意味着变量X对于每个开关致动,从0到5次计数。那么,它只是偶然的X等于5尽管循环退出。
学生需求的是切换只能递增1,仅用于关闭开关转换:在积极的边缘输入脉冲的。问题是如何使用编程来做到这一点。
另一个学生,当面对同样的问题时,选择用这种方法来解决,而且效果很好:
Pseudocode列表将PIN0声明为输出
将Pin1声明为输入
声明作为布尔(0或1)变量切换
将Last_Switch声明为布尔(0或1)变量
将X声明为整数变量
环形
设置Last_Switch等于交换机
设置开关等于PIN1
如果switch = 1 and last_switch = 0,则添加1到x(x = x 1)
别的什么都不做x
ENDIF
如果x等于5,请将pin0设置为高并设置x到0
否则设置PIN0低
ENDIF
endloop.
解释这个程序如何成功增量X只有在按钮交换机的每次离外转换,而其他程序增量X在整个过程中快速按下按钮开关。
了解该算法如何工作的关键是实现变量last_switch.变量后面总是有一个扫描(循环执行)吗转变。
挑战问题:在程序中是否在以下两行进行了重要?必须在if /然后有条件的陈述之前立即放置吗?
设置Last_Switch等于交换机
设置开关等于PIN1
该脉冲检测算法非常常用于处理现实世界开关输入的程序中。它以软件执行脉冲检测网络在边缘触发的触发器内部,同样的效果:仅在脉冲信号的边缘发起某种动作。
根据条款和条件发布创作共用归因许可证