当前位置:首页 » 编程软件 » xc编译器的中断怎么写

xc编译器的中断怎么写

发布时间: 2023-06-08 10:45:34

1. 请教单片机高人:怎么用C编写中断,汇编中可以有ORG 000BH来确定是T0中断,那C怎么办还有现场保护怎办

C51中断函数格式
Keil C51编译器中断函数语法定义如下:
(c语言不用处理现场保护了) interrupt n <----这个是重点
void 函数名() interrupt n
{

}
//定时器T0中断
void 函数名() interrupt 1
{

}

C51编译器允许0~31个中断,下列中断及其相关地址为8051控制器所提供的中断:
0:EXTERNAL 0 地址:0003H
1:TIMER/COUNTER 0 地址:000BH
2:EXTERNAL 1 地址:0013H
3:TIMER/COUNTER 1 地址:001BH
4:SERIAL PORT 地址:0023H
编写中断函数时应遵循下列规则:
·不能进行参数传递。如果中断过程包括任何参数声明,则编译器将产生一个错误信息。
·无返回值。如果想定义一个返回值将产生错误,但是,如果返回整型值,编译器将不产生
错误信息,因为整型值是默认值,编译器不能清楚识别。
·在任何情况下,不能直接调用中断函数,否则编译器会产生错误。由于退出中断过程是由
指令RETI完成的,该指令影响MCS-51单片机的硬件中断系统,直接调用中断函数时,硬件
上没有中断请求存在,因而这个指令的结果是不定的,并且通常是致命的。
·编译器从绝对地址8n+3处产生一个中断向量,其中n为中断号,该向量包括一个中断过
程的跳转,向量的产生可由编译器控制指令NOINTVECTOR压缩,因而程序员可以从独立的汇
编模块中提供中断向量。
·可以在中断函数定义中使用using指定当前使用的寄存器组。格式如下:
void 函数名([形式参数])interrupt n [using m]
MCS-51单片机有四组寄存器R0~R7,程序具体使用哪一组寄存器由程序状态字PSW中
的两位RS1和RS0来确定。在中断函数定义时,可以用using指定该函数具体使用哪一组寄
存器,m在0,1,2,3这4个数中取值,对应四组寄存器组。例如:
void delay() interrupt 3 using 2
·在中断函数中调用的函数所使用的寄存器组必须与中断函数相同。当没有使用using指令
时,编译器会选择一个寄存器组作为绝对寄存器访问。程序员必须保证按要求使用相应寄存
器组,C编译器不会对此检查。
·如果在中断函数中执行浮点运算,必须保存浮点寄存器状态,当没有其他程序执行浮点运
算时,可以不保存。

2. 怎样写中断服务程序

方法1. 用关键词interrupt和中断矢量编号定义中断函数
这种方式最简单也最直观。缺点是程序的可移植性稍差。范例如下:
void interrupt 17 sci1_Recv_ISR(void){
.......}关键词interrupt告诉编译器此函数为中断服务函数,数字17告诉连接器该中断矢量的偏移位置(以复位矢量偏移为0计)。某一个中断响应对应的矢量入口编号可以在该芯片的DataSheet中查到。
方法2. 用关键词interrupt定义中断函数,中断矢量入口由prm文件指定,仍以上面的中断服务函行仿数为例,这时函数的定义方式为
void interrupt sci1_Recv_ISR(void){
........}然脊带升后在项目对应的prm文件中添加一行矢量位置定义:
VECTOR 17 sci1_Recv_ISR //指定的中断服务矢量入口
方法3. 用#pragma TRAP_PROC定义中断函数,中断矢量入口由prm文件指定。此类型的函数编译器在将C代码编译成汇编指令樱老时会在代码前后增加必要的现场保护和恢复汇编代码,同时函数的最后返回用汇编指令RTI而不是针对普通函数的RTS。例如

3. c语言怎么编写单片机的中断

