一、题目

 

二、分析

根据题目画出整个程序的状态机的动作和变换以及条件

这里将界面和模式分开建立了两种类型的状态机,也可以将界面和模式设置为一种状态机也许。

按键控制着状态机的切换以及占空比的调节,然后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); //PA6HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);      //PA7while (1){Key_Proc();Led_Proc();Lcd_Proc();}}//***按键扫描子函数
void Key_Proc(void)
{if((uwTick -  uwTick_Key_Set_Point)<50) return;//减速函数uwTick_Key_Set_Point = uwTick;ucKey_Val = Key_Scan();unKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val); ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val);    ucKey_Old = ucKey_Val;if(unKey_Down == 1) //数据界面和参数界面切换{if(lcd_set==0){lcd_set=1;LCD_Clear(Black);}else if(lcd_set ==1){lcd_set =0;LCD_Clear(Black);}}if(unKey_Down == 4) //模式切换{if(state==2)state=0;else if(state==0)state=2;else if(state==1)state=3;else if(state==3)state=1;}    if(unKey_Down == 2){if(lcd_set==1) //参数界面{PA6 += 10;if(PA6>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)<200)    return;//减速函数uwTick_Led_Set_Point = uwTick;if(state==2||state==3) //自动模式LED1亮{ucLed |= (1<<0);}else if(state ==0 ||state ==1){ucLed &= ~(1<<0);}if(lcd_set ==0) //数据界面 led2亮{ucLed |= (1<<1);}else if(lcd_set ==1){ucLed &= ~(1<<1);}LED_Disp(ucLed);
}void Lcd_Proc(void)
{if((uwTick -  uwTick_Lcd_Set_Point)<100)    return;//减速函数uwTick_Lcd_Set_Point = uwTick;v37 = 3.3*getADC2()/4096;if(lcd_set ==0) //数据界面{sprintf((char *)Lcd_Disp_String, "      Data");LCD_DisplayStringLine(Line0, Lcd_Disp_String);  sprintf((char *)Lcd_Disp_String, "    V:%4.2fV",v37);LCD_DisplayStringLine(Line2, Lcd_Disp_String);   if(state ==2 || state ==3)sprintf((char *)Lcd_Disp_String, "    Mode:AUTO");else if(state==0 || state==1)sprintf((char *)Lcd_Disp_String, "    Mode:MANU");LCD_DisplayStringLine(Line4, Lcd_Disp_String);   }else if(lcd_set==1) //参数界面{sprintf((char *)Lcd_Disp_String, "      Para  ");LCD_DisplayStringLine(Line0, Lcd_Disp_String); sprintf((char *)Lcd_Disp_String, "    PA6:%2d%%  ",PA6);LCD_DisplayStringLine(Line2, Lcd_Disp_String);    sprintf((char *)Lcd_Disp_String, "    PA7:%2d%%  ",PA7);LCD_DisplayStringLine(Line4, Lcd_Disp_String);    }   // stateswitch(state) // 2<->3 , 0<->1 在数据界面下b3按下交换频率和保持占空比不变{case 2:PA6 = v37/3.3*100; //转为百分比PA7 = PA6;__HAL_TIM_SET_AUTORELOAD(&htim3, 9999);  //PA6(绿色)的频率为200hz__HAL_TIM_SET_AUTORELOAD(&htim17, 4999);//PA7(黄色)的频率为100hz//占空比设置__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, (10000*v37/3.3));__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, (5000*v37/3.3));     break;case 3:PA6 = v37/3.3*100;PA7 = PA6;__HAL_TIM_SET_AUTORELOAD(&htim3, 4999);  __HAL_TIM_SET_AUTORELOAD(&htim17, 9999);//占空比设置__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, (5000*v37/3.3));__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, (10000*v37/3.3)); break;case 0:__HAL_TIM_SET_AUTORELOAD(&htim3, 9999);    __HAL_TIM_SET_AUTORELOAD(&htim17, 4999);//占空比设置__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, PA6*100); // 10000 *pa6 /100__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, 50*PA7);  break;case 1:__HAL_TIM_SET_AUTORELOAD(&htim3, 4999);__HAL_TIM_SET_AUTORELOAD(&htim17, 9999);//占空比设置__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 50*PA7);__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, 100*PA6); break;}
}void Error_Handler(void)
{/* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}
}

2020年嵌入式第十一届省赛真题解析相关推荐

  1. 历届蓝桥杯Scratch编程国赛 初级 中级 青少年编程比赛国赛真题解析【持续更新 已更新至27题】

    历届蓝桥杯国赛真题 第十三界.十二届.十一届等历届青少年蓝桥杯Scratch编程比赛国赛真题解析 国赛真题01-河马带球[试看] [蓝桥杯国赛真题01]Scratch河马带球 少儿编程蓝桥杯Scrat ...

  2. 历届蓝桥杯Scratch编程省赛 初级 中级 青少年编程比赛省赛真题解析【持续更新 已更新至35题】

    历届蓝桥杯scratch省赛真题 历年蓝桥杯Scratch编程比赛省赛真题详细解析 省赛真题35-水面倒影 [蓝桥杯省赛真题35]Scratch水面倒影 少儿编程scratch编程蓝桥杯省赛真题讲解_ ...

  3. 第九届蓝桥杯JavaA组(2018年)省赛真题解析

    第九届蓝桥杯JavaA组(2018年)省赛真题解析 1.分数 1/1+1/2+1/4+1/8+1/16+- 每项是前一项的一半,如果一共有20项,求这个和是多少 结果用分数表示,类似: 3/2,当然这 ...

  4. 【蓝桥杯Web】2022年第十三届蓝桥杯Web大学组国赛真题解析

    前言 省赛真题解析见: 2022年第十三届蓝桥杯Web大学组省赛真题解析(完整版) 2022年第十三届蓝桥杯Web大学组省赛真题解析(精华版) 更多蓝桥杯题解请查阅专栏:蓝桥杯 之前写省赛解析时篇幅过 ...

  5. 蓝桥杯到底难不难?(内附第11届省赛+国赛真题解析)

    前几天有粉丝留言蓝桥杯的事,刚好猪哥之前也参加过,就想和大家聊聊关于蓝桥杯的那些事! 今天猪哥会讲讲之前自己为什么参加蓝桥杯,拿到的成绩,以及讲解去年的真题,让大家感受一下真实比赛题目难度! 文章目录 ...

  6. 【蓝桥杯】 《3W字数总结》 蓝桥杯Java必备基础知识以及国赛真题解析

    本文会持续更新,如果对您有帮助的话可以点点关注,双击 本人2021年蓝桥杯C++B组国二,今年转战Java,并整理此文,希望能够对大家有所帮助,第一次写这么长的文章,可能有的地方写的不是很好,还请大家 ...

  7. 2014年蓝桥杯c/c++B组省赛真题解析

    一.啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒. 注意:答案是一个整数.请通过浏览器提交答 ...

  8. ②【Java 组】蓝桥杯省赛真题解析 [振兴中华] [三部排序] 持续更新中...

    个人简介:Java领域新星创作者:阿里云技术博主.星级博主.专家博主:正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 蓝桥杯真题--持续更新中... ...

  9. [蓝桥杯]2020年第十一届省赛真题C/C++ B组(七月)

    第十一届蓝桥杯省赛题目 试题A: 跑步训练 试题B: 纪念日 试题C: 合并检测 试题D: REPEAT 程序 试题E: 矩阵 试题F: 整除序列 试题G: 解码 试题H: 走方格 试题I:整数拼接 ...

最新文章

  1. php的遍历方法,PHP数组遍历方法总结
  2. Nginx防盗链,Nginx访问控制, Nginx解析php相关配置, Nginx代理
  3. CentOS7.4安装PyQt5.6
  4. 扔掉 Postman,一个工具全部搞定,真香!
  5. Maven修改本地仓库位置
  6. ios设置中性黑体_ios 解决自定义字体无法显示问题
  7. Windows 2000本地路由表
  8. overfitting(过度拟合)的概念
  9. Linux中的【.】【./】【/】代表的含义【转载】
  10. python字节流分割_Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
  11. html输入框2位小数,input输入框数字限制(2位小数,含0的正整数)
  12. java基础篇---网络编程(TCP程序设计)
  13. matlab双线性插值图像处理,数字图像处理:双线性插值
  14. 【推荐】数据治理资料合集
  15. springcloud服务假死
  16. 【毕业设计】基于人脸登录的大学生快递系统
  17. MATLAB图中图绘制(局部放大图)
  18. 学Java的四天(在入土的边缘疯狂试探。。。)
  19. bash: vi: command not found
  20. 建议71:区分异步和多线程应用场景

热门文章

  1. 从MapReduce的Shuffle原理 进行 生产参数调优
  2. 计算激变:当华为跨过一切走向星空
  3. oracle 计算年累计,ORACLE计算累计和
  4. C++运算符重载之加号运算符重载
  5. linux sslocal 客户端报错
  6. bert获得词向量_词向量详解:从word2vec、glove、ELMo到BERT
  7. 计算机硕士陷两难困境!考研难就业也难
  8. 双亲委派模型---学而时习之
  9. win7下安装nodejs16+
  10. 使用批处理实现完整备份Outlook 2010和恢复