单片机定时功能的实现

单片机定时功能

先上代码,然后再解释:

<span style="font-family:System;">//定時器功能
void timer_0(void)
{
    TMOD=0x01;              //採用定時器T0,工作方式為1(16位定时器)
    IE=0x82;                //二進制1000|0010,七位為1表示全局中斷打開,即EA=1,一位為1表示定时器0中斷打開
    TH0=0xD8;               //定時器高八位賦值65536
    TL0=0xEF;               //定时器第八位赋值55536
                            //65536-55536=10000,因此12M晶振单片机中:計數10000個機器週期使用10ms
}

//定時器T0中斷函數
void Timer0(void) interrupt 1
{
    TH0=0xD8;
    Tl0=0xEF;
    Count++;                //計數加1
}
</span>

第一句TMOD=0x01:

TMOD是定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)。

这个代码中TMOD=0x01

0x__就是表示16进制,然后后面是两个数0和1,第一个数字0表示D7,D6,D5,D4的值均为0,第二个数1表示D3,D2,D1,D0的值依次为0,0,0,1

那么D7,D6,D5等等是神马呢?
我们需要看一下此寄存器的结构:

因此D7=0表示定时器1的GATE=0;但是并不是说不打开,给它赋值0和1有啥区别呢?
●GATE=1时,“与门”的输出信号K由INTx输入电平和TRx位的状态一起决定(即此时K=TRx·INTx),当且仅当TRx=1,INTx=1(高电平)时,计数启动;否则,计数停止。
●GATE=0时,“或门”输出恒为1,“与门”的输出信号K由TRx决定(即此时K=TRx),定时器不受INTx输入电平的影响,由TRx直接控制定时器的启动和停止。 
然后,

D7,D6,D5,D4的值均为0,就表示定时器1不用。看第二个数字1,第二个数1表示D3,D2,D1,D0的值依次为0,0,0,1。对照寄存器的结构,则表示M1=0,M0=1,这是什么意思呢?

这就涉及到寄存器工作方式:

M0、M1——方式选择功能

MCS-51的定时器T0有4种工作方式:方式0,方式1,方式2,方式3。
MCS-51的定时器T1有3种工作方式:方式0,方式1,方式2。

M1 M0 工作方式 功能说明
0 0 方式0 13位定时器/计数器
0 1 方式1 16位定时器/计数器
1 0 方式2 自动重载8位定时器/计数器
1 1 方式3 T0分为2个8位独立计数器,T1无方式3

对照这个表,确定定时器的工作方式,则得出它的工作方式是:方式1——16位定时器/计数器。

第二句:IE=0x82; 

IE是中断允许寄存器,0x82转换为二进制为1000|0010,最高位为1表示CPU开放中断,第二位为1表示允许定时器T0溢出中断。

其他位的意思大家可以百度:中断允许寄存器IE

第三四句:TH0=0xD8;TL0=0xEF;

TH0=0xD8;                //定時器高八位賦值65536
TL0=0xEF;                //定时器第八位赋值55536
                            //65536-55536=10000,因此12M晶振单片机中:計數10000個機器週期使用10ms

TH0,TL0分别是16位定时器0/计数器的高低位,TL0是低八位,TH0=是高八位
对应的TH1,TL1分别是16位定时器1/计数器的高低位。

————————————————————可爱的分割线—————————————————

定时器中断函数:

//定時器T0中斷函數
void Timer0(void) interrupt 1
{
    TH0=0xD8;
    Tl0=0xEF;
    Count++;                   //計數加1
}

中断优先级:

51单片机的默认(此时的IP寄存器不做设置)中断优先级为:
外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断

代号分别为:0,1,2,3,4,

刚刚程序中打开了定时器0,对应的优先级代号为1。因此inturrupt后面的数字为1.中断程序中要对TH0,TL0赋初始值。

0

Leave a Reply

Your email address will not be published.