当前位置: 首页 > article >正文

STM32单片机学习(11)——GPIO输入实验

文章目录实验一按住按键LED点亮实验题目要求接线与程序框架程序实现存在的问题 —— 按键抖动优化后的程序代码实验二光敏电阻传感器控制LED实验光敏电阻光敏电阻传感器各部分元器件介绍比较器正极输入电压分析比较器负极输入电压分析最终结论临界状态与扩展编码实现利用光照强度控制LED程序实现扩展热敏电阻传感器debug实验一实验一按住按键LED点亮实验题目要求综合GPIO通用输出和输入模式,以及LED,按键,蜂鸣器等元器件完成以下实验。先将蜂鸣器和LED接入面包板接线可以自由完成。然后将两个按键接入面包板第一个按键的一脚要接在电源轨正极另一脚接入某个IO引脚比如PB1长按按键1实现切换LED流水灯,松开按键则熄灭所有LED灯第二个按键的一脚要接在电源轨负极另一脚接入某个IO引脚比如PA9按下按键1蜂鸣器响再次按下蜂鸣器关闭。接线与程序框架A0 A2 A4 A6接LED灯 采用推挽输出模式流水灯按键一端接B1 另外一端接电源正极采用上拉输入模式。蜂鸣器I/O口接在A10蜂鸣器按键一端接在A9另外一段接在电源负极采用下拉输入模式// 初始化led和按键voidinit_led_and_key(GPIO_InitTypeDef GPIO_InitStruct);// 初始化蜂鸣器和按键voidinit_buzzer_and_key(GPIO_InitTypeDef GPIO_InitStruct);// 初始化接口voidinit();// 流水灯voidstream_led();// 切换蜂鸣器状态voidstitch_state_of_buzzer();程序实现led流水灯部分实现//初始化led及其按键voidinit_led_and_key(GPIO_InitTypeDef GPIO_InitStruct){//初始化LEDGPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_PinGPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_2MHz;GPIO_Init(GPIOA,GPIO_InitStruct);// 初始化按键1GPIO_InitStruct.GPIO_PinGPIO_Pin_1;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IPU;//采用上拉输入模式GPIO_Init(GPIOB,GPIO_InitStruct);}//初始化voidinit(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;init_led_and_key(GPIO_InitStruct);}// 流水灯实现voidstream_led(){uint16_tPin_x1;// GPIO_ReadInputDataBit()函数读取当前引脚电平状态以此作为循环终止的判断while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)Bit_RESET){if(Pin_xGPIO_Pin_6)Pin_xGPIO_Pin_0;// 点亮GPIO_SetBits(GPIOA,Pin_x);// 延时Delay_Ms(200);// 熄灭GPIO_ResetBits(GPIOA,Pin_x);// 轮换Pin_xPin_x2;}}intmain(){init();while(1){// 默认输出高电平当按下按键引脚接地则输出低电平// 所以输出低电平时开始流水灯否则全部熄灭。if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)Bit_RESET)stream_led();elseGPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6);}}知识点温故引脚设置为上拉输入模式时若引脚输入了高电平此时读取输入数据寄存器可以读到代表高电平的1信号。若引脚输入了低电平或者引脚接地此时读取输入数据寄存器可以读到代表低电平的0信号。若引脚处于悬空状态无外部信号输入时由于上拉电阻的影响此时读取输入数据寄存器仍然可以读到代表 高电平的1信号。上拉输出模式引脚默认输出高电平蜂鸣器部分实现// 初始化蜂鸣器和按键2voidinit_buzzer_and_key(GPIO_InitTypeDef GPIO_InitStruct){GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_PinGPIO_Pin_10;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_2MHz;GPIO_Init(GPIOA,GPIO_InitStruct);// 初始化按键A9 采用下拉输入模式GPIO_InitStruct.GPIO_ModeGPIO_Mode_IPD;GPIO_InitStruct.GPIO_PinGPIO_Pin_9;GPIO_Init(GPIOA,GPIO_InitStruct);}// 初始化voidinit(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;init_buzzer_and_key(GPIO_InitStruct);}// 切换蜂鸣器状态voidswitch_state_of_buzzer(){if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_10)Bit_SET)GPIO_ResetBits(GPIOA,GPIO_Pin_10);elseGPIO_SetBits(GPIOA,GPIO_Pin_10);}intmain(){init();while(1){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)Bit_SET)switch_state_of_buzzer();}}知识点温故当引脚设置为下拉输入模式时若引脚输入了高电压此时读取输入数据寄存器可以读到代表高电平的1信号。若引脚输入了低电压或者引脚接地此时读取输入数据寄存器可以读到代表低电平的0信号。若引脚处于悬空状态无外部信号输入时由于下拉电阻的影响此时读取输入数据寄存器仍然可以读到代表低电平的0信号。总体的代码如下#includestm32f10x.h#include../tools/Delay.h/* - A0 A2 A4 A6接LED灯 采用推挽输出模式 - 流水灯按键一端接B1 另外一端接电源正极采用上拉输入模式。 - 蜂鸣器I/O口接在A10 - 蜂鸣器按键一端接在A9另外一段接在电源负极采用下拉输入模式 */voidinit_led_and_key(GPIO_InitTypeDef GPIO_InitStruct){//初始化LEDGPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_PinGPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_2MHz;GPIO_Init(GPIOA,GPIO_InitStruct);// 初始化按键1GPIO_InitStruct.GPIO_PinGPIO_Pin_1;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IPU;GPIO_Init(GPIOB,GPIO_InitStruct);}voidinit_buzzer_and_key(GPIO_InitTypeDef GPIO_InitStruct){// 初始化蜂鸣器GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_PinGPIO_Pin_10;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_2MHz;GPIO_Init(GPIOA,GPIO_InitStruct);// 初始化按键2 - A9 采用下拉输入模式GPIO_InitStruct.GPIO_ModeGPIO_Mode_IPD;GPIO_InitStruct.GPIO_PinGPIO_Pin_9;GPIO_Init(GPIOA,GPIO_InitStruct);}voidinit(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;init_led_and_key(GPIO_InitStruct);init_buzzer_and_key(GPIO_InitStruct);}voidstream_led(){uint16_tPin_x1;while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)Bit_RESET){if(Pin_xGPIO_Pin_6)Pin_xGPIO_Pin_0;// 点亮GPIO_SetBits(GPIOA,Pin_x);// 延时Delay_Ms(200);// 熄灭GPIO_ResetBits(GPIOA,Pin_x);// 轮换Pin_xPin_x2;}}voidswitch_state_of_buzzer(){if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_10)Bit_SET)GPIO_ResetBits(GPIOA,GPIO_Pin_10);elseGPIO_SetBits(GPIOA,GPIO_Pin_10);}intmain(){init();while(1){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)Bit_RESET)stream_led();elseGPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6);if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)Bit_SET)switch_state_of_buzzer();}}存在的问题 —— 按键抖动在上面的程序中我们成功实现了按下按键运行流水灯以及按下按键切换蜂鸣器的工作状态的功能。但是在控制蜂鸣器的过程中会发现经常会有不灵敏或是没反应的现象这就需要我们考虑更多的因素了从程序逻辑上来讲这个代码是完全没问题的但是嵌入式开发往往从实际触发。所以这里涉及到一个新的概念按键抖动所谓按键抖动由于按键内部使用的是机械式弹簧片来进行通断的所以在按下和松手的瞬间会伴随有一连串的、不稳定的电平抖动。为了规避抖动对最终电平结果的影响一个常用好用的办法就是加延时。于是我们可以提取一个函数用于确定按键是否按下弹起即返回按键状态的函数此函数的行为是这样的若按键按下且已弹起则程序需要切换LED状态此时函数返回一个整数值1。若按键没有按下则程序需要保持LED当前状态此时函数返回一个整数值0。考虑到代码中直接写字面值不够规范我们可以定义两个宏或者直接定义一个枚举类型。最后此函数的参考代码如下typedefenum{UNPRESSED0;PRESSED;}KeyState;KeyStateKEY_GetState(){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)Bit_RESET){// 延时20msDelay_Ms(20);// 跳过按下的过程while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)Bit_RESET);Delay_Ms(20);// 引脚输入稳定if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)Bit_SET)returnPRESSED;}returnUNPRESSED;}优化后的程序代码#includestm32f10x.h#include../tools/Delay.h/* - A0 A2 A4 A6接LED灯 采用推挽输出模式 - 流水灯按键一端接B1 另外一端接电源正极采用上拉输入模式。 - 蜂鸣器I/O口接在A10 - 蜂鸣器按键一端接在A9另外一段接在电源负极采用下拉输入模式 */typedefenum{UNPRESSED,PRESSED}KeyState;voidinit_led_and_key(GPIO_InitTypeDef GPIO_InitStruct){//初始化LEDGPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_PinGPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_2MHz;GPIO_Init(GPIOA,GPIO_InitStruct);// 初始化按键1GPIO_InitStruct.GPIO_PinGPIO_Pin_1;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IPU;GPIO_Init(GPIOB,GPIO_InitStruct);}voidinit_buzzer_and_key(GPIO_InitTypeDef GPIO_InitStruct){// 初始化蜂鸣器GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_PinGPIO_Pin_10;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_2MHz;GPIO_Init(GPIOA,GPIO_InitStruct);GPIO_SetBits(GPIOA,GPIO_Pin_10);// 初始化按键2 - A9 采用下拉输入模式GPIO_InitStruct.GPIO_ModeGPIO_Mode_IPD;GPIO_InitStruct.GPIO_PinGPIO_Pin_9;GPIO_Init(GPIOA,GPIO_InitStruct);}voidinit(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;init_led_and_key(GPIO_InitStruct);init_buzzer_and_key(GPIO_InitStruct);}voidstream_led(){uint16_tPin_x1;while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)Bit_RESET){if(Pin_xGPIO_Pin_6){Pin_xGPIO_Pin_0;}// 点亮GPIO_SetBits(GPIOA,Pin_x);// 延时Delay_Ms(200);// 熄灭GPIO_ResetBits(GPIOA,Pin_x);// 轮换Pin_xPin_x2;}}voidswitch_state_of_buzzer(){if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_10)Bit_SET){GPIO_ResetBits(GPIOA,GPIO_Pin_10);}else{GPIO_SetBits(GPIOA,GPIO_Pin_10);}}KeyStateKEY_GetState(){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)Bit_RESET){// 延时20msDelay_Ms(20);// 跳过按下的过程while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)Bit_RESET);Delay_Ms(20);// 引脚输入稳定if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)Bit_SET){returnPRESSED;}}returnUNPRESSED;}intmain(){init();while(1){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)Bit_RESET){stream_led();}else{GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6);}if(KEY_GetState()PRESSED){switch_state_of_buzzer();}}}实验二光敏电阻传感器控制LED实验光敏电阻光敏电阻通常由半导体材料制成如硫化镉CdS、硒化镉CdSe 等。其外形一般如下图所示我们使用的光敏电阻传感器上就存在这样的一个光敏电阻用于检测光照的强度。光敏电阻的半导体材料在光照下其内部的电子吸收光子能量后会从价带跃迁到导带从而产生更多的自由电子 - 空穴对使得半导体的电导率增加电阻值降低。光照强度越大产生的自由载流子电子和空穴就越多电阻值下降得越明显。总之光敏电阻是这样的一种电子元器件光照强度提高电阻的阻值减少。光照强度降低电阻的阻值将会增大。光敏电阻传感器一个典型的光敏电阻传感器的内部电路如下图所示首先这张图的左上角是电源指示灯的相关电路电容两个横杠在电路中的作用是稳定信号过滤干扰分析电路时也可以去掉传感器的AO针脚的目的是获取光敏电阻上的电压模拟信号我们暂时用不到所以也可以去掉。于是我们可以把这个电路图简化成如下图所示下面我们简单介绍一下图中的重要元器件。各部分元器件介绍LM393电压比较器LM393 是一种双路电压比较器能够对两个输入电压正极 和负极 -进行比较并且根据比较的结果使得DO口输出低电平或者进入高阻态状态。所以LM393的输出模式是开漏输出模式可以输出低电平或高阻态两种状态。LM393比较器和施密特触发器一样同样是一种将模拟信号转换到数字信号的元器件。具体工作逻辑如下当正极输入电压 大于 负极-输入电压时相当于开漏输出模式输出1即DO 引脚进入高阻抗状态电路在DO引脚处完全断开。在高阻态下DO 引脚本身没有确定的电压但由于电路中存在 上拉电阻 于是将 DO 引脚电压稳定拉到和VCC一致此时DO输出高电平。总之当正极电压 负极-电压时DO 引脚输出高电平。当正极输入电压 小于 负极-输入电压时相当于开漏输出模式输出0相当于DO引脚接地此时DO引脚输出低电平。此时 DO 引脚的电压被拉到低电平接近 0V。总之当正极电压 负极-电压时DO 引脚输出低电平。所以在这个电路中我们分析DO引脚输出电平的核心点在于分析比较器的正负极电压分别是多少以及它们如何变化。DO-LED指示灯这个DO-LED指示灯可以直接在元器件上面看到如下图所示在上面的电路图中和DO针脚指示灯相关联的其实只有这一部分这个LED指示灯的阳极接入了电源正极VCC阴极通过一个1K电阻和DO引脚相连。那么这个LED什么时候亮起呢显然当DO引脚输出高电平时VCC和DO引脚之间没有电势差LED熄灭。当DO引脚输出低电平时DO引脚接地此时形成完整通路LED点亮。所以这个DO-LED指示灯当它亮起时其实说明DO引脚输出了低电平。比较器正极输入电压分析光敏电阻传感器的DO针脚连接到了STM32的PB6引脚A.PB6引脚则通过输入模式读取DO针脚的高低电平从而确定当前的光照强度。现在我们已知DO针脚输出高低电平的规律如下当正极电压 负极-电压时DO 引脚输出高电平。当正极电压 负极-电压时DO 引脚输出低电平。那么比较器的正极输入电压如何来计算呢首先我们把和比较器正负极电压输入无关的部分删除简化后的电路图如下所示首先分析比较器正极的电压输入比较器正极输入的电压来源于 10kΩ 电阻和光敏电阻之间的分压点其相关的电流通路是“VCC -- 10K电阻 -- 光敏电阻 -- GND”10K电阻和光敏电阻是串联连接的串联分压当电流流过10K电阻时会分走一部分电压。而到了比较器正极接入点时比较器正极输入电压的就是光敏电阻在串联电路中分得的电压。于是我们可以得出以下结论比较器正极输入的电压就是光敏电阻在电路中分到的电压由于串联分压光敏电阻分到的电压和其阻值成正比而光敏电阻的阻值和光照强度成反比。所以光线越暗比较器正极输入的电压就越大光照越强比较器正极输入的电压就越小。比较器负极输入电压分析再分析比较器负极的电压输入比较器负极和滑动变阻器的滑动端相连其相关的电流通路是“VCC -- 滑动电阻器VR1 -- GND”比较器的负极和滑动变阻器的滑动端相连可以认为此时: 滑动变阻器的上半部分和下半部分串联起来的了。于是比较器负极输入的电压就是滑动变阻器的下半部分分到的电压这样负极就可以输入一个0V~VCC的电压。比较器负数输入电压就是滑动变阻器电位器的下半部分在电路中分到的电压。这个电位器可以直接使用螺丝刀配件盒中有拧动螺丝进行调节顺时针拧动电位器滑动变阻器的下半部分就越多分到的电压就越大比较器负极输入的电压就越大。逆时针拧动电位器滑动变阻器的下半部分就越少分到的电压就越小比较器负极输入的电压就越小。最终结论结合上面的所有结论针对我们的光敏电阻传感器实物我们可以以下四条最终结论顺时针拧动电位器向右比较器的负极输入电压就越大DO口就越容易输出一个低电平DO指示灯就越容易点亮。逆时针拧动电位器向左比较器的负极输入电压就越小DO口就越容易输出一个高电平DO指示灯就越难以点亮。光照强度越小光敏电阻上方的环境越暗比较器的正极输入电压就越大DO口就越容易输出一个高电平DO指示灯就越难以点亮。光照强度越大光敏电阻上方的环境越亮比较器的正极输入电压就越小DO口就越容易输出一个低电平DO指示灯就越容易点亮。临界状态与扩展现在我们需要使用光敏电阻传感器来判断光线的亮暗而DO指示灯刚好可以充当这个指示标志DO指示灯亮说明DO口输出低电平。如果不拧动电位器在光线比较亮光照强度比较大时DO指示灯更容易亮。DO指示灯熄灭说明DO口输出高电平。如果不拧动电位器在光线比较暗光照强度比较小时DO指示灯更容易熄灭。于是光敏电阻传感器就存在这样一个临界点在正常光照下DO指示灯亮起光线变暗或捂住光敏电阻DO指示灯熄灭。只需要拧动电位器就可以找到这个临界点。找到这个临界点后就可以使用该光敏电阻传感器指示光照强弱了。该如何拧动电位器找到临界点呢在正常光照下先顺时针向右拧动电位器保证DO指示灯点亮。光照条件不变再逆时针向左慢慢拧动电位器找到DO指示灯熄灭的位置。光照条件不变再稍稍顺时针向右拧动电位器。让DO指示灯点亮此时光敏电阻传感器就处于临界状态。下面根据已知结论扩展几个小问题加深你对光敏电阻传感器的理解。问题一DO指示灯目前亮起有几种方式可以使它熄灭可以尝试以下方式捂住光敏电阻或减弱环境光照。逆时针拧动电位器。问题二DO指示灯目前熄灭有几种方式可以使它点亮可以尝试以下方式增强环境光照比如打开手电筒照射光敏电阻。顺时针拧动电位器。编码实现利用光照强度控制LED把上述原理、结论都弄清楚后我们就可以编码实现利用光照强度来控制LED的亮灭了。我们想要实现的效果是当光线比较暗时用手遮住光敏电阻LED点亮当光线比较亮时不用手遮光敏电阻LED熄灭。此时的思路是当DO引脚输出高电平时意味着光线比较暗PB6引脚会读到一个高电平此时点亮LED即让PA3引脚输出低电平。当DO引脚输出低电平时意味着光线比较亮PB6引脚会读到一个低电平此时熄灭LED即让PA3引脚输出高电平。那么最后一个问题PB6引脚的工作模式应该如何选择呢首先肯定要选择输入模式那么是上拉输入还是下拉输入还是浮空输入亦或者无所谓呢这就需要考虑DO引脚输出高低电平的工作原理了上面已经讲过了当光照不足较暗时传感器的DO引脚实际会进入高阻态此时会由内部的上拉电阻将电平拉高引脚对外输出高电平。当光照充足较亮时DO引脚会输出低电平。根据这个规律那么此时引脚的输入模式可以选择两种浮空输入模式由于DO引脚没有悬空状态总是稳定的输出高低电平所以完全可以选择引脚的工作模式为浮空输入模式。上拉输入模式既然DO引脚输出高电平是依靠内部上拉电阻完成的那么也可以再将引脚设置为上拉输入这样可以增加上拉作用使得DO口输出的高电平更加稳定。当然这么做不是必须的注意不要选择下拉输入模式因为下拉输入会与传感器内部上拉电阻形成分压可能导致高电平电压不足从而影响逻辑判断。程序实现利用光敏电阻的特点实现一下功能。当环境足够亮时熄灭光敏电阻指示灯点亮PC13指示灯当环境不够亮时点亮光敏电阻指示灯熄灭PC13指示灯#includestm32f10x.h#include../tools/Delay.hvoidinit(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_PinGPIO_Pin_13;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_2MHz;//初始化PC13GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;//推挽输出模式GPIO_Init(GPIOC,GPIO_InitStruct);//初始化光敏电阻GPIO_InitStruct.GPIO_PinGPIO_Pin_14;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IN_FLOATING;// 浮空输入模式GPIO_Init(GPIOC,GPIO_InitStruct);}intmain(void){init();while(1){if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_14)Bit_RESET){GPIO_ResetBits(GPIOC,GPIO_Pin_13);}elseGPIO_SetBits(GPIOC,GPIO_Pin_13);}}代码还是很简单的重要的是理解光敏电阻特性以及如何分析问题。只要理解了光敏电阻那么热敏电阻也就不难理解了本质上就是把光换成了温度其他都是一样的扩展热敏电阻传感器搞明白了光敏电阻传感器那么热敏电阻传感器也就容易理解了。它本质上就是把光敏电阻传感器电路中的光敏电阻换成了热敏电阻其他分析思路基本一致。其参考电路原理如下图所示图中的 NTC即 Negative Temperature Coefficient负温度系数热敏电阻。它的特点是温度越高热敏电阻的阻值越小。同样使用它的DO口可以输出高低电平来指示环境温度是否超过一个阈值。这个阈值并不是固定写死的而是由模块上的电位器来调节的。其工作过程可以这样理解热敏电阻 NTC 和固定电阻构成分压电路产生一个随温度变化而变化的电压。电位器提供另一个可调的参考电压。LM393 比较器不断比较这两个电压的大小关系。当两者大小关系发生变化时DO 口的输出高低电平也随之翻转。电位器还是可以直接使用螺丝刀配件盒中有拧动螺丝进行调节顺时针拧动电位器滑动变阻器的下半部分就越多分到的电压就越大比较器负极输入的电压就越大。逆时针拧动电位器滑动变阻器的下半部分就越少分到的电压就越小比较器负极输入的电压就越小。而比较器正极输入电压就是NTC热敏电阻分得的电压而温度越高它的阻值越小。所以温度越高热敏电阻阻值越小比较器正极输入电压就越小。温度越低热敏电阻阻值越大比较器正极输入电压就越大。结合上述两段内容可以得出以下结论DO口想要输出高电平需要降低温度或者逆时针拧动电位器DO口想要输出低电平需要升高温度或者顺时针拧动电位器在电位器不变的前提下可以把DO口输出从高到低DO指示灯点亮作为温度超过阈值的特征。在电位器不变的前提下可以把DO口输出从低到高DO指示灯熄灭作为温度低于阈值的特征。越顺时针拧动电位器DO口就越容易输出低电平这可以降低传感器温度的阈值。越逆时针拧动电位器DO口就越容易输出高电平这可以升高传感器温度的阈值。debug实验一按照实验一的方法运行的话会发现一个问题就是直接按流水灯按键是没反应的原因是因为我们在KEY_GetState()函数实现中写了一个循环成为了阻塞函数所以程序运行过程中一直卡在该函数的循环中所以当你按住key2的时候会发现按key1是可以有流水灯的。我们可以选择注释掉那个循环虽然原写法更保险能够保证不会有抖动问题但是已经影响到了程序的正常运行并且注释之后也没有明显的抖动现象。

