当前位置:文档之家› 51单片机外部中断与定时器的实用

51单片机外部中断与定时器的实用

51单片机外部中断与定时器的实用
51单片机外部中断与定时器的实用

中断使能寄存器

通过设置中断使能寄存器 IE 的 EA 位 使能所有中断 每个中断源都有单独的使能位 可通过软件设置 IE 中相应的使能位在任何时候使能或禁能中断 中断使能寄存器 IE 的各 位如下所示

中断使能寄存器IE

位地址 0AFH 0AEH 0ADH 0ACH 0ABH 0AAH 0A9H 0A8H 位符号 EA

/ ET2 ES

ET1 EX1 ET0 EX0

EA 使能标志位 置位则所有中断使能 复位则禁止所有中断保留 ET2 定时器2 中断使能 ES 串行通信中断使能 ET1 定时器 1 中断使能 EX1 外部中断 1 使能 ET0 定时器0 中断使能 EX0 外部中断 0使能

8051 支持两个中断优先级 有标准的中断机制, 低优先级的中断只能被高优先级的中断所中断 ,而高优先级的中断不能被中断。

中断优先级寄存器

每个中断源都可通过设置中断优先级寄存器IP 来单独设置中断优先级 如果每个中断源的相应位被置位 则该中断源的优先级为高,如果相应的位被复位, 则该中断源的优先级为低, 如果你觉得两个中断源不够用 ,别急以后我会教你如何增加中断优先级 表 A-5 示出了 IP 寄存器的各位 此寄存器可位寻址 IP 寄存器

位地址 0BFH 0BEH 0BDH 0BCH 0BBH 0BAH 0B9H 0B8H 位符号 /

/

/ PS PT1 PX1 PT0 PX0

编号 中断源

中断向量

上电复位 0000H 0 外部中断0 0003H 1 定时器0溢出 000BH 2 外部中断1 0013H 3 定时器1溢出 001BH 4 串行口中断 0023H 5

定时器2溢出 002BH

PT2 定时器 2中断优先级 PS 串行通信中断优先级 PT1 定时器 1中断优先级 PX1 外部中断1 优先级 PT0 定时器0中断优先级 PX0 外部中断0 优先级

定时器控制寄存器 TCON

TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TF1 定时器1溢出中断标志响应中断后由处理器清零

TR1 定时器1控制位置位时定时器 1 工作复位时定时器 1 停止工作

TF0 定时器0溢出标志位定时器 0 溢出时置位处理器响应中断后清除该位TR0 定时器0控制位置位时定时器 0 工作复位时定时器 0 停止工作

IE1 外部中断1 触发标志位当检测到 P3.3 有从高到低的跳变电平时置位处理器响应中断后由硬件清除该位

IT1 中断1 触发方式控制位置位时为跳变触发复位时为低电平触发

IE0 外部中断1 触发标志位当检测到 P3.3 有从高到低的跳变电平时置位处理器响应中断后由硬件清除该位

IT0 中断1 触发方式控制位置位时为跳变触发复位时为低电平触发

定时器控制寄存器 TMOD

GATE C/T M1 M0 GATE C/T M1 M0 定时器1 定时器0

GATE 当 GATE置位时定时器仅当 TR=1并且 INT=1 时才工作如果 GATE=0 置位TR 定时器就开始工作

C/T 定时器方式选择如果 C/T=1 定时器以计数方式工作 C/T=0 时以

定时方式工作

M1 模式选择位高位

M0 模式选择位低位

定时器:

1、设置TMOD工作方式

2、允许定时器中断设置IE(ET0/ET1)

3、启动定时器设置TCON TR0/TR1

4、设置定时器初值 TH0、TL0

EA=1;

TR0=1;

ET0=1;

中断:

1、设置中断使能寄存器 IE的EX0

2、设置TCON 中断方式上升沿是下降沿(IT0/IT1)

EA=1;

EX0=1;

IT0=1;

C51单片机定时器及数码管控制实验报告

理工大学信息工程与自动化学院学生实验报告 (201 — 201学年第1 学期) 课程名称:单片机技术

一、实验目的 1.掌握定时器T0、T1 的方式选择和编程方法,了解中断服务程序的设计方法,学会实时程序的调试技巧。 2.掌握LED 数码管动态显示程序设计方法。 二、实验原理 1.89C51 单片机有五个中断源(89C52 有六个),分别是外部中断请求0、外部中断请求1、定时器/计数器0 溢出中断请求、定时器/计数器0 溢出中断请求及串行口中断请求。每个中断源都对应一个中断请求位,它们设置在特殊功能寄存器TCON 和SCON 中。当中断源请求中断时,相应标志分别由TCON 和SCON 的相应位来锁寄。五个中断源有二个中断优先级,每个中断源可以编程为高优先级或低优先级中断,可以实现二级中断服务程序嵌套。在

