单元训练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;
        }
    }
}
相关推荐
智者知已应修善业2 小时前
【51单片机用数码管显示流水灯的种类是按钮控制数码管加一和流水灯】2022-6-14
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
智商偏低8 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen10 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森12 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白12 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D12 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术15 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt16 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘16 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang16 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c