附件里有Proteus仿真、Keil C工程和程序文件,可以看看效果。
#include
#include
#define uchar unsigned char
#define uint unsigned int
//变量
uchar Count,LED;
//主程序
void main()
{
P0=0xff;
Count=0;
LED=0x01;
TMOD=0x01;
//12MHZ晶振 C51单片机对其12分频
//实际定时器“加1”频率为1MHZ 也就是1us
//用定时器中断时间间隔 是从“开启定时器加1”到“溢出”的时间
//对于工作在模式1的定时器0来说 也就是从“开启定时器加1”到“(TH0 TL0)=(0xff 0xff)+1”的时间
//0xffff+1=65536
//如果(TH0 TL0)初始值是(65536-50000) 那么初始值到溢出需要“加1”50000次
//1次是1us 50000次就是50000us=50ms
//如果我们对定时器的中断次数进行计数,每20次算作一个时间段,那么这样的一个时间段就是20*50ms = 1000ms = 1s
//这就是利用定时器计时的原理
//因为TH0和TL0分别是高字节和低字节,所以赋初值时也要将(65536-50000)分成高低字节分别赋值给TH0和TL0
//高字节 是除以256后的到的商 低字节 是除以256后的到的余数
//另外,因为在模式1中,每次定时器溢出后,单片机不会自动对TH0和TL0重新赋值
//所以每当定时器中断,我们都要首先对TH0和TL0人工重新赋值
TH0=(65536-50000)/256;//50ms 定时
TL0=(65536-50000)%256;
ET0=1;
EA=1;
TR0=1;//启动T0
while(1)
{
//显示
P1=LED;
}
}
//T0 中断函数
void Int_T0() interrupt 1
{
//另外,因为在模式1中,每次定时器溢出后,单片机不会自动对TH0和TL0重新赋值
//所以每当定时器中断,我们都要首先对TH0和TL0人工重新赋值
TH0=(65536-50000)/256;// 恢复初值
TL0=(65536-50000)%256;
//Count每中断一次加1 以20为周期 每当等于20时候说明1s到了
if(++Count==4)
{
Count=0;
LED=_crol_(LED,1);
}
}