同一优先级别中,靠部的查询逻辑来确定响应顺序。不同的中断源有不同的中断矢量地址。 中断的控制用四个特殊功能寄存器IE、IP、TCON (用六位)和SCON(用二位),分别用于控制中断的类型、中断的开/关和各种中断源的优先级别。中断程序由中断控制程序(主程序)和中断服务程序两部分组成: 1)中断控制程序用于实现对中断的控制; 2)中断服务程序用于完成中断源所要求的中断处理的各种操作。 C51 的中断函数必须通过interrupt m 进行修饰。在C51 程序设计中,当函数定义时用了interrupt m 修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按MCS-51 系统中断的处理方式自动把它安排在程序存储器中的相应位置。 在该修饰符中,m 的取值为0~31,对应的中断情况如下: 0——外部中断0 1——定时/计数器T0 2——外部中断1 3——定时/计数器T1 4——串行口中断 5——定时/计数器T2 其它值预留。 89C51 单片机设置了两个可编程的16 位定时器T0 和T1,通过编程,可以设定为定时器和外部计数方式。T1 还可以作为其串行口的波特率发生器。

关于51单片机外部中断响应

关于51单片机外部中断响应 外部中断方式最好设为下降沿方式,特别是中断引 脚接按键的情况。 外部下降沿中断:SETB IT0。每个机器周期都由硬 件对引脚自动采样,若连续在2个周期采样到电平从高 到低,则认定有中断请求,IE0=1。IE0会一直保持到该 中断请求被CPU响应,响应前都不会自动清零,只有在 响应后硬件才自动将IE0清零IE0=0。 外部低电平中断:CLR IT0。当中断引脚为低电平时,并保持一个机器周期,硬件自动置IE0=1。如果在下一个 周期采样到中断引脚为高电平时,硬件自动将IE0清0。中断标志位自动清0条件:下降沿中断只有CPU响应中断同时才会清0,否则一直保持。低电平中断:任何时候 当外部中断引脚为低电平时,IE0=1;为高电平时, IE0=0,所以不需要响应中断才会清0,与引脚状态有关。注意:当EA=0时,中断引脚为低电平也不会将IE0自动置1,只有EA=1时才会自动置1 单片机设计中有两个CPU时,主CPU控制副CPU中断时应注意:主CPU发出中断信号的时候,副CPU能够及时接收到,也就是副CPU工作状态不允许在关中断CLR EA的程序中运行。只要副CPU不工作在关中断的程序中运行,

主CPU发出的中断信号副CPU都能够及时响应中断。还有就是如果采用下降沿方式,主CPU发出的高低电平之间间隔时间只需一条NOP指令。所以应该尽可能考虑这个时差问题。有时候就是副CPU还没有运行完屏蔽中断的程序的时候,主CPU就发出了中断信号,造成副CPU无法中断或时好时坏。 键盘中断到今天为止终于可以告一段落了。 现在才知道,程序架构有了并不代表程序就容易完成,更多的时间在于调试,防真,再调试,如此循环。所以遇到问题要有耐心,信心,细心。做到这三点,不行也得行!!!!

MCS-51单片机计数器定时器

