此片基于B站西风大模板创作,下图是十二届蓝桥杯单片机题目
硬件框图分析
通过硬件框图确定核心功能模块,包括LED、蜂鸣器、继电器、按键、数码管等外设的交互逻辑。重点关注温度传感器DS18B20和DAC转换模块的硬件连接方式。
基础底层搭建
初始化函数需完成所有外设的配置。LED、蜂鸣器、继电器采用GPIO控制,按键检测使用扫描或中断方式。数码管驱动需实现动态扫描,段选和位选信号根据硬件连接配置。
温度传感器DS18B20采用单总线协议,实现温度读取函数rd_temperature()。DAC模块通过I2C协议通信,封装Da_Write()函数完成电压输出。
数码管显示设计
定义全局变量Seg_Disp_Mode控制显示界面切换:
- 模式0:温度显示界面
- 模式1:参数设置界面
- 模式2:DAC输出界面
显示数据通过Seg_Buf[]数组传递,小数点位置由Seg_Point[]数组控制。温度值转换为数码管显示格式时需处理整数和小数部分:
(unsigned char)Temperature / 10 % 10; // 十位 (unsigned char)Temperature % 10; // 个位 (unsigned int)(Temperature * 100)/10 % 10; // 小数后第一位按键功能实现
按键处理函数采用状态机设计,不同界面下按键行为独立:
- 按键4:循环切换显示界面,同步更新
Temp_Disp和Temp_Ctrol的数值关联 - 按键8/9:在参数设置界面实现设定值增减,范围限制0-99
- 按键5:通过异或操作切换
Output_Mode工作模式
温度控制逻辑
模式1采用阈值比较:
if(Temperature < Temp_Ctrol) Voltage_Output = 0; else Voltage_Output = 5;模式2实现线性输出:
if(Temperature < 20) Voltage_Output = 1; else if(Temperature > 40) Voltage_Output = 4; else Voltage_Output = 0.15*(Temperature-20)+1;LED状态指示
LED显示与系统状态同步:
- LED0反映工作模式状态
- LED1-3通过位置编码指示当前显示界面
ucLed[0] = !Output_Mode; for(i=0;i<3;i++) ucLed[1+i] = (i == Seg_Disp_Mode);异常处理
针对DS18B20上电复位时可能出现的85℃异常值,在初始化阶段插入750ms延时并预先读取一次温度值。数码管显示函数需加入数据有效性校验。