单片机中断

                                 蓝桥杯单片机之中断

1、中断含义及过程

中断是指CPU在处理A事情时,发现B请求CPU立刻去处理(中断发生),于是CPU去处理B(中断服务), 处理完B后又再次回到A被中断的地方,继续处理A(中断返回)

2、中断源

51单片机有五个中断源,分为外部 中断源(2个),定时器/计数器 中断源(2个)、串行通信 中断(1个)

每个中断源都有固定的入口地址和中断号,学习时要注意中断源与中断号的对应关系

3、中断的处理函数

(1)中断初始化函数

(2)中断服务 函数     三个特点:<1>没有返回值也不能带参数

                                                       <2>函数后面跟一个关键字:interrupt

                                                        <3>在关键字interrupt后面跟一个中断号

4、与中断 相关的寄存器

一、TCON    低4位给外部中断请求源使用,高4位给内部中断系统寄存器

外部请求源(第四位)

<1>  IT0  :IT0 = 0时, INT0为低电平触发方式, IT0 = 1, INT0为负 跳变触发方式。总之是INT0触发方式控制位,可由软件进行置位和复位。

<2>IE0 :    INT0中断请求标志位,当有外部中断请求时,该位就置1(硬件来完成),在CPU响应中断后,硬件将IE0又清0

<3> IT1:   类似  不过是定时器1的相关位

<4>IE1:   SAME

内部 请求源(高四位)

<1>TF0:定时/计数器T0溢出中断标记。当T0产生溢出时,TF0置位,当CPU响应中断后,硬件再把TF0复位

<2>TR0 :T0的开关控制位, TR0 = 1  定时器计数器打开, TR0= 0   定时器计数器关闭

注:TF1、TR1 与TF0 和TR0相似 。只是一个是定时器0的,一个是定时器1的

二、SCON :低二位与串口中断相关

TI:串行口发送中断

RI :串行口接收中断

三、IE    中断允许寄存器

EA : 中断总控制位    EA =1 ,CPU开放所有中断   EA = 0, CPU禁止所有中断

ES:     串行口中断控制位 ES =1, 允许串行口中断, ES= 0, 屏蔽串行口中断

ET1:   定时/计数器TI中断控制位。ET1=1,允许T1中断;ET1=0,禁止T1中断

EX1:外部中断1中断控制位。EX1=1,允许外部中断1中断;EX1=0禁止外部中断1中断

ETO:定时/计数器T0中断控制位。ETO=1,允许T0中断;ETO=0,禁止T0中断

EXO:外部中断0中断控制位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0断。

四、IP  中断优先级寄存器

执行时先将高级优先级执行后才会执行低的

PS  :串行口中断优先级控制位

PT1:定时器1优先级控制位
PX1:外部中断1优先级控制位
PTO:定时器0优先级控制位
PX0:外部中断0优先级控制位

5、对于每一个外设,我们都需要写一个初始化函数和中断服务函数。

下面分别展示外部中断   定时器\计数器中断    串行借口中断的部分代码

6

6、单片机补充:

《1》三大外设:外部中断、定时/计数器、串行通信

《2》sfr P0 = 0x80    和 P0 = 0x02的区别        前者用SFR来找了P0口的地址,为0X80, 后者是把0x02赋给P0口

《3》INT0  和INT1是中断控制器里面的,称为外部中断申请输入端

在INT0 或INT1 输入一个信号(低电平或者是下降沿),就可以使单片机临时停下正在执行的事情, 转去执行B事情

《4》KEIL使用建工程:project---new uvison project---source group----add existing files to group.写完之后记得点魔术棒,生成Greate HEX Files

在断电状态下单击下载,然后再上电  程序就自动下载到芯片了

发布了2 篇原创文章 · 获赞 7 · 访问量 1199
展开阅读全文

请问单片机如何通过电平变化中断唤醒单片机

10-29

