单元训练09:定时器实现秒闪功能
蓝桥杯 小蜜蜂 单元训练09:定时器实现秒闪功能
#include "stc15f2k60s2.h"#define LED(x) \{ \P0 = x; \P2 = P2 & 0x1f | 0x80; \P2 &= 0x1f; \}#define L1 0xFE; // 定义L1
#define L8 0x7F; // 定义L8typedef 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); // 点亮L1if (EnableHalfSec) // 0.5s延时{StatusHalfSec = 1;EnableHalfSec = 0;}break;case 1:LED(P0 | 0x01); // 熄灭L1if (EnableHalfSec) // 0.5秒延时{StatusHalfSec = 0;EnableHalfSec = 0;}break;default:StatusHalfSec = 0;break;}
}
void blinkL8()
{switch (StatusFiveSec) // L8状态切换处理{case 0:LED(P0 & L8); // 点亮L8if (EnableFiveSec) // 5秒延时{StatusFiveSec = 1;EnableFiveSec = 0;}break;case 1:LED(P0 | 0x80); // 熄灭L8if (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;}}
}