80C51单片机内部设有两个16位的可编程定时器/计数器。可编程的意思是指其功能(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。在定时器/计数器中除了有两个16位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。 : 从上面定时器/计数器的结构图中我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1构成。其访问地址依次为8AH-8DH。每个寄存器均可单独访问。这些寄存器是用于存放定时或计数初值的。此外,其内部还有一个8位的定时器方式寄存器TMOD和一个8位的定时控制寄存器TCON。这些寄存器之间是通过内部总线和控制逻辑电路连接起来的。TMOD主要是用于选定定时器的工作方式;TCON主要是用于控制定时器的启动停止,此外TCON还可以保存T0、T1的溢出和中断标志。当定时器工作在计数方式时,外部事件通过引脚T0(P3.4)和T1 (P3.5)输入。 定时计数器的原理: 16位的定时器/计数器实质上就是一个加1计数器,其控制电路受软件控制、切换。 当定时器/计数器为定时工作方式时,计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出为止。显然,定时器的定时时间与系统的振荡频率有关。因一个机器周期等于12个振荡周期,所以计数频率fcount=1/12osc。如果晶振为12MHz,则计数周期为: T=1/(12×106)Hz×1/12=1μs 这是最短的定时周期。若要延长定时时间,则需要改变定时器的初值,并要适当选择定时器的长 度(如8位、13位、16位等)。 当定时器/计数器为计数工作方式时,通过引脚T0和T1对外部信号计数,外部脉冲的下降沿将触发计数。计数器在每个机器周期的S5P2期间采样引脚输入电平。若一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。此后的机器周期S3P1期间,新的计数值装入计数器。所以检测一个由1至0的跳变需要两个机器周期,故外部事年的最高计数频率为振荡频率的1/24。例如,如果选用12MHz 晶振,则最高计数频率为0.5MHz。虽然对外部输入信号的占空比无特殊要求,但为了确保某给定电平在变化前至少被采样一次,外部计数脉冲的高电平与低电平保持时间均需在一个机器周期以上。

51单片机定时中断C语言的写法步骤

51单片机定时中断C语言的写法步骤 程序说明:51单片机定时器0工作于方式一,定时50ms中断一次 晶振为12M #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 ET0 = 1; //开定时器0中断 EA = 1; //开总中断 TR0 = 1; //启动定时器0 while(1) { ; } } void Timer0_int() interrupt 1 { //重新装初值 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 } /****************************************************************************** *********************************/ 上面是比较好理解的。如果实在要求简洁的话,看下面的,跟上面功能一样 #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = 0x3c; //高八位装入初值 TL1 = 0xb0; //低八位装入初值 IE = 0x82;//开总中断并开定时器0中断 TR0 = 1; //启动定时器0 while(1) { ; } }

void Timer0_int() interrupt 1 { //重新装初值 TH1 = 0x3c; //高八位装入初值TL1 = 0xb0; //低八位装入初值}

基于51单片机的外部中断实例

51单片机一般有两个外部中断输入端,并允许外部中断源以低电平或负边沿两种触发方式输入中断请求信号。本例就是利用一只按钮,在按下时产生的负边沿触发外部中断。 1 硬件设计 将一只按钮接在外部中断输入0(12脚),八支发光二极管分别接在P0.0~P0.7,其电路如下图所示。 ⒉软件设计 通过按下按钮SW触发外部中断,从而改变发光二极管D1~D8的亮、灭,当第一次按下按钮时,只有D1发光二极管亮;第二次按下按钮时,只有D2发光二极管亮;第三次按下按钮时,只有D3发光二极管亮;……第八次按下按钮时,只有D8发光二极管亮;第九次按下按钮时,D1~D8发光二极管全亮;第十次按下按钮时,D1~D8发光二极管全都不亮;第十一次按下按钮时,只有D1发光二极管亮; 按钮SW触发外部中断,从而控制D1~D8亮灭的详细C51程序如下。 /***************外部中断****************/ #include unsigned char count=0; //外部中断计数 unsigned char F0=0; main(){ F0=0;

IE=0X81;//打开外部中断0和总中断使能或者(EX0=1;EA=1) IT0=1; //标志位清零,开中断 ,边沿激活(或者TCON|=0X01) while(1) { while(F0==0); switch(count%10){ case(0): P0=0XFF;break; case(1): P0=0XFE;break; case(2): P0=0XFD;break; case(3): P0=0XFB;break; case(4): P0=0XF7;break; case(5): P0=0XEF;break; case(6): P0=0XDF;break; case(7): P0=0XBF;break;case(8): P0=0X7F;break; case(9): P0=0X00;break; } F0=0; } } void int_int0() interrupt 0 //外部中断 { count++;F0=1; }

51单片机C语言中断程序定时计数器

51单片机C语言中断程序定时/计数器 程序一 利用定时/计数器T0从P1.0输出周期为1s 的方波,让发光二极管以1HZ闪烁, #include //52单片机头文件 #include //包含有左右循环移位子函数的库#define uint unsigned int //宏定义 #define uchar unsigned char //宏定义 sbit P1_0=P1^0; uchar tt; void main() //主函数 { TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;//开总中断 ET0=1;//开定时器0中断 TR0=1;//启动定时器0 while(1);//等待中断产生 }

void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++; if(tt==20) { tt=0; P1_0=~P1_0; } } 程序二 利用定时/计数器T1产生定时时钟, 由P1口控制8个发光二极管, 使8个指示灯依次一个一个闪动, 闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。#include //52单片机头文件 #include //包含有左右循环移位子函数的库 #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义

51单片机中断总结

51单片机中断总结: 1. 查询优先级为固定的(外部中断0>定时器0>外部中断1>定时器1>串行中断)。 2. 执行优先级可以通过IP寄存器进行设置(高/低)。 3. CPU同时收到多个中断请求时,首先响应优先级较高者,然后相应优先级较低者;如果 优先级相同,则按照查询优先级顺序依次响应。 4. 正在执行的中断服务,不能被同级或更低级的中断请求打断,但会被更高级的中断请求 打断。推论(1)高优先级的中断不能被任何其它中断所打断(2)低优先级的中断只能在没有任何中断服务运行时得到响应。 5. 对于定时器和外部中断,在进入中断服务后,其中断标志位会自动清零;对于串行中断,由于有两个中断源,需要手动查询并清零RI或/和TI。 if (RI) { // processing RI = 0; } if (TI) { // processing TI = 0; } 6. 如果是使用汇编写中断服务,需要保护累加器、状态寄存器、寄存器组等 8051 Tutorial: Interrupts https://www.doczj.com/doc/413739286.html,/tutint.php As the name implies, an interrupt is some event which interrupts normal program execution. As stated earlier, program flow is always sequential, being altered only by those instructions which expressly cause program flow to deviate in some way. However, interrupts give us a mechanism to "put on hold" the normal program flow, execute a subroutine, and then resume normal program flow as if we had never left it. This subroutine, called an interrupt handler, is only executed when a certain event (interrupt) occurs. The event may be one of the timers "overflowing," receiving a character via the serial port, transmitting a character via the serial

51单片机外部中断与定时器的实用

中断使能寄存器 通过设置中断使能寄存器 IE 的 EA 位 使能所有中断 每个中断源都有单独的使能位 可通过软件设置 IE 中相应的使能位在任何时候使能或禁能中断 中断使能寄存器 IE 的各 位如下所示 中断使能寄存器IE 位地址 0AFH 0AEH 0ADH 0ACH 0ABH 0AAH 0A9H 0A8H 位符号 EA / ET2 ES ET1 EX1 ET0 EX0 EA 使能标志位 置位则所有中断使能 复位则禁止所有中断保留 ET2 定时器2 中断使能 ES 串行通信中断使能 ET1 定时器 1 中断使能 EX1 外部中断 1 使能 ET0 定时器0 中断使能 EX0 外部中断 0使能 8051 支持两个中断优先级 有标准的中断机制, 低优先级的中断只能被高优先级的中断所中断 ,而高优先级的中断不能被中断。 中断优先级寄存器 每个中断源都可通过设置中断优先级寄存器IP 来单独设置中断优先级 如果每个中断源的相应位被置位 则该中断源的优先级为高,如果相应的位被复位, 则该中断源的优先级为低, 如果你觉得两个中断源不够用 ,别急以后我会教你如何增加中断优先级 表 A-5 示出了 IP 寄存器的各位 此寄存器可位寻址 IP 寄存器 位地址 0BFH 0BEH 0BDH 0BCH 0BBH 0BAH 0B9H 0B8H 位符号 / / / PS PT1 PX1 PT0 PX0 编号 中断源 中断向量 上电复位 0000H 0 外部中断0 0003H 1 定时器0溢出 000BH 2 外部中断1 0013H 3 定时器1溢出 001BH 4 串行口中断 0023H 5 定时器2溢出 002BH PT2 定时器 2中断优先级 PS 串行通信中断优先级 PT1 定时器 1中断优先级 PX1 外部中断1 优先级 PT0 定时器0中断优先级 PX0 外部中断0 优先级

AT89C51单片机定时器中断模式和查询设置

AT89C51单片机定时器终端模式和查询设置 T1为定时模式,定时65.536ms,P2.0对应的LED等闪烁一次,T0计数模式,计数脉冲从P3.4脚用按键输入,按一次,记一次,所以计数初值为0FFFFh,没按一次,产生一个溢出,P2.5对应的LED闪烁,同时数码管加1显示。 一、定时/计数器终端模式 org 0000h ljmp bb ;跳转到主程序入口bb处 org 000bh ;定时器0中断响应从这里开始执行 cjne r2,#9d,xx mov r2,#00h ljmp xx11 org 001bh ;定时器1中断响应从这里开始执行 ljmp xxx bb: mov p1,#3fh ;主程序入口处 mov tmod,#05h ;05h=0000 0101B设置T1定时T0计数模式,0定时,1计数 ;00是13位二进制计数模式0,高4位控制T1 ;01是16位二进制计数模式1,低4位控制T0 mov dptr,#0300h ;查表入口地址存放 mov r2,#00h

setb et0 ;和setb 0afh效果相同 setb ea ;和setb 0abh相同 setb et1 ;和setb 0a9h相同 setb tr0 setb tr1 mov th0,#0ffh ;计数器0的计数初值的高8位 mov tl0,#0fdh ;计数器0的计数初值的低8位(第一次开始计数初值) sjmp $ ;程序执行时,原地踏步等待语句,在没有中断请求时, ;在此位置原地踏步计数定时计数,有请求时跳到中断入口执行中断xx: inc r2 xx11: mov th0,#0ffh ;计数器0的计数初值的高8位 mov tl0,#0fdh ;计数器0的计数初值的低8位(第二次以后开始计数初值) mov a,r2 movc a,@a+dptr cpl p2.5 mov p1,a reti xxx: mov th1,#00h ;计数器1的计数初值的高8位 mov tl1,#00h ;计数器1的计数初值的低8位 cpl p2.0 reti org 0300h ;七段显示吗表格入口 db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh end 二、定时/计数器查询模式 org 0000h ljmp bb ;跳转到主程序入口bb处 bb: mov tmod,#15h ;主程序入口处 ;设置T1定时模式,工作在计数方式0,设置T0计数模 ;式工作在计数方式1 mov dptr,#0300h ;查表入口地址存放 clr et0 ;关定时/计数器0中断 setb ea ;和setb 0abh相同,开总中断开关 setb et1 ;和setb 0a9h相同,开定时/计数器1中断 setb tr0 setb tr1 mov th0,#0ffh ;计数器0的计数初值的高8位 mov tl0,#0ffh ;计数器0的计数初值的低8位(第一次开始计数初值) CX: JBC TF0, xx ;查询定时/计数器0溢出标志位,有溢出跳转xx执行 JBC TF1, xxx ;查询定时/计数器1溢出标志位,有溢出跳转xxx执行 sjmp CX ;无溢出,跳CX继续查询 ;溢出是在THi和TLi计数满,超过FFFFH时,TFi被自动置1,中断和查询都是根 ;据这个标志是否为1来响应的。 xx: mov th0,#0ffh ;计数器0的计数初值的高8位 mov tl0,#0ffh ;计数器0的计数初值的低8位(第二次以后开始计数初值) cjne r2,#10d,xx11 mov r2,#00h

51单片机外部中断实验

实验6 外部中断实验 (仿真部分) 一、实验目的 1. 学习外部中断技术的基本使用方法。 2. 学习中断处理程序的编程方法。 二、实验内容 在INT0和INT1上分别接了两个可回复式按钮,其中INT0上的按钮每按下一次则计数加一,其中INT1上的按钮每按下一次则计数减一。P1.0~ P1.3接LED灯,以显示计数信号。 三、实验说明 编写中断处理程序需要注意的问题是: 1.保护进入中断时的状态,并在退出中断之前恢复进入时的状态。 2.必须在中断处理程序中设定是否允许中断重入,即设置EX0位。 3.INT0和INT1分别接单次脉冲发生器。P1.0~ P1.3接LED灯,以查看计数信号. 四、硬件设计 利用以下元件:AT89C51、BOTTON、CAP、CAP-POL、CRYSTAL、RES、NOT、LED-Yellow。设计出如下的硬件电路。晶振频率为12MHz。 五、参考程序框图 开始 设置有关中断控制寄存器 开外中断INT0、INT1 设置P1.0~ 3初始状态 显示循环等待中断 INT0中断入口 计数加一 保护现场 恢复现场 中断返回

主程序框图INT0中断处理程序框图 实验6 外部中断实验 (实验箱部分) 1.实验目的 认识中断的基本概念 学会外部中断的基本用法 学会asm和C51的中断编程方法 2.实验原理 图按键中断 【硬件接法】 P1.1控制LED,低电平点亮 P3.3/INT1接按键,按下时产生低电平 【运行效果】 程序工作于中断方式,按下按键K2后,LED点亮,1.5秒后自动熄灭。 8051单片机有/INT0和/INT1两条外部中断请求输入线,用于输入两个外部中断源的中断请求信号,并允许外部中断源以低电平或下降沿触发方式来输入中断请求信号。/INT0和/INT1中断的入口地址分别是0003H和0013H。 TCON寄存器(SFR地址:88H)中的IT0和IT1位分别决定/INT0和/INT1的触发方式,置位时为下降沿触发,清零时为低电平触发。实际应用时,如果外部的中断请求信号在产生后能够在较短时间内自动撤销,则可以选择低电平触发。在中断服务程序里要等待其变高后才能返回主程序,否则会再次触发中断,产生不必要的麻烦。 如果外部的中断请求信号产生后可能长时间后才能撤销,则为了避免在中断服务程序里长时间无谓等待,可以选择下降沿触发。下降沿触发是“一次性”的,每次中断只会有1个下降沿,因此中断处理程序执行完后可以立即返回主程序,而不必等待中断请求信号恢复为高电平,这是一个重要的技巧。 3. 实验步骤 ●参考实验例程,自己动手建立Keil C51工程。注意选择CPU类型。Philips半导体的 P89V51RB2。 ●编辑源程序,编译生成HEX文件。 ●ISP下载开关扳到“00”,用Flash Magic软件下载程序HEX文件到MCU BANK1,运行。 运行Flash Magic软件。各步骤操作如下:

51单片机定时器设置

51单片机定时器设置入门(STC89C52RC) STC单片机定时器设置 STC单片机定时器的使用可以说非常简单,只要掌握原理,有一点的C语言基础就行了。要点有以下几个: 1. 一定要知道英文缩写的原形,这样寄存器的名字就不用记了。 理解是最好的记忆方法。好的教材一定会给出所有英文缩写的原形。 2. 尽量用形像的方法记忆 比如TCON和TMOD两个寄存器各位上的功能,教程一般有个图表,你就在学习中不断回忆那个图表的形像 TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER) 定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。 其格式为: 其中低四位定义定时器/计数器C/T0,高四位定义定时器/计数器C/T1,各位的说明: GA TE——门控制。 GA TE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。 当INT0引脚为高电平时TR0置位,启动定时器T0; 当INT1引脚为高电平时TR1置位,启动定时器T1。 GA TE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。 C/T——功能选择位 C/T=0时为定时功能,C/T=1时为计数功能。 置位时选择计数功能,清零时选择定时功能。

M0、M1——方式选择功能 由于有2位,因此有4种工作方式: M1M0 工作方式计数器模式TMOD(设置定时器模式) 0 0 方式0 13位计数器TMOD=0x00 0 1 方式1 16位计数器TMOD=0x01 1 0 方式 2 自动重装8位计数器TMOD=0x02 1 1 方式3 T0分为2个8位独立计数器,T1为无中断重装8位计数器TMOD=0x03 单片机定时器0设置为工作方式1为TMOD=0x01 这里我们一定要知道,TMOD的T是TIMER/COUNTER的意思,MOD是MODE的意思。至于每位上的功能,你只要记住图表,并知道每个英文缩写的原型就可以了。 在程序中用到TMOD时,先立即回忆图表,并根据缩写的单词原形理出每位的意义,如果意义不是很清楚,就查下手册,几次下来,TMOD的图表就已经在脑子里了。 8位GA TE位,本身是门的意思。 7位C/T Counter/Timer 6位M1 Mode 1 5位M0 Mode 0 TCON: 定时器/计数器控制寄存器(TIMER/COUNTER CONTROL REGISTER) TMOD分成2段,TCON控制更加精细,分成四段,在本文中只要用到高四段。 TF0(TF1)——计数溢出标志位,当计数器计数溢出时,该位置1。 TR0(TR1)——定时器运行控制位 当TR0(TR1)=0 停止定时器/计数器工作 当TR0(TR1)=1 启动定时器/计数器工作 IE0(IE1)——外中断请求标志位 当CPU采样到P3.2(P3.3)出现有效中断请求时,此位由硬件置1。在中断响应完成后转向中断服务时,再由硬件自动清0。 IT0(IT1)——外中断请求信号方式控制位 当IT0(IT1)=1 脉冲方式(后沿负跳有效) 当IT0(IT1)=0 电平方式(低电平有效)此位由软件置1或清0。 TF0(TF1)——计数溢出标志位

51单片机定时器中断

一.定时器相关寄存器 1. 工作方式寄存器(TMOD) 该寄存器用于设置定时/计数器的工作方式,低四位用于定时器0,高四位用于定时器1。GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。 C/T:定时/计数模式选择位。C/T=0为定时模式;C/T=1为计数模式。

2. 定时器/计数器控制寄存器控制寄存器(TCON) 该寄存器的低4位用于控制外部中断,已在前面介绍,高4位用于控制定时/计数器的启动和中断申请。 TF1:T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。 TR1:T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。 TF0:T0溢出中断请求标志位,其功能与TF1类同。 TR0:T0运行控制位,其功能与TR1类同。 3. 中断允许控制寄存器(IE) ET0:定时/计数器T0中断允许位; ET1:定时/计数器T1中断允许位; EA :CPU中断允许(总允许)位。

二.定时器溢出中断的处理过程 1、设置定时器工作方式 2、为定时器装入初值 3、定时器中断允许位置为1 4、开总中断 5、开定时器,等待产生溢出中断请求 三.实现简单时钟 说明: 1.使用动态数码管显示 2.选择工作方式1,以16位的定时器0进行工作,即TMOD=0x01,中断编号为1; 3.定时50ms,即每隔50ms产生一次中断: TH0=(65536-50000)/256; //16位定时器的高8位 TL0=(65536-50000)%256; //16位定时器的低8位 具体的时间与单片机的晶振有关,请了解机器周期、指令周期、时钟周期等相关知识。#include #define uchar unsigned char#define uint unsigned int uchar hour,min,sec; uchar code wei[8]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //共阴极数码管位选编码

51单片机每个外部中断和定时器中断 应用模版

第一步,中断配置 /************************************************************ 函数名:INT0_Config 功能:配置单片机与中断相关的硬件,让单片机能够正常检测中断和执行中断代码。 输入参数: 输出参数: ************************************************************/ void INT0_Config(void) { IT0=1; //中断触发方式,IT0=0,低电平触发,INT0=1下降沿触发(下降沿就是由高电平向低电平的跳变); EX0=1; //外部中断0的中断开关,每个中断源都有自己的中断开关。 EA=1; //打开总中断,如果总中断不打开,就是其他中断开关被打开,单片机也不能执行中断。 } 第二步,中断服务,也就是cpu被中断后所要做的事。 /************************************************************ 函数名:Isr_INT0 功能:中断服务 输入参数: 输出参数: ************************************************************/ void Isr_INT0() interrupt 0 //interrupt表明该函数是中断函数,后面的标号表示是哪个中断源产生的中断。{ //(INT0)为0, Timer0为1,INT1为2,Timer3,串口中断为4。 // Add your code here //自己想要中断后发生的程序 } 第三部主函数 /************************************************************ 函数名:main 功能:主函数 输入参数: 输出参数: ************************************************************/ void main() { INT0_Config();//调用这个函数来配置外部中断 while(1) { //Add your code here //CPU一直在这里循环的执行代码,一旦发生中断,就停下来去执行中断函数Isr_INT0() interrupt 0, //执行完成后,返回从断点处继续往下执行原来的代码。 } }

51单片机12M和11.0592M晶振定时器初值TL0和TH0的计算

51单片机12M和11.0592M晶振定时器初值TL0和TH0的计算 #include #include void timer0_init() { TMOD=0x01;//方式1 TL0=0xb0; TH0=0x3c; TR0=1; ET0=1; } void timer0_ISR(void) interrupt 1 { TL0=0xb0; TH0=0x3c;//50ms中断一次 single++; if(single==20) { kk++; single=0; } } void main() { int kk=0;//计数器 int single=0; timer0_init(); } TL0=0xb0; TH0=0x3c; 这两个是怎么算出来得,如果晶振不是12Mhz ,是11.0592 MHz 怎么算 12M的晶振每秒可产生1M个机器周期,50ms就需要50000个机器周期,定时器在方式1工作,是16位计数器,最大值为65536,所以需设置初值15536,即3CB0H(10进制15536转换成16进制数3CB0),所以TH0=0x3c,TL0=0xb0。(65536-50000周期=初值15536) 高位就是TH0的值,低位为TL0的值 11.0592M的晶振每秒可产生0.9216M个机器周期,50ms就需要46080个机器周期,定时器在方式1工作,是16位计数器,最大值为65536,所以需设置初值19456,即4C00H,所以TH0=0x4c,TL0=0x00。其实很简单,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期 机器周期=12/n(n指晶振频率),假设你要定时的时间为M 那么定时的初值为: M/机器周期=初值; TH0=(65536-初值)%256; TL0=(65536-初值)/256; 将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值 例如用12M晶振做1ms定时计算如下: 机器周期=12/12*10^6=1us(微秒) 定时初值=(1*10^-3)/(1*10^-6)=1000; 所以:TH0=(65536-1000)%256; TL0=(65536-1000)/256; 将65536-1000=64536化为16进制为:0xFC18 TH0=0xFC; TL0=0X18;

51单片机外部中断详解

一.外部中断相关寄存器 1.定时器/计数器控制寄存器控制寄存器(TCON) IT0:外部中断0触发方式控制位 当IT0=0时,为电平触发方式(低电平有效) 当IT0=1时,为边沿触发方式(下降沿有效) IT1:外部中断1触发方式控制位 当IT1=0时,为电平触发方式(低电平有效) 当IT1=1时,为边沿触发方式(下降沿有效) 2.中断允许控制寄存器(IE) EX0:外部中断0允许位; EX1:外部中断1允许位; EA :CPU中断允许(总允许)位。 二.外部中断的处理过程 1、设置中断触发方式,即IT0=1或0,IT1=1或0

2、开对应的外部中断,即EX0=1或EX1=1; 3、开总中断,即EA=1; 4、等待外部设备产生中断请求,即通过,口连接外部设备产生中断 5、中断响应,执行中断服务函数 三.程序编写 要求:通过两位按键连接外部中断0和1,设定外部中断0为下降沿触发方式,外部中断1为低电平触发方式,按键产生中断使数字加减,用一位共阳极数码管来显示数值。 目的:感受外部中断对程序的影响,体会低电平触发和下降沿触发的区别。 #include<>#define uint unsigned int #define uchar unsigned char uchar code dat[]={0xc0, 0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uint num; void main() { ! EA=1; //开总中断 IT0=1; //下降沿触发 IT1=0; //低电平触发 EX0=1; //外部中断0允许 EX1=1; //外部中断1允许 while(1) { P0=dat[num%10]; } } { void plus() interrupt 0//外部中断0

51单片机定时系统详解

51单片机中断系统 using 0 是第0组寄存器; using 1 是第1组寄存器; using 2 是第2组寄存器; using 3 是第3组寄存器; 51单片机内的寄存器是R0--R7(不是R0-R3) R0-R7在数据存储器里的实际地址是由特殊功能寄存器PSW里的RS1、RS0位决定的。 using 0时设置RS1=0,RS0 =0,用第0组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(00H)....R7(07H) using 1时设置RS1=0,RS0 =1,用第1组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(08H)....R7(0FH) using 2时设置RS1=1,RS0 =0,用第2组寄存器,R0--R7的在数据存储区里的实际地址是08H-0FH。R0(10H)....R7(17H) using 3时设置RS1=1,RS0 =1,用第3组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(18H)....R7(1FH)

中断允许寄存器IE EA---全局中允许位。 EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。EA=0,关闭全部中断。 -------,无效位。 ET2---定时器/计数器2中断允许位。EA总中断开关,置1为开; ET2=1,打开T2中断。EX0为外部中断0(INT0)开关,……ET2=0,关闭T2中断。ET0为定时器/计数器0(T0)开关,……ES---串行口中断允许位。EX1为外部中断1(INT1)开关,……ES=1,打开串行口中断。ET1为定时器/计数器1(T1)开关,……ES=0,关闭串行口中断。ES为串行口(TX/RX)中断开关,……ET1---定时器/计数器1中断允许位。ET2为定时器/计数器2(T2)开关,……ET1=1,打开T1中断。 ET1=0,关闭T1中断。 EX1---外部中断1中断允许位。 EX1=1,打开外部中断1中断。 EX1=0,关闭外部中断1中断。 ET0---定时器/计数器0中断允许位。 ET0=1,打开T0中断。 ET0=0,关闭T0中断。 EX0---外部中断0中断允许位。 EX0=1,打开外部中断0中断。 EX0=0,关闭外部中断0中断。 -------,无效位。 PS---串行口中断优先级控制位。 PS=1,串行口中断定义为高优先级中断。 PS=0,串行口中断定义为低优先级中断。 PT1---定时器/计数器1中断优先级控制位。 PT1=1,定时器/计数器1中断定义为高优先级中断。 PT1=0,定时器/计数器1中断定义为低优先级中断。 PX1---外部中断1中断优先级控制位。 PX1=1,外部中断1中断定义为高优先级中断。 PX1=0,外部中断1中断定义为低优先级中断。 PT0---定时器/计数器0中断优先级控制位。 PT0=1,定时器/计数器0中断定义为高优先级中断。 PT0=0,定时器/计数器0中断定义为低优先级中断。 PX0---外部中断0中断优先级控制位。

51单片机定时器使用

sTC单片机定时器的使用可以说非常简单,只要掌握原理,有一点的C语言基础就行了。要点有以下几个: 1.一定要知道英文缩写的原形,这样寄存器的名字就不用记了。 理解是最好的记忆方法。好的教材一定会给出所有英文缩写的原形。 2.尽量用形像的方法记忆。 比如TCON和TMOD两个寄存器各位上的功能,教程一般有个图表,你就在学习中不断回忆那个图表的形像。 3.TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER) 定时器/计数器C/T1,各位的说明: (1)GATE——门控制。 GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。 当INT0引脚为高电平时TR0置位,启动定时器T0; 当INT1引脚为高电平时TR1置位,启动定时器T1。 GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。 (2)C/T——功能选择位 C/T=0时为定时功能,C/T=1时为计数功能。 置位时选择计数功能,清零时选择定时功能。 (3)M0、M1——方式选择功能 由于有2位,因此有4种工作方式: M1M0 工作方式计数器模式TMOD(设置定时器模式) 0 0 方式0 13位计数器TMOD=0x00 0 1 方式1 16位计数器TMOD=0x01 1 0 方式 2 自动重装8位计数器TMOD=0x02 1 1 方式3 T0分为2个8位独立计数器,T1为无中断重装8位计数器TMOD=0x03 单片机定时器0设置为工作方式1为TMOD=0x01 这里我们一定要知道,TMOD的T是TIMER/COUNTER的意思,MOD是MODE的意思。 至于每位上的功能,你只要记住图表,并知道每个英文缩写的原型就可以了。 在程序中用到TMOD时,先立即回忆图表,并根据缩写的单词原形理出每位的意义,如果意义不是很清楚,就查下手册,几次下来,TMOD的图表就已经在脑子里了。 8位GATE位,本身是门的意思。 7位C/T Counter/Timer 6位M1 Mode 1 5位M0 Mode 0 4.TCON: 定时器/计数器控制寄存器(TIMER/COUNTER CONTROL REGISTER)

用单片机的外部中断来测频率

用单片机的外部中断来测频率 用51单片机的外部中断来测频率 作者:佚名来源:本站原创点击数: 302 更新时间:2010年08月08日【字体:大中小】 //晶振:12M //实验方法:首先要把51hei单片机开发板上的ne555的方波输出信号J7的第一脚用杜邦线 // 引入P3.2口,数码管即可显示ne555震荡电路当前的频率值,旋动PR1电位器可 // 发现数字有变化. //原理:1秒钟内计数外部脉冲个数,如计数1000次,则表示频率为1000Hz //1秒钟定时采用51单片机定时器0实现,外部脉冲由外部中断0引脚接入 #include<reg51.h> #include"51hei.h" #define uchar unsigned char uchar counter1; sbit duan=P2^6; //74HC573的LE端U5 LED的段选端 sbit wei=P2^7; //74HC573的LE端U4 LED的位选端 unsigned int counter2,tmp; uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 共阳型数码管0—9显示 unsigned int dis[6]; uchar con[]={0xfe,0xfd,0xfb,0xf7,0xef}; //共阳型数码管控制端 init(); delay(uchar); display(); jishu(); void main() {guandz(); init(); while(1) { jishu(); }

实验四 单片机外部中断实验

实验四单片机外部中断实验 一、实验目的 1.理解单片机AT89C51的中断原理及其中断过程。 2.用proteus设计、仿真AT89C51单片机的外部中断。 外部中断就是单片机AT89C51的重要功能,本实验用AT89C51单片机外部中断功能改变数码管的显示状态。当无外部中断0时,主程序运行状态为七段数码管的a~g段依次点亮,不断循环;当有外部中断0(单片机P3、2脚上有下降沿电压)输入时,立即产生中断,转而执行中断服务程序,数码管显示状态为“8”亮灭闪烁显示,亮灭闪烁显示8次以后,返回主程序原断点处继续执行,数码管继续段点亮的循环显示。 1 ③7SEG-COM-AN-GRN:绿色发光二极管; ④CAP、CAP-ELEC:电容、电解电容; ⑤CRYSTAL:晶振; ⑥BUTTON:按钮。 2、放置元器件

3、放置电源与地 4、连线 5、元器件属性设置 6、电气检测 四、源程序设计、生成目标代码文件 1、流程图 2、源程序设计 通过菜单“sourc e→Add/Remove Source Files…”新建源程序文件:DZC33、ASM。 通过菜单“sourc e→DZC34、ASM”,打开PROTEUS提供的文本编辑器SRCEDIT,在其中编辑源程序。 程序编辑好后,单击按钮存入文件DZC34、ASM。 3、源程序编译汇编、生成目标代码文件 通过菜单“sourc e→Build All”编译汇编源程序,生成目标代码文件。若编译失败,可对程序进行修改调试直至汇编成功。 五、PROTEUS仿真 1、加载目标代码文件 2、全速仿真 单击按钮,启动仿真。 3、仿真调试 (1)带断电仿真

相关主题
文本预览
相关文档 最新文档