天猫网站建设的意义hao123上网主页官网设置成主页

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

天猫网站建设的意义,hao123上网主页官网设置成主页,洞头网站建设,内江市网站建设培训一、触摸按键 1.1理论讲解 1.1.1实验现象 触摸按键 1 单击与长按#xff0c;控制 LED1#xff1b;触摸按键 2 单击与长按#xff0c;控制 LED2;触摸按键 3 单击与长按#xff0c;控制 LED3;触摸按键 4 单击与长按#xff0c;控制继电器; 1.1.2硬件电路 是原理图上触摸…一、触摸按键 1.1理论讲解 1.1.1实验现象 触摸按键 1 单击与长按控制 LED1触摸按键 2 单击与长按控制 LED2;触摸按键 3 单击与长按控制 LED3;触摸按键 4 单击与长按控制继电器; 1.1.2硬件电路 是原理图上触摸按键、继电器、LED 灯三部分电路。 注意按键一般为高电平按下后为低电平在配置时就要注意是下降沿触发。 1.1.3外部中断 1.1.4HAL库函数 第一行读管脚状态要么低电平要么高电平。 第二行写管脚状态写高或者写低。 第三行选择一个管脚状态取反。 第四行锁定管脚进行保护状态不能写了。 第五行中断处理函数软件自动生成的后续讲解。 第六行外部中断的回调函数其中的变量是指示具体管脚是具体管脚的回调函数。如PA~PA15共用一个外部中断如上图共用一个回调函数通过变量去判断具体是哪一个管脚引起的中断 1.2初始化 1.2.1继电器初始化 推挽输出默认低电平使其刚开始处于断开的模式。 1.2.2触摸按键初始化 一般为高电平按下后为低电平故配置成下降沿触发。 如果配上升沿触发,单击按键松开才触发长按不触发如果配置成均触发则单击触发两次所以触发方式的配置和硬件紧密相连 注意不是配置成输入模式而是配置成中断模式后面软件编写也是启动中断的功能。 注意当按键 1 配置成中断时与其共使用一个外部中断的其他引脚配置成的中断就会自动消失  1.2.3配置按键的中断 1.3编程 在 main.c 中代码都是一样的但是代码调用的代码是不一样的不论是软件自动生成的初始化代码还是我们自己编写的代码。 MyInit.Peripheral_Set() 自定义初始化代码如下 static void Peripheral_Set() {printf(—-此程序实现触摸按键单击与长按功能—-\r\n);printf(Initialization completed, system startup!\r\n);printf(Software version is V%.1f\r\n\r\n,SoftWare_Version);printf(等待触摸按键:\r\n\r\n); } 说明 代码比较灵活长按的时间可以自由设定。单击的时间也可以自由设定可以不是10ms检查一次可以是5ms检查一次用户就不用等待那么长的时间。本测试中按键式中断并且是不影响其他中断的运行或者被影响当有别的中断并不会影响该中断检查是不是长按/ 单击的程序。注意上面说的别的中断以及在其他任何项目中的一般中断都要遵循“中断快进快出”的原则运行几十微秒~几百微秒问题都不大。 1.4实验现象 单击翻转 LED 灯的状态长按 ≥2S 翻转两次 LED 灯的状态两次间隔 200ms。 触摸按键 二、PWM 驱动蜂鸣器 2.1理论讲解 2.1.1程序功能 上电后无源蜂鸣器发出声音通过触摸按键关闭或打开蜂鸣器。 2.1.2无源蜂鸣器 无源蜂鸣器没有振动源驱动需要 PWM 波来驱动通过改变 PWM 波的频率来改变蜂鸣器的声音。 2.1.3 PWM 英文全称 Pulse-Width Modulation脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术通过调占空比调节光的强度、声音、电机等。本次是通过通用定时器进行频率调节。 2.1.4通用定时器 TIMx 本次是通过通用定时器来调节 PWM 的频率TIMx 器是一个通过可编程预分频器驱动的 16 位自动装载计数器构成。它适用于多种场合包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)。使用定时器预分频器和 RCC 时钟控制器预分频器脉冲长度和波形周期可以在几个微秒到几个毫秒间调整每个定时器都是完全独立的没有互相共享任何资源可以一起同步操作包含 计数器寄存器(TIMx_CNT)预分频器寄存器 (TIMx_PSC)自动装载寄存器 (TIMx_ARR) 2.1.5计数模式 在向上计数模式中计数器从0计数到自动加载值(TIMx_ARR计数器的内容)然后重新从0开始计数并且产生一个计数器溢出事件。这样的计数方式更加灵活在计数中间时可以和另一个设定的值进行比较进行其他需要的操作。 2.1.6 PWM模式 脉冲宽度调制模式可以产生一个由 TIMx_ARR 寄存器确定频率、由TIMx_CCRx寄存器确定占空 比的信号。 2.1.7HAL库函数 这些是定时器关于PWM的函数 上面4个是初始化函数不用我们写第4个DMA功能没用到第3个中断没用到第2个启动、停止输出功能后续就是通过触摸按键调用这两个函数打开或者关闭报警。 2.2软件初始化 2.2.1 框1 蜂鸣器的引脚为 PA8 在 Cubemx 中 PA8 只能设置成为定时器 1定时器 1 是高级定时器具有上面所讲的通用定时器的功能我们也只使用通用定时器的功能其他的功能不展开讲解和使用。 2.2.2 框2 Clock Source 时钟源选择使用内部时钟 Channel1输出 PWM 波 注意在这里设置完之后引脚可能会自动跳变到默认引脚这里是 PE9还需要手动重新设置为我们蜂鸣器的 PA8。 2.2.3 框3 1预分频器 系统时钟 72MAHB2 的时钟频率也是 72M 故 PA8 的初始时钟也是 72M 通过预分频器企图达到的目标评率为 1M 。 预分频器可以进行 0~65535 分频因为零也算所以后面要加一计算预分频器具体分频数 X 的公式如下 所以在软件配置的值为72000000/1000000-1目标频率是 1M
2其他 Counter Mode 计数模式向上 Counter Period 自动重装定时器设置 PWM 波的频率 频率预分频器频率/次数1000000/10001000HZ Internal Clock Division 内部时钟分频器不需要 Repetition Counter 重复计数器高级定时器功能此处不需要 auto-reload preload 自动重新装载必须使能由于后续需要改变蜂鸣器的音色就需要改变频率该变频率就需要重装载。如果没有使能后续即使改变 ARR 值夜不会重新装载进去。 2.2.4 框4 这里主要是设置占空比。 Mode 模式PWM 模式 1 Pulse 脉冲16 位值500这个值就是 CCR 你可以这么理解通过预分频器最后的时钟频率是1M但是我还要自己更加灵活的控制PWM的频率灵机一动想到了计数的方式。 所以才有了通过上面的设置让计数 1000 次ARR周期就变成了 1M×1000 1ms 。 就这么利用一下这个计数未免也太浪费资源了吧既然它在向上计数那就在中间设计一个比较值 CCR利用 CCR 来调节占空比小于 CCR 时 PWM 波输出高电平大于 CCR 是 PWM 波输出低电平。 Qutput compare preload 输出比较预加载使能可以改变占空比而不是固定占空比 极速模式关闭 CH 极性高小于 CCR 的状态 状态重置 2.2.5达到的状态 每隔一毫秒中断一次占空比为 50% 。 2.3编程 2.3.1文件结构 Buzzer.c控制蜂鸣器的开启并记录其状态。 Timer6.c通过定时器 6 改变频率发出不同的声音。 触摸按键触发中断关闭或者打开蜂鸣器。 2.3.2文件内容 1运行函数 main.c → System.c  运行函数中没有内容因为这一次是通过按键中断来改变声音。 2蜂鸣器结构体 Buzzer.h Buzzer.c #include MyApplication.hstatic void Buzzer_ON(void); static void Buzzer_OFF(void); //定义结构体 Buzzer_t Buzzer
{OFF_Status,//默认蜂鸣器初始状态是关闭Buzzer_ON,Buzzer_OFF//两个函数赋给函数指针函数如下 };static void Buzzer_ON(void)//打开蜂鸣器 {Buzzer.Status ON_Status;//更新一下状态为打开状态HAL_TIM_PWM_Start(htim1,TIM_CHANNEL_1);//通过这个HAL库函数打开定时器定时器1通道1 }static void Buzzer_OFF(void)//关闭蜂鸣器理论同上 {Buzzer.Status OFF_Status;HAL_TIM_PWM_Stop(htim1,TIM_CHANNEL_1); } 3Myinit.c 上电初始化只是打开蜂鸣器 4改变频率来改变音色 也是在 CallBack.c 文件中共有三个参数 f频率 → 通过改变 ARR1000:1ms2000:2ms500:0.5mscnt在某一频率是重复的时间长度 #include MyApplication.h/** name HAL_TIM_PeriodElapsedCallback* brief 定时器中断回调函数* param htim - 处理定时器的结构体指针 retval None
*/ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {static uint8_t Fre_Cnt 0;if(htim-Instance htim6.Instance){//程序支持运行指示灯间隔1s闪烁if(Timer6.usMCU_Run_Timer TIMER0_1S){Timer6.usMCU_Run_Timer 0;LED.LED_Flip(LED1);}//控制PWM的频率长度与大小if(Fre_Cnt 2){Fre_Cnt 0;//定时器时钟 1MHzPWM频率 1/((11000000)*ARR) 1000000/ARR //ARR 250, PWM频率为4KHz//ARR 500, PWM频率为2KHz//ARR 1000,PWM频率为1KHz//ARR 2000,PWM频率为0.5KHZTIM1-ARR - 10;if(TIM1-ARR 500)TIM1-ARR 2000;//设置占空比为50%TIM1-CCR1 TIM1-ARR / 2;}} } 5CallBack.c 只控制蜂鸣器打开或者关闭按下按键就翻转蜂鸣器的状态。 #include MyApplication.hvoid HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if(GPIO_Pin KEY1_Pin){LED.LED_Flip(LED2);//控制蜂鸣器开关if(Buzzer.Status ON_Status){Buzzer.OFF();}else{Buzzer.ON();}} } 2.3.3整体框架 等我明天8.3画出来等我 2.3.4实验现象 PWM波驱动蜂鸣器 三、数码管 3.1数码管驱动 IC 手册阅读 3.2编程