相关文章:

STM32单片机学习(11)——GPIO输入实验

文章目录实验一:按住按键LED点亮实验题目要求接线与程序框架程序实现存在的问题 —— 按键抖动优化后的程序代码实验二:光敏电阻传感器控制LED实验光敏电阻光敏电阻传感器各部分元器件介绍比较器正极输入电压分析比较器负极输入电压分析最终结论临界状态…...

WandEnhancer终极指南:3步解锁完整WeMod高级功能

WandEnhancer终极指南:3步解锁完整WeMod高级功能 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod高级功能付费而烦恼吗&#xff…...

Linux入门篇之RK3588基于Buildroot系统下安装交叉编译器

一、交叉编译器 交叉编译器是一种能够在一种计算机平台上生成另一种平台可执行代码的编译器。例如,在x86架构的PC上编译出运行于ARM架构嵌入式设备的程序。与本地编译器不同,交叉编译器的编译环境和运行环境是分离的。 二、为什么需要交叉编译器&#…...

5分钟让您的PS3手柄在Windows上重获新生:DsHidMini驱动完全指南

5分钟让您的PS3手柄在Windows上重获新生:DsHidMini驱动完全指南 【免费下载链接】DsHidMini Virtual HID Mini-user-mode-driver for Sony DualShock 3 Controllers 项目地址: https://gitcode.com/gh_mirrors/ds/DsHidMini 还在为闲置的索尼DualShock 3手柄…...

