第六章 定时器计数器、外部中断(C51)
第六章单片微机的定时器计数器原理及应用
中断矢量001BH
⑴T0方式3下的T0
在方式3情况下,T0被拆成二个独立的8位计数器TH0、TL0。 ▲ TL0:8位定时/计数器,使用T0原有的控制寄存器资 源:TF0,TR0,GATE,C/T,INT0,中断矢量等; ▲ TH0:8位定时器,占用T1的中断溢出标志TF1,运行控 制开关TR1,中断矢量001BH,只能对片内机器周期脉冲计数
复位后,两个寄存器全部清零。
6.3.2 定时器/计数器T2的工作方式
T2的工作方式用控制位CP/RL2(T2CON.0)和RCLK +TCLK来选择。T2有3种工作方式,如表6-2所示:捕获方式、 自动重装载方式和波特率发生器方式。
⒈ 捕获方式
在一定条件下,自动将计数器TH2和TL2的数据读入捕获寄存器 RCAP2H和RCAP2L,亦即TH2和TL2内容的捕获是通过捕获寄 存器RCAP2H和RCAP2L来实现的。其工作原理可参见图6-7。
当CP/RL2=0时,选择自动重装载方式。 若T2的中断是被允许的,则无论发生TF2=1还是EXF2 =1,CPU都会响应中断,此中断向量的地址为002BH。响应 中断后,应用软件撤除中断申请。TF2 和EXF2都是直接可寻 址位,可采用CLR TF2和CLR EXF2指令实现撤除中断申请的 功能。
触发 方式
89H IE0
中断 标志
88H IT0
触发 方式
⒊ T0、T1 的数据寄存器——TH1、TL1,TH0、TL0 ⒋ 定时器/计数器中断
⑴ 中断允许寄存器IE
⑵ 中断矢量 ⑶ 中断优先级寄存器IP
6.2.2 定时器/计数器T0、T1 的工作方式
T0:有4种工作方式可选(方式0,1,2,3)
当CP/RL2=l时,选择捕获方式。
c51单片机中断详解
包含: (1)T0和T1的溢出中断请求标志位TF1和TF0。 (2)外部中断请求标志位IE1与IE0。 各标志位的功能:
IE1——外部中断请求1的中断请求标志位。 IE1=0,无中断请求。 IE1=1,外部中断1有中断请求。当CPU响应该中 断,转向中断服务程序,由硬件清“0”IE0。
● IT1外部中断1的中断触发方式控制位
IT1——选择外部中断请求1为负跳变触发方式 还是电平触发方式:
IT1 =0,为电平触发方式,IE1状态完全 由IT1决定。
IT1=1,为负跳变触发方式。 IT1可由软件置“1”或清“0”。
● IT0—外部中断请求0为负跳变触 发方式还是电平触发方式,意义与 IT1类似。 ● IE0—外部中断请求0的中断请求 标志位,意义与IE1类似。
二、中断允许控制
中断允许控制寄存器IE
CPU对中断源的开放或屏蔽,由片内 的中断允许寄存器IE控制(两级控制)。 字节地址为A8H,可位寻址。格式如下:
IE中各位的功能如下:
(1)中断允许总控制位EA(IE.7位):
EA=0,所有中断请求被屏蔽。
EA=1,CPU开放中断,但五个中断源 的中断请求是否允许,还要由IE中 的5个中断请求允许控制位决定。
CPU暂时中止当前的工作,转到中断 服务处理程序处理所发生的事件。
处理完该事件后,再回到原来被中止的 地方,继续原来的工作,这称为中断。
中断方式优点:大大地提高了CPU的 工作效率。
●能够实现中断处理功能的部件称为 中断系统。 ●产生中断的请求源称为中断请求源。 ●中断源向CPU提出的处理请求,称为 中断请求(或中断申请)。 ● CPU暂时终止自身的事务,转去处 理中断事件的过程,称为CPU的中断响 应过程。
利用c51的5个外部中断
充分利用80C51系列MCU的5个外部中断80C51系列MCU具有2个通用中断输入引脚。
通常,80C51器件上提供有5个中断源,定时器T0、T1、串行口也都能产生中断响应。
在一些应用场合中,需要用到多于2个的外部中断输入信号,并且器件上尚有空闲的定时器、串行口时,可将空闲的定时器、串行口设置为简易扩展的外部中断输入信号。
本文介绍一种将定时器/计数器、串行口设置为外部中断输入信号的方法(见图一)。
最快的中断响应速度是我们的设置目标。
为实现外部中断输入,另外一个普遍的做法是,在软件控制下轮流访问被设置为输入的通道管脚。
单片机外围的设备在使用时,这样的做法是必要的。
所建议的这种方法在应用时是这样的一个情况:处理器花费一半的时间执行“等待环节”,或者执行一简短的代码,这些代码为内部跳转或分支,并不执行任何的功能。
在这样的情况下,检查中断源输入状态的指令就会插入到执行的顺序里。
从而,当其他的例行程序执行时,输入就被忽略掉。
例行的程序执行时,可能须要从外部闭锁这个输入。
使之将处理器引导到单独服务程序(辅助程序)(作为2个多用途中断输入用)的专门中断输入没有上述方法提到的缺点。
一、计数器/定时器的设置设置 T0 和T1工作于模式2 ,即可自动重载的8位计数器模式。
在TH1、TL1或TH0、TL0中装入16进制数据0xFF,作为计数器/重装寄存器的初始值。
当T0/T1工作于此模式下时,必须设置相应的控制位。
下表列出了需设置的控制位: 寄存器 控制位TMOD GATE = 0 C/T = 1 M1 = 1 M0 = 0TCON TR x = 1IE ET x = 1 EA = 1上表中的“x”即定时器/计数器的编号(0或1)。
如果两个定时器均用作外部中断输入,那么,在特殊功能寄存器TMOD中,T0的设置值为0xX6,T1的设置值为0x6X,结果将使TMOD的值为0x66。
中断优先级可在IP寄存器中设置。
作用于T0或T1管脚的信号下降沿将使相应的定时器发生溢出,并产生中断信号。
c51定时中断实验报告
c51定时中断实验报告本文介绍的是C51定时中断实验,利用这个实验可以更好地理解C51的定时器与中断模块,进一步熟悉C语言的使用。
一、实验目的1.掌握C51单片机的定时器模块和中断模块。
2.熟悉定时器与中断的工作原理。
3.掌握利用中断实现定时功能的方法。
4.掌握如何调试程序,发现和解决程序问题。
二、实验装置硬件:STC89C52微控制器、电源、电路板、电路元件等。
软件:Keil C51集成开发环境。
三、实验原理1.定时器模块C51单片机中的定时器模块包含了3种不同的工作方式:工作模式0、模式1和模式2。
这些工作模式拥有不同的计数器范围和计数方式。
在本实验中,将使用工作模式1,因为它适用于大多数定时需求,并且易于编写程序。
工作模式1基本特点如下:(1)Timer1用两个8位计数器(TH1和TL1)组成,当一个计数器溢出时(从FFH计数到00H),计数值自动重装,同时中断请求位TF1被设置。
(2)计数器TH1可以初始值,TL1需要重新初始计数。
(3)Timer1的计数时钟来源可以是外部时钟源或内部时钟源,一般选择内部时钟源。
(4)TH开头的寄存器和TL开头的寄存器合起来组成16位的Timer1计数器,这个计数器的数值大小为TH1-TH1。
(5)x表示H或L。
用C语言对Timer1进行编程,首先需要完成以下配置:TMOD |= 0x10; // 定时器模式选择,使用模式1,TH0和TL0为一组计数器TH1 = (65536 - 50000) / 256; // 定时器初值设置ET1 = 1; // 打开定时器中断其中,TMOD是用来选择定时器工作模式,可以用对应的数值进行配置;TH1和TL1需要根据需要设置计数器初始值,该初值的计算公式为:计数初值 = (65536 - 计数时间/12)。
ET1为定时器1允许中断的位,EA为总中断允许位,TR1为定时器1工作使能位。
2.中断模块中断是一种实时响应外部事件处理的技术手段,当特定的硬件事件发生时,CPU自动调出相应的中断处理程序来响应事件,处理程序完成任务后返回继续程序运行,从而提高了CPU的效率。
微处理器C51_6定时器和中断应用
MCS-51中断系统
1、8051中断系统的结构 8051的中断系统有5个中断源(8052有 6个,还有第三个定时/计数 器中断) ,2个优先级,可实现二级中断嵌套 。
TCON
IT0 1 0 IE0 1 ET0 1 TF0 IT1 1 0 IE1 1 ET1 1 TF1 0 RI TI ES 1 ≥1 PS 1 0 0 PT1 1 0 自 然 优 先 级 中断源 低 级 0 EX1 1 PX1 1 EX0 1
c.两个外部中断 如图,P1接8个LED,INT0和INT1接上拉电阻和对地按钮。 主程序执行时,P1所接的LED闪烁。按下INT0按钮,进入外部中断0服 务,8个LED单灯左移,左移三圈后回主程序;按下INT1按钮,进入外部 中断1服务,8个LED单灯右移,三圈后回主程序。此外,要求INT0的优先 级高于INT1。
void my_int1(void) interrupt 2 { unsigned saveLED=LED; right(3); LED=saveLED; }
void delay1ms(int x) { int i,j; for(i=0;i<x;i++) for(j=0;j<120;j++); }
void left(int x) { int i,j; for(i=0;i<3;i++) { LED=0xfe; for(j=0;j<7;j++) { delay1ms(250); LED=(LED<<1)|0x01; } void righ(int x) delay1ms(250); { int i,j; } for(i=0;i<3;i++) } { LED=0x7f; for(j=0;j<7;j++) { delay1ms(250); LED=(LED>>1)|0x80; } delay1ms(250); } }
中断与定时器计数器的C51
1.MCS-51单片机的中断系统由哪几个特殊功能寄存器组成?MCS-51单片机的中断系统是由TCON、IE、IP组成的。
2.MCS-51单片机中与定时器/计数器有关的特殊功能寄存器有哪几个?它们的功能各是什么?和定时器/计数器有关的寄存器分别为TMOD、TCON、TH、TLTMOD寄存器是定时器/计数器工作方式设置寄存器TCON寄存器是定时器/计数器控制寄存器TH、TL是初值寄存器3.试编写一段对中断系统初始化程序,允许外部中断0、外部中断1、定时器/计数器T0溢出中断、串行口中断,且使定时器/计数器T0溢出中断为高优先级中断。
IE=0X87;IP=0X02;4.MCS-51单片机若要把外部中断源扩充为6个,可采用哪些方法?如何确定它们的优先级?可以采用两种方法。
(1)利用外部中断和查询相结合的方法扩展外部中断如果系统有多个外中断请求源,把其中最高级别的中断源直接连接到单片机外中断0辑器件通过“与”或者“或”的办法连接到单片机外中断1入/输出端口(如P0或P1)的若干引脚,用来查询判断具体是哪一个中断请求源发生的中断事件。
电路如下,利用单片机扩展5个外部中断源,中断的优先次序为S0~S4,其中S0接到外部中断0上,S1~S4通过“与”门接到外部中断1上;单片机的P1.4~P1.7接4个发光二极管用来作为输出指示;当有S1~S4其中一个外部中断发生时,相应的发光二极管D1~D4点亮;当S0外部中断发生时,4个发光二极管全亮。
C5源程序代码如下:#include<reg51.h>sbit P1_0=P1^0; //定义位变量sbit P1_1=P1^1;sbit P1_2=P1^2;sbit P1_3=P1^3;sbit P1_4=P1^4;sbit P1_5=P1^5;sbit P1_6=P1^6;sbit P1_7=P1^7;void main( ){ P1=0xFF; //熄灭LEDIT0=1; IT1=1; //外中断0、1脉冲触发方式EA=1; EX0=1; EX1=1; //中断管理for( ; ; ) //延时等待中断发生{;}}void INT0_ISR( ) interrupt 0 //外中断0中断服务函数{ P1=0x0F; //P1口高4位置0,点亮4个LED }void INT1_ISR( ) interrupt 2 //外中断1中断服务函数{ if (P1_0==0) {P1=0xef;} //如果为中断S11,点亮D1else if (P1_1==0) {P1=0xdf;}else if (P1_2==0) {P1=0xbf;}else if (P1_3==0) {P1=0x7f; } //如果为中断S44,点亮D4}(2)利用优先编码器扩展外部中断可以采用优先级解码芯片如74LS148,把多个中断源信号作为一个中断。
第6章-MCS-51定时计数器
1.定时/计数器工作方式寄存器TMOD TMOD为T0、T1的工作方式寄存器,主要用于控制定
时/计数器T0和T1的工作模式和4种工作方式。低4位用于 控制T0,高4位用于控制T1。
门控 位
在单片机应用中,定时和计数的需求比较多,为了使用 方便并增加单片机的功能,就把定时电路集成到芯片中,称 之为定时/计数器。目前,几乎所有的单片机都集成了可编 程定时/计数器,为单片机提供定时和计数功能。
6.1.1 定时/计数器的结构 MCS-51 单片机内部有两个16位的可编程定时/计数器,称为
定时器0(T0)和定时器1(T1),都具有定时和计数的功能,可 编程选择其作为定时器或作为计数器用。 TMOD:选择定时器/计数器T0、T1的工作模式和工作方式。 TCON:控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。
Hale Waihona Puke ⑵ 工作方式1: T0初值 =216-500s/2s=65536–250=65286=FF06H TH0=FFH;TL0=06H。
⑶ 工作方式2: T0初值 =28-500s/2s=256-250=6 TH0=06H;TL0=06H。
⑷ 工作方式3: T0方式3时,被拆成两个8位定时器,定时初值可分别计
定时器:对片内机器时钟(周期方波)进行计数 计数器:对Tx引脚输入的负脉冲进行计数
6.1.2 定时/计数器的工作原理
单片机内部有两个定时/计数器T0和T1,其核心是计数器, 基本功能是加1。
对外部事件脉冲(下降沿)计数,是计数器;对片内机周 脉冲计数,是定时器。
计数器由二个8位计数器组成。
第6章80C51单片机内部资源及应用
80C51单片机内部资源及应用
80C51中断号、中断源和中断向量关系如表所示。
中断号n 0 1 2 中 断 源 外部中断0 定时器0 外部中断1 中断向量 0003H 000BH 0013H
3
4
定时器1
串行口
001BH
0023H
当用void 函数名( ) interrupt n [using m]声明一个中断函 数后,C51编译器会在中断号n对应的地址产生一个长 跳转指令,跳到中断服务程序的入口地址。
80C51单片机内部资源及应用
80C51单片机内部资源及应用
1. 中断源 80C5l共有3类5个中断源,分别是2个外部中断源、2 个定时中断源、1个串行口接收/发送中断源。
外部中断是由外部请求信号或掉电等异常事故引起的, 共有2个中断源:外部中断0和1,分别由引脚(P3.2) 和(P3.3)引入。
当中央处理器CPU正在执行某程序时,由于某种原因, 外界向CPU发出了暂停目前工作去处理更重要事件的 请求,程序被打断,CPU响应该请求并转入相应的处 理程序,处理程序完成以后,再返回到原来程序被打 断的位置,继续原来的工作,这一过程称为中断。实 现中断功能的部件称为中断系统。
80C51单片机内部资源及应用
高优先级中断请求可以中断一个正在执行的低优先级 中断服务,除非正在执行的低优先级中断服务程序设 置了禁止某些高优先级的中断。正在执行的中断服务 程序不能被另一个同级或低优先级的中断所中断。
80C51单片机内部资源及应用
4. 中断处理过程 一个完整的中断处理过程包括中断请求、中断响应、 中断服务、中断返回几个部分,前面主要介绍了中断 请求与控制,下面将介绍其他相关内容。
80C51单片机内部资源及应用
51单片机的定时器_计数器的C51编程
51单片机的定时器_计数器的C51编程相关知识点:1、单片机的定时器/计数器,实质是按一定时间间隔、自动在系统后台进行计数的。
2、当被设定工作在定时器方式时,自动计数的间隔是机器周期(12个晶振振荡周期),即计数频率是晶振振荡频率的1/12;3、当定时器被启动时,系统自动在后台,从初始值开始进行计数,计数到某个终点值时(方式1时是65535),产生溢出中断,自动去运行定时中断服务程序;注意,整个计数、溢出后去执行中断服务程序,都是单片机系统在后台自动完成的,不需要人工干预!4、定时器的定时时间,应该是(终点值-初始值)x机器周期。
对于工作在方式1和12MHz时钟的单片机,最大的计时时间是(65535-0)x1uS=65.535ms。
这个时间也是一般的51单片机定时器能够定时的最大定时时间,如果需要更长的定时时间,则一般可累加多定时几次得到,比如需要1秒的定时时间,则可让系统定时50ms,循环20次定时就可以得到1s的定时时间。
5、定时器定时得到的时间,由于是系统后台自动进行计数得到的,不受主程序中运行其他程序的影响,所以相当精确;6、使用定时器,必须先用TMOD寄存器设定T0/T1的工作方式,一般设定在方式1的情况比较多,所以可以这样设定:TMOD=0x01(仅设T0为方式1,即16位)、TMOD=0x10(仅设T1为方式1,即16位)、TMOD=0x11(设T0和T1为方式1,即都为16位)。
7、使用定时器,必须根据需要的定时时间,装载相应的初始值,而且在中断服务程序中,很多情况下得重新装载初始值,否则系统会从零开始计数而引起定时失败;8、要使用定时器前,还必须打开总中断和相应的定时中断,并启动之:EA=1(开总中断)、ET0=1(开定时器0中断)、TR0=1(启动定时器0)、ET1=1(开定时器1中断)、TR1=1(启动定时器1);9、注意中断服务程序尽可能短小精干,不要让它完成太多任务,尤其尽量避免出现长延时,以提高系统对其他事件的响应灵敏度.//定时器基本例程-1(未使用定时器,一个灯每隔500ms亮灭一次)//这是个特意安排的例程,以便与下面的例程2进行对比#include <reg52.h>sbit led=P2^7;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮while(1){led=!led;delay_ms(500);}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------//定时器基本例程-2(使用定时器,一个灯每隔500ms亮灭一次)#include <reg52.h>sbit led=P2^7;unsigned char num;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮TMOD=0x01; //设定定时器0为工作方式1TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0while(1){delay_ms(8000);}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 1 //使用了定时中断0的led闪烁子函数{ TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000 TL0=(65536-50000)%256; //num++;if(num==10){num=0;led=!led;}}////定时器基本例程-3//(使用定时器T1,单片机整个口接的8个灯每隔500ms亮灭一次)#include <reg52.h>#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中unsigned char num;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led_port=0xff; //上电初始化,所有led灯不亮TMOD=0x10; //设定定时器1为工作方式1(16位方式)TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //EA=1; //开总中断ET1=1; //开定时器1中断TR1=1; //启动定时器1while(1){delay_ms(8000); //这句表明定时中断的运行是在系统后台自动运行的,不需要主函数“操心”}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 3 //使用了定时中断1的8灯闪烁子函数{ TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //num++; //计数if(num==10) //计够10次,时间就是10x50ms=500ms{num=0; //清零,以便进行下一次500ms的10次计数led_port=~led_port; //整个口接的led灯亮灭状态翻转}}//-------------------------------------------------//定时器基本例程-4//(同时使用定时器T0和定时器T1,单片机某个口的灯和某个口接的8个灯每隔500ms亮灭一次)#include <reg52.h>sbit led=P2^7;#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中unsigned char num_0,num_1;void delay_ms(unsigned int xms); //ms级延时子程序//=================================================void main(){led=1; //上电初始化,led灯不亮led_port=0xff; //上电初始化,该口所有led灯不亮TMOD=0x11; //设定定时器0和定时器1都为工作方式1(16位方式)TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0ET1=1; //开定时器1中断TR1=1; //启动定时器1while(1){delay_ms(8000); //这句表明定时中断的运行是在系统后台自动运行的,不需要主函数“操心”}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void led_flash() interrupt 1 //使用了定时中断0的led闪烁子函数{ TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL0=(65536-50000)%256; //num_0++; //计数if(num_0==10) //计够10次,时间就是10x50ms=500ms{num_0=0; //清零,以便进行下一次500ms的10次计数led=!led; //led灯亮灭状态翻转}}//-------------------------------------------------void led_all_flash() interrupt 3 //使用了定时中断1的8灯闪烁子函数{ TH1=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000TL1=(65536-50000)%256; //num_1++; //计数if(num_1==10) //计够10次,时间就是10x50ms=500ms{num_1=0; //清零,以便进行下一次500ms的10次计数led_port=~led_port; //整个口接的led灯亮灭状态翻转}}//-------------------------------------------------//定时器基本例程-5//设定定时器T0工作在方式1的计数应用状态,//单片机T0口(P3.4)接一个按键充当外部脉冲源,//系统对进来的脉冲(每按一次键得一脉冲)进行计数,//计数的结果用接在单片机P0口的8个LED灯表示出来//(大家也可以改成用1602LCD来显示,这样更直观)//广西民大物电学院李映超2010年4月14日#include <reg52.h>#define led_port P0 //宏定义,具体的端口尽量不要出现在主函数和主函数中//=================================================void main(){TMOD=0x05; //设定定时器0为工作方式1、计数器TH0=0; //清零TL0=250; //TR0=1; //启动定时器0进行计数while(1){led_port=TL0; //将计数结果送去显示(用8个LED灯显示),//这里仅显示16位计数器的低8位}}定时器0仍旧工作在计数器状态,增加定时器1工作在定时状态,得到1s的定时时间,定时时间到后,将定时器0计数得到的脉冲数去显示,则这个脉冲数就是所输入的外部信号的频率,从而构成一个简单而准确的频率计!!不过,这个简单的“频率计”能够计量的信号频率(脉冲数),受单片机中断响应速度的影响,一般只能达到单片机系统时钟晶振的1/24,所以要能够测量更高的频率,必须使用前置分频器,对更高频率的待测输入信号进行预分频!。
51单片机外部中断的C51编程
void main()
{
P0=0xff; //上电初始化,P0全灭
led=1; //上电初始化,led灯不亮
TCON=0x05; //打开外部中断1,并设置为下降沿触发
IE=0x85; //开总中断和外部中断1
void main()
{
led=1; //上电初始化,led灯不亮
while(1)
{
key_scan();
delay_ms(3000);
}
}
//=================================================
void delay_ms(unsigned int xms) //ms级延时子程序
相关知识:
1、51单片机的5大中断源:串行口中断、定时中断1、外部中断1、定时中断0、外部中断0;
2、中断源的编号: 串行口中断为4、定时中断1为3、外部中断1为2、定时中断0为1、外部中断0为0;
3、中断源的优先级:按以上顺序排列,串行口中断最低、外部中断0最高;
4、使用外部中断0和1,必须TCON寄存器设置其触发方式是低电平触发(0)还是下降沿触发(1);
//外部中断基本例程-3 (单个键盘的外部中断1扫描处理)
//功能跟上例一样,都是用一个按键控制一个灯的亮灭,但是使用的是外部中断1
//注意与前例写法上的不同之处
//广西民大物电学院 李映超 2010年4月12日
#include <reg52.h>
sbit k2=P3^3; //
51单片机定时器计数器、外部、串行中断服务控制字(详版)
51单片机定时器0中断服务51单片机定时器0工作在模式0,每中断10次,使P2.0引脚连接的LED灯闪烁。
#include "reg_c51.h"int nn; //中断次数变量中断服务程序中计数count++时,count应在void main()外定义为全局变量!!!void main(void){//TMOD=0x0F;TMOD &= 0xF0; //定时器0运行在模式0 ,13位计数器// GATE0=0; C/T0#=0; M1=0; M0=0;TH0 = 0x00; //设置初值0x00,所以计数值为8192(213),若是时钟频率为12MHzTL0 = 0x00; //则8192μs中断一次(定时器每计数一次1μs,8192次即8192μs)ET0=1; //允许定时器0中断EA=1; //允许总中断TR0=1; //启动定时器0while(1); //无限循环,没有循环体}void it_timer0(void) interrupt 1 定时器0中断服务程序{nn=nn++; //每次中断nn加1if(nn==10) //当中断10次后,使LED灯闪烁{ nn=0;P2_0 = ~P2_0; //引脚P2.0取反}}①IT0(IT1):外部中断0(或1)置0:电平触发置1:边沿触发②IE0(IE1):外部中断标志硬件置位③TF0(TF1):定时器0(或1)溢出中断标志(通常用于查询方式)当T0(T1)被允许计数后,T1(T0)从初始值开始加1计数,最高位产生溢出时,该位由内部硬件置位,并向CPU请求申请中断。
当CPU响应时,由硬件清零。
硬件置位硬件清零④TR0(TR1):定时器/计数器T1(T0)的运行控制位置0:关闭定时器/计数器置1:启动定时器/计数器TMOD高4位:定时器1(1)M1M0:工作方式0 0 方式0:13位定时器/计数器0 1 方式1:16位定时器/计数器1 0 方式2:自动重装8位定时器/计数器1 1 方式3:仅适用于T0,分为两个8位定时器/计数器方式0:M=213=8192方式1:M=216=65536方式2:M=28=256方式3:定时器0分成两个8位计数器,所以两个定时器的M值均为256(2)C/T:计数器/定时器0:定时器1:计数器(3)GA TE:门控位GA TE=0时,只要TRi=1,定时器/计数器就开始工作,称为软启动。
用KeilC51开发定时器计数器
用KeilC51开发定时器计数器用Keil C51开发定时器/计数器原文:基本的51单片机内部有两个16位可编程的定时器/计数器T0和T1。
它们各自具有4种工作状态,其控制字和状态均在相应的特殊功能寄存器中,可以通过软件对控制寄存器编程设置,使其工作在不同的定时状态或计数状态。
现在,许多厂家生产的8051兼容单片机上,还加入了定时器/计数器2,使单片机的应用更为灵活,适应性更强。
很多8051单片机的书籍都对定时器/计数器有详细的介绍,我们在此不再详细地讨论。
但因为编写或或阅读程序时经常要查阅定时器/计数器的设置情况,因此我们仅对一些编程时经常要用到的较重要的寄存器和设置方式进行简要简介。
1 定时器/计数器简介8051单片机的定时器/计数器基本结构如图1-1所示,定时器T0由两个8位计数器TH0和TL0构成,定时器T1也由两个8位计数器TH1和TL1构成,TMOD寄存器控制定时器的工作方式,TCON寄存器控制定时器的启动和停止以及定时器的状态。
图1-1 定时器/计数器结构在作定时器使用时,输入的时钟脉冲是由晶体振荡器的输出经12分频后得到的。
实际上,定时器就是单片机机器周期的计数器。
因为每个机器周期包含晶体振荡器的12个振荡周期,而每一个机器周期定时器加1,故其频率为晶振频率的1/12。
如果晶振频率为12MHz,则定时器每接收一个输入脉冲的时间为1?s。
选择计数器工作方式时,计数脉冲来自相应的外部输入引脚T0(P3.4)或T1(P3.5)。
在这种情况下,当检测到输入引脚上的电平由高跳变到低时,计数器就加1。
2 控制和状态寄存器(1)定时器控制寄存器(TCON)TCON为定时器/计数器的控制寄存器,同时也锁存外部中断请求标志,各位定义如下。
TF1:定时器/计数器1中断请求标志位。
当定时器计数满溢出回零时,由硬件置位,并可申请中断。
当CPU响应中断并进入中断服务程序后,TF1自动清零。
TR1:定时器/计数器1运行控制位,靠软件置位或清除。
c51单片机中断详解
(3)该中断源的中断允许位=1,即该中断没有 被屏蔽。
(4)无同级或更高级中断正在被服务。
资料仅供参考
二、中断响应的主要过程
中断源
入口地址 资料仅供参考
外部中断0
0003H
定时器/计数器T0 000BH
外部中断1
0013H
定时器/计数器T1 001BH
在一个单一中断的系统里,MCS-51单片机 对外部中断请求的响应的时间总是在 3~8个机器周期之间。
资料仅供参考
补充:中断服务程序的设计
一、中断服务程序设计的任务 基本任务:
(1)设置中断允许控制寄存器IE。 (2)设置中断优先级寄存器IP。 (3)对外中断源,是采用电平触发还是跳沿
触发。 (4)编写中断服务程序,处理中断请求。 前3条一般放在主程序的初始化程序段中。
优
中断源
中断级别
先
外部中断0
最高
级
T0溢出中断
设
外部中断1 T1溢出中断 串行口中断
置 原 则?
最低
资料仅供参考
可归纳为下面三条基本规则: (1)低优先级可被高优先级中断,反之
则不能。 (2)同级中断不会被它的同级中断源所
中断。 (3)若CPU正在执行高优先级的中断,
则不能被任何中断源所中断。
例
例6-2 设置IP寄存器的资料初仅供参考始值,使2个外中断请 求为高优先级,其它中断请求为低优先级。
资料仅供参考
●对事件的整个处理过程称为中断 处理。 ●中断返回:处理完毕中断事件, 再回到原来被中止的地方。
没有中断,CPU的大 量时间会浪费在原地踏 步的操作上。
单片机原理及接口技术(C51编程)定时器计数器的工作原理及应用
7.2.2 方式1
方式1和方式0差别仅仅 在于计数器的位数不同,方 式1为16位计数器,由THx高 8位和TLx低8位构成(x = 0, 1),方式0则为13位计数器, 有关控制状态位含义(GATE、 C/T* 、TFx、TRx)与方式0 相同。
7.2.3 方式2
方式0和方式1最大特点是计数溢出后,计数器为全0。 因此在循环定时或循环计数应用时就存在用指令反复装入计 数初值的问题,这会影响定时精度,方式2就是为解决此问 题而设置的。
7.2.1 方式0
GATE位状态决定定时器/计数器运行控制取决于TRx一 个条件,还是取决于TRx和INTx*引脚状态两个条件。
GATE=0时,A点(见图7-4)电位恒为1,B点电位仅 取决于TRx状态。TRx=1,B点为高电平,控制端控制 电子开关闭合,允许T1(或T0)对脉冲计数。TRx=0, B点为低电平,电子开关断开,禁止T1(或T0)计数。
【例7-1】 在AT89S51的 P1口上接有8只 LED,原理电路 见图7-13。采 用T0方式1的定 时中断方式,使 P1口外接的8只 LED每0.5s闪亮 一次。
图7-13 方式1定时 中断控制LED闪亮
7.4.1 P1口控制8只LED每0.5s闪亮一次
(1)设置TMOD寄存器
T0工作在方式1,应使TMOD寄存器的M1、M0=01; 应设置C/T*=0,为定时器模式;对T0的运行控制仅由TR0 来控制,应使相应的GATE位为0。定时器T1不使用,各相关 位均设为0。所以,TMOD寄存器应初始化为0x01。
T0;TR0=0,则停止定时器T0定时。
7.4.1 P1口控制8只LED每0.5s闪亮一次
参考程序:
#include<reg51.h> char i=100; void main () {
C51定时器计数器详细讲解
多数情况下 不能满足要求
如何加大 延时时间
答案通Leabharlann 软件模拟成为 更多位数的定时器定时器每中断一次, 软件变量值增加1
定时器0/1
软件变量
…
定时器使用步骤
1
配置 定时器
2
设定时 器初值
3
启动 定时器
4
中断检 测
设定TMOD 设置THx和 寄存器中的相关位 TLx的初始值
将TCON中 的TFx位清0并 将TRx位置1
00:模式0 01:模式1 10:模式2 11:模式3
模式寄存器TMOD设置举例
现需要设置T0具有以下功能:
选择模式1 选择定时器功能 INT0引脚不参与启停控制
如何设置 TMOD
位号
位名
Bit7
GATE
Bit6
C/T
Bit5
M1
Bit4
M0
Bit3
GATE
Bit2
C/T
Bit1
M1
Bit0
„„
响应
中断程序的编写
中断的编程方法 配置中断
设定TMOD的相关位和THx、TLx的初始值
使能中断
编写ISR
TRx = 1,EA = 1
按照规则编写
ISR编写规则
函数名称 表明是中断服务函数
Warning!
不可直接调用ISR 必须让main函数 “看到”ISR原型
void isrName(void) interrupt n using i
8AH 8BH 8CH 8DH
复位值
00H 00H 00H 00H
定时/计数器模式0
当M1M0 = 00时,定时/计数器工作于模式0,使用TLx的低5位和THx 构成13位的加法计数器。
c51定时器中断
TH0 = 0xee;
// TH0重新预置
TR0 = 0;
//开始计数
cp++;
// timer0中断1次,变量cp加1
if(cp = 200)
//中断200次,时间刚好为1秒
{cp = 0;
counter[0]++;
//个位数,1秒加1
}
if(counter[0] == 10) {counter[0]= 0; counter[1]++;}
// Timer0的16位计数器初始值为
//0xee11,12MHz晶体振
//频率,单片机的机器周期为1微妙,
//Timer0每1微秒加1计数,
//加满溢出变产生中断,
//从计数到中断刚好为5毫秒
PT0 = 1;
//设置中断优先次序寄存器IP中的
//PT0位,Timer0中断优先
ET0 = 1;
//设置中断允许寄存器IE中ET0的
{
uchar d;
d = d * tick;
//d 的值1秒内改变1次,要么0x00,要么0xff
d = d | 0x7f;
//d 的值1秒内改变1次,要么0x7f, 要么0xff
swich(i)
{
case 0 : P0 = seven_seg[counter[0]%10]; break; //显示秒个位
//显示分十位
case 4 : P0 = 0x7f & seven_seg[counter[0]%10]; break; //显示数据高8位为低 电平,小数点常亮
case 5 : P0 = seven_seg[counter[0]/10]; break; //显示时十位
51单片机中的特殊寄存器、外部中断、定时器计器
1.特殊功能寄存器TCON (2)2.特殊功能寄存器SCON (9FH) (3)3.中断允许控制寄存器IE (0A8H) (3)4.中断优先级控制寄存器IP(B8H) (3)5.中断的系统结构 (4)6.开启外部中断 (5)7.定时器/计数器介绍 (6)8.定时/计数器的控制寄存器 (7)8.1定时/计数器控制寄存器TCON (7)8.2定时/计数器工作方式控制寄存器TMOD (7)9.定时/计数器工作方式 (9)9.1 工作方式0 (9)9.2 工作方式1 (9)9.3 工作方式2 (9)9.4 工作方式3 (9)10.定时/计数器的应用 (10)10.1计算定时/计数初值 (10)1.特殊功能寄存器TCONTCON 在特殊功能寄存器中,字节地址为88H ,位地址(由低位到高位)分别是88H-8FH 。
计数溢出标志位TF0(TF1)=1,计数溢出,要求单片机中断有效。
1,脉冲触发方式,下降沿有效现有效中断请求信号效中断请求信号88H 89H 8AH 8BH 8DH 8FHTCON 位功能:IE0/IE1:外部中断申请标志位: =0:没有外部中断申请;=1:有外部中断申请。
置1清0由硬件完成。
① IE1 —— 外中断中断请求标志当P3.3引脚信号有效时,IE1=1 ② IE0 —— 外中断中断请求标志当P3.2引脚信号有效时,IE0=1 ③ IT1 —— 外中断触发方式控制位• IT1=1,边沿触发方式;下降沿触发。
• IT1=0,电平触发方式。
低电平有效。
④ IT0 —— 外中断触发方式控制位• 其意义和功能与IT1相似。
• IT0/IT1:外部中断请求的触发方式选择位通过软件编程实现: • =0:在INT0/INT1端申请中断的信号低电平有效; • =1:在INT0/INT1端申请中断的信号负跳变有效. ⑤ TF1 —— T1溢出中断请求标志 T1计数溢出后,TF1=1 ⑥ TF0 —— T0溢出中断请求标志 T0计数溢出后,TF0=1TF0/TF1:定时器溢出中断申请标志位: (由硬件自动置位)。