>51单片机的定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志二、控制寄存器TMOD与TCON 80C51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。 工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。C/T:定时/计数模式选择位。=0为定时模式;=1为计数模式。M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如下:TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。TR0(TCON.4):T0运行控制位,其功能与TR1类同。方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。方式1的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加1计数器 。方式2为自动重装初值的8位计数方式 方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。
四、使用方法 1、设置TMOD,确定定时计数器的工作方式与定时、计数功能
设置T1为工作方式1,定时器功能,则TMOD=0X10;
2、计算并装初值TH1/TL1 TH0/TL0 设定时器T1为50000次溢出一次,因为单片机的晶振为12M,则一个机器周期为1us,50000次为50毫秒溢出溢出,初值为65536-50000=15536,计算得:
低8位为:TL1=0xb0;//15536 3、运行定时器TCON TR1=1;TR0=1;
4、判断定时器是否溢出
if(TF1==1)
五、用定时器1,12M晶体,定时50ms做一个时钟程序 #include <REGX52.H> #define uchar unsigned char #define uint unsigned int void delay(uint ms); void display(uchar shu,uchar wei); uchar tab[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x40}; sbit bz=P1^5; void didi(uint di); void timer_init(); void main() { uint cn,miao,fen,shi; timer_init(); while(1) { display(shi/10,7); display(shi%10,6); display(16,5); display(fen/10,4); display(fen%10,3); display(16,2); display(miao/10,1); display(miao%10,0); if(TF1==1) { TF1=0; TH1=0x3c; TL1=0xb0; cn++; if(cn==20) { cn=0; miao++; if(miao==60) { miao=0; fen++; didi(10); if(fen==60) { fen=0; shi++; if(shi==24) { shi=0;fen=0;miao=0; } } } } } } }
void timer_init() { TMOD=0X10; TH1=0x3c; TL1=0xb0; TR1=1; }
void didi(uint di) { while(di--) { bz=0;delay(1); bz=1;delay(1); } }
void display(uchar shu,uchar wei) { P2=(P2&0xe3)+(wei<<2); P0=tab[shu]; delay(2); P0=0x00; }
void delay(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=123;j>0;j--); }
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |