赞
踩
中断
中断嵌套——多级中断系统/单机中断系统
中断源(引起CPU中断的根源)、断点(中断的地方)
8个中断源(外部中断0(INT0)、外部中断 1(INT1)、外部中断 2(INT2)、外部中断 3(INT3)、定时器 0中断、定时器 1 中断、定时器 2 中断、串口(UART)中断)
[四个外部中断、三个定时器中断、一个串口中断]通常使用INT0、INT1
51单片机一定有5个中断(INT0、INT1、定时器 0/1,串口中断)
当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。
当中断来临时,只有中断号正确才能进入中断。
INT0(P3_2)、INT1(P3_3)——中断,低电平或下降沿有效
T0(P3_4)、T1(P3_5)——溢出中断请求标志
RXD(P3_0)[接受完]、TXD(P3_1)[发生完]——串行口中断请求标志
CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器 IE 控制的。
TR0/1:定时器TR0/1的运行控制位
中断响应条件(同时满足才有可能响应)
中断源有中断请求
此中断源的中断允许位为1
CPU开中断(EA = 1)
主程序中包含代码:
EA=1;//打开总中断开关
EX0=1;//开外部中断 0
IT0=0/1;//设置外部中断的触发方式`
中断服务函数:
void int0() interrupt 0 using 1
{
//编写用户所需的功能代码
}
/*
在中断函数中 int0 是函数名,可自定义,但必须符合 C 语言标识符定义规则,interrupt 是一个关键字,表示 51 单片机中断。
后面的“0”是中断号,外部中断 0 中断号为 0,这个可参考前面的内容。后面的using 1 可省略不写。
*/
时序
①振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡
周期)。
②状态周期:2 个振荡周期为 1 个状态周期,用 S 表示。振荡周期又称 S 周期或时钟周期。
③机器周期:1 个机器周期含 6 个状态周期,12 个振荡周期
④指令周期:完成 1 条指令所占用的全部时间,它以机器周期为单位。
例如:外接晶振为 12MHz 时,51 单片机相关周期的具体值为:
振荡周期=1/12us;
状态周期=1/6us;
机器周期=1us;
指令周期=1~4us;
①51 单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。
②定时器/计数器和单片机的 CPU 是相互独立的。定时器/计数器工作的过程是自动完成的,不需要 CPU 的参与。
③51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加 1。
有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加 1 的工作可以交给定时器/计数器处理。CPU 转而处理一些复杂的事情。同时可以实现精确定时作用。
原理
STC89C5X 单片机内有两个可编程的定时/计数器 T0、T1 和一个特殊功能定时器 T2。定时/计数器的实质是加 1 计数器(16 位),由高 8 位和低 8 位两个寄存器 THx 和 TLx 组成。它随着计数器的输入脉冲进行自加 1,也就是每来一个脉冲,计数器就自动加 1,当加到计数器为全 1 时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置 1,向 CPU 发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。可见,由溢出时计数器的值减去计数初值才是加 1 计数器的计数值。
工作模式寄存器TMOD(不可位寻址 只可整体赋值)
定时/计数器的工作模式寄存器,确定工作方式和功能
定时器启动:GATE = 0 && TR0/TR0 = 1 或
GATE = 1 && TR0/TR0 = 1 && INT0/1 =1(高电平)
控制寄存器TCON(可位寻址 可单独赋值)
控制T0、T1的启动和停止及设置溢出标志
高四位定时、低四位中断
工作方式
每个脉冲加一,计数器达到65535
定时器配置
里以定时器 0 为例介绍配置定时器工作方式 1、设定 1ms 初值,开启定时器计数功能以及总中断,如下:(12MHZ )
void time0_init(void)
{
TMOD|=0X01;//选择为定时器 0 模式,工作方式 1
TH0=0XFC; //给定时器赋初值,定时 1ms
TL0=0X18;
ET0=1;//打开定时器 0 中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
定时器模块化(Timer0.c)
#include <REGX52.H> //====¶¨Ê±Æ÷0³õʼ»¯£¬1ºÁÃë@11.059MHz void Timer0Init(void) //1??@11.0592MHz { TMOD &= 0xF0; //??????? TL0 = 0xCD; //?????? TH0 = 0xD4; //?????? TF0 = 0; //??TF0?? TR0 = 1; //???0???? ET0 = 1; EA = 1; PT0 = 0; } /*¶¨Ê±Æ÷ÖжϺ¯ÊýÄ£°å void Timer0_Rountine() interrupt 1 { static unsigned int T0count; TL0 = 0xcd; //?????? TH0 = 0xd4; //?????? T0count++; if(T0count >= 255) { T0count = 0; } } */
定时器时钟(main.c)
#include <REGX52.H> #include "Delay.h" #include "Timer0.h" #include "LCD1602.h" unsigned char Sec = 59,Min = 59,Hour = 23; void main() { LCD_Init(); Timer0Init(); LCD_ShowString(1,1,"CLOCK:"); LCD_ShowString(2,3,":"); LCD_ShowString(2,6,":"); while(1) { LCD_ShowNum(2,1,Hour,2); LCD_ShowNum(2,4,Min,2); LCD_ShowNum(2,7,Sec,2); } } void Timer0_Rountine() interrupt 1 { static unsigned int T0count; TL0 = 0xcd; //?????? TH0 = 0xd4; //?????? T0count++; if(T0count >= 1000) { T0count = 0; Sec++; if(Sec >= 60) { Min++; Sec = 0; if(Min >= 60) { Hour++; Min = 0; if(Hour >= 24) { Hour = 0; Min = 0; Sec = 0; } } } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。