ps制作网站产品图片,太原网站建设 thinkphp3.2,win7优化大师下载,wordpress 360网盘按钮学习51单片机的重点及难点主要有中断、定时器、串口等内容#xff0c;这部分内容一定要认真掌握#xff0c;这部分没有学好就不能说学会了51单片机
1、中断系统
1.1 概念 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的#xff0c;中断功能的存在#… 学习51单片机的重点及难点主要有中断、定时器、串口等内容这部分内容一定要认真掌握这部分没有学好就不能说学会了51单片机
1、中断系统
1.1 概念 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的中断功能的存在很大程度上提高了单片机处理外部或内部事件的能力。 eg你打开火 烧上一壶水。然后去洗衣服在洗衣服的过程中突然听到水壶发出水开的报警 声这时你停止洗衣服动作立即去关掉火然后将开水灌入暖水瓶中灌完 开水后你又回去继续洗衣服。这个过程中实际上就发生了一次中断
对于单片机来讲中断是指CPU在处理某一事件A时发生了另一事件B请求CPU迅速去处理(中断发生)CPU暂时停止当前的工作(中断响应)转去处理事件B(中断服务)待CPU将事件B处理完毕后再回到原来事件A被中断的地方继续处理事件A(中断返回)这一过程称为中断。 1.2 中断结构 STC89C5X 系列单片机提供了8个中断请求源它们分别是外部中断0(INTO)、外部中断1(INT1)、外部中断2(INT2)、外部中断3(INT3)、定时器0中断、定时器1中断、定时器2中断、串口(UART)中断。 注意51 系列单片 机一定有基本的 5 个中断但不全有 8 个中断需要查看芯片手册通常我 们使用的都是基本的5个中断INT0、INT1、定时器0/1串口中断 ①INT0对应的是P3.2口的附加功能可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时中断标志IE0(TCON.1)置1向CPU申请中断。 ②INT1对应的是P3.3口的附加功能可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时中断标志IE1(TCON.3)置1向CPU申请中断。 ③T0对应的是P3.4口的附加功能TF0(TCON.5)片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时置位TF0并向CPU申请中断。 ④T1对应的是P3.5口的附加功能TF1(TCON.7)片内定时/计数器T1 溢出中断请求标志。当定时/计数器T1发生溢出时置位TF1并向CPU申请中 断。 ⑤RXD和TXD对应的是P3.0和P3.1口的附加功能RI(SCON.0)或TI(SCON.1)串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI向CPU申请中断。
1.3 中断相关寄存器
1.3.1 中断允许控制 IE CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的 EX0(IE.0)外部中断0允许位
ET0(IE.1)定时/计数器T0中断允许位
EX1(IE.2)外部中断0允许位
ET1(IE.3)定时/计数器T1中断允许位
ES(IE.4)串行口中断允许位
EA (IE.7)CPU中断允许总允许位
1.3.2 中断请求标志 TCON IT0(TCON.0)外部中断0触发方式控制位。当IT00 时为电平触发方式 当IT01 时为边沿触发方式下降沿有效
IE0(TCON.1)外部中断0中断请求标志位
IT1(TCON.2)外部中断1触发方式控制位
IE1(TCON.3)外部中断1中断请求标志位
TF0(TCON.5)定时/计数器T0溢出中断请求标志位
TF1(TCON.7)定时/计数器T1溢出中断请求标志位。
1.3.3 中断优先级 高优先级的中断请求可以打断低优先级的中断反之低优先级的中断请求不可以打断高优先级及同优先级的中断。当两个相同优先级的中断同时产生时将由查询次序来决定系统先响应哪个中断
1.3.4 中断号 1.3.5 中断响应条件
1中断源有中断请求
2此中断源的中断允许位为1
3CPU开中断即EA1
eg外部中断0初始化函数 void exti0_init(){ EA1; //打开总中断开关 EX01; //打开INT0的中断允许 IT01; //跳变沿触发方式下降沿 } 1.3.6 中断服务函数 void exti0() interrupt 0 using 1{ //编写用户所需的功能代码 } interrupt是一个关键字表示51单片机中断
“0”是中断号外部中断0的中断号为0
using 1可省略不写
2、外部中断实验
要实现的功能是使用独立按键K4控制LED1亮灭 #include reg51.h typedef unsigned int u16; typedef unsigned char u8; void delay_10us(u16 us){ while(us--); } sbit KEY4P3^3; sbit LED1P2^0; //外部中断1初始化函数 void exti1_init(){ EA1; //打开总中断开关 EX11; //打开INT1的中断允许 IT11; //跳变沿触发方式下降沿 } void main(){ exti1_init(); while(1){ } } void exti1() interrupt 2{ delay_10us(1000); if(KEY40){ LED1!LED1; } } 要实现的功能是使用独立按键K3控制LED流水灯 #include reg51.h #include intrins.h typedef unsigned int u16; typedef unsigned char u8; void delay_10us(u16 us){ while(us--); } sbit KEY3P3^2; #define LED P2 //外部中断0初始化函数 void exti0_init(){ EA1; //打开总中断开关 EX01; //打开INT0的中断允许 IT01; //跳变沿触发方式下降沿 } void main(){ exti0_init(); while(1){ } } void exti0() interrupt 0{ u16 i0; delay_10us(1000); //消抖 if(KEY30){ LED0xfe; delay_10us(50000); for(i0;i7;i){ LED_crol_(LED,1); delay_10us(50000); } for(i0;i7;i){ LED_cror_(LED,1); delay_10us(50000); } } } 有人就会问在主函数中怎么没有看到按键对LED的控制呢因为我们在exti0_init()函数内就已经把按键管脚配置为外部中断0下降沿触发当有按键按下即会进入对应中断服务函数执行相应的功能程序LED的控制就在中断函数内完成的。