用法
dsq.c文件:(main.c文件可以直接用time_init()来调用但是目前来看中断由于涉及变量得通过 extern 【变量】来实现,因此干脆将中断放在主函数中)
void time_init() //初始化定时器
{
TMOD=0x01;
TF0=0; //定时器的计数起点为0
TR0=1; //启动定时器0
TH0=0xFC; // TH0=0x3C;
TL0=0x18; // TL0=0xAF;
ET0=1; //允许中断
EA=1; //允许中断
}
void time_routine() interrupt 1{ //中断
TH0=0xFC; TH0=0x3C;(这个是时钟芯片的) //定时器复位
TL0=0x18; TL0=0xAF; //定时器复位
count++;
if(count==20){
ms++;
if(ms>=61)
{
mm++;
ms=0;
}
if(mm>=61)
{
mh++;
mm=0;
}
if(mh>=25)
{
mh=0;
}
}
}
——来自普中51单片机开发攻略_V1.2
计时方法
当你使用12MHZ的外部晶振的时候,机器周期=1/1M=1us。
如果我们想定时1ms的初值是多少呢? 1ms/1us=1000。也就是要计数1000个,
初值=65535-1000+1 (因为实际上计数器计数到65536 (2的16次方)才溢出,所以后面要加1
也就是说溢出:后面加一,这样实际到65536(65535+1)就中断一次。
64536=FC18H,所以初值即为THx=0XFC,TLx=0X18。
那为什么会用TH0,Y=TL0分别存放64536的一部分呢?
TH0存放高八位,TL0存放低八位;
THx =(65536-1000)/256;TLX =(65536-1000)%256;
1111 1111=256,因此/256获取高八位,%256获取低八位。
但是这里有个问题,如果以TH0=0xFC,TL0=0x18的话,最低间隔就是1ms,如果我想要0.5ms就不行了(应该)。
目前是大一新生,忘海涵,如果有问题请和我讲