控制/MCU
前面我们讲解了通用IO输入输出,延时函数和外部中断,今天我们讲解单片机另一个重要的功能,定时器。顾名思义,定时器就是用来定时的,与延时函数的设置不同,延时函数是不精确定时,是用来解决一些不需要精确定时的问题的。而定时器以单片机的时钟频率为基准,定时都是十分精确的。
在原理图的设计中,有一个单片机最小系统必不可少的模块,晶振电路模块。
采用两个电容并接晶振Y1的方式设计晶振电路,为单片机的运行提供时钟,频率由外部晶振Y1的值决定,这里是11.0592MHz。时钟的周期为t=1/11.0592M s。51单片机中1个机器周期等于12个振荡周期,振荡周期也叫时钟周期。定时时间以机器周期计算,也就是计数值N乘以机器周期T(=12*t)就是定时时间t 。
51单片机定时模式有4种,数据手册中由工作模式寄存器TMOD决定:
高四位控制定时器1,低四位控制定时器0,具体详细寄存器信息大家百度即可,我就不多赘述了。然后我们简单说一下四种工作模式为模式0(13位定时器/计数器),模式1(16位定时器/计数器模式),模式2(8位自动重装模式),模式3(两个8位定时器/计数器)。定时器/计数器1除模式3外,其他工作模式与定时器/计数器0相同,T1在模式3时无效,停止计数。平时使用最多的是模式1,模式2通常由T1使用,为串口通信配置波特率。
定时时,16位计数器默认从0开始,计数到65535记满,多记一个溢出,也就是计数65536就会让定时器溢出,因此我们要注意设置初值时要用65536去减。比如我们需要定时50ms,假定计一个数是1us(实际是12*1/11.0592M s),需要计数50000次,那么计数初值设置为65536-50000,而不是65535-50000,这是许多初学者弄不清楚的地方。
除了工作模式寄存器,还有TCON控制寄存器,IE中断设置寄存器(我们需要中断来给定时器重新赋初值)。
代码贴在下面,大家自行借鉴。
#include"reg52.h"
sbit LED1=P1^1;
void delay(unsigned char time)
{
unsigned char i,j;
for(i=0;i< time;i++)
for(j=0;j< 120;j++);
}
void init_timer0()
{
TMOD=0x21; //0方式1,1方式2
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
TR0=1;
}
int main()
{
init_timer0();
while(1);
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;//50ms*60=3s定时3s
if(num==60)
{
LED0=~LED0;
}
}
全部0条评论
快来发表一下你的评论吧 !