#include //包含 51 标准文件头
#define uchar unsigned char
#define uint unsigned char
uchar dat=0; //定义 BCD 计数单元(范围: 0~99)
uchar i; //定义循环变量
int cnt=0;
sbit key=P1^0; //定义按键
/*---------------------- T0 初始化子函数 -----------------------*/
void Timer0Init(void) //50毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
TF0 = 0; //清除TF0标志
EA = 1; //全局中断使能
ET0 = 1; //定时器0中断使能
}
/*---------------------- T1 初始化子函数 -----------------------*/
void Timer1Init(void) //50毫秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xB0; //设置定时初值
TH1 = 0x3C; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
EA = 1; //全局中断使能
ET1 = 1; //定时器1中断使能
}
/*-------------------- T0 中断服务子函数 -----------------------*/
void Timer0_int(void) interrupt 1 //T0 中断服务子程序
{
i++;
if(i==10) //计时 1S
{
i = 0;
dat++;
if(dat==100) //计时到 100S 时,又从 0 开始
{
dat = 0;
}
}
}
/*-------------------- T1 中断服务子函数 -----------------------*/
void Timer1_isr (void) interrupt 3
{
cnt++;
if(cnt==10)
P17=!P17;
else if(cnt==30)
{
cnt=0;
P17=!P17;
}
}
/*----------------------- 启动子函数 ---------------------------*/
void Start(void) //启动定时函数
{
if(key==0) //判断按键按下
{
TR0=1; //定时器0开始计时
}
else
{
TR0=0; //定时器0结束计时
}
}
/*-------------------- BCD 码转换子函数 ------------------------*/
int decimal_bcd_code(int decimal) //十进制转BCD码
{
int sum = 0, i; //i计数变量,sum返回的BCD码
for ( i = 0; decimal > 0; i++)
{
sum |= ((decimal % 10 ) << ( 4*i));
decimal /= 10;
}
return sum;
}
/*-------------------------- 主函数 ---------------------------*/
void main(void)
{
Timer0Init(); //T0 初始化
Timer1Init(); //T1 初始化
while(1)
{
Start(); // 启动定时
P0 = ~(decimal_bcd_code(dat)); //送 LED 显示
}
}