在C51中 主函数中 怎样看出中断函数被调用了

在C51中 主函数中 怎样看出中断函数被调用了,第1张

可以采用以下几种方法:

如果系统带有显示屏,可以在中断函数中加入一段显示中断计数的计数值,如果是按照要求中断的,显示计数可以反映出来。

如果不带显示,但有蜂鸣器或发生元件,可以在中断函数中加入一段发声程序,如果是按照要求中断的,声音可以反映出来。

如果两者都没有,可以在多余的I/O口串接05~1K电阻连接LED发光管,在中断函数中加入一段驱动I/O亮或暗的程序[中断一次亮,再中断暗],如果是按照要求中断的,LED可以反映出来。

以上是测试中端的常用方法,当程序通过后此中断程序中的测试代码可以去除或注释掉。

C51的中断函数的格式为:

void FuncIr(void) interrupt x [using y]

以下是梦游的一些分析:

一、中断函数是一个特殊的函数,没有参数,也没有返回值;但是程序中允不允许使用return呢?答案是允许的,不过

只能用"return;",不能用"return(z);";用在一些需要快速返回的地方,对应的汇编会有多个ret语句,相对效率会高一

些。

二、using的用法,using可以修饰任何函数,不过个人建议只用来修饰中断函数;简单的说,“using”会指定工作寄存

器组,由于中断函数一般都是比较紧急的事情,有时一条语句都会斤斤计较,所以使用using切换寄存器组可以省去一些压栈

的动作,由于51只有两级中断,同级中断不能被打断,因此,我们可以同级中断设成同样的寄存器组,从某种意义上来说,

有一组寄存器是多余的。同时个人建议中断函数应该使用using这个关键字。

三、中断中调用函数,首先要讨论中断函数中调用函数的必要性,前天在论坛上我和别人争论过这个问题,现在我还是

这个观点:有些情况中断中调用函数还是必要的,这个时候是不是该调用函数,其实和普通函数差不多,首先是这个函数如

果调用多次,或者要带一些参数什么的就更加必要的;前天有人跟我叫劲,说假如只调用一次且无参数无返回的函数要直接

写,因为如果用函数,至少会增加CALL和RET两条语句,我不敢苟同,我是实际调试发现的,当你程序比较复杂时,你将那部

分单独拉出来做成函数,可能代码和时间都会更好

四、中断中调用的函数最好不要被中断外的其它函数调用,因为会出现“重复调用”的警告,有时这种调用是很致命

的,有人说这个函数可以用reentrant来修饰,是的,的确可以这样解决,不过个人不建议这么做,也许这样会跟你减少很多

堆栈空间,并且整个程序的优化要差很多,个人建议出现这种情况就把这个函数写两遍,分成两个函数分别调用。

五,中断调用了函数,会出现一些莫名其妙的问题,一些数据不对。其实一般是因为汇编中使用了绝对寄存器引起的,有人说中断函数使用那个寄存器组,被中断调用的

函数就使用哪个寄存器组,我认为这样不好:

这样会增加额外的消耗,使用using会增加一下语句:

PUSH PSW

MOV PSW, #XX

POP PSW

更重要的是,使用using的函数不能有返回值,这是致命伤

个人推荐的方法有两种:

1、使用“#pragma NOAREGS”禁止使用绝对寄存器

2、使用“#pragme RB(x)”来指定本文件的工作寄存器组

六、一般说来,要求中断函数尽可能的短,但也有特殊情况,有些前/后台的系统中,就会把很多相对重要的事情放到定

时中断(这个定时中断类似实时 *** 作系统中的时钟节拍)去做,而且程序很长。我单独提出来这点是想告诉大家,中断函数

也是一个函数而已,只要系统有必要,可以做一些看似不合理的事情,该出手时就出手,就像goto语句一样。

定义一个延时xms毫秒的延时函数

void delay(unsigned int xms) // xms代表需要延时的毫秒数

{

unsigned int x,y;

for(x=xms;x》0;x--)

for(y=110;y》0;y--);

}

使用:

void Delay10us(uchar Ms)

{

uchar data i;

for(;Ms》0;Ms--)

for(i=26;i》0;i--);

}

i=[(延时值-175)12/Ms-15]/4

扩展资料

1、在C51中进行精确的延时子程序设计时,尽量不要或少在延时子程序中定义局部变量,所有的延时子程序中变量通过有参函数传递。

2、在延时子程序设计时,采用do…while,结构做循环体要比for结构做循环体好。

3、在延时子程序设计时,要进行循环体嵌套时,采用先内循环,再减减比先减减,再内循环要好。

void delayms(uint j)

{

uchar i;

for(;j>0;j--) //for内程序循环J次

{i=250;

while(--i); //while循环i-1次

i=249;

while(--i);

}

简单的说就是:用无实际 *** 作的循环一直在占用cpu(占用时间为:delayms(j);),过这么长时间后,继续让cpu干活,从而达到延时的效果。

不懂继续追问,希望能帮到你~

//用定时器T0查询方式P0口8位控制LED闪烁

#include // 包含52单片机寄存器定义的头文件

#define uchar unsigned char

#define uint unsigned int

/

函数功能:主函数

/

void main(void)

{

TMOD=0x01; //使用定时器T0的模式1

TH0=(65536-50000)/256; //定时器T0的高8位赋初值

TL0=(65536-50000)%256; //定时器T0的高8位赋初值

TR0=1; //启动定时器T0

TF0=0; //溢出标志位 先清零

P0=0xff; //关闭LED灯

while(1)//无限循环等待查询

{

while(TF0==1)

{

TF0=0;

P0=~P0;

TH0=(65536-50000)/256; //定时器T0的高8位赋初值否则会从0开始计数

TL0=(65536-50000)%256; //定时器T0的高8位赋初值

}

}

}

C51单片机的循环左移函数是,_crol_(变量名,n),循环右移函数是,_cror_(变量名,n),函数中的“循环”是指变量的8位二进制数依次向左移一位,或向右移一位。

你比如的,取8位数,让1111 1110循环左移一位,就是在1111 1110、1111 1101、1111 1011、1111 0111、1110 1111,等等,每移位一次,8位数向左或向右移一位。继续移位,就会循环重复的。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/11677251.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存