终极免费B站视频下载方案:BilibiliDown完整使用指南

终极免费B站视频下载方案:BilibiliDown完整使用指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/…...

not-my-job:基于代码变更自动定责的工程效能工具设计与实践

1. 项目概述:一个“甩锅”工具背后的工程哲学在软件开发团队里,我们经常会遇到一种让人哭笑不得的场景:一个功能模块出了问题,你作为负责人去排查,结果发现问题的根源在于另一个团队维护的底层依赖。当你试图去推动修复…...

Cursor Pro功能完全解锁指南:三步实现免费无限使用终极方案

Cursor Pro功能完全解锁指南:三步实现免费无限使用终极方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached you…...

092、Python在芯片验证中的应用:从脚本小子到验证架构师

092、Python在芯片验证中的应用:从脚本小子到验证架构师 一、那个凌晨三点的调试现场 上周三凌晨三点,实验室的空调嗡嗡作响。面前的屏幕上,UVM验证环境跑了八小时,终于在随机测试第237次迭代时触发了那个诡异的时序违例。日志文件12GB,波形文件更是高达80GB。手动分析?…...

基于红外通信的实体寻宝游戏:从MakeCode到CircuitPython的嵌入式开发实践

1. 项目概述:用红外线玩一场实体寻宝游戏如果你手头有几块Adafruit的Circuit Playground Express开发板,除了点亮LED、播放声音这些基础操作,有没有想过用它们来设计一个能跑能藏的实体互动游戏?红外寻宝游戏就是一个绝佳的选择。…...

