控制/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;voiddelay(unsignedchartime){unsignedchari,j;for(i=0;i< time;i++)for(j=0;j<120;j++); }voidinit_timer0(){ TMOD=0x21;//0方式1,1方式2TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; EA=1; TR0=1; }intmain(){init_timer0();while(1); }voidtimer0()interrupt 1{ TH0=(65536-50000)/256; TL0=(65536-50000)%256; num++;//50ms*60=3s定时3sif(num==60) { LED0=~LED0; } }
全部0条评论
快来发表一下你的评论吧 !