单元训练09:定时器实现秒闪功能

蓝桥杯 小蜜蜂 单元训练09:定时器实现秒闪功能

cpp 复制代码
#include "stc15f2k60s2.h"

#define LED(x)                 \
    {                          \
        P0 = x;                \
        P2 = P2 & 0x1f | 0x80; \
        P2 &= 0x1f;            \
    }

#define L1 0xFE; // 定义L1
#define L8 0x7F; // 定义L8

typedef unsigned char uint8_t;

uint8_t timerCounterHalfSec = 0; // 0.5s,500ms计时
uint8_t EnableHalfSec = 0;       // 0.5s状态达到

uint8_t timerCounterFiveSec = 0; // 5s,5000ms计时
uint8_t EnableFiveSec = 0;       // 5s状态达到

uint8_t StatusHalfSec; // 用于L1切换状态
uint8_t StatusFiveSec; // 用于L8切换状态

void Timer0_Init(void) // 5毫秒@12MHz
{
    AUXR |= 0x80; // 定时器时钟1T模式
    TMOD &= 0xF0; // 设置定时器模式
    TL0 = 0xA0;   // 设置定时初始值
    TH0 = 0x15;   // 设置定时初始值
    TF0 = 0;      // 清除TF0标志
    TR0 = 1;      // 定时器0开始计时
    ET0 = 1;      // 使能定时器0中断
    EA = 1;
}

void blinkL1()
{
    switch (StatusHalfSec)
    {
    case 0:
        LED(P0 & L1);      // 点亮L1
        if (EnableHalfSec) // 0.5s延时
        {
            StatusHalfSec = 1;
            EnableHalfSec = 0;
        }
        break;
    case 1:
        LED(P0 | 0x01);    // 熄灭L1
        if (EnableHalfSec) // 0.5秒延时
        {
            StatusHalfSec = 0;
            EnableHalfSec = 0;
        }
        break;
    default:
        StatusHalfSec = 0;
        break;
    }
}
void blinkL8()
{
    switch (StatusFiveSec) // L8状态切换处理
    {
    case 0:
        LED(P0 & L8);      // 点亮L8
        if (EnableFiveSec) // 5秒延时
        {
            StatusFiveSec = 1;
            EnableFiveSec = 0;
        }
        break;
    case 1:
        LED(P0 | 0x80);    // 熄灭L8
        if (EnableFiveSec) // 5秒延时
        {
            StatusFiveSec = 0;
            EnableFiveSec = 0;
        }
        break;
    default:
        StatusFiveSec = 0;
        break;
    }
}
void main()
{
    LED(0xFF);     // 初始化,全灭
    Timer0_Init(); // 初始化定时器
    while (1)
    {
        blinkL1();
        blinkL8();
    }
}

void Timer0_Isr(void) interrupt 1
{
    if (++timerCounterHalfSec == 100) // 500ms,500ms/5ms = 100
    {
        EnableHalfSec = 1;
        timerCounterHalfSec = 0;
        if (++timerCounterFiveSec == 10) // 5s,5000ms,5000ms/500ms = 10
        {
            EnableFiveSec = 1;
            timerCounterFiveSec = 0;
        }
    }
}
相关推荐
恒锐丰小瑞1 天前
率能SS8837T 12V/1.8A/单通道H桥电机驱动IC,超低睡眠电流(120nA)与独立逻辑电源,用于摄像机/玩具/机器人
嵌入式硬件·机器人
从零开始的嵌入式之旅1 天前
day32
linux·c语言·经验分享·笔记·嵌入式硬件
集芯微电科技有限公司1 天前
低压功率MOSFETs选型手册
人工智能·单片机·嵌入式硬件·神经网络·生成对抗网络
Messy create1 天前
【BMS-AFE-分压采样电路】
单片机·能源
z落落1 天前
C# WinForm NModbus 串口通信+WinForm Modbus4 串口通信
开发语言·单片机·c#
Rocktech_ruixun1 天前
破人类记录!机器人如何跑得更快更稳?瑞迅科技RK3588机器人主板三大核心技术解析
人工智能·嵌入式硬件·机器人
sramdram1 天前
基于MCU单片机的电推剪控制解决方案
单片机·嵌入式硬件·mcu·mcu单片机
单片机仿真设计1 天前
【proteus仿真】基于 STM32 超声波传感器自动泊车系统 设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
三佛科技-187366133971 天前
HN8220A是什么芯片?大功率非隔离电源芯片HN8220A深度解析
单片机·嵌入式硬件
张海森-1688201 天前
cv610_flash 烧录两个rootfs操作,记录
单片机