一 什么是定时器
定时器/计数器是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向cpu提出中断处理请求,从而实现,定时或者计数功能的外设。
二 51单片机的定时/计数器

单片机外部晶振12MHZ,12分频后计数脉冲为1MHZ,即每个时钟脉冲周期为1us,定时器T0的16位工作模式最大定时时间位65535us,如果要定时10ms的计数器的话就不能从0开始计数了,必须给定一个计数初值。
TH0 = (65535-10000)/256;
TL0 = (65535-10000)%256;
三 定时器/计数器编程思想
通常有2个函数,1个是初始化函数,1个是对外做中断服务函数
配置工作环境->计算计数初值->使能定时/计数器中断(即ET0或者ET1置0)-> 打开总中断(即EA=1)->启动定时器(即TR0或者TR1置0)
在中断服务函数中,如果不是自动重装模式,需要对THX和TLX重新赋值。
四 工程 代码
利用51单片机的定时/计数T0模式实现定时,每隔1s,L1指示灯闪烁一下,也就是点亮0.5s,熄灭0.5s,每隔10s,L8指示灯闪烁一下,即点亮5s,熄灭5s。
- #include"reg52.h"
-
- sbit L1 = P0^0;
- sbit L8 = P0^7;
-
- void InitHC138(unsigned char n)
- {
- switch (n)
- {
- case 4:
- HC138_C = 1;
- HC138_B = 0;
- HC138_A = 0;//输出Y4
- break;
- case 5:
- HC138_C = 1;
- HC138_B = 0;
- HC138_A = 1;//输出Y5
- break;
- case 4:
- HC138_C = 1;
- HC138_B = 1;
- HC138_A = 0;//输出Y6
- break;
- case 5:
- HC138_C = 1;
- HC138_B = 1;
- HC138_A = 1;//输出Y7
- break;
- }
- }//锁存器选择
-
- //======================================
- void InitTimer()
- {
- THOD = 0x01;
- TH0 = (65535-50000)/256;
- TL0 = (65535-50000)%256;
-
- ET0 = 1;
- EA = 1;
- TR0 = 1;
- }
-
- unsigned char count = 0;
- unsigned char count1= 0;
- void ServiceTimer() interrupt 1
- {
- TH0 = (65535-50000)/256;
- TL0 = (65535-50000)%256;
- count++;
- count1++;
- if(count ==10)
- {
- L1=~L1;
- count =0;
- }
- if(count1 = 100)
- {
- L8=~L8;
- count1 = 0;
- }
-
- //======================================
-
-
- void mian()
- {
- void InitTimer();
- while(1)
- {
-
- }
- }