#include <Reg52.h>
//--重定義函數(shù)變量--//
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/* 定義常量 */
#define FOSC 12000000L //主時鐘
#define T50us (65536-FOSC/12/1000000*50) //12T 模式下,50us 時間的計算方法
#define T10ms (65536-FOSC/12/1000*10) //12T 模式下,10ms 時間的計算方法
//--定義全局變量--//
uchar uTime1 = 0; //脈沖寬度數(shù)值
uchar uMove = 0; //移動標志
uchar uCount = 0; //每 10ms 計數(shù)值
uchar LightLevel[8] = {64,32,16,8,4,2,1,0};//亮度級別表:PWM的脈沖寬度
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼
uchar code DIG_CODE[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
void TimeConfig();
void main(void)
{
TimeConfig();
while(1)
{
uchar Led = 0x00; //當前點亮的Led的值
uchar i = 0;
if (uCount >= 10)
{
uCount = 0;
uMove++;
}
uTime1 %= 64;
uMove %= 8;
for(i = 0; i < 8; i++)
{
if (uTime1 < LightLevel[(i+uMove)%8])
Led |= 0x01 << i;
else
Led &= ~(0x01 << i);
}
P0 = Led;
}
}
void TimeConfig()
{
TMOD = 0x11; //設置定時計數(shù)器0和定時計數(shù)器1工作模式1
//--定時器0賦初始值,12MHZ下定時10ms--//
TL0 = T10ms;
TH0 = T10ms >> 8;
//--定時器1賦初始值,12MHZ下定時50us--//
TL1 = T50us;
TH1 = T50us >> 8;
TF0 = 0; //清除TF0標志
ET0 = 1; //開啟定時器0中斷
TF1 = 0; //清除TF1標志
ET1 = 1; //開啟定時器1中斷
EA = 1;
TR0 = 1; //開啟定時器 0
TR1 = 1; //開啟定時器 1
}
void Time0(void) interrupt 1 //0:外部中斷1; 1:定時器0中斷; 2:外部中斷2; 3:定時器1中斷; 4:串口中斷
{
TL0 = T10ms; //重新賦初值
TH0 = T10ms >> 8;
uCount++;
}
void Time1(void) interrupt 3 //0:外部中斷1; 1:定時器0中斷; 2:外部中斷2; 3:定時器1中斷; 4:串口中斷
{
TL1 = T50us; //重新賦初值
TH1 = T50us >> 8;
uTime1++;
}
|