给你上个较完整的程序,可以直接在KEIL中运行并观察输出
/******************************************************************************
功能:
本程序在12M晶振模式下,通过定时器中断精确实现数字时钟计时操作,并在KEIL
中实现输出。时、分、秒的变化在定时中断里处理。
说明:
因采用工作方式2,自动装入初值,所以此程序计时很精确,只是在KEIL中模拟输
出显示的变化速度很快,这点可不理会
******************************************************************************/
#include
#include
#define
TEST
//此行用于KEIL输出显示,如果不需要显示可将其删除
typedef
unsigned
char
uchar;
typedef
unsigned
int
uint;
#define
TH0TL0_INIT
(256-250)
//定时器8位自动装入模式下寄存器初值,0.25ms中断一次
char
cHour;
//时
char
cMin;
//分
char
cSec;
//秒
uint
iCount;
//秒计数,计数达到4000时1s,4000*0.25ms
=1000ms
=
1s
bit
bSecChanged;
//秒发生变化标志,每秒送一次输出显示,送显完成后清0,提高主程序效率
//==============================================================================
//T0定时器中断服务程序,12M晶振下每0.25ms产生中断,本程序执行一次
//==============================================================================
void
Timer0()
interrupt
1
{
iCount++;
//秒计数值+1
if(iCount==4000)
{//时间计数达到1S
iCount
=
0;
//重新开始下一秒计数
cSec++;
//时钟:秒+1
bSecChanged
=
1;
//置秒发生变化标志
if(cSec==60)
{//计够60s
cSec
=
0;
//重新开始下一分计数
cMin++;
//时钟:分+1
}
if(cMin==60)
{//计够60分钟
cMin
=
0;
//重新开始下一小时计数
cHour++;
//时钟:小时+1
}
if(cHour==24)
{//计够24小时
cHour
=
0;
//重新开始第二天计数
}
}
}
//==============================================================================
//主程序
//==============================================================================
void
main()
{
uchar
outstr[10];
//输出字符串,我的编译器可能有问题,直接输出有错
TMOD
=
0X02;//工作方式2,8位自动重装计时模式
TH0
=
TH0TL0_INIT;
//0.25ms中断一次
TL0
=
TH0TL0_INIT;
//0.25ms中断一次
#ifdef
TEST
SCON
=
0x50;
/*
SCON:
mode
1,
8-bit
UART,
enable
rcvr
*/
TMOD
|=
0x20;
/*
TMOD:
timer
1,
mode
2,
8-bit
reload
*/
TH1
=
221;
/*
TH1:
reload
value
for
1200
baud
@
16MHz
*/
TR1
=
1;
/*
TR1:
timer
1
run
*/
TI
=
1;
/*
TI:
set
TI
to
send
first
char
of
UART
*/
#endif
cHour
=
0;
//时
cMin
=
0;
//分
cSec
=
0;
//秒
iCount
=
0;
//秒计数
bSecChanged
=
0;
outstr[2]
=
':';
//时分分隔符
outstr[5]
=
':';
//分秒分隔符
outstr[8]
=
0;
//字符串结束符
EA=1;
//开总中断
ET0=1;
//允许T0中断
TR0=1;
//启动T0
while(1)
{
if(bSecChanged==1)
{//秒发生变化,将时间值转换为可显示字符串准备送显示
bSecChanged
=
0;//清除标志,节省CPU资源
outstr[0]
=
cHour/10
+
0x30;
//将秒转换为ASCII码
outstr[1]
=
cHour%10
+
0x30;
outstr[3]
=
cMin/10
+
0x30;
//将分转换为ASCII码
outstr[4]
=
cMin%10
+
0x30;
outstr[6]
=
cSec/10
+
0x30;
//将小时转换为ASCII码
outstr[7]
=
cSec%10
+
0x30;
#ifdef
TEST
printf("
%s\r",outstr);
//在KEIL中显示时钟
#endif
}
}
}

4. 关于c语言中中断的问题

1.void(中断函数返回类型(空型)) Time1 (中断函数名)(void(参数类型) interrupt 3 (中断号)
2: 中断条件发生时执行中断,比如void Time1(void) interrupt 3 是定时器1定时时间到发生中断,中断函数放在那里无所谓
3:void PxInt0(void) interrupt 0 中断名为PxInt0的0号中断
void PxInt1(void) interrupt 2 中断名为PxInt1的2号中断
void time0_int(void) interrupt 1 中断名为time0_int的1号中断
void time1_int(void) interrupt 3 中断名为time1_int的3号中断
4:中断的代码是你想中断执行的工作,中断的代码是根据任务,需要你自己写的

热点内容
gp数据库库 发布:2024-05-03 22:12:43 浏览:873
压缩点点 发布:2024-05-03 22:12:33 浏览:380
有哪些编程比赛 发布:2024-05-03 22:03:45 浏览:263
怎么根据配置调整游戏分辨率 发布:2024-05-03 22:02:50 浏览:77
小鸟酱265g资源密码多少啊 发布:2024-05-03 21:32:08 浏览:653
三国战纪游戏华为帐号密码是多少 发布:2024-05-03 21:22:54 浏览:950
变频压缩机启动 发布:2024-05-03 21:17:06 浏览:436
建立云存储 发布:2024-05-03 21:04:03 浏览:76
socket编程php 发布:2024-05-03 20:12:50 浏览:208
坦洲邮政局可以解压吗 发布:2024-05-03 20:09:55 浏览:733