首页 > 其他分享 >蓝桥杯- 第14届模拟题第二套

蓝桥杯- 第14届模拟题第二套

时间:2024-03-20 17:44:23浏览次数:22  
标签:14 Caculate ADC1 模拟题 蓝桥 LCD ADC2 Mode Cal

 

老规矩,先看外设要求...... ADC,LED,LCD,KEY,EEPROM。除了EEPROM之外其它没什么新意,所以我们来看看EEPROM就可以了(其它可以在第一套模拟题中看到)

 

/*****************************************************************************************************************/

EEPROM配置本来是需要写IIC驱动代码的,但赛方给了,我们就不浪费时间了。

直接调用里面的函数来完成我们要的功能就行

我们需要什么功能?  ------一个数据写入,一个数据读取

就这两个功能,没有其它的了(当然还有初始化)。

void E2P_Init()
{
  //初始化直接调用给的初始化函数即可 I2CInit(); }

接下来是数据写入功能

//写入数据需要什么?  -待写入的数据的地址DataAddr,要写入的数据量Count,以及要在芯片中存储的地址空间Store_Addr
uint8_t E2P_Write(uint8_t * DataAddr,uint8_t Count,uint8_t *Store_Addr)
{
    I2CStart();        //启动IIC传输
    I2CSendByte(0xa0);    //发送操作码(不同厂家对其芯片都会有一套操作码来执行不同的芯片功能,如这里0xa0是写入的操作码  0xa1是读取当前地址数据的操作码) 
    while(I2CWaitAck()!=0); //等待应答(阻塞写法不可取...........不要学我)
    I2CSendByte(*Store_Addr);  //发送要存储在芯片的地址位置,这里我会用到0位置
    while(I2CWaitAck()!=0);
    
    while(--Count)      //传输Count个字节的数据
    {
        I2CSendByte(*DataAddr++);    //发送要写入的数据
            while(I2CWaitAck()!=0);
    
    }
    
    I2CStop();        //结束IIC传输
    HAL_Delay(200);      //这里实际测试的时候需要一些延时

}

再之是数据读取功能

//读取数据需要什么?  -存放数据的地址DataAddr,要读取的数据量Count,以及要在芯片中读取的地址空间Store_Addr
uint8_t E2P_Read(uint8_t * DataAddr,uint8_t Count,uint8_t *Store_Addr)
{
     I2CStart();
  //为什么这里是写入操作码0xa0?  ------由于芯片上电默认是从0位置处开始读取数据,但我们要访问其它地址数据就需要先通过写入来改变当前芯片内部自增指针的指向 I2CSendByte(0xa0); while(I2CWaitAck()!=0); I2CSendByte(*Store_Addr);  //使指针指向要读取的数据地址 while(I2CWaitAck()!=0) ; I2CStart();          //重新启动传输 I2CSendByte(0xa1);      //读取操作码 while(I2CWaitAck()!=0) ; while(Count) { *DataAddr++ = I2CReceiveByte();  //从芯片内读取字节数据 if(--Count)    //当Count非0时返回应答,否则返回非应答 I2CSendAck(); } I2CSendNotAck(); I2CStop();       HAL_Delay(200); }

 至此,EEPROM的基本功能就已经完成了,下一步就是去实现代码逻辑。

 

/********************************************************************************************************/

由题目需求需要对ADC值进行计算,我们定义一些变量来完成这个功能

 #include "bsp/adc_proj.h"
 
  float Caculate_ADC1,Caculate_ADC2,Caculate_Result;   //采集ADC1,ADC2锁定和计算后的结果(题目要求是按下按键后锁定当前时刻ADC值)
  

  uint8_t Caculate_Mode = Cal_ADD;  //计算模式两种 Cal_ADD(1) ,Cal_DEC(0)
  uint8_t ADC1_G,ADC2_G;        //两个标志位确定ADC值是否已经锁定
  
    uint8_t ADC_Calculate()  
  {
      
      if(ADC1_G == 0 ||  ADC2_G == 0 )  //如果没有锁定,直接返回0,无法计算
          return 0;
      else
      {
          ADC1_G = ADC2_G = 0;   //重置锁定
          if(Caculate_Mode == Cal_ADD )
            Caculate_Result =  Caculate_ADC1 + Caculate_ADC2;
          else
            Caculate_Result =  Caculate_ADC1 - Caculate_ADC2;  
          
         
      }

         
          return 1;  //返回1,表示计算成功
  }

回到main函数中先对ADC进行初始化,在while中不断采集ADC值并通过计算得到计算结果给后续LCD输出

int main(void)
{
  MX_ADC1_Init();
  MX_ADC2_Init();

while(1)
{

  My_ADC_Get();
  if(ADC_Calculate() == 1) Cal_Cmd = 1;  //Cal_Cmd:作用是在LCD中区分输出ERROR还是数值

}

 

/**********************************************************************************************************************/

 再来完成LED的要求

#include "gpio.h"
 #include "BSP/led_proj.h"
//需要判断当前的LCD_Mode和ADC计算的结果Result
void LED_SHOW(uint8_t LCD_Mode,float Result)
{
    
      HAL_GPIO_WritePin(GPIOC, LED6_Pin|LED7_Pin|LED8_Pin|LED1_Pin
                          |LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin, GPIO_PIN_SET);
    if(LCD_Mode == DATA)  //数据界面LED1点亮
        My_Led_On(LED1,1);
    else
        My_Led_On(LED1,0);
    
    if(LCD_Mode == Caculate)//同上
        My_Led_On(LED2,1);
    else
        My_Led_On(LED2,0);
    
    if(Result > 6)      //计算值大于6时,闪烁LED3
        My_Led_Flash();
    else
        My_Led_On(LED3,0);

   //锁存器锁存
     HAL_GPIO_WritePin(LED_Cmd_GPIO_Port, LED_Cmd_Pin, GPIO_PIN_SET);
     HAL_GPIO_WritePin(LED_Cmd_GPIO_Port, LED_Cmd_Pin, GPIO_PIN_RESET);

}

 

/************************************************************************************************************************/

LCD显示部分

 #include "BSP/lcd_proj.h"
 uint8_t LCD_Mode = DATA;  //当前LCD显示
  uint8_t LCD_str[255];
  uint8_t Cal_Cmd;      //是否有计算结果(是否有锁存数据)
    
  

void DATA_SHOW(float ADC1_3_3,float ADC2_3_3)
{
  //显示ADC1,ADC2的实时采集值 LCD_Clear(Black); sprintf((char *)LCD_str," DATA"); LCD_DisplayStringLine(Line2,LCD_str); sprintf((char *)LCD_str,"R37:%1.2fV",ADC1_3_3); LCD_DisplayStringLine(Line3,LCD_str); sprintf((char *)LCD_str,"R38:%1.2fV",ADC2_3_3); LCD_DisplayStringLine(Line4,LCD_str); } void Caculate_SHOW(float Cal_Value,uint8_t Cal_Mode) {
  //显示锁存数据后的计算结果和当前计算模式 LCD_Clear(Black); sprintf((char *)LCD_str," COU"); LCD_DisplayStringLine(Line2,LCD_str); if(Cal_Cmd == 1)  //全部锁存 { sprintf((char *)LCD_str,"RES:%1.2fV",Cal_Value); LCD_DisplayStringLine(Line3,LCD_str); } else          //没有全部锁存,直接返回Error { sprintf((char *)LCD_str,"RES:Error"); LCD_DisplayStringLine(Line3,LCD_str); } sprintf((char *)LCD_str,"MODE:%d",Cal_Mode); LCD_DisplayStringLine(Line4,LCD_str); } void LCD_Show(float ADC1_3_3,float ADC2_3_3,float Cal_Value,uint8_t Cal_Mode) { if(LCD_Mode == DATA) DATA_SHOW( ADC1_3_3, ADC2_3_3); else Caculate_SHOW(Cal_Value,Cal_Mode); }

 

接下来在main函数中完成其它功能的逻辑

int main(void)
{

  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();  //LED.KEY初始化
  MX_ADC1_Init();  //ADC初始化
  MX_ADC2_Init();
E2P_Init();  //EEPROM初始化 E2P_Read(&Caculate_Mode,1,0);  //每次上电从0地址处读取当前的计算模式  -------这里不知道为什么一直读出来是255,后面找一下这个DEBUG......

  //LCD初始化配置 LCD_Init(); LCD_SetBackColor(Black); LCD_SetTextColor(White); while (1) { Key_Value = My_Key_Get();  //采集按键值 if(Key_Value == KEY1)    //数据界面按下KEY1  ->锁存ADC1的值 { if(LCD_Mode == DATA) { Caculate_Result = 0; Cal_Cmd = 0; ADC1_G = 1; Caculate_ADC1 = ADC1_3_3; } } else if(Key_Value == KEY2)  //同上 { if(LCD_Mode == DATA) { Caculate_Result = 0; Cal_Cmd = 0; ADC2_G = 1; Caculate_ADC2 = ADC2_3_3; } } else if(Key_Value == KEY3)  //按下KEY3,切换LCD界面 LCD_Mode ^=1; else if(Key_Value == KEY4)  //按下KEY4,切换数据计算模式 { if(LCD_Mode == Caculate) { if(Caculate_Mode == Cal_ADD) Caculate_Mode =Cal_DEC; else Caculate_Mode =Cal_ADD; E2P_Write(&Caculate_Mode,1,0); } }
    //采集并计算ADC值 My_ADC_Get(); if(ADC_Calculate() == 1) Cal_Cmd = 1; //LCD和LED显示 LCD_Show(ADC1_3_3,ADC2_3_3,Caculate_Result,Caculate_Mode); LED_SHOW(LCD_Mode,Caculate_Result); } }

 

 模拟题相较真题来说,逻辑简单很多,后面来做真题看看吧。

 

标签:14,Caculate,ADC1,模拟题,蓝桥,LCD,ADC2,Mode,Cal
From: https://www.cnblogs.com/sujian4412/p/18085654

相关文章

  • P1142 轰炸
    原题链接题解由于本题数据范围小,所以考虑暴力两点确定一条直线,所以我们先确定两个点AB,然后再遍历所有点C,如果向量AB叉乘AC等于0代表共线(没说从哪里起飞)code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;structnode{llx,y;}a[1000];intmain......
  • ceph:在centos7 上通过 ceph-ansible 安装ceph 14
    安装本质上就是熟悉ceph-ansible工具的各种配置关系:哪些时必须的?默认值来自哪里?各种配置分散在哪些配置文件内?...../site.yml./group_vars/all.yml  ./group_vars/其他各种组件特定的.yml  注意:all.yml里的配置很大部分时依赖于site.yml的配置的。根据需要进行配置。 ......
  • 第144篇:阿里低开项目 init方法
    好家伙,  demo-general项目运行后主界面如下 解析阿里低开引擎中的初始化方法init拆解项目来自阿里的lowcodeengine目录下的demogeneral项目0.找到入口文件可以看到整个项目用到的插件非常之多于是init: init 方法用于初始化低代码引擎,负责加载各种插件并配......
  • 第十三届蓝桥杯省赛B组
    目录试题A:排列字母试题B:寻找整数题解试题C:纸张尺寸试题D:数位排序试题E:蜂巢试题F:消除游戏暴力试题G:全排列的价值题解正解试题H:技能升级试题I:最长不下降子序列试题J:最优清零方案代码题解:滑动窗口试题A:排列字母见https://www.cnblogs.com/lushuang55/p/18069984试题B:寻找整数......
  • 蓝桥杯进阶03——光温显示综合应用
    一、分模块1.led和smg检测单片机上电后,8个LED灯从左到右依次点亮,然后再从左到右依次熄灭,进行LED的检测;8个数码管从左到右,逐个数码管全部段码点亮,然后再从左到右,这个数据管全部段码熄灭,进行数码管的检测。关闭蜂鸣器和继电器等无关设备。voidDisplaysmg(){ unsigned......
  • 蓝桥杯 2013 国 AC 网络寻路 第四届国赛 洛谷P8605
    [蓝桥杯2013国AC]网络寻路题目描述XXX国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径。源地址和目标地......
  • Day_14
    ##重复的DNA序列classSolution{publicList<String>findRepeatedDnaSequences(Strings){List<String>ans=newArrayList<>();intn=s.length();Map<String,Integer>map=newHashMap<>();......
  • 14. 磁盘
    iostat安装apt-getinstallsysstat 使用iostat-xm3#x表示显示扩展统计信息,m表示以兆为单位显示,3表示每隔3秒显示#输出如下:avg-cpu:%user%nice%system%iowait%steal%idle0.580.000.330.000.0099.08Device:rrqm/swrqm/sr/sw/srMB/......
  • P3714 [BJOI2017] 树的难题
    fromxcs题意:给定一棵\(n\)个节点的树,树根为\(1\),每个点有一个编号,每条边有一个边权。定义\(dep(x)\)表示一个点到根简单路径上边权的和,\(lca(x,y)\)表示\(x,y\)节点在树上的最近公共祖先。共\(m\)组询问,每次询问给出\(l,r\),求对于所有点编号的二元组\((i,j)\)......
  • 计数组合【2024蓝桥杯0基础】-学习笔记
    文章目录计数原理排列数组合数组合数性质例题分析代码复现例题2状态分析代码复现常见的排列组合问题圆排列代码复现第二类斯特林数感悟计数原理排列数组合数组合数性质例题分析代码复现defksm(a,b,c):ans=1%cwhileb!=0:......