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

网站提示域名重定向怎么做旅游网站名字

网站提示域名重定向怎么做,旅游网站名字,普陀微信网站建设,聊城手机网站建设电话文章目录 一 、硬件介绍二 、实验#xff1a;LED闪烁、LED流水灯、蜂鸣器提示2.1 需求1#xff1a;面包板上的LED以1s为周期进行闪烁。亮0.5s,灭0.5s.....2.2 需求2: 8个LED实现流水灯2.3 需求3#xff1a;蜂鸣器不断地发出滴滴、滴滴.....的提示音。蜂鸣器低电平触发。 三、… 文章目录 一 、硬件介绍二 、实验LED闪烁、LED流水灯、蜂鸣器提示2.1 需求1面包板上的LED以1s为周期进行闪烁。亮0.5s,灭0.5s.....2.2 需求2: 8个LED实现流水灯2.3 需求3蜂鸣器不断地发出滴滴、滴滴.....的提示音。蜂鸣器低电平触发。 三、硬件介绍-按键开关、光敏电阻四、 实验 按键控制LED、光敏传感器控制蜂鸣器4.1 需求1一个按键开关控制一个LED,每次按下按键LED就改变自己的亮灭状态两套系统互不影响4.2 需求2光敏电阻被遮挡蜂鸣器长鸣光敏电阻不被遮挡蜂鸣器不响。 道友蹉跎者光阴如梭有志者岁月如歌 核心本文共4个小实验 第一个LED灯闪烁 第二个LED流水灯 第三个按键控制LED 第四个光敏传感器控制蜂鸣器 一 、硬件介绍 1.1 LED、蜂鸣器、面包板 LED:发光二极管正向通电点亮反向通电不亮。有源蜂鸣器本实验内部自带振荡源将正负极接上直流电压即可持续发声频率固定。如下图所示的蜂鸣器模块使用三极管作为开关。无源蜂鸣器内部不带振荡源需要控制器提供振荡脉冲才可发声调整提供振荡脉冲的频率可发出不同频率的声音UP的51单片机课程中用晶振提供振荡源。 注LED长脚为正极灯里面内部小头为正极。本实验的蜂鸣器低电平驱动。 最右边的半圆符号是蜂鸣器 1.2 硬件电路 上图给出了led和蜂鸣器的驱动电路图。注意三极管的发射极一定要直接接正电源/地这是因为三极管的开启需要发射极和基极之间有一定的电压电压差如果接在负载侧则有可能会导致三极管无法正常开启。 三极管开关是最简单的驱动电路 这里的保护电阻限流电阻在UP视频中为了方便没有加自己设计电路需要加上去。 很多单片机中或者芯片片都使用了高电平弱驱动低电平强驱动的规则。 上右一的图是PNP三极管驱动电路类型当基极R1给低电平蜂鸣器能被驱动工作当R1给高电平三极管截止电流蜂鸣器不工作PNP的三极管最好接在上边NPN的三极管最好接在下边。 下右二的图是NPN类型当基极R1给高电平导通低电平断开 1.3 三极管的简单介绍 三极管Transistor 三极管是一种由三个半导体区域组成的电子元件通常是NPN或PNP型。它具有三个引脚发射极Emitter、基极Base和集电极Collector。三极管是一种可控电流放大器可以根据输入信号的变化来控制输出电流。它可以作为开关或放大器使用。在放大器应用中输入信号作用在基极上通过控制基极电流可以放大电流并将其输出到集电极。在开关应用中基极电流的变化可以控制集电极与发射极之间的电流流动实现开关功能。 PNP三极管驱动电路类型当基极R1给低电平蜂鸣器能被驱动工作当R1给高电平三极管截止电流蜂鸣器不工作PNP的三极管最好接在上边NPN的三极管最好接在下边。 NPN类型当基极给高电平导通低电平断开。 1.4 面包板 上图是面包板。可以看出面包板中间的金属爪是竖着排列的用于插各种元器件最上和最下的两条金属爪是横着排列的一般用于供电。注意在使用面包板之前一定要观察孔位的连接情况比如接电源那里可能会有断开的情况而且用杜邦线插拔可能会接触不到位的情况。 二 、实验LED闪烁、LED流水灯、蜂鸣器提示 2.1 需求1面包板上的LED以1s为周期进行闪烁。亮0.5s,灭0.5s… LED低电平驱动 低电平驱动Low-Level Driving是指在数字电路中输出信号的电平为低电平通常为低电压时能够正确地驱动连接的设备或元件。在数字电路中通常将高电平定义为逻辑1低电平定义为逻辑0。相当于低电平触发。 需要用到延时函数Delay.h、Delay.c ,在UP提供的“程序源码”中为了方便管理应在工程内建System文件夹专门存放这些可以复用的代码。 上图为LED闪烁接线图实际上应该在led和驱动电源之间接上保护电阻但由于本电路过于简单于是直接省略保护电阻。后面的LED流水灯“、”蜂鸣器提示”实验同样省略保护电阻我试过如果Vcc接5V甚至更大如图的小发光二极管容忍电压上限3v左右会冒烟烧坏 2.1 代码展示 选中函数名按F12进入查看函数参数原型部分注释没有改过来别搞乱了关注点是红色框框 上图为除库函数之外的LED闪烁-代码调用 main.c #include stm32f10x.h // Device header #include Delay.hint main(void) {/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟//使用各个外设前必须开启时钟否则对外设的操作无效/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure; //先定义结构体变量再给结构体赋值GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; //GPIO模式赋值为推挽输出模式GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; //GPIO引脚赋值为第0号引脚GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; //GPIO速度赋值为50MHzGPIO_Init(GPIOA, GPIO_InitStructure); //将赋值后的构体变量传递给GPIO_Init函数//函数内部会自动根据结构体的参数配置相应寄存器//实现GPIOA的初始化/*主循环循环体内的代码会一直循环执行*/while (1){/*设置PA0引脚的高低电平实现LED闪烁下面展示3种方法*//*方法1GPIO_ResetBits设置低电平GPIO_SetBits设置高电平*/GPIO_ResetBits(GPIOA, GPIO_Pin_0); //将PA0引脚设置为低电平Delay_ms(500); //延时500msGPIO_SetBits(GPIOA, GPIO_Pin_0); //将PA0引脚设置为高电平Delay_ms(500); //延时500ms/*方法2GPIO_WriteBit设置低/高电平由Bit_RESET/Bit_SET指定*/GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); //将PA0引脚设置为低电平第三个参数是指定写入的值Delay_ms(500); //延时500msGPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); //将PA0引脚设置为高电平Delay_ms(500); //延时500ms/*方法3GPIO_WriteBit设置低/高电平由数据0/1指定数据需要强转为BitAction类型*/GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); //将PA0引脚设置为低电平Delay_ms(500); //延时500msGPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1); //将PA0引脚设置为高电平Delay_ms(500); //延时500ms} } Delay.c //延时模块不用管代码怎么实现直接拿来用就行 #include stm32f10x.h/*** brief 微秒级延时* param xus 延时时长范围0~233015* retval 无*/ void Delay_us(uint32_t xus) {SysTick-LOAD 72 * xus; //设置定时器重装值SysTick-VAL 0x00; //清空当前计数值SysTick-CTRL 0x00000005; //设置时钟源为HCLK启动定时器while(!(SysTick-CTRL 0x00010000)); //等待计数到0SysTick-CTRL 0x00000004; //关闭定时器 }/*** brief 毫秒级延时* param xms 延时时长范围0~4294967295* retval 无*/ void Delay_ms(uint32_t xms) {while(xms--){Delay_us(1000);} }/*** brief 秒级延时* param xs 延时时长范围0~4294967295* retval 无*/ void Delay_s(uint32_t xs) {while(xs--){Delay_ms(1000);} } Delay.h #ifndef __DELAY_H //这是预处理指令用来判断某个宏是否已经定义如果该宏没有定义则执行下面的代码 #define __DELAY_H //宏定义void Delay_us(uint32_t us); void Delay_ms(uint32_t ms); void Delay_s(uint32_t s);#endif 当一个头文件例如delay.h被多个源文件引用时可以使用预处理指令 #ifndef、#define 和 #endif 来确保头文件只被编译一次。 #ifndef 预处理指令 #ifndef 是 “if not defined” 的简写。 #ifndef 用于检查某个宏是否未定义。如果该宏未定义则执行下面的代码。 如果宏已经定义过了#ifndef 中的代码将被忽略。 举例子说明 #endif 是C/C中的预处理指令用于结束条件编译块。 当在代码中使用 #ifdef、#ifndef 或 #if 这些条件编译指令时需要使用 #endif 来标记条件编译块的结束位置。 例如以下是一个简单的条件编译示例 #ifdef DEBUG_MODE// 调试模式下执行的代码printf(Debug mode is enabled.\n); #else// 正常模式下执行的代码printf(Debug mode is disabled.\n); #endif 在这个示例中 #ifdef DEBUG_MODE 判断是否定义了 DEBUG_MODE 宏。如果定义了该宏则执行调试模式下的代码否则执行正常模式下的代码。最后的 #endif 指令用于标记条件编译块的结束位置。它表示上面的条件编译块已经结束之后的代码将会被正常编译。总结来说 #endif 用于结束条件编译块它与 #ifdef 、 #ifndef 或 #if 一起使用确保条件编译的范围正确闭合。注意此后Delay.h、Delay.c 将作为常用处理函数长期存放于System文件夹中后续如果使用到将直接调用故后续不会再在笔记中展示源代码。 编程感想 Keil编译过后整个工程会比较大不利于分享给别人。可以使用UP主提供的批处理程序KeilKill.bat删掉工程中的中间文件后再分享给别人(编译前2M编译后20M,所以要使用批处理程序)其他人使用的时候只需要重新编译一下就行。本教程用到了RCC和GPIO两个外设这些外设的库函数在Library中一般存放在相应的.h文件的最后。将LED的短脚接负极长脚接PA0口就是高电平驱动方式但是现象和低电平相同。将GPIO设置成开漏输出模式可以发现高电平高阻态无驱动能力低电平有驱动能力所以一般常使用推挽输出模式 以便同时具备高电平和低电平的驱动能力。 5.记得添加文件夹的路径 2.2 需求2: 8个LED实现流水灯 面包板上的8个LED以0.5s切换一个的速度实现流水灯。低电平驱动。 上图为LED流水灯-接线图 代码调用关系与“2-1的LED闪烁实验”相同下面是代码展示 main.c #include stm32f10x.h // Device header #include Delay.hint main(void){ // //配置RCC寄存器使能GPIOC的时钟。GPIO都属于APB2外设 // RCC-APB2ENR 0x00000010; // //配置寄存器PC13通用推挽输出模式、输出模式50MHz // GPIOC-CRH 0x00300000; // //输出数据寄存器PC13 // //GPIOC-ODR 0x00002000;//LED灭 // GPIOC-ODR 0x00000000;//LED亮//1.开启GPIO的外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//2.配置寄存器PC13的端口模式//2.1 首先配置GPIO结构体GPIO_InitTypeDef GPIO_InitStructure ;//给结构体起名字GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;//寄存器模式为通用推挽输出GPIO_InitStructure.GPIO_Pin GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//寄存器引脚为13GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//输出速度为50MHz//2.2 然后才能调用函数配置寄存器GPIO_Init(GPIOA,GPIO_InitStructure);//3.配置数据寄存器PC13的输出//GPIO_SetBits(GPIOC,GPIO_Pin_13);//设置高电平灯灭 // GPIO_ResetBits(GPIOC,GPIO_Pin_13);//设置低电平灯亮while(1) {//使用GPIO_SetBits、GPIO_ResetBits进行赋值这里仅用于演示“或操作”同时赋值GPIO_SetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);GPIO_ResetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);//使用GPIO_Write,同时设置GPIOA所有引脚的高低电平实现LED流水灯//对指定的端口同时赋值GPIO_Write(GPIOA,~0x01); //0x0001 二进制0000 0000 0000 0001Delay_ms(500);GPIO_Write(GPIOA,~0x02); //二进制0000 0000 0000 0010Delay_ms(500);GPIO_Write(GPIOA,~0x04);//二进制0000 0000 0000 1000Delay_ms(500);GPIO_Write(GPIOA,~0x08);Delay_ms(500);GPIO_Write(GPIOA,~0x010);Delay_ms(500);GPIO_Write(GPIOA, ~0x20);Delay_ms(500);GPIO_Write(GPIOA, ~0x40);Delay_ms(500);GPIO_Write(GPIOA, ~0x80);//对应的二进制数 1000 0000表示最高位的引脚 } } 思路使用或操作 | 就可以实现只初始化定义某几个GPIO,或者某几个外设的时钟 2.3 需求3蜂鸣器不断地发出滴滴、滴滴…的提示音。蜂鸣器低电平触发。 注蜂鸣器执行四个动作为1个周期分别是响0.1s,静音0.1s,响0.1s,静音0.1s。 上图是蜂鸣器提示-接线图GPIOB,Pin_12 代码调用关系与“LED闪烁”实验相同下面是代码展示 mian.c #include stm32f10x.h // Device header #include Delay.hint main(void){// 开启APB2-GPIOB的外设时钟RCCRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 初始化PB12端口定义结构体及参数GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_Init(GPIOB, GPIO_InitStructure);while(1){GPIO_ResetBits(GPIOB, GPIO_Pin_12);Delay_ms(100);GPIO_SetBits(GPIOB, GPIO_Pin_12);Delay_ms(100);GPIO_ResetBits(GPIOB, GPIO_Pin_12);Delay_ms(100);GPIO_SetBits(GPIOB, GPIO_Pin_12);Delay_ms(100);Delay_ms(600);}; } 编程感想 1.控制蜂鸣器的IO端口可以随便选但是不要选择三个JTAG调试端口PA15、PB3、PB4。本实验选择PB12端口进行输出。 2.关于调用库函数有以下几种方法 直接查看每一个外设的.h函数拖到最后就可以看到本外设的所有库函数然后在对应的.c文件中查看函数定义和调用方式即可。查看库函数的用户手册-“stm32f103xx固件函数库用户手册.pdf”,这个中文版比较老新版本的用户手册可以在st公司的帮助文档中查看但只有英文版。CSDN百度别人的代码。 三、硬件介绍-按键开关、光敏电阻 上图是按键开关实物图虽然前面说过GPIO端口有专门的肖特基触发器对输入信号进行整型但按键开关的抖动幅度大、时间长所以还需要“软件消抖”。基本思路就是延迟5-10ms,跳过抖动时间范围即可。 上图是按键开关硬件电路上图给出了按键开关的硬件电路设计图(下接按键常用和上接按键)。对于按键开关来说常见以上四种设计方法而行业规范中单片机端口一般都有上拉输入模式弱上拉所以基本上就选择内部上拉/外部上拉的设计电路。 下接按键常用第一个图按下按键引脚为低电平松手引脚为高电平如果电路同时存在内部上拉和外部上拉那么其高电平的驱动能力更强但是低电平会更加耗电。两个下拉电路则可以使低电平驱动能力更强而不会明显增加损耗。浮空输入模式下每部没有上下拉此时必须在外部有上下拉电路。注意内部和外部的上下拉必须一致内部有上下拉时就可以不用配置外部上下拉。 上图是传感器模块实物图从左到右依次是光敏电阻传感器、热敏电阻传感器、对射式红外传感器、反射式红外传感器。传感器光敏电阻/热敏电阻/红外接收管等的电阻会随外界模拟量的变化而变化通过与定值电阻分压可得到模拟电压输出再通过电压比较器进行二值化即可得到数字电压输出。 上图是传感器模块原理图 上述所给出的是一个比较通用的传感器模块格式 左起第三个模块下面的可变电阻就是各种传感器模块所对应的阻值与上面的分压电压R1进行进而输出模拟电压值A0。电容C2是滤波电容。左边起第一个模块使用LM393模块通过运算放大器实现“电压比较器”的功能。IN-是一个可以调节的值IN则直接连接传感器的模拟分压AO,当AOIN-时数字输出DO拉高当AOIN-时数字输出DO拉低。左边起第二个模块通过一个滑变电阻器实现比较电压IN-的调整。左边起第四个模块电源指示灯。左边起第五个模块传感器模块的端口。LED2用于指示数字输出DO的值。注意R5上拉电阻保证DO的默认值为高。 补充情况 1.对于对射式红外传感器来说N1就是红外接收管并且额外还有一个点亮红外发射管的电路模拟电压表示时接收红外信号的强度。并且该模块常用于检测通断所以用两个电阻将阈值固定为1/2的参考电压而不是采用滑动变阻器。 2.对于反射式红外式传感器向下发射和接收红外光可以做循迹小车。 而对于传感器模块的电路设计来说由于采用模块的方案所以直接给传感器接上VCC和GND,将模拟信号AO和数字信号DO接在stm32的对应端口上即可。 本次实验采用数字信号DO接入,关于模拟信号接入的使用方法在后面AD/DA的实验中继续讲解。 四、 实验 按键控制LED、光敏传感器控制蜂鸣器 4.1 需求1一个按键开关控制一个LED,每次按下按键LED就改变自己的亮灭状态两套系统互不影响 LED低电平驱动。按键B11控制LEDA2,按键B1控制LEDA1.LED的状态改变是“松开触发”。 上图分别依次是按键控制LED-接线图和代码调用不包括库函数 以下是代码展示 main.c #include stm32f10x.h // Device header #include Delay.h #include LED.h #include Key.huint8_t KeyNum; //定义用于接收按键键码的变量int main(void) {/*模块初始化*/LED_Init(); //LED初始化Key_Init(); //按键初始化while (1){KeyNum Key_GetNum(); //获取按键键码if (KeyNum 1) //按键1按下{LED1_Turn(); //LED1翻转}if (KeyNum 2) //按键2按下{LED2_Turn(); //LED2翻转}} } LED.h #ifndef __LED_H #define __LED_Hvoid LED_Init(void); void LED1_ON(void); void LED1_OFF(void); void LED1_Turn(void); void LED2_ON(void); void LED2_OFF(void); void LED2_Turn(void);#endif Key.h #ifndef __KEY_H #define __KEY_Hvoid Key_Init(void); uint8_t Key_GetNum(void);#endif LED.c #include stm32f10x.h // Device header/*** 函 数LED初始化,初始化PA2、PA1作为两个LED的输出端口* 参 数无* 返 回 值无*/ void LED_Init(void) {/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*///初始化PA的输出端口定义结构体及参数GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Pin GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure); //将PA1和PA2引脚初始化为推挽输出/*设置GPIO初始化后的默认电平默认输出为低电平LED初始不亮*/GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2); //设置PA1和PA2引脚为高电平 }/*** 函 数LED1开启* 参 数无* 返 回 值无*/ void LED1_ON(void) {GPIO_ResetBits(GPIOA, GPIO_Pin_1); //设置PA1引脚为低电平 }/*** 函 数LED1关闭* 参 数无* 返 回 值无*/ void LED1_OFF(void) {GPIO_SetBits(GPIOA, GPIO_Pin_1); //设置PA1引脚为高电平 }/*** 函 数LED1状态翻转* 参 数无* 返 回 值无*/ void LED1_Turn(void) {if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) 0) //获取输出寄存器的状态如果当前引脚输出低电平{GPIO_SetBits(GPIOA, GPIO_Pin_1); //则设置PA1引脚为高电平}else //否则即当前引脚输出高电平{GPIO_ResetBits(GPIOA, GPIO_Pin_1); //则设置PA1引脚为低电平} }/*** 函 数LED2开启* 参 数无* 返 回 值无*/ void LED2_ON(void) {GPIO_ResetBits(GPIOA, GPIO_Pin_2); //设置PA2引脚为低电平 }/*** 函 数LED2关闭* 参 数无* 返 回 值无*/ void LED2_OFF(void) {GPIO_SetBits(GPIOA, GPIO_Pin_2); //设置PA2引脚为高电平 }/*** 函 数LED2状态翻转* 参 数无* 返 回 值无*/ void LED2_Turn(void) {if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) 0) //获取输出寄存器的状态如果当前引脚输出低电平{ GPIO_SetBits(GPIOA, GPIO_Pin_2); //则设置PA2引脚为高电平} else //否则即当前引脚输出高电平{ GPIO_ResetBits(GPIOA, GPIO_Pin_2); //则设置PA2引脚为低电平} } Key.c #include stm32f10x.h // Device header #include Delay.h/*** 函 数按键初始化初始化B11、B1作为按键2、按键1* 参 数无* 返 回 值无*/ void Key_Init(void) {/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOB, GPIO_InitStructure); //将PB1和PB11引脚初始化为上拉输入 }/*** 函 数按键获取键码* 参 数无* 返 回 值按下按键的键码值范围0~2返回0代表没有按键按下* 注意事项此函数是阻塞式操作当按键按住不放时函数会卡住直到按键松手*/ uint8_t Key_GetNum(void) {uint8_t KeyNum 0; //定义变量默认键码值为0if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) 0) //读PB1输入寄存器的状态如果为0则代表按键1按下{Delay_ms(20); //延时消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) 0); //等待按键松手Delay_ms(20); //延时消抖KeyNum 1; //置键码为1}if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) 0) //读PB11输入寄存器的状态如果为0则代表按键2按下{Delay_ms(20); //延时消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) 0); //等待按键松手Delay_ms(20); //延时消抖KeyNum 2; //置键码为2}return KeyNum; //返回键码值如果没有按键按下所有if都不成立则键码为默认值0 } 编程感想 1 .代码提示框如果不弹出可以使用CTRLspace 弹出代码提示框。如果没用的话大概率是和中英切换快捷键冲突输入法右键设置取消即可。 2.GPIO配置好之后默认就是低电平所以配置好后LED会默认是亮的状态。 3.本工程创建了全新的驱动函数文件夹Hardware,专门用于存放程序中使用到的外设(如LED、按键、光敏传感器等)的驱动函数。做好驱动代码的提取是非常重要的可以极大地方便梳理框架。 4.其实写完之后发现这个按键开关非常不灵敏经常出现按键松手后LED没有反应的情况大概这就是设置“光敏传感器控制蜂鸣器”实验的原因吧 4.2 需求2光敏电阻被遮挡蜂鸣器长鸣光敏电阻不被遮挡蜂鸣器不响。 蜂鸣器低电平驱动。光敏传感器光强越强阻值越小分压越小DO的LED指示灯低电平驱动。 上图是光敏传感器控制蜂鸣器的接线图下图是代码调用不包括库函数 main.c #include stm32f10x.h // Device header #include Delay.h #include Buzzer.h #include LightSensor.hint main(void) {/*模块初始化*/Buzzer_Init(); //蜂鸣器初始化LightSensor_Init(); //光敏传感器初始化while (1){if (LightSensor_Get() 1) //如果当前光敏输出1{Buzzer_ON(); //蜂鸣器开启}else //否则{Buzzer_OFF(); //蜂鸣器关闭}} } Buzzer.h #ifndef __BUZZER_H #define __BUZZER_Hvoid Buzzer_Init(void); void Buzzer_ON(void); void Buzzer_OFF(void); void Buzzer_Turn(void);#endif Buzzer.c #include stm32f10x.h // Device header/*** 函 数蜂鸣器初始化* 参 数无* 返 回 值无*/ void Buzzer_Init(void) {/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOB, GPIO_InitStructure); //将PB12引脚初始化为推挽输出/*设置GPIO初始化后的默认电平*/GPIO_SetBits(GPIOB, GPIO_Pin_12); //设置PB12引脚为高电平 }/*** 函 数蜂鸣器开启* 参 数无* 返 回 值无*/ void Buzzer_ON(void) {GPIO_ResetBits(GPIOB, GPIO_Pin_12); //设置PB12引脚为低电平 }/*** 函 数蜂鸣器关闭* 参 数无* 返 回 值无*/ void Buzzer_OFF(void) {GPIO_SetBits(GPIOB, GPIO_Pin_12); //设置PB12引脚为高电平 }/*** 函 数蜂鸣器状态翻转* 参 数无* 返 回 值无*/ void Buzzer_Turn(void) {if (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) 0) //获取输出寄存器的状态如果当前引脚输出低电平{GPIO_SetBits(GPIOB, GPIO_Pin_12); //则设置PB12引脚为高电平}else //否则即当前引脚输出高电平{GPIO_ResetBits(GPIOB, GPIO_Pin_12); //则设置PB12引脚为低电平} } LightSensor.h #ifndef __LIGHT_SENSOR_H #define __LIGHT_SENSOR_Hvoid LightSensor_Init(void); uint8_t LightSensor_Get(void);#endif LightSensor.c #include stm32f10x.h // Device header/*** 函 数光敏传感器初始化* 参 数无* 返 回 值无*/ void LightSensor_Init(void) {/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOB, GPIO_InitStructure); //将PB13引脚初始化为上拉输入 }/*** 函 数获取当前光敏传感器输出的高低电平* 参 数无* 返 回 值光敏传感器输出的高低电平范围0/1*/ uint8_t LightSensor_Get(void) {return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13); //返回PB13输入寄存器的状态 } 编程感想 1.模块化编程香每个模块都写一个专门的驱动函数存放在Hardware文件夹中使得main.c函数极其简单几乎就可以直接按照人类正常的功能逻辑书写代码 2.蜂鸣器是低电平驱动 光敏传感器光强越强那阻值越小分压越小光敏电阻被阻挡蜂鸣器长鸣。 3.获取光敏电阻返回的GPIO值初始值是1,当有光源时变为0。 参考B站STM32江协自动化【哈工大虎慕】 道友蹉跎者光阴如梭有志者岁月如歌
http://www.tj-hxxt.cn/news/223034.html

