main.c 程序源代码:
// =========================== main.c ======================
#include "reg51.h"
#define LED_ON 20
#define LED_OFF 0
#define F_1HZ 1
#define F_2HZ 2
#define F_3HZ 3
#define F_4HZ 4
#define F_5HZ 5
#define F_6HZ 6
#define F_7HZ 7
#define F_8HZ 8
#define F_9HZ 9
#define F_10HZ 10
sbit LED1 = P2.0; // 定义LED IO口
unsigned char g_u8_LedFrequence; // 按键值
unsigned char g_flag_10ms_led; // 10ms 计时标志
//LED 以不同频率闪烁
//LED 亮的时间是:100ms
//LED 灭的时间是:相应周期 - 100ms
//LED 频率的范围:0-10 hz
void LED1_Flash(unsigned char flash_frequence)
{
static byte count, flash_period;
//根据频率选择周期
switch(flash_frequence)
{
case F_1HZ : flash_period = 100; break; //1 hz
case F_2HZ : flash_period = 50; break; //2 hz
case F_3HZ : flash_period = 34; break; //3 hz
case F_4HZ : flash_period = 25; break; //4 hz
case F_5HZ : flash_period = 20; break; //5 hz
case F_6HZ : flash_period = 17; break; //6 hz
case F_7HZ : flash_period = 14; break; //7 hz
case F_8HZ : flash_period = 12; break; //8 hz
case F_9HZ : flash_period = 11; break; //9 hz
case F_10HZ : flash_period = 10; break; //10 hz
case LED_ON: count = 0; break; //led on
case LED_OFF: count = 9; break; //led off
}
//根据周期闪烁
if(g_flag_10ms_led) //此标志在中断服务程序中,每10ms置一一次。
{
g_flag_10ms_led = 0; //清零 led的10ms计数标志,
count++; //计数器
if(count==1) LED1 = 1; //点亮LED LED亮的时间:1-10
else if(count == 10) LED1 = 0; //熄灭LED LED灭的时间:10-flash_period
else if(count >= flash_period) count = 0; //清零计数
}
}
void LED1_Flash(unsigned char flash_frequence); // 声明LED flash函数
void T0_Init_10ms(void) // timer0,初始化函数 ,定时时间为 10ms
{
TMOD |= 0x01;
TH0 = (65535 - 10000)/256;
TL0 = (65535 - 10000)%256;
ET0 = 1;
TR0 = 1;
EA = 1;
}
// ================================================ 主函数 ===================================================
void main(void)
{
P1.0 = 1; // P1.0 拉高
T0_Init_10ms(); // 定时器0,初始化,定时10ms
g_u8_LedFrequence = F_3HZ; // 设置LED闪烁的频率值,3hz
while(1)
{
LED1_Flash(g_u8_LedFrequence); // LED闪烁
}
}
// timer0 中断服务程序
void IRQ_T0(void) interrupt 1
{
g_flag_10ms_led = 1; // 置位 10ms 定时标志
}