news 2026/5/1 9:06:56

蓝桥杯单片机备赛指南第十五讲· 省赛真题01:第十二届省赛完全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
蓝桥杯单片机备赛指南第十五讲· 省赛真题01:第十二届省赛完全解析

蓝桥杯单片机备赛指南第十五讲· 省赛真题01:第十二届省赛完全解析

1. 题目功能需求拆解

拿到题目(PDF),首先提取核心要素:

1.1 显示界面(3 个)

  1. 温度显示界面:标识符C,显示实时温度(保留2 位小数)。

    • 例:C 24.25
  2. 参数设置界面:标识符P,显示温度参数(整数)。

    • 例:P 25
  3. DAC 输出界面:标识符A(或U/F,依题意),显示当前DAC 输出电压(保留2 位小数)。

    • 例:A 3.50

1.2 逻辑控制

  • DAC 输出模式

    • 模式1VoutV_{out}Vout与温度相关。若T<TparamT < T_{param}T<Tparam,输出0V;若T≥TparamT \ge T_{param}TTparam,输出5V。

    • 模式2VoutV_{out}Vout固定输出(例如1V-5V 循环,或特定值,具体依代码逻辑)。

  • LED 指示

    • L1:模式1 时亮。

    • L2:温度显示界面时亮。

    • L3:参数设置界面时亮。

    • L4:DAC界面时亮。

1.3 按键定义

  • S4:界面切换(温度-> 参数-> DAC -> 温度)。

  • S5:模式切换(Mode 1 <-> Mode 2)。

  • S8:参数-1。

  • S9:参数+1。


2. 硬件与驱动层配置

本题用到两个核心外设,直接复用之前的驱动模块:

  1. DS18B20 (OneWire):复用Note 10的驱动。

    • 核心函数:Read_T()

    • 注意:读取需放在主循环,不能放在中断。

  2. PCF8591 (IIC):复用Note 11的驱动。

    • 核心函数:Da_Write(val)

    • 计算Val=Voltage×51.0Val = Voltage \times 51.0Val=Voltage×51.0


3. 软件架构实现(Grand Template 实战)

完全套用Note 12总结的“分时轮询架构”。

3.1 全局变量定义(RAM 镜像)

C

// === 核心数据 ===floatTemperature=0;// 实时温度unsignedcharT_Param=25;// 温度参数 (默认25)floatDAC_Volt=0;// DAC 输出电压// === 状态标志 ===unsignedcharSeg_Mode=0;// 0:温度, 1:参数, 2:DACunsignedcharWork_Mode=0;// 0:模式1, 1:模式2

3.2 主函数设计(Main Loop)

主函数只负责调度,不处理具体细节。

C