从《现代微波滤波器》到CoupleFila:手把手教你打通耦合矩阵‘理论-软件-ADS’全链路

从理论到实践:耦合矩阵设计与ADS验证全流程指南 微波滤波器设计一直是射频工程师面临的核心挑战之一,而耦合矩阵作为设计过程中的关键工具,其重要性不言而喻。然而,许多初学者在接触这一领域时,往往被各种理论公式、计…...

从basicfwd到自定义发包器:手把手教你用DPDK 21.11写一个高性能发包程序

从basicfwd到自定义发包器:DPDK 21.11高性能网络编程实战 在当今云计算和边缘计算蓬勃发展的时代,网络性能优化已成为开发者必须面对的挑战。DPDK(Data Plane Development Kit)作为高性能数据包处理框架,正在被越来越多…...

基于CircuitPython与LED Animation库的NeoPixel蓝牙动态灯光系统

1. 项目概述与核心价值如果你玩过微控制器,尤其是像Adafruit的Circuit Playground Bluefruit这类功能丰富的开发板,那你肯定对板载的那一圈NeoPixel RGB LED灯珠印象深刻。它们不只是几个简单的指示灯,而是一个完整的、可编程的彩色光带。但很…...

JetBrains IDE试用期重置技术全解析:从原理到实战的开发者指南

