对于单片机中断,可以简单理解为在看电视的过程中,突然蹦出一个广告,广告过了在继续播放之前的节目。CPU在处理事件A时,发生了另一事件B,请求CPU迅速去处理(中断发生),CPU中断当前的工作,转去处理事件B(中断响应和中断服务),待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回)。
单片机的应用与开发,实际上就是通过单片机的三个重要外设,即外部中断、定时器/计数器和串口来实现对寄存器的操作。
EA=1,CPU开放中断
EA=0,CPU屏蔽所有中断申请
ELVD=1,允许低压检测中断
ELVD=0,禁止低压检测中断
EADC=1,允许ADC中断
EADC=0,禁止ADC中断
ES=1,允许串行口1中断
ES=0,禁止串行口1中断
ET1=1,允许T1中断
ET1=0,禁止T1中断
EX1=1,允许外部中断1中断
EX1=0,禁止外部中断1中断
ET0=1,允许T0中断
ET0=0,禁止T0中断
EX0=1,允许外部中断0中断
EX0=0,禁止外部中断0中断
PT1=1,定时器1中断为最高优先级
PT1=0,定时器1中断为最低优先级
PX1=1,外部中断1为最高优先级
PX1=0,外部中断1为最低优先级
PT0=1,定时器0中断为最高优先级
PT0=0,定时器0中断为最低优先级
PX0=1,外部中断0为最高优先级
PX0=0,外部中断0为最低优先级
TF1=1,TF1计数器溢出
TF1=0,TF1计数器未溢出
TR1=1,启动定时器
TR1=0,关闭定时器
TF0=1,TF0计数器溢出
TF0=0,TF10计数器未溢出
TR0=1,启动定时器
TR0=0,关闭定时器
IT1=1,下降沿触发
IT1=0,低电平触发
IT0=1,下降沿触发
IT0=0,低电平触发
发送完数据后由硬件置1,进入中断程序后需手动软件清0
接收完数据后由硬件置1,进入中断程序后需手动软件清0
补充:
因为11.0592MHz能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)量常见的波特率相关。特别是较高的波特率(19600,19200),不管多么古怪的值,这些晶振都是准确,常被使用的。用11.0592晶振的原因是51单片机的定时器导致的,用51单片机的定时器做波特率发生器时,如果用11.0592MHz的晶振,根据公式算下来需要定时器设置的值都是整数;如果用12MHz晶振,则波特率都是有偏差的。比如9600,用定时器取0XFD,实际波特率10000,一般波特率偏差在4%左右都是可以的,所以也还能用STC90C516晶振12M波特率9600,倍数时误差率6.99%,不倍数时误差率8.51%,数据肯定会出错。这也就是串口通信时大家喜欢用11.0592MHz晶振的原因,在波特率倍速时,最高可达到57600,误差率0.00%。用12MHz,最高也就4800,而且有0.16%误差率,但在允许范围,所以没多大影响。
SMOD=1,方式1、2、3的波特率加倍
SMOD0=0时,与SCON寄存器中的SM0/FE位一起指定串行口的工作方式
T1允许计数以后,从初始值开始计数,当产生溢出时由硬件将TF1置1,直到CPU响应中断时,才由硬件清“0”。
当GATE=0,TR1=1时就允许T1定时,TR1=0时禁止T1定时。若GATE=1,则当TR=1且INT1输入高电平时,才允许T1开始定时。
T0允许计数以后,从初始值开始计数,当产生溢出时由硬件将TF0置1,直到CPU响应中断时,才由硬件清“0”。
当GATE=0,TR0=1时就允许T0定时,TR0=0时禁止T8定时。若GATE=1,则当TR0=1且INT0输入高电平时,才允许T0开始定时。
置1时只有INT1/0脚为高电平及TR1/0控制位置1时才可以打开定时器/计数器。
为0:定时器是传统8051速度,12T
为1:定时器是传统8051速度的12倍,1T
为0:串口1模式0是传统8051单片机串口速度,12T
为1:串口1模式0是传统8051单片机串口速度的6倍,2T
注意:如果串口1/串口2用T2作为波特率发生器,则由T1x12决定串口1/串口2是12T还是1T
0,允许使用逻辑上在片外、物理上在片内的扩展RAM
1,禁止使用逻辑上在片外、物理上在片内的扩展RAM
为0:选择定时器1作为串口1(UART1)的波特率发生器;
为1:选择定时器2作为串口1(UART1)的波特率发生器,此时定时器1得到释放,可以作为独立定时器使用
计数是指对外部事件进行计数,外部事件的发生以输入脉冲的形式表示,因此计数功能的实质就是对外部脉冲进行计数,在单片机中对应引脚T0和T1两个脉冲输入端。外部输入的脉冲在负跳变时有效(即外部脉冲由1变化到0),计数器加1。
定时器是通过计数器的计数来实现的,不过定时器的计数脉冲来自单片机的内部,因此定时器的实质是对内部脉冲的计数
补充:
根据单片机晶振,所选TMOD的的工作方式,所要定的时间,来确定TH0和TL0所要赋予的初值(以12MHz晶振,工作方式1,16位计数器为例,设所定时间为Xus(16为计数器最大数65536,即65536us,若所定时间大于65535,则要用if语句控制,现假设X<65535))
①时钟周期的时间:t=1/12MHz=1/12 (us)
②机器周期的时间:T=12*1/12=1 us
③因为每经过一个机器周期计数器+1,所以,计数器+1,经过的时间为 1 us。
若所定时间为X,则要求经过Xus,中断响应,又因为16位计数器要全部置1(即达到65535+1)后,中断才会响应,所以,初值=(65536-X),将初值转化为16进制码,分别赋给TH0和TL0
例如:所定时间5ms,则:
初值=(65536-5000)=60536=EC78
TH0=0XEC;
TL0=0X78;
写程序时另一种TH0/TL0赋值方法
TH0=(65536-5000)/256
TL0=(65536-5000)%256