voidmain(){System_Init();// 关闭蜂鸣器、继电器等while(1){// 1. 数据获取 (Input)Temperature=Read_T();// 读取温度 (耗时操作放在主循环)// 2. 业务逻辑 (Logic)Key_Proc();// 按键处理Seg_Proc();// 数码管显示数据生成DAC_Proc();// DAC 输出逻辑计算LED_Proc();// LED 状态计算}}

3.3 按键处理(Key_Proc)

仅处理状态跳转和参数修改。

C

voidKey_Proc(){if(Key_Slow_Down)return;Key_Slow_Down=1;// ... (按键读取代码略) ...switch(Key_Down){case4:// S4: 切换界面if(++Seg_Mode>2)Seg_Mode=0;break;case5:// S5: 切换 DAC 模式Work_Mode^=1;break;case8:// S8: 参数 -if(Seg_Mode==1){// 仅在参数界面有效T_Param--;}break;case9:// S9: 参数 +if(Seg_Mode==1){T_Param++;}break;}}

3.4 核心业务逻辑(DAC_Proc)

将题目要求的DAC 逻辑独立封装,清晰明了。

C

voidDAC_Proc(){// 根据模式计算目标电压if(Work_Mode==0)// 模式 1: 温控输出{if(Temperature<T_Param)DAC_Volt=0.0;elseDAC_Volt=5.0;}else// 模式 2: 固定输出 (假设题意为固定 2V 或其他逻辑){DAC_Volt=2.0;}// 执行硬件输出Da_Write((unsignedchar)(DAC_Volt*51.0));}

3.5 显示处理(Seg_Proc)

只负责将数据“翻译”到Seg_Buf,不负责扫描。

C

voidSeg_Proc(){if(Seg_Slow_Down)return;Seg_Slow_Down=1;switch(Seg_Mode){case0:// 温度界面: C 24.25Seg_Buf[0]=12;// 'C'Seg_Buf[1]=10;// 熄灭// ... (中间熄灭) ...Seg_Buf[4]=(unsignedlong)(Temperature)/10;Seg_Buf[5]=(unsignedlong)(Temperature)%10;Seg_Buf[6]=(unsignedlong)(Temperature*10)%10;Seg_Buf[7]=(unsignedlong)(Temperature*100)%10;Seg_Point[5]=1;// 小数点break;case1:// 参数界面: P 25Seg_Buf[0]=13;// 'P'// ...Seg_Buf[6]=T_Param/10;Seg_Buf[7]=T_Param%10;Seg_Point[5]=0;// 清除小数点break;case2:// DAC 界面: A 3.50Seg_Buf[0]=10;// 'A' (假设字模 10)// ...Seg_Buf[5]=(unsignedchar)DAC_Volt;Seg_Buf[6]=(unsignedchar)(DAC_Volt*10)%10;Seg_Buf[7]=(unsignedchar)(DAC_Volt*100)%10;Seg_Point[5]=1;break;}}

4. 备赛心得与避坑指南

  1. DS18B20 的坑

    • 读取温度函数Read_T()内部有几十微秒甚至毫秒的延时,千万不要放在定时器中断里,否则会导致数码管闪烁、按键失灵。

    • 上电初始化时,DS18B20 默认输出85℃,建议在mainwhile(1)之前先读取一次温度丢弃,防止开机跳变。

  2. PCF8591 的坑

    • DAC 输出需要时间,虽然很快,但在高频循环中,建议加上简单的限流(例如每100ms 更新一次DAC),或者直接跟随主循环跑也没问题(因为有Read_T 的延时撑着)。
  3. 按键的坑

    • 题目中S8/S9 通常只在“参数设置界面”有效。务必在case 8case 9中加上if(Seg_Mode == 1)的判断,防止在看温度时误触修改了参数。
  4. 工程化思维

    • 看到这道题,你应该立刻反应出:这是DS18B20+ ** PCF8591**的组合。

    • 代码只需从之前的模块中复制粘贴,然后填入main.c的骨架中即可。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 3:45:33

推荐系统中特征交叉算法设计操作指南

推荐系统中的特征交叉&#xff1a;从工程实践到模型演进的深度指南 你有没有遇到过这种情况——明明模型结构越来越深&#xff0c;优化器调得飞起&#xff0c;AUC却卡在某个值上纹丝不动&#xff1f;数据量也够大&#xff0c;特征也都上了&#xff0c;但就是感觉“差了点意思”…

作者头像 李华
网站建设 2026/5/1 3:44:37

Desk.com界面简洁:快速查找解决方案

Fun-ASR WebUI&#xff1a;让语音识别真正服务于企业一线 在客服中心的日常工作中&#xff0c;一个常见的场景是&#xff1a;坐席刚刚结束一通长达十分钟的客户来电&#xff0c;电话内容涉及退款流程、会员升级和发票补开等多个事项。他需要迅速整理关键信息&#xff0c;创建工…

作者头像 李华
网站建设 2026/5/1 3:52:08

SMBus块数据传输:操作指南与协议限制说明

SMBus块数据传输实战指南&#xff1a;如何安全高效地读写32字节以内数据你有没有遇到过这样的场景&#xff1a;想从一个电源管理芯片里读取一段故障日志&#xff0c;结果发现它有几十个字节——用单字节读太慢&#xff0c;用IC批量读又怕不兼容&#xff1f;这时候&#xff0c;S…

作者头像 李华
网站建设 2026/5/1 3:49:12

如何通过去耦电容提升PLC抗干扰能力:项目应用详解

一个0.1μF电容如何拯救了差点“死机”的PLC系统&#xff1f;——去耦设计实战全解析在一次水泥厂自动化产线的现场调试中&#xff0c;工程师团队遇到了一个令人头疼的问题&#xff1a;PLC每隔几小时就会莫名其妙重启。更诡异的是&#xff0c;这种故障总发生在大型电机启停的瞬…

作者头像 李华
网站建设 2026/5/1 3:49:30

VAD检测集成Fun-ASR:精准切分语音片段提升识别效率

VAD检测集成Fun-ASR&#xff1a;精准切分语音片段提升识别效率 在智能会议记录、客服录音分析和远程教学转录等实际场景中&#xff0c;我们常常面对长达数小时的音频文件。如果直接将整段音频送入语音识别模型&#xff0c;不仅处理缓慢&#xff0c;还可能因为长时间静音或背景噪…

作者头像 李华
网站建设 2026/5/1 1:24:19

深入浅出RS232串口协议:控制信号线功能详解

串口通信的灵魂&#xff1a;揭开RS232控制信号线的工程智慧你有没有遇到过这种情况&#xff1f;两块MCU用TXD和RXD连好了&#xff0c;代码也写得没问题&#xff0c;可数据一多就开始丢包&#xff1b;或者设备明明通电了&#xff0c;上位机却始终检测不到连接状态。排查半天&…

作者头像 李华