JetBrains IDE试用期重置技术全解析:从原理到实战的开发者指南 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 在JetBrains IDE生态系统中,试用期管理是每个开发者都会面临的实际问题。ide…...

别熬大夜改 PPT 了!Paperxie AI PPT,一键搞定毕业论文答辩

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/ppt/createhttps://www.paperxie.cn/ppt/create 论文终稿刚定稿,答辩 PPT 的空白页面就开始让人焦虑。打开 PowerPoint,对着 “新建幻灯片” 发愣&am…...

BilibiliDown终极指南:快速下载B站视频的免费高效方案

BilibiliDown终极指南:快速下载B站视频的免费高效方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/b…...

英特尔®oneAPI 数学内核库(oneMKL)在Windows上的高效部署与VS2022集成指南

1. 为什么选择oneMKL?从矩阵计算到AI加速的全能选手 第一次接触oneMKL是在处理一个图像处理项目时,当时需要实现大规模的矩阵变换运算。用原生C写的算法跑起来像老牛拉车,直到同事推荐了英特尔的这个数学库。实测下来,同样的算法…...

Adobe-GenP 3.0终极指南:5分钟快速激活Adobe全系列创意软件

Adobe-GenP 3.0终极指南:5分钟快速激活Adobe全系列创意软件 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP是一款专为Adobe Creative Cloud用…...

