第五周 过渡模拟二学习笔记

温度采集器要点

长按短按

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;
    }
}