找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 984|回复: 12
收起左侧

单片机中断程序声明调用是怎么用的呀?

[复制链接]
ID:1082650 发表于 2023-6-8 23:07 | 显示全部楼层 |阅读模式
求大佬帮帮!为了实现设计实现24秒计时器。要求(1)倒计时功能(2)24秒复位键功能(3)启动/暂停键功能;proteus仿真图是这样子画的,代码是下面这样子写得,但是仿真一点反应都没有,代码编译说有一段代码没有被用到,到底是哪里出了问题,单片机萌新真不会啊,是不是中断程序声明调用那部分出了问题
1.png

单片机源程序如下:
#include<reg51.h>
unsigned char code table []={0x3f, 0x06,0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
sbit start_stop =P3^2;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
unsigned char time,cnt;
bit key_flag;
void delay (void)
{
unsigned int i;
for (i=0;i<2000;i++);
}
void display(unsigned char temp)
{
                        unsigned char shi,ge;
                        shi=temp/10;
                        ge=temp%10;
                        P1&=0xfC;
                        P2=table[shi];
                        P1_0=1;
                        delay();
                        P1&=0xfC;
                        P2=table[ge];
                        P1_1=1;
                        delay();
                        P2=0;
                        P1&=0xf0;
}
void t0_int(void){}
void ex_int(void){}
void main(void)
{
                t0_int();
                ex_int();
                while(1);
                {
                                display(time);
                }
}
void ex0_int(void) interrupt 0
{
  key_flag=!key_flag;
  if(key_flag) TR0=1;
  else TR0=0;
  }
void ex1_int(void) interrupt 2
{
                 time=24;
}

void t0_int(void) interrupt 1
{
                        TH0=(65536-50000)/256;
                        TL0=(65536-50000)%256;
                        cnt++;
                        if(cnt==20)
                        {
                        cnt =0;
                        time--;
                        if(time==0)         time=24;
                        }
}


回复

使用道具 举报

ID:883242 发表于 2023-6-9 11:43 | 显示全部楼层
这两行删掉!
  1. void t0_int(void){}
  2. void ex_int(void){}
复制代码
回复

使用道具 举报

ID:1082650 发表于 2023-6-9 13:31 | 显示全部楼层

TEXT1.C(35): warning C206: 'ex_int': missing function-prototype就只删掉这两行报错了又
回复

使用道具 举报

ID:883242 发表于 2023-6-9 13:36 | 显示全部楼层
Grealish 发表于 2023-6-9 13:31
TEXT1.C(35): warning C206: 'ex_int': missing function-prototype就只删掉这两行报错了又

这两个函数是硬件中断调用的,你放到main()里面几个意思?
  1.                 t0_int();
  2.                 ex_int();
复制代码
回复

使用道具 举报

ID:404160 发表于 2023-6-9 13:46 | 显示全部楼层
Hephaestus 发表于 2023-6-9 13:36
这两个函数是硬件中断调用的,你放到main()里面几个意思?

另外,没有对中断,定时器进行初始化。
回复

使用道具 举报

ID:1082650 发表于 2023-6-9 14:13 | 显示全部楼层
Hephaestus 发表于 2023-6-9 13:36
这两个函数是硬件中断调用的,你放到main()里面几个意思?
  1. #include<reg51.h>
  2. unsigned char code table []={0x3f, 0x06,0x5b, 0x4f,
  3. 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
  4. sbit start_stop =P3^2;
  5. sbit P1_0=P1^0;
  6. sbit P1_1=P1^1;
  7. unsigned char time,cnt;
  8. bit key_flag;
  9. void delay (void)
  10. {
  11. unsigned int i;
  12. for (i=0;i<2000;i++);
  13. }
  14. void display(unsigned char temp)
  15. {
  16.                         unsigned char shi,ge;
  17.                         shi=temp/10;
  18.                         ge=temp%10;
  19.                         P1&=0xf0;
  20.                         P2=table[shi];
  21.                         P1_0=1;
  22.                         delay();
  23.                         P1&=0xf0;
  24.                         P2=table[ge];
  25.                         P1_1=1;
  26.                         delay();
  27.                         P2=0;
  28.                         P1&=0xf0;
  29. }
  30. t0_ini(){}
  31. ex_ini(){}
  32. void main(void)
  33. {
  34.                 t0_ini();
  35.                 ex_ini();
  36.                 while(1);
  37.                 {
  38.                                 display(time);
  39.                 }
  40. }
  41. ex0_int() interrupt 0
  42. {
  43.   key_flag=!key_flag;
  44.   if(key_flag) TR0=1;
  45.   else TR0=0;
  46.   }
  47. ex1_int() interrupt 2
  48. {
  49.                 time=24;
  50. }

  51. t0_int() interrupt 1
  52. {
  53.                         TH0=(65536-50000)/256;
  54.                         TL0=(65536-50000)%256;
  55.                         cnt++;
  56.                         if(cnt==20)
  57.                         {
  58.                         cnt =0;
  59.                         time--;
  60.                         if(time==0)         time=24;
  61.                         }
  62. }
复制代码

这是老师给的参考代码抄下来的,我感觉应该是老师敲错了把,也有一个警告,*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
所以改了一下,或者是不是我电路连错了
回复

使用道具 举报

ID:712097 发表于 2023-6-11 15:27 | 显示全部楼层
main函数中加入以下语句
IT0 = 1;                    //设置INT0的中断类型为仅下降沿,下降沿唤醒
EX0 = 1;                    //使能INT0中断
IT1 = 1;                    //设置INT0的中断类型为仅下降沿,下降沿唤醒
EX1 = 1;                    //使能INT0中断
EA = 1;                     //开总中断

原main函数中的这两句删除
t0_ini();
ex_ini();

t0_ini和ex_ini这两个中断函数放到main函数前面。

中断函数无法通过其它函数调用。
当外部中断触发后,中断正在执行的语句,自动执行中断函数中的语句。执行完成后返回之前中断的语句继续执行。
回复

使用道具 举报

ID:213173 发表于 2023-6-11 21:18 | 显示全部楼层
Grealish 发表于 2023-6-9 14:13
这是老师给的参考代码抄下来的,我感觉应该是老师敲错了把,也有一个警告,*** WARNING L16: UNCALLED  ...

无标题.jpg
  1. #include<reg51.h>

  2. sbit P1_0=P1^0;
  3. sbit P1_1=P1^1;

  4. unsigned char code table []={0x3f, 0x06,0x5b, 0x4f,
  5. 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
  6. unsigned char time,cnt;
  7. bit key_flag;
  8. void t0_int(void);
  9. void ex_int(void);
  10. void display(unsigned char temp);
  11. void delay (void);

  12. void main(void)
  13. {
  14.         t0_int();
  15.         ex_int();
  16.         while(1)
  17.         {
  18.                 display(time);
  19.         }
  20. }

  21. void delay (void)
  22. {
  23.         unsigned int i;
  24.         for (i=0;i<2000;i++);
  25. }

  26. void display(unsigned char temp)
  27. {
  28.         P2=0x00;
  29.         P1_0=0;
  30.         P1_1=1;
  31.         P2=table[temp/10];
  32.         delay();

  33.         P2=0x00;
  34.         P1_0=1;
  35.         P1_1=0;
  36.         P2=table[temp%10];
  37.         delay();
  38. }

  39. void t0_int(void)
  40. {
  41.         TMOD = 0x01;
  42.         TH0=(65536-50000)/256;
  43.         TL0=(65536-50000)%256;
  44.         TF0 = 0;
  45.         TR0 = 1;
  46. }

  47. void ex_int(void)
  48. {
  49.         ET0 = 1;
  50.         IT0 = 1;
  51.         EX0 = 1;
  52.         EA = 1;
  53. }

  54. void exint0() interrupt 0
  55. {
  56.         key_flag=1;
  57.         time=24;
  58. }

  59. void Timer0Interrupt(void) interrupt 1
  60. {
  61.         TH0=(65536-50000)/256;
  62.         TL0=(65536-50000)%256;
  63.         if(key_flag)
  64.         {
  65.                 if(++cnt==20)
  66.                 {
  67.                         cnt=0;
  68.                         time--;
  69.                         if(time==0)key_flag=0;
  70.                 }
  71.         }
  72. }
复制代码



回复

使用道具 举报

ID:1082650 发表于 2023-6-14 17:54 | 显示全部楼层

感谢感谢!!!
回复

使用道具 举报

ID:1084128 发表于 2023-6-14 18:46 | 显示全部楼层
在单片机中,中断程序是在中断事件发生时自动执行的程序。中断程序在执行完成后,会返回到原来的程序继续执行。这样可以让单片机在执行一个任务的同时,可以在中断事件发生时及时响应事件。  在使用中断程序时,首先需要在程序中声明中断函数,并指定中断服务程序的编号。例如,在8051单片机中,可以使用关键字`interrupt`来声明中断函数。如下所示:  ```c void interrupt my_interrupt()  {     // 中断事件发生时需要执行的代码 } ```  然后,需要调用一个函数来启用中断。在8051单片机中,可以使用`IE`寄存器来开启中断。例如,如果需要开启`Timer 0`的中断,则可以设置`IE`寄存器中`ET0`位为1。如下所示:  ```c ET0 = 1;  // 开启Timer 0中断 ```  当中断事件发生时,会自动执行中断函数。执行完成后,程序会回到原来的执行点继续执行。
回复

使用道具 举报

ID:77589 发表于 2023-6-16 15:58 | 显示全部楼层
大佬不少
回复

使用道具 举报

ID:116103 发表于 2023-6-16 16:51 | 显示全部楼层
中断子程序和其他的子程序不同,不用先定义,直接写在MAIN()后面就行
回复

使用道具 举报

ID:1084869 发表于 2023-6-19 09:55 | 显示全部楼层
你需要main函数里面加
IT0 = 1;                    
EX0 = 1;                    
IT1 = 1;                    
EX1 = 1;                    
EA = 1;            
不用在头文件声明,这个在单片机声明那里就有了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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