NotebookLM深度适配语言学研究全流程(附Linguistic Annotation Pipeline v2.1实测报告)

更多请点击: https://intelliparadigm.com 第一章:NotebookLM语言学研究辅助的范式变革 从静态语料库到动态知识图谱的跃迁 NotebookLM 不再将语言学材料视为孤立文本,而是通过语义锚点(Semantic Anchors)自动识别术…...

基于Apify与AI模型的产品安全风险智能识别系统构建指南

1. 项目概述:一个面向产品安全与消费者风险管理的智能工具最近在梳理一些供应链和电商合规的项目时,我反复被一个核心痛点困扰:如何系统性地、自动化地识别和评估海量商品信息中潜藏的消费者风险?无论是作为平台方的风控团队&…...

开源桌面宠物应用开发指南:从原理到实践

1. 项目概述:一个开源的桌面宠物应用 最近在逛GitHub的时候,发现了一个挺有意思的开源项目,叫“openclaw-desktop-pet”。简单来说,它就是一个可以让你在电脑桌面上养一只小宠物的应用。这只宠物不是静态的图片,而是一…...

RK3568开发实战:基于buildroot定制开机自启Qt应用,彻底解决全屏显示与任务栏冲突

1. RK3568开发板与buildroot固件基础 RK3568作为瑞芯微推出的高性能处理器,在工业控制和嵌入式领域应用广泛。很多开发者选择buildroot作为其轻量级Linux系统构建工具,因为它能快速生成包含Qt运行环境的定制化固件。我在实际项目中发现,直接使…...

