几种单片机的中断函数写法

合集下载

单片机中断服务函数写法

单片机中断服务函数写法

单片机中断服务函数写法一、在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。

(1)中断源:中断请求信号的来源。

(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效。

(2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。

期间涉及到CPU响应中断的条件,现场保护,现场恢复。

(3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。

优先级是可以编程的,而优先权是固定的。

80C51的原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。

80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制(1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。

在这里我们讲下注意的事项(1)CPU响应中断后,TF0(T0中断标志位)和TF1由硬件自动清0。

(2)CPU响应中断后,在边沿触发方式下,IE0(外部中断INT0请求标志位)和IE1由硬件自动清零;在电平触发方式下,不能自动清楚IE0和IE1。

所以在中断返回前必须撤出INT0和INT1引脚的低电平,否则就会出现一次中断被CPU多次响应。

(3)串口中断中,CPU响应中断后,TI(串行口发送中断请求标志位)和RI(接收中断请求标志位)必须由软件清零。

(4)单片机复位后,TCON,SCON给位清零。

C51语言允许用户自己写中断服务子程序(中断函数)首先来了解程序的格式:void 函数名() interrupt m [using n]{}关键字interrupt m [using n] 表示这是一个中断函数m为中断源的编号,有五个中断源,取值为0,1,2,3,4,中断编号会告诉编译器中断程序的入口地址,执行该程序时,这个地址会传个程序计数器PC,于是CPU开始从这里一条一条的执行程序指令。

有关51单片机中断的形式和C语言编程格式[精选5篇]

有关51单片机中断的形式和C语言编程格式[精选5篇]

有关51单片机中断的形式和C语言编程格式[精选5篇]第一篇:有关51单片机中断的形式和C语言编程格式有关51单片机中断的形式和C语言编程格式void INT0()interrupt 0 using 1 {.........} interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器中断1; interrupt 4 指明是串行口中断;using 0 是第0组寄存器; using 1 是第1组寄存器; using 2 是第2组寄存器; using 3 是第3组寄存器;例如:/*-----------------外部中断程序-----------------*/ void ISR_Key(void)interrupt 0 using 1 { P1=~P1;//s3按下触发一次,P1取反一次 }/*-----------------串口中断程序-----------------*/ void UART_SER(void)interrupt 4 //串行中断服务程序 {unsigned char Temp;//定义临时变量if(RI)//判断是接收中断产生{RI=0;//标志位清零Temp=SBUF;//读入缓冲区的值P1=Temp;//把值输出到P1口,用于观察SBUF=Temp;//把接收到的值再发回电脑端}if(TI)//如果是发送标志位,清零TI=0;}第二篇:--单片机C语言编程实训实习报告实习地点:201机房实习时间:2014.12.1——2014.12.6 实习项目:单片机C语言编程实训指导老师:骆乐姓名:班级:电信3121一、实习内容 1.计算字符的ASCII码编写一个程序,在终端输入一个字符,输出它的ASCII码。

解题思路:通常我们输出一个字符一般用printf(“%c”,c);的形式,因为输出格式规定的是“%c”,因此表示以字符的形式输出,所以我们看到的是相对应的ASCII码的字符形式。

(完整版)C51中断函数的写法

(完整版)C51中断函数的写法

一、中断允许控制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中断允许(总允许)位。

80C51单片机定时/计数器的工作由两个特殊功能寄存器控制。

TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。

一、工作方式寄存器TMOD工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。

其格式如下:GATE:门控位。

GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。

即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。

:定时/计数模式选择位。

C/T =0为定时模式;C/T=1为计数模式。

M1M0:工作方式设置位。

定时/计数器有四种工作方式,由M1M0进行设置。

TCON的低4位用于控制外部中断,已在前面介绍。

TCON的高4位用于控制定时/计数器的启动和中断申请。

其格式如下:▪TF1(TCON.7):T1溢出中断请求标志位。

T1计数溢出时由硬件自动置TF1为1。

CPU响应中断后TF1由硬件自动清0。

T1工作时,CPU可随时查询TF1的状态。

所以,TF1可用作查询测试的标志。

TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。

▪TR1(TCON.6):T1运行控制位。

TR1置1时,T1开始工作;TR1置0时,T1停止工作。

TR1由软件置1或清0。

所以,用软件可控制定时/计数器的启动与停止。

▪TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。

单片机中断触发方式代码

单片机中断触发方式代码

单片机中断触发方式代码1.引言中断是单片机中常用的一种编程方式,可通过中断从程序的正常执行流程中跳转,响应特定的事件或条件。

中断触发方式代码定义了中断的触发条件、中断程序的处理流程以及中断的优先级等相关配置,本文将介绍几种常见的单片机中断触发方式代码。

2.外部中断触发方式代码外部中断是指通过外部触发器产生中断请求,单片机在接收到中断请求后,根据相应的中断触发方式代码来响应中断。

以下是一个外部中断触发方式代码的示例:#i nc lu de<r eg52.h>s b it IN T0=P3^2;//外部中断0引脚v o id IN T0_I ni t(){I T0=1;//外部中断0触发方式为下降沿触发E X0=1;//使能外部中断0E A=1;//总中断使能}v o id IN T0_H an dl er()in te rr up t0{//中断处理程序}v o id ma in(){I N T0_I ni t();w h il e(1);}3.定时器中断触发方式代码定时器中断是通过定时器溢出产生中断请求,单片机在定时器溢出时,根据相应的中断触发方式代码来响应中断。

以下是一个定时器中断触发方式代码的示例:#i nc lu de<r eg52.h>v o id Ti me r0_I ni t(){T M OD=0x01;//定时器0工作在模式1T H0=0x FC;//定时器0初值设定为0xFC67,定时1m sT L0=0x67;E T0=1;//允许定时器0中断E A=1;//总中断使能T R0=1;//启动定时器0}v o id Ti me r0_H an dle r()in te rr up t1{//中断处理程序}v o id ma in(){w h il e(1);}4.串口中断触发方式代码串口中断是通过接收到数据或发送完成时产生中断请求,单片机在接收到中断请求后,根据相应的中断触发方式代码来响应中断。

51单片机中断函数基础

51单片机中断函数基础

51单片机-中断函数基础
单片机中断按照中断源类型的不同主要分为:外部中断、定时器中断、串口中断
而因为电路板上可能存在多个定时器或多个引起外部中
断的位置,所以产生多个中断源,也因此单片机有多个
中断函数
以51单片机为例:
====================================
中断编号
中断源
外部中断0
1
T0定时器溢出中断
2
外部中断1
3
T1定时器溢出中断
4
串口中断
====================================
C程序中使用中断的方法
EA=1;
//打开中断总开关
ET0=1;
//打开T0定时器中断
while(1)
{
//your code
}
//定义中断处理函数(程序会自动调用)
void InterruptTimer0() interrupt 1
{
//关键词interrupt后面的1表示中断函数编号 //your code
//当T0定时器溢出(即截获中断)时,执行InterruptTimer0中断处理函数,执行完毕后程序将从
while中发生中断的位置继续往下执行}。

中断函数

中断函数
单片机中断中void time0() interrupt 1 using 1
中断函数类型void,说明中断函数是不能有返回值的,这点要明确,所以不要企图让中断函数给你个返回值。还有,函数名后面括弧内是没有参数的。。。这点也需要注意,中断函数不能传递参数。interrupt 后面的点是中断号。重点我给你解释下using。这是C51编译器扩展的关键字。用来选择80c51单片机中不同的寄存器组,你也知道R0-R7总共有4组,那么using 后面的数字也就是0-3范围里的一个数了。如果不需要using的话,编译器会自动选择一组寄存器作为绝对寄存器访问的。using对代码是有一定的影响的。给你说个简单的例子,你可以想下,如果定义 void time0() interrupt 1 using 1假设,我们又在中断里调用了一个delay();这个delay是起延时作用。那么,我们就需要确保我们使用的寄存器组是同一组,否则,就会出现混乱。
void INT0()interrupt 0 using 1
{....
.....
}
interrupt 0 指明是外部中断0;
interrupt 1 指明是定时器中断0;
interrupt 2 指明是外部中断1;
interrupt 3 指明是定时器中断1;
interrupt 4 指明是串行口中断;
using 3时设置 RS1=1,RS0 =1,用第3组寄存器,R0--R7的在数据存储区里的实际地址是18H-1FH。R0(18H)....R7(1Fቤተ መጻሕፍቲ ባይዱ)
using 1时设置 RS1=0,RS0 =1,用第1组寄存器,R0--R7的在数据存储区里的实际地址是08H-0FH。R0(08H)....R7(0FH)

单片机中断程序

单片机中断程序

单⽚机中断程序1单⽚机外部中断应⽤#include "reg51.h"typedef unsigned int u8;#define led P2 //整个P2⼝都被定义为ledsbit k3=P3^2;sbit k4=P3^3;void yanshi(u8 z){while(z--);}void Int_Init()////外部中断配置{EA=1; //打开中断允许总控制位EX0=1; //外部中断0中断允许位IT0=1; //设置为脉冲触发,下降沿有效}void main() //主函数执⾏{led=0xff; //设置状态为全亮Int_Init();while(1); //while(1);是⼀条指令,它让单⽚机停在这个位置道//⼀般⽤来检测中断,只有cpu收到中断指令,才会跳出while(1)//进⼊中断服务⼦程序;}void int0 () interrupt 0 using 0//2.写此程序的时候要注意中断标准和中断号是否是对应的{ //这⾥为外部中断0的中断函数yanshi(1000);if(k3==0){led=~led; //这⾥将⼩灯的状态反转}}写外部中断时应该看清楚电路图 P32,P33⼝是外部中断0和1的位置2蜂鸣器#include "reg51.h"sbit fen=P1^5;sbit k2=P3^0;void dealy(int x){while(x--);}void main(){while(1){if(k1==0)//判断按键是否按下{dealy(100);if(k1==0)//判断按键是否按下{fen=~fen;//执⾏蜂鸣器状态的反转,如果按键⼀直按,那么⼀直延时反转,就会响dealy(10);}}}}按照开发板的图⽚来蜂鸣器接的⼝为p1.5;1.此时将外部中断与蜂鸣器连起来综合运⽤#include "reg51.h"typedef unsigned int u8;sbit fen=P1^5;sbit led=P2^0;sbit k3=P3^2;u8 z=0;void dealy(u8 x){while(x--);}void Int_Init(){EA=1; //打开中断允许总控制位EX0=1; //外部中断0中断允许位IT0=1; //设置为脉冲触发,下降沿有效}void main(){led=0;Int_Init(); //调⽤外部中断的函数while(1);}void int0 () interrupt 0{dealy(1000);if(k3==0){for(z=0;z<10000;z++){fen=~fen;dealy(10);}}}此时只需要按下k3将会有⼤约1s的蜂鸣器的叫声3.按下k3闪烁不按⾼四位亮的中断应⽤#include "reg51.h"typedef unsigned int u8;#define led P2 //定义整个2脚sbit key=P3^2;u8 z;yanshi(u8 x){while(x--);}void Int_Init(){EA=1;EX0=1;IT0=1;}void main(){led=0xf0;Int_Init();while(1);}void int0 () interrupt 0 using 0{yanshi(1000);if(key==0){for(z=0;z<8;z++){yanshi(5000);led=~led;yanshi(5000);}}}4.定时器的⼀些⽤法解析4.定时器中断的⼀些详解(带程序)#include "reg52.h"typedef unsigned char u8;typedef unsigned int u16;u8 wei[3];sbit LSA = P2^2;//138译码器端⼝定义sbit LSB = P2^3;sbit LSC = P2^4;u8 code smgduan[16]= {0x3f, 0x06, 0x5b, 0x4f,0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; //0~F数码u8 ge,shi=0,bai=0,c,z=1;void delay(u8 x){while(x--);}void Timer0_Init() //初始化定时器{TMOD = 0x01; //定时器0⽅式1TH0 = 0;TL0 = 0; //定时器的计数起点为0TR0 = 1; //启动定时器0}void weishu()//各个位的位数显⽰{wei[0]=smgduan[ge];wei[1]=smgduan[shi];wei[2]=smgduan[bai];}void xs()//数字显⽰{u8 i;for(i=0;i<z;i++){switch(i){case 0:LSC = 0;LSB = 0;LSA = 0;break; //显⽰第1个数码管case 1:LSC = 0;LSB = 0;LSA = 1;break; //显⽰第2个数码管case 2:LSC = 0;LSB = 1;LSA = 0;break; //显⽰第3个数码管}P0=wei[i];//显⽰0-9的数值delay(10); //延时,造成视觉暂留现象P0 = 0x00; //数码管消隐}}void main(){Timer0_Init();while(1){if(TF0 == 1) //检测定时器0是否溢出,每到65535次{TF0=0;c++;if(c==14) //71ms乘以14为1s{c=0;ge++;if(ge==10){ge=0;shi++;z=2;}//3个判断分别包含开启3个数码管显⽰if(shi==10){shi=0;bai++;}if(bai>0){z=3;}}}weishu();//调⽤位数数字xs();//显⽰数字}}⼀个0-999的⼀秒加数器。

AVR单片机中断寄存器及中断函数格式

AVR单片机中断寄存器及中断函数格式

简介:中断的概念,ATmega16中断向量表,avr中断寄存器SREG,MCU控制和状态寄存器MCUCSR,通用中断控制寄存器GICR,MCU控制寄存器MCUCR,ICCAVR中断函数格式介绍
中断就是暂停正在执行的程序语句,转去执行另一功能(函数)的程序语句,执行完后,立即返回原先暂停执行的语句处,继续执行。

单片机的中断系统解决了单片机运算速度快,外设(如键盘)速度慢之间的数据传输问题,提高了单片机的实时性和数据处理能力。

中断源:产生中断的地方,ATmega16具有20个中断源和一个复位中断,不同的单片机中断源的个数是不一样的。

单片机的中断源分为外部中断源和内部中断源,有三个外部中断源有INT0,INT1,INT2,当连接在单片机引脚的上的外部电平发生变化时,将产生相应的中断。

内部中断源由单片机内部的功能单元如定时器,串行通讯产生的中断。

按是否可屏蔽可分为,非屏蔽中断,和可屏蔽中断,非屏蔽中断有系统复位(reset)中断,可屏蔽中断:屏蔽指的的是中断可由软件编程控制是否允许中断,或禁止中断,大部分都是可屏蔽中断。

中断向量:单片机的每个中断源都有一个固定的入口地址,这个地址由单片机的硬件决定的,单片机相应中断后,自动跳转到相应的地址,这个地址就叫中断矢量
小企鹅diy科学探究学习网
更多相关文章转到: /wqb_lmkj/blog 文章分类下的单片机。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

几种单片机的中断函数写法
写单片机程序,中断是免不了的。

我比较喜欢用C写单片机程序,简单而且可读性高,当然程序效率没有汇编的高。

目前写过51单片机跟AVR单片机的C程序,最近在看MSP430的书。

用C写不同的单片机程序其实都是大同小异,因此能对不熟悉的单片机也能很快上手写程序。

不过中断函数的写法,各个编译器往往都会有些差别。

最早写的C程序是51单片机的,用的编译器自然是大名鼎鼎的keil c了。

Keil的功能还是非常强劲的,不仅能编译,还有软件仿真调试与硬件调试的功能。

由于条件简陋,没用过什么仿真器,一直都是靠软件仿真调试程序的。

Keil 中的中断函数一般格式如下:void 函数名() interrupt n using n
{
…….
}
其中函数名可以任意取,关键字interrupt用来指明这是一个中断服务函数,后面的n 表示中断号,关键字using加后面的n表示使用哪一组寄存器。

后然接触到AVR的单片机,该单片机开发环境一般用ICC或者是GCC。

由于ICC是商用软件,而GCC是免费的,因此我一般用GCC来写AVR的C程序。

现在版本的GCC for AVR有了一些改进,对于中断函数支持两种关键字ISR与SIGNAL,其格式如下:ISR(vect)
{
………
}

SIGNAL(vect)
{
……..
}
其中的vect就是中断向量名,根据不同的型号的AVR单片机的不同的中断源都会有相对应的中断向量名,比如外部中断0对于ISR格式的中断向量名为INT0_vect,对SIGNAL则为SIG_INTERRUPT0。

最近在看TI的MSP430系列单片机的资料,看到该单片机采用C430写的中断服务函数有点像前两种的综合,其格式如下:
interrupt [vect] void 函数名(void)
{
…….
}
其中vect也是中断向量名,函数名可以任取。

比较这几种中断函数写法,本人更倾向于AVR的GCC的写法。

首先对于中断函数来说即不能有输入参数又没有返回值,没必要再给它加个“void 函数名(void)”的形式的函数。

而且光看中断向量名一般都能知道是哪个中断源产生,再写个中断函数名作解释似乎有点重复。

对于keil c用中断向量号的形式来表示中断源,感觉有点麻烦,记住中断源的中断号比记中
断向量要难多了。

不过可能标准51的中断缘比较少,而且keil应该出来的比较早,所以才会采用这种方式。

相关文档
最新文档