温度采集器要点
长按短按
unsigned int Key_Tick;//按键计时变量
bit Key_Flag;//按键使能标志位
/*参数+*/
if(Seg_Mode == 2)//处于参数设置界面
{
if(Key_Down == 14)//按下S14
Key_Flag = 1;//开始计时
}
if(Key_Tick < 500)//短按
{
if(Key_Up == 14)//S14抬起
{
Key_Flag = Key_Tick = 0;//复位
if(++Temp_Set[Temp_Set_Index] > 70)
Temp_Set[Temp_Set_Index] = 10;
}
}
else//长按
{
if(Key_Old == 14)
{
if(++Temp_Set[Temp_Set_Index] > 70)
Temp_Set[Temp_Set_Index] = 10;
}
if(Key_Up == 14)//S14抬起
Key_Flag = Key_Tick = 0;//复位
}
if(Key_Flag == 1)//按键计时
{
if(++Key_Tick == 600)
Key_Tick = 600;
}
利用计时变量 Key_Tick 和使能标志位 Key_Flag,检测到按键下降沿时开始计时。若在 500ms 内检测到上升沿,视为短按;若超过 500ms 仍保持按下,则视为长按,并在长按期间连续增加参数值,实现快速调节。松开按键时复位计时标志。
亮度等级
unsigned char Led_Num;//Led亮度等级计数变量
unsigned char Led_Pwm;//Led亮度等级
/*亮度等级*/
if(Temp > Temp_Data[0])
Led_Pwm = 3;
else if(Temp < Temp_Data[1])
Led_Pwm = 9;
else
Led_Pwm = 6;
if(++Led_Num == 10) Led_Num = 0;
if(Led_Num < Led_Pwm)
Led_Disp(Seg_Pos,ucLed[Seg_Pos]);//Led显示
else
Led_Disp(Seg_Pos,0);
采用简单的 PWM(脉冲宽度调制)思想控制 LED 亮度。Led_Num 以 10 为周期循环计数,当计数值小于 Led_Pwm 时输出点亮信号,否则熄灭。Led_Pwm 的值越大,LED 在一个周期内点亮的时间越长,视觉上越亮。通过温度比较设置不同的 Led_Pwm 值,即可实现三种亮度等级。
四舍五入
Temp = Temp_Input[0]*100 + Temp_Input[1]*10 + Temp_Input[2];
/*四舍五入*/
if(Point_Wela == 1)//第一位小数点
Temp = (Temp + 50) / 100.0;
else if(Point_Wela == 2)//第二位小数点
Temp = (Temp + 5) / 10.0;
case 1://数据显示界面
Seg_Buf[0] = 13;//C
Seg_Buf[1] = Seg_Buf[2] = Seg_Buf[3] = 10;//固定熄灭
Seg_Buf[4] = (unsigned char)Temp / 10 % 10;
Seg_Buf[5] = (unsigned char)Temp % 10;
if(Seg_Buf[4] == 0) Seg_Buf[4] = 10;//高位管熄灭
break;
温度数据存储为 float 类型。通过将原始整数数据加上适当的偏移量(一位小数加 50,两位小数加 5)再进行除法运算,即可实现四舍五入。显示时,将 Temp 强制转换为 unsigned char 后分别取出十位和个位,若十位为 0 则将该位数码管熄灭,使显示更简洁。
蓝桥杯培训笔记:LED 模块
1. 添加芯片包
在 Keil 安装目录中找到并添加芯片包。
2. 锁存器
- Reset 为高电平:Q 输出为 0。
- Set 为高电平:Q 输出为 1。
- Reset 和 Set 均为低电平:Q 保持原状态不变。
当 LE 为低电平时,锁存器进入“锁存”状态,D0-D7 的数据无法传输,从而起到锁存数据的作用。
3. 74HC138 译码器
74HC138 是 3-8 线译码器,通过 C、B、A 三端输入 3 位二进制编码,控制 Y0~Y7 输出。其输出低电平有效,即选中的输出端为低电平,其余为高电平。
4. 编写程序
4.1 选择芯片
4.2 初始化底层
完成底层初始化,包括关闭 LED、关闭蜂鸣器等。
4.3 关闭 LED
P0 口的数据需要通过 Y4C 控制的三态门/锁存器进行传输。当 Y4 为 0 时,Y4C 为 1(Y4C 是 Y4 的反相信号),锁存器导通,P0 数据可写入。此时 P27~P25 需配置为 100。程序实现如下:
P0 = 0xff; // 关闭所有 LED
P2 = P2 & 0x1f | 0x80; // 将 Y4C 置高电平,允许 P0 数据写入锁存器
P2 &= 0x1f; // 将 Y4C 置低电平,锁存数据
4.4 关闭蜂鸣器
N_BUZZ 为低电平时蜂鸣器使能。由于 ULN2003 内部集成反相器,P0 输出高电平即可打开蜂鸣器。当 Y5 为 0 时,Y5C 为 1,P27~P25 需配置为 101。程序实现如下:
P0 = 0x00; // 关闭蜂鸣器
P2 = P2 & 0x1f | 0xa0; // 将 Y5C 置高电平,允许 P0 数据写入锁存器
P2 &= 0x1f; // 将 Y5C 置低电平,锁存数据
4.5 LED 底层驱动
#include "Led.h"
void Led_Disp(unsigned char addr, unsigned char enable)
{
static unsigned char temp = 0x00;
static unsigned char temp_old = 0xff;
if(enable)
temp |= 0x01 << addr; // 点亮对应 LED
else
temp &= ~(0x01 << addr); // 熄灭对应 LED
if(temp != temp_old) // 状态有变化时才刷新硬件
{
P0 = ~temp; // LED 低电平点亮,取反输出
P2 = P2 & 0x1f | 0x80; // 打开 Y4C 锁存
P2 &= 0x1f; // 关闭 Y4C 锁存
temp_old = temp;
}
}