黑金AX301开发板+HS-04模块:FPGA超声波测距从原理到数码管显示的保姆级教程

黑金AX301开发板实战:基于HS-04模块的FPGA超声波测距系统设计 当超声波传感器遇到FPGA,我们能创造出怎样的精准测距系统?本文将带你从硬件连接到Verilog编码,完整实现一个基于黑金AX301开发板和HS-04超声波模块的测距系统。不同于…...

基于MCP协议的能源转型智能体:架构、实现与应用场景解析

1. 项目概述:能源转型智能体的“大脑”与“手脚”最近在做一个挺有意思的项目,核心是围绕一个叫apifyforge/energy-transition-intelligence-mcp的智能体展开的。这名字听起来有点拗口,拆开来看,“apifyforge”是发布者&#xff0…...

Arduino情绪交互与Flappy Bird游戏:Tone库与状态机实战

1. 项目概述:当Arduino学会“表达情绪”与“玩游戏”在嵌入式开发的世界里,让一块小小的微控制器板子“活”起来,发出声音、显示画面并与人互动,是件充满乐趣和挑战的事。我们常常追求功能的实现,但如何让交互本身变得…...

AS5600磁编码器与STM32的闭环步进电机控制(硬件设计+软件滤波+减速比处理)

1. AS5600磁编码器与STM32的闭环控制方案设计 第一次接触AS5600磁编码器时,我被它12位分辨率、非接触式测量的特性吸引。相比传统光电编码器,这个指甲盖大小的芯片能直接输出数字信号,特别适合集成到步进电机系统中。当时为了给实验室的3D打印…...

