一、题目
二、分析
根据题目画出整个程序的状态机的动作和变换以及条件
这里将界面和模式分开建立了两种类型的状态机,也可以将界面和模式设置为一种状态机也许。
按键控制着状态机的切换以及占空比的调节,然后LCD将各个状态机的动作显示出来。
考点:
调节PWM的频率:__HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__)
第一个参数:定时器句柄
第二个参数:自动重装载值(设置周期)
设置200hz:__HAL_TIM_SET_AUTORELOAD(&htim17, 4999);
假设主频80Mhz,经过80分频,得到计数频率1Mhz,每s,CNT中的值就加1,若超过ARR也就是自动装载值,就会产生更新事件。若自动重载值为1000,则每计数到1000,就发生中断,发生中断的周期为
s,即频率1Khz。
调节PWM的占空比:__HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__)
第一个参数:定时器句柄
第二个参数:PWM通道数
第三个参数:CCR,比较值
设置占空比60%:__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, (5000*0.6);
占空比:高电平占周期的百分比
注:题目说在数据界面下每按一次B3,互换PA6和PA7输出脉冲信号频率,这里还要保存原来的占空比不变。还有显示内容的行数与列数要与试题上的一致。
三、程序
#include "main.h"
#include "RCC\bsp_rcc.h"
#include "KEY_LED\bsp_key_led.h"
#include "LCD\bsp_lcd.h"
#include "UART\bsp_uart.h"
#include "ADC\bsp_adc.h"
#include "TIM\bsp_tim.h"
//***全局变量声明区
//*减速变量
__IO uint32_t uwTick_Key_Set_Point = 0;//控制Key_Proc的执行速度
__IO uint32_t uwTick_Led_Set_Point = 0;//控制Led_Proc的执行速度
__IO uint32_t uwTick_Lcd_Set_Point = 0;//控制Lcd_Proc的执行速度
//*按键扫描专用变量
uint8_t ucKey_Val, unKey_Down, ucKey_Up, ucKey_Old;
//*LED专用变量
uint8_t ucLed;
//*LCD显示专用变量
uint8_t Lcd_Disp_String[21];//最多显示20个字符
float v37;
uint8_t lcd_set=0; // 0: 数据界面 1:参数界面
uint8_t state=2; //状态机
uint8_t PA6=10,PA7=10;//初始占空比
//***子函数声明区
void Key_Proc(void);
void Led_Proc(void);
void Lcd_Proc(void);
void Usart_Proc(void);
//***系统主函数
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/*bsp资源的初始化*/
KEY_LED_Init();
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
UART1_Init();
ADC2_Init();
PWM_OUTPUT_TIM3_Init();
PWM_OUTPUT_TIM17_Init();
//*启动定时器3和定时器17通道输出
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); //PA6
HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1); //PA7
while (1)
{
Key_Proc();
Led_Proc();
Lcd_Proc();
}
}
//***按键扫描子函数
void Key_Proc(void)
{
if((uwTick - uwTick_Key_Set_Point)90)PA6=10;
}
}
if(unKey_Down == 3)
{
if(lcd_set==1) //参数界面
{
PA7 += 10;
if(PA7>90)PA7=10;
}
else if(lcd_set==0) //在数据界面下,交换频率保持占空比不变
{
if(state==2)state=3;
else if(state==0)state=1;
else if(state==1)state=0;
else if(state==3)state=2 ;
}
}
}
//***LED扫描子函数
void Led_Proc(void)
{
if((uwTick - uwTick_Led_Set_Point)
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?