请教单片机高人:怎么用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编译器不会对此检查。
·如果在中断函数中执行浮点运算,必须保存浮点寄存器状态,当没有其他程序执行浮点运
算时,可以不保存。追问

好的,我还想搞清楚下void main([ ])这句里,我一直不明白用了()和没用有区别吗?然后那个[ ]里的形式参数又是什么?

追答

这个一般情况下用不到. 是DOS命令行中 使用的参数

比如你在DOS下 使用dir 后面可以使用/s/w 这就是main的参数

追问

这样,好吧,分给你之前再请教下怎么用C调用子程序呢?我刚刚改用C

追答

int add(int a,int b)
{
return a+b;
}

void main()
{
int sum=0;
sum=add(10,20);
}

温馨提示:内容为网友见解,仅供参考
无其他回答

请教单片机高人:怎么用C编写中断,汇编中可以有ORG 000BH来确定是T0中...
1:TIMER\/COUNTER 0 地址:000BH 2:EXTERNAL 1 地址:0013H 3:TIMER\/COUNTER 1 地址:001BH 4:SERIAL PORT 地址:0023H 编写中断函数时应遵循下列规则:·不能进行参数传递。如果中断过程包括任何参数声明,则编译器将产生一个错误信息。·无返回值。如果想定义一个返回值将产生错误,但...

单片机中断问题
AJMP ZD0 ORG 000BH;定时器T0中断入口地址 AJMP ZD1 ORG 0013H;外部1中断入口地址 AJMP ZD2 ORG 0030H;主程序入口地址 MAIN: MOV P1,#00H MOV IE,#87H;CPU开中断、T0开中断、外部0、1开中断 MOV TMOD,#01H;T0定时模式1 MOV TH0,#3CH;定时50ms,晶振频率设为12MHz MOV TL0,#0B0H ...

单片机89C52汇编问题
简单来说,T0定时器启动后加到溢出时会触发中断标志,若各级中断允许,即产生中断响应,系统自动跳到ORG 000B矢量地址去运行,所以一般在ORG 000B后紧跟的是转向中断处理子程序。范例程序如下:;51@12M ORG 0000H LJMP START ORG 000BH ;T0中断矢量地址 LJMP Timer0Interrupt;转向中断处理 START:MO...

如何用汇编语言编写单片机试验中的定时中断实验?
第一、设置定时器工作模式;第二、给TLX、THX赋初值;第三、开中断;第四、启动定时器。当然你要编好中断服务程序了。下面给一个简单的示范例程:程序运行后将在P1.0上产生1K的方波信号输出。ORG 0000H LJMP START ORG 000BH LJMP TM0 ORG 0100H START:CLR EA MOV SP,#60H MOV TMOD,#01H...

单片机定时\/应用问题请教下
---开始 写ORG 000H, LJMP MAIN , 就是说LJMP MAIN 放在单片机的000H 位置,一般单片RESET 后开始运行的地址就是0000H, 这句话的作用是单片上电后或RESET后就跳到MAIN:这个地方,不是跳到ORG 000BH 这个地方,而是ORG 0100H这个地方,也就是MAIN的地方,ORG 的作用就是设定ORG 后面的程序...

单片机汇编语言
绝对正确,看看我得唱歌程序就知道了 ;T0中断次数计数寄存器20H;音调长度寄存器30H;音调寄存器31H SPEAKER BIT P2.0 ORG 0000H LJMP START ORG 000BH INC 20H MOV TH0,#0D8H MOV TL0,#0EFH RETI ORG 0030H START:MOV SP,#60H MOV TMOD,#01H MOV TH0,#0D8H MOV TL0,#0EFH MOV IE,#...

一段单片机汇编程序看不懂,哪位能帮忙分析下,谢谢!
ORG 000BH ;声明指向T0的中断入口的地址 AJMP IT0P ;这时的指令内容是转到IT0P的程序(T0中断处理程序)去工作。地址是000BH ORG 0100H ;声明现在的是地址0100H,之前没用到的保留。编译器认为是内容是00H MAIN: MOV SP,#60H ;设堆栈指针.复位时是07H。系统中如用不到堆栈将占用的寄存器可以不...

单片机定时器中断实验 程序(汇编语言)不要c语言的
SJMP MAIN ORG 000BH SJMP T0_INT MAIN:MOV TMOD, #01H ;T0定时方式1 MOV TH0, #(65536-50000) \/ 256 ;定时50ms@12MHz MOV TL0, #(65536-50000) MOD 256 ;SETB TR0 ;启动T0 MOV IE, #82H ;开中断 ;第一秒钟L0,L2亮,第二秒钟L1,L3亮,第三秒L...

单片机中计数脉冲H=100个允许中断,使用工作方式1和2进行初始化编程_百 ...
我猜想你问题表达含混了,应该是单片机中计数脉冲H=100个时申请中断,使用工作方式1和2进行初始化编程。方式1:;启动入口 ORG 0000H;复位启动 LJMP START;ORG 000BH;T0中断 LJMP T0INT;ORG 0100H;LJMP START;;;主控程序 START:MOV SP,#80H;初始堆栈值 MOV TMOD,#05H;定时器0工作于方式1,计数...

单片机中,怎么用汇编语言编写程序实现延迟40ms
1.可以用定时中断的方法:ORG 0000H LJMP START ORG 000BH LJMP Timer0Interrupt START:MOV SP,#60H LCALL InitTimer0 LOOP:;add your code here!LJMP LOOP InitTimer0:MOV TMOD,#01H MOV TH0,#63H MOV TL0,#0C0H SETB EA SETB ET0 SETB TR0 RET Timer0Interrupt:PUSH DPH PUSH DPL PUS...

相似回答