什么是中断
中断系统是为使CPU具有对外界异步事件的处理能力而设置的。
单片机是单线程的,通常情况下都是在执行死循环,一旦遇到外部情况,就无法跳出当前的循环,这时候就需要用到中断。
程序在执行一项工作时,遇到更紧急的任务时,暂停当前工作,转而去执行另更紧急的任务,执行完毕之后再回到原来的工作。
中断允许寄存器IE
EA: 总中断控制位,当EA = 1 , CPU 允许开放中断。当EA = 0 时, CPU 屏蔽所有中断。
ELVD : 低压检测中断允许位。ELVD=1,允许低压检测中断;ELVD=0,禁止低压检测中断。
EADC : A/D转换中断允许位。EADC=1,允许A/D转换中断;EADC=0,禁止A/D转换中断。
ES : 串行口1中断允许位。ES=1,允许串行口1中断;ES=0,禁止串行口1中断。
ET1 : 定时/计数器T1的溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。
EX1 : 外部中断1中断允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。
ET0 : T0的溢出中断允许位。ET0=1,允许T0中断;ET0=0禁止T0中断。
EX0 : 外部中断0中断允许位。EX0=1,允许中断;EX0=0禁止中断。
定时器
c51中定时器和计数器是由同一个硬件电路支持的,通过定时器/计数器工作模式寄存器TMOD进行配置,标准c51单片机中有两个定时器/计数器可供配置。
时钟周期和机器周期
时钟周期:时钟周期就是晶振频率的倒数,如果采用的是11.0592Mhz的晶振,晶振就是1/(1.10592*10^7)秒
机器周期:标准c51下,机器周期 = 12个时钟周期。
每经过一个机器周期,计数器就会加1,如果采用的是16位模式工作,那么计数范围就在0-65536,计时范围就为0-0.71s,当计数器累加到65536时,计数器就会溢出,并向CPU请求中断。如果要规定定时器多久触发中断,可以为定时器设定初始值,从初始值到65536,就是定时时长。
计数存储寄存器THX和TLX
初始值通过THX和TLX来设定,如果选用的是定时器0,则采用TH0和TL0,TH0代表高位,TL0代表低位。
如果希望定时器定时为10ms,应该如此计算,0.01s/(12/1.10592*10^7) = 9216, 65536-9216=56320,转化为16位进制,得DC00,所以定时器初始值应该设为DC00,即TH0 = 0XDC, TL0 = 0X00;
控制寄存器TCON
TF1:定时器/计数器1的溢出标志位。1表示计数存储器溢出,0表示计数存储器正常计数。
清0方式:①通过代码修改TF1为0
②当通过中断机制来使用定时器/计数器1时,进入中断处理函数后自动归0
TR1:定时器/计数器1的启动和停止位。1表示启动,0表示停止。
TF0:定时器/计数器0的溢出标志位。1表示计数存储器溢出,0表示计数存储器正常计数。
清0方式:①通过代码修改TF0为0
②当通过中断机制来使用定时器/计数器0时,进入中断处理函数后自动归0
TR0:定时器/计数器0的启动和停止位。1表示启动,0表示停止。
void initUart()
{
TMOD |= 0X01; //选择定时器0工作在16位模式
TH0 = 0XDC;
TL0 = 0X00; //定时器初始化
IE |= 1<<7; //打开总中断EA
IE |= 1<<1; //打开定时器0中断ET0
TR0 = 1; //打开定时器0;
}
void timer () interrupt 1
{
TF0 = 0; //计时器中断溢出位,应软件置零
TH0 = 0XDC;
TL0 = 0X00; //重置定时器
}