为claudecode配置taotoken代理解决封号与token不足痛点

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为 Claude Code 配置 Taotoken 代理解决封号与 Token 不足痛点 对于频繁使用 Claude Code 进行编程辅助的开发者而言,直…...

如何轻松获取九大网盘直链下载地址:LinkSwift完整使用指南

如何轻松获取九大网盘直链下载地址:LinkSwift完整使用指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / …...

Vue绘图画布组件:零基础打造专业级绘图应用

Vue绘图画布组件:零基础打造专业级绘图应用 【免费下载链接】vue-drawing-canvas VueJS Component for drawing on canvas. 项目地址: https://gitcode.com/gh_mirrors/vu/vue-drawing-canvas vue-drawing-canvas 是一个功能强大的Vue.js画布绘图组件&#x…...

如何快速掌握JSON Lint for PHP:从新手到专家的完整指南

如何快速掌握JSON Lint for PHP:从新手到专家的完整指南 【免费下载链接】jsonlint JSON Lint for PHP 项目地址: https://gitcode.com/gh_mirrors/jso/jsonlint 你是否曾经在深夜里调试JSON数据,却被那些晦涩难懂的错误信息折磨得焦头烂额&#…...

古吉拉特语TTS项目上线倒计时48小时!这份含11个合规性检查项的ElevenLabs交付清单请立刻保存

更多请点击: https://intelliparadigm.com 第一章:古吉拉特语TTS项目上线倒计时全景概览 古吉拉特语(Gujarati)作为印度西部广泛使用的官方语言,拥有超过 5500 万母语使用者,但其高质量、低延迟、可商用的…...