1、一看就懂的单片机中断定时器80c51 定时器实现定时功能,比较方便的方法是利用单片机内部的定时器/计数器。也可以采用下面的三种方法1 软件定时:软件定时不占用硬件资源,但是占用了 cpu 的利用率采用时基电路定时:列采用 555 电路,外接必要的元器件(电阻和电容) ,即可构成硬件定时电路,但在硬件连接好以后,定时的范围不能由软件进行控制和修改,即不可编程采用可编程的芯片定时:这种定时芯片的定时值及定时范围很容易用软件来确定和修改,此种芯片定功能强,使用灵活。在单片机的定时/计数器不够用时,可以考虑进行扩展。定时/计数器的结构和工作原理1.定时/计数器的实质是加一计数器(16 位) ,由高 8
2、 位和低 8 位两个寄存器组成,TMOD 是定时/计数器的工作方式寄存器,确定工作方式和功能,TCON 是控制器,T1,T0 的启动和停止以及设置溢出标志。加一计数器输入的技术脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经过 12 分频后送来,一个是 T0 或者 T1 引脚舒服的外部脉冲源,每来一个脉冲计数器加一,当加到计数器为全 1 时,再输入一个脉冲就使计数器回零。且计数器的溢出使 TCON 中 TF0 或 TF1置 1,向 cpu 发出中断请求(定时/计数器中断允许时) 。付过定时/计数器工作于定时模式,则表示时间已到,如果工作计数模式,则表示计数值已满可见,由溢出世时计数器的值减去
3、计数初值才是加 1 计数器的计数值计数器值计数初值=加 1 计数器的计数值计数值就是计数多少个数假如晶振是 1250*1/12*12 12 是震荡周期 1/12 是 1/12 是晶振周期12 个分频就是 12 个震荡周期刚好是一个计时器周期设置为定时模式时,加 1 计数器是对内部机器周期计数(1 个机器周期等于 12 个震荡周期,即计数频率为晶振频率的 1/12) 。计数值N 乘以机器周期 Tcy 就是定时时间 t。65535*1 等于微妙65535 就是 65 毫秒设置为计数器模式时,外部事件计数脉冲由 T0 或 T1 引脚输入到计数器。在每个机器周期的 S5P2 期间采样 T0,T1 引脚
4、电平。当某周期采样到一高电平输入,而下一周期采样到一低电平时,则计数器加 1,更新的计数值在下一个机器周期的 S3P1 期间装入计数器。由于检测一个从 1 到 0 的下降沿需要两个机器周期,因此晶振频率为12MHz 时,最高计数频率不超过 1/2MHz,即计数脉冲的周期要大于2us。80c51 单片机定时/计数器的工作由两个特殊功能其存期控制。TMOD 用于设置工作方式;一、工作方式寄存器 TMOD 用于设置定时/计数器的工作方式,低四位用于 T0,高四位用于 T1。其格式如下:位 7 6 5 4 3 2 1 0 字节地址:89H GAT C/t M1 M0 GATE C/t M1 M0 TM
5、ODGATE:门控位。GATE=0 时,只要软件使 TR0 或 TR1 为 1,同时外部中断引脚或也为高电平,才能启动定时/计数器工作。即此时定时器的启动多了一条件。C/T:定时/计数器模式选择位,C/T=0 为定时模式,C/T1 为计数模式M1M0:工作方式置位,定时/计数器有四种工作方式,由 M1M0 进行设置。 外部中断引脚就是 P32引脚单片机核心就是中断,定时器串口通信定时器工作方式设置表M1M0 工作方式 说明00 方式 0 13 位定时/计数器01 方式 1 16 位定时/计数器10 方式 2 8 位自动重装定时/计数器11 方式 3 T0 分成两个独立的 8 位定时/计数器,T
6、1 此方式停止计数 控制寄存器 TCONTCON 的低四位用于控制外部中断,已在前面介绍。TCON 的高四位用于控制定时器/计数器的启动和中断申请,其格式如下:位 7 6 5 4 3 2 1 0 字节地址:88H TF1 TR1 TF0 TR0 TCON TF1:T1 溢出中断请求标志位。T1 计数溢出时由硬件自动 TF 为 1。cpu 响应中断后TF1 由硬件自动清 0。T1 工作时,cpu 可随查询 TF1 的状态。所以,TF1 可用作查询测试的标志。TF1 也可以用软件置 1 或者0,同硬件置 1 或者清 0 效果一样。TR1(TCON.6):T1 运行控制位,TR1 置1 时,T1 开
7、始工作:TR1 置 0 时,T1 停止工作,TR1 由软件置 0 或者 1,所以,用软件可以控制定时/计数器的启动和停止TF0(TCON.5):T0 溢出中断请求标志位,其功能与 TF1 类同TR0(TCON.4):T0 运行控制位,其功能与 TR1 类同方式 1方式 1 的计数位数是 16 位,由 TL0 作为低8 位,TH0 作为高 8 位。组成了 16 位加 1计数器。计数个数与计数初值的关系为:X=216N 最大值 65535高八位和低八位的关系低八位 TL0 1 1 1 1 1 1 1 1 如果低八位超过了 256 之后就进 1 给高八位,然后到 66635 之后清零高八位 TH0
8、1 1 1 1 1 1 1 1TH0=(6553650000)/256 等于十六进制 3CB0 超过 256 的装在高八位中 50000 就是 50 毫秒 就是需要定时的时间TL0=(6553650000)%256 不超过 256 的装在低八位中TH0 ,TL0 是寄存器要计算 60 毫秒的就 TH0=(65536-60000)/256TL0=(65536-60000)%256定时/计数器应用举例子初始化程序应用完成如下工作:对 TMOD 赋值,以确定 T0 和 T1 或TH1 的工作方式。计算初值,并将其写入 TH0,TL0 或TH1,TL1.中断方式时,则对 IE 赋值,开放中断。使 IR
9、0 或 TR1 置位,启动定时/计数器或计数。51 单片机有 5 个中断先介绍三个中断先外部中断有下降沿和跳变沿触发沿方式EA=1; /打开总中断,无论用什么中断都必须打开总中断EX0=1;/打开外部中断void exter0() interrupt 0 /中断函数,无论用什么中断都要这个函数,0 表示工作方式 0,有 0 到 5. /中断函数,进入中断函数执行中断函数,中断函数有点像 c 语言的函数调用跳变沿方式EA=1;/打开总中断,无论用什么中断方式是什么都必须打开总中断EX0=1;/打开外部中断,使用外部中断时候必须打开外部中断IT0=1;/跳变沿触发方式void main()/主函数
10、void exter0() interrupt 0 /中断函数,无论用什么中断都要这个函数,0 表示工作方式 0,有 0 到 5. /中断函数,进入中断函数执行中断函数,中断函数有点像 c 语言的函数调用中断定时器使用中断定时器的时候 必须要打开总中断,打开定时器中断, 设置定时器 0 为工作方式 1,启动定时器,定时器有定时器 0 和 1 两种方式,然后计算计数时间中断定时器有两个寄存器 TH0 和 TL0。计算时间放在两个寄存器中一共 16 位,分别为高八位,和低八位分别为 TH0 1 1 1 1 1 1 1 1 TL0 1 1 1 1 1 1 1 1当 TL0 寄存器存入数据超过 255
11、 的时候就进 1 到 TH0;不超过 255 的时候就存入到 TL0 中所以 TH0=65536/256 去整,TL0=65536%256 求余;公式为 TH0=(65536-要定时多少时间)/256;TL0=(65536-要定时多少时间)%256;TH0=(65536-50000)/256;TL0=(65536-50000)%256;定时器 0EA=1; /打开总中断TMOD=0x01; /设置定时器 0 为工作方式 1ET0=1; /打开定时器 0TR0=1; /启动定时器 0TH0=(65536-50000)/256;TL0=(65536-50000)%256;void main()/主函数void time0() interrupt 1 /中断函数,工作方式为 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;定时器 1EA=1; /打开总中断TMOD=0x01; /设置定时器 0 为工作方式 1ET1=1; /打开定时器 1TR1=1; /启动定时器 1TH1=(65536-50000)/256;TL1=(65536-50000)%256;void main()/主函数void time0() interrupt 3 /中断函数,工作方式为 3TH0=(65536-50000)/256;TL0=(65536-50000)%256;