#include "config.h"
// 延时函数
void delay(U32 dly)
{
U32 i;
while(--dly > 0)
{
for(i=0;i++;i<1000000);
}
}
#define TIMER0_RUN_HZ 10000 //每秒多少次进入定时器中断
#define T0RELOAD (65536 - (Fpclk/TIMER0_RUN_HZ))
// 定义一个易变型变量并初始化为0
volatile U32 SYS_Time = 0;
volatile U32 LED_PWM = 0;
void ISR_TIMER0(void) interrupt 1 using 1
{
// 重新装载定时器值
TH0 = T0RELOAD / 256;
TL0 = T0RELOAD % 256;
// 以下添加用户程序
SYS_Time++;
if(SYS_Time < LED_PWM) // PWM调光程序
{
P0 = 0; // 点亮LED灯
}else{
P0 = 0xff; // 关闭LED灯
}
if(SYS_Time > 100)SYS_Time = 0;
}
void TIMER0_Init(void)
{
TMOD &= 0xf0;
TMOD |= 0x01; // 16位计数器
TH0 = T0RELOAD / 256;
TL0 = T0RELOAD % 256;
AUXR |= 0x80; // 计数器0时钟为Fosc,即1T
PT0 = 1; // 定时器0优先级控制位, 1 为高优先级 0 为低优先级
ET0 = 1; // 定时器0中断使能
TR0 = 1; // 启动定时器
EA = 1; // 开总中断
}
// 主程序入口函数
void main(void)
{
U8 i; // 循环用变量
TR0 = 0; // 暂时关闭定时器
for(i = 0;i<3;i++)
{
P0 = 0; // 八个灯全亮
delay(50000); // 延时一段时间
P0 = 0xff; // 八个灯全灭
delay(20000); // 延时一段时间
}
TR0 = 1; // 启动定时器
while(1)
{
delay(5000); // 延时一段时间
P33 = 1; // 释放按钮1输出
if(P33 == 0) // 检测按钮1是否按下
{
LED_PWM = 0;// 熄灭LED
}
P34 = 1; // 释放按钮2输出
if(P34 == 0) // 检测按钮2是否按下
{
if(LED_PWM < 100)LED_PWM++; // 调亮LED
}
P35 = 1; // 释放按钮3输出
if(P35 == 0) // 检测按钮3是否按下
{
if(LED_PWM > 0)LED_PWM--; // 调暗LED
}
}
}
这个程序里定时器、各个变量的作用以及它们之间的关系是怎么样的,LED_PWM++;LED_PWM--; 与定时器的周期是什么关系?
|