相关文章:

  • html基础网站建设优化seo
  • 网页设计作业 个人网站wordpress 个人站
  • 做外贸去哪些网站找老外人人商城源码
  • 爱空间网站模板wordpress模板制作软件
  • 青岛网站制作公司排名重庆喷绘制作
  • 成都网站开发外包网站建设 服务流程
  • 营销策划好的网站苏州seo优化公司
  • 做微商好还是开网站好没有网站可以做cpa
  • 长安做英文网站企业服务公司是干嘛的
  • 建设网站公司怎样的网站打开速度块
  • 青岛做网站哪家专业设计师 网站 贵
  • 专门做运动装备的网站做网站去哪里找广告主
  • 如何做网站的源码绍兴百度seo公司
  • 贵港公司做网站仙居做网站的
  • 张家港建网站价格南宁seo域名
  • qq整人网站怎么做医药网站开发
  • 网上做翻译兼职网站智慧校园学生端登录平台
  • 网页设计入门+齿轮站内seo内容优化包括
  • wordpress编码修改重庆网站seo推广
  • 好的网站设计制作网站主页排版
  • 用自己的电脑做服务器弄网站电子商务网站的设计
  • 中山网站制作公司淘宝二官方网站是做啥的
  • 重庆专业网站搭建英语外贸网站建设
  • it网站建设资讯网科技公司网站制作公司
  • 做网站时空间的选择seoheuni
  • 视频网站建设服务网站如何关闭
  • 珠海营销网站建设网站换域名 百度收录
  • 长沙网站开发哪家好外网怎样访问自己做的网站
  • 宁波网站seo报价微信小程序开发流程图
  • 有专门做最佳推荐的网站北京专业的网站建设