(学习笔记)51单片机的中断功能及其相关的寄存器
2015-08-14 15:00
357 查看
51单片机中断系统
引起CPU中断的根源,称为中断源,中断源向CPU提出中断请求,CPU暂时中断原来的事务A,转去处理事件B,对时间B处理完毕后,再回来原来的地方(断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。中断优先级决定了中断是否能够实现嵌套,52单片机一共有六个中断源
中断源 | 序号(C | 默认中断级别 |
INT0 | 0 | 最高 |
T0 | 1 | 2 |
INT1 | 2 | 3 |
T1 | 3 | 4 |
TI/RI | 4 | 5 |
T2 | 5 | 最低 |
中断允许寄存器IE以及中断优先级寄存器IP
位序 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位符 | EA | -- | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
位地址 | AFH | -- | ADH | ACH | ABH | AAH | A9H | A8H |
EA----全局中断允许位
EA=1,打开全局中断控制,由各个中断控制位确定相应的打开或者 关闭中断
EA=0,禁用所有中断
除--为无效位外,其他位分别为各个中断的允许位,置1打开中断,置零关闭中断
位序号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位符号 | -- | -- | -- | PS | PT1 | PX1 | PT0 | PX0 |
位地址 | -- | -- | -- | BCH | BBH | BAH | B9H | B8H |
51单片机系列中,高优先级 能够打断低优先级中断以形成中断嵌套,同优先级之间或者低级对高优先级中断则不能形成中断嵌套。若几个同级中断同时向CPU请求中断响应,在没有设置的中断优先级的情况下,按照默认中断级别响应中断,在设置中断优先级后,则按设置顺序确定响应的先后顺序
51系列单片机的定时器中断
单片机的定时器系统
51单片机内有两个16位可编程计数器/定时器(16位加1计数器,分由高八位和低八位两个寄存器组成),分别为T0( TH0,TL0 )、T1( TH1,TL0 ),另52单片机内部多一个T2。它们既有定时器功能又有计数功能,通过设置相关的特殊功能寄存器可以使用它们。定时器系统是单片机内部一个独立的硬件部分,它与CPU和晶振通过内部某些控制线连接并相互作用,CPU一旦设置开启定时器功能后,定时器便在晶振的作用下自动开始计时,当定时器的计数器计满后,会产生中断。加1计数器的计数脉冲有两个来源:一个是系统的时钟震荡器输出脉冲经12分频后送来,另一个是由T0或是T1引脚输入的外部脉冲源,每一个脉冲计数加1,计满再一个脉冲则归零,向CPU请求中断。
先来了解定时器,计数器功能暂不介绍
定时器/计数器工作方式寄存器TMOD以及定时器/计数器控制寄存器TCON
位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
符号 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
GATE----门控制位
GATE=0,定时器计数器启动与停止仅受TCON寄存器中的TRX(X=0,1)控制
GATE=1,定时器计数器启动与停止由外部中断引脚(INT0或INT1)上的电平状态来共同控制
C/T----定时器或者计数器模式选择位
M1M0--工作方式选择位
每个定时器都有4中工作方式,它们由M1M0来设定
M1 | M0 | 工作方式 |
0 | 0 | 方式0,为13位定时器/计数器 |
0 | 1 | 方式1,为16位定时器/计数器 |
1 | 0 | 方式2,8位初值自动重装的定时器/计数器 |
1 | 1 | 方式3,仅适用于T0,分成两个8位计数器,T1停止计数 |
位序号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位符号 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
位地址 | 8FH | 8EH | 8DH | 8CH | 8BH | 8AH | 89H | 88H |
TF1/TF0--------定时器/计数器溢出标志位
当定时器计满溢出时,由硬件使其置1,并且向CPU申请中断,进入中断服务程序后,由硬件自动清0。
TR1/TR0-------定时器运行控制位
当GATE=1,当相应的外部中断引脚(INT1/INT0)为高电平时,TR1/TR0置1启动定时器,当GATE=0,TR1/TR0置1启动定时器
IE1/IE0--------外部中断请求标志位
IT1/IT0---------外部中断触发方式选择位
0为电平触发模式
1为跳变沿触发模式
定时器中断应用举例->方式1
16位定时器/计数器在写单片机程序之前,需要对定时器以及中断寄存器做初始化设置
①对TMOD赋值,确定定时器工作方式
TOMD=0x01;-----即系设定定时器0为16位定时器,GATE=0此时仅由TR0控制启动定时器0
②计算初值,并将初值写入TH0/TL0
③对IE赋值,开放中断
④对TR0/TR1置位,开始定时或者计数
关于计算初值,前面提到,加1计数器的脉冲源为一个是系统的时钟震荡器输出脉冲经12分频后送来,另一个是由T0或是T1引脚输入的外部脉冲源,每一个脉冲计数加1,计满再一个脉冲则归零,向CPU请求中断。
这里使用系统的时钟振荡器输送经12分频之后送来的脉冲源,由此,1个机械周期等于12个时钟周期。
令单片机的时钟晶振频率为f,则一个机械周期的时间为[(1/f)*12 ] 。51单片机常用的外部晶振为12MHz和11.0592MHz,若使用12MHz的晶振,则机械周期为1us(微秒),即系定时器寄存器每经一微秒就加1。
我们令定时器寄存器(TH0和TL0)的初值为(2^16 - N),此时每经N微秒发生一次中断。(2^16=65536)
将初值装入TH0、TL0的方式: TH0=(65536-N)/256; TH0=(65536-N)%256;
#include<reg52.h> sbit led1=P1^0; unsigned char num; void main() { TMOD=0x01;<span style="white-space:pre"> </span>//设定定时器0为工作方式1 TH0=(65536-50000)/256; //定时器寄存器装初值 TL0=(65336-50000)%256; EA=1; //全局中断允许 ET0=1; //定时器0中断允许 TR0=1; //启动定时器0 while(1); } void timer0() interrupt 1 { TH0=(65536-50000)/256; //重装初值 TL0=(65536-50000)%256; num++; if( 20==num) //每20*50ms 即系1秒让led1取反一次 { num=0; led1=~led1; } }这是一个简单的程序,让I/O口驱动一个led灯,每一秒改变一次状态。
一旦开启定时器,其便开始计数,当计数溢出时候,自动进入中断服务程序,计数器自动计数,知道程序执行结束才停止。所以,中断服务程序的代码不可以过长,以免中断服务程序未执行完,下一次中端来临,便会丢失中断。
相关文章推荐
- Spring注解@Scope("prototype")
- 列表框在页面交互中的应用
- NSIS 进度条精确显示 (学习六)
- php实现双色球的生成
- 使用SharedPreferences记住密码的功能
- Android处理图片工具(转载)
- 使用CocoaPods 出错
- action属性注入为null
- CSS让整个网页成灰色
- 在Android5.0上Audio Patch和Patch Panel的一些分析
- 康耐视研讨会总结
- Block概述
- 二进制整数的加,减运算
- Java实现图片压缩
- win10任务栏图标在哪里添加和删除?
- 深度挖掘:特斯拉为何抛弃第二“故乡”台湾
- PAT 1032. Sharing (25)
- Humble Numbers
- 那些年满天飞的bug(1)
- Android-ViewPager+Fragment数据更新问题