搜索
bottom↓
回复: 8

51的中断函数问题

[复制链接]

出0入0汤圆

发表于 2014-4-4 00:06:31 | 显示全部楼层 |阅读模式
本帖最后由 wildone 于 2014-4-4 00:18 编辑

请问各位高手,
问题1:C语言中,51中断函数不在主函数里面,写在其它文件,能顺利进入中断吗?
问题2:C 语言中,51中断函数里面不写吗?这样会不会出问题?
            例如   void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
                    {  
                    
                     }

问题3:C语言中,51主函数文件里面有个全局变量unsigned char TEMP=0;,其它模块文件里面有个子函数里面有个变量如  void  delay  (unsigned int TEMP);   这样有影响吗?

问题4:C语言中,51主函数文件里面有个全局变量unsigned char TEMP=0;  ,其它模块文件里面有个子函数里面有个变量如
                                                unsigned char  delay  (unsigned int A)
                                                         {
                                                                return TEMP;
                                                                }                                                                               
                                                                 这样有影响吗?
       

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2014-4-4 00:28:35 来自手机 | 显示全部楼层
1,能。2,如中断发生后不清除相关标志位,将不能再次进入中断函数。3和4无影响。另外你应该自己验证一下。

出0入0汤圆

 楼主| 发表于 2014-4-4 01:18:08 | 显示全部楼层
xiakang 发表于 2014-4-4 00:28
1,能。2,如中断发生后不清除相关标志位,将不能再次进入中断函数。3和4无影响。另外你应该自己验证一下。 ...

谢谢回答问题
第一个问题:如果能,需不需要在头文件再声明这个中断?
第二个问题:定时器工作方式2是自动重装载,不用清除相关标志位,所以这个函数是可以写空的吧?
麻烦大侠了,我也会再验证一下

出0入93汤圆

发表于 2014-4-4 06:55:09 | 显示全部楼层
1、根本不能写到主函数里面,写在其他什么位置都可以。不需要在头文件再声明这个中断。
2、这个函数是可以写空。印象中,51就只有T2才需要考虑相关标志位,其他的都不用管。
3、你要注意作用域的问题,没有影响的。
4、没有影响。

出0入0汤圆

发表于 2014-4-4 08:25:22 | 显示全部楼层
昨晚看了一点STM32的定时器,写法和51的不一样,虽然都是KEIL
不过这点挺好的,打开51的工程,直接编译,都好使,然后换STM32的工程,也直接编译,同一个软件,用起来很方便
奔四的人了,脑袋不灵了,看东西一会儿就困啊,哎

出0入0汤圆

 楼主| 发表于 2014-4-4 13:13:52 | 显示全部楼层
xiaobendan 发表于 2014-4-4 08:25
昨晚看了一点STM32的定时器,写法和51的不一样,虽然都是KEIL
不过这点挺好的,打开51的工程,直接编译,都 ...

哈哈,谢谢

出0入0汤圆

 楼主| 发表于 2014-4-4 14:26:30 | 显示全部楼层
takashiki 发表于 2014-4-4 06:55
1、根本不能写到主函数里面,写在其他什么位置都可以。不需要在头文件再声明这个中断。
2、这个函数是可以 ...

刚才实验了,你们说的都是对的

出0入0汤圆

发表于 2014-4-12 16:35:25 | 显示全部楼层
MARK一下

出0入0汤圆

发表于 2014-4-15 14:37:59 | 显示全部楼层
本帖最后由 gosfon 于 2014-4-15 14:39 编辑

前两个问题大家都说了,不过问题1要注意一点,你得把包含中断程序的那个文件加入在Keil(假设你用这个)的工程中。

我补充一下问题3和问题4

问题3,如果一个函数中有一个变量与全局变量同名(设为Temp),运行时会这样处理,在进入函数前,
先保存全局变量Temp的值到堆栈中,进入函数内后就和全局变量Temp无关了,函数内只和内部定义的Temp有关,
退出函数后,将全局变量Temp的值从堆栈中还原。

  1. #include <stdio.h>

  2. unsigned int delay(unsigned int Temp ) {
  3.     while(Temp) {
  4.         Temp--;
  5.     }
  6.     printf("局部变量Temp = %u\n", Temp);
  7.     return Temp;
  8. }

  9. unsigned int Temp = 5; // 全局变量

  10. void main(void){
  11.         printf("全局变量Temp = %u\n\n", Temp);
  12.         delay(Temp);  // 调用函数,其中delay函数有个同名的变量Temp
  13.         printf("\n全局变量Temp = %u\n", Temp);
  14. }


  15. /* 运行结果
  16. 全局变量Temp = 5

  17. 局部变量Temp = 0

  18. 全局变量Temp = 5
  19. */
复制代码


问题4,和问题3的解决方法一样,函数内部的同名变量不会影响外部的同名变量,各算各的,里面的不会修改外面的,外面的也不会修改里面的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 03:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表