//初始化 #include "holychip_define.h" #include "inital.h" void inital(void) { PORTA=0X00; PORTB=0X00; //PORT口输出高低电平设置 1=高电平,0=低电平 TRISA=0X00; //输入输出设置 1=输入,0=输出 TRISB=0XE0; //输入输出设置 1=输入,0=输出 0X11100000 PB7,PB6,PB5设置为输入 PHCON1=0XFF; //上拉设置 1=DISABLED PULL-UP ;0=PULL-UP PHCON =0XFF; //上拉设置 1=DISABLED PULL-UP ;0=PULL-UP PDCON1=0XFF; //下拉设置 1=DISABLED PULL-UP ;0=PULL-UP PDCON =0XFF; //下拉设置 1=DISABLED PULL-UP ;0=PULL-UP ODCON1=0X00; //开漏设置 0=DISABLED PULL-UP ;1=PULL-UP ODCON =0X00; //开漏设置 0=DISABLED PULL-UP ;1=PULL-UP } //系统初始化 void sysinitial(void) { INTECON=0x00; OSCCON=0X80; OPTION=0X80; //Ftimer0 1/2 PCON=0X40; //更改 上下电复位 禁止看门狗 } //模式转换 #include "holychip_define.h" #include "model.h" void high_frequence_change_to_sleep(void) //高低频切睡眠 { // SBIT(OSCCON, 7, LOW); T0OSCEN=0; } void high_frequence_change_to_low_frequence(void) //高频切低频 { // SBIT(OSCCON, 0, HIGH); SCS=1; } void low_frequence_change_to_high_frequence(void) //低频切高频 { // SBIT(OSCCON, 0, LOW); SCS=0; } void low_or_high_frequence_change_to_green(void) //高低频切绿色模式 T0定时唤醒 { OPTION=0X05; SBIT(OPTION, 5, HIGH); //T0CS=1 // T0CS =1; T0IF=0; //清T0中断标志 T0IE=1; //使能T0定时器 T0=0X00; //T0赋初值 asm(sleep) } //PB电平变化中断初始化 #include "holychip_define.h" #include "PORTB_interrupt_inital.h" void PORTB_interrupt_inital() { TRISB=0XE0; //PORTB端口设置 0X11100000 PB7,PB6,PB5设置为输入 IOCB=0XE0; //使能PORTB端口为电平变化中断 PBIF=0; // PROTB中断请求标志清零 PBIE=1; //使能PROTB中断 GIE=1; //使能GIE } //脉冲显示函数 #include "holychip_define.h" #include "Pulse_display.h uS延时函数 void DelayUs(unsigned char t) { while(--t); } mS延时函数 void DelayMs(unsigned int t) { unsigned char count = 200; while(t--) { while(count--); } } //脉冲显示子程序 void Pulse_display(void) { if(PORTB7==1) PORTA1=1; DelayMs(20); PORTA1=0; if(PORTB7==0) PORTA2=1; DelayMs(20); PORTA2=0; if(PORTB6==1) PORTA3=1; DelayMs(20); PORTA3=0; if(PORTB6==0) PORTB0=1; DelayMs(20); PORTB0=0; if(PORTB5==1) PORTB1=1; DelayMs(20); PORTB1=0; if(PORTB5==0) PORTB2=1; DelayMs(20); PORTB2=0; } //主函数 #include "holychip_define.h" #include "inital.h" #include "Pulse_display.h" #include "PORTB_interrupt_inital.h" #include "model.h" void main(void) { inital(); //端口初始化 DelayMs(100); //延时等待系统稳定 sysinitial(); //系统初始化 PORTB_interrupt_inital();//PB电平中断初始化,设置PB7,PB6,PB5电平中断 while(1) { high_frequence_change_to_sleep(); //高频转换为睡眠模式 Pulse_display(); //脉冲显示 } } //PORTB中断服务程序 void Intr(void) __interrupt 0 { if(PBIF) //Judge PBIF { PBIF=0; //Clear PBIF } } 我目前在做一个低功耗的项目,所以采用单片机的休眠模式,想知道如何使用单片机电平变化中断唤醒单片机? 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览