|
#include "config.h"
// 延時函數(shù)
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調(diào)光程序
{
P0 = 0; // 點亮LED燈
}else{
P0 = 0xff; // 關(guān)閉LED燈
}
if(SYS_Time > 100)SYS_Time = 0;
}
void TIMER0_Init(void)
{
TMOD &= 0xf0;
TMOD |= 0x01; // 16位計數(shù)器
TH0 = T0RELOAD / 256;
TL0 = T0RELOAD % 256;
AUXR |= 0x80; // 計數(shù)器0時鐘為Fosc,即1T
PT0 = 1; // 定時器0優(yōu)先級控制位, 1 為高優(yōu)先級 0 為低優(yōu)先級
ET0 = 1; // 定時器0中斷使能
TR0 = 1; // 啟動定時器
EA = 1; // 開總中斷
}
// 主程序入口函數(shù)
void main(void)
{
U8 i; // 循環(huán)用變量
TR0 = 0; // 暫時關(guān)閉定時器
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++; // 調(diào)亮LED
}
P35 = 1; // 釋放按鈕3輸出
if(P35 == 0) // 檢測按鈕3是否按下
{
if(LED_PWM > 0)LED_PWM--; // 調(diào)暗LED
}
}
}
這個程序里定時器、各個變量的作用以及它們之間的關(guān)系是怎么樣的,LED_PWM++;LED_PWM--; 與定時器的周期是什么關(guān)系?
|
|