找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

單片機(jī)中斷程序聲明調(diào)用是怎么用的呀?

查看數(shù): 2169 | 評論數(shù): 12 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時(shí)間: 2023-6-8 23:07

正文摘要:

求大佬幫幫!為了實(shí)現(xiàn)設(shè)計(jì)實(shí)現(xiàn)24秒計(jì)時(shí)器。要求(1)倒計(jì)時(shí)功能(2)24秒復(fù)位鍵功能(3)啟動/暫停鍵功能;proteus仿真圖是這樣子畫的,代碼是下面這樣子寫得,但是仿真一點(diǎn)反應(yīng)都沒有,代碼編譯說有一段代碼沒有被 ...

回復(fù)

ID:1084869 發(fā)表于 2023-6-19 09:55
你需要main函數(shù)里面加
IT0 = 1;                    
EX0 = 1;                    
IT1 = 1;                    
EX1 = 1;                    
EA = 1;            
不用在頭文件聲明,這個(gè)在單片機(jī)聲明那里就有了
ID:116103 發(fā)表于 2023-6-16 16:51
中斷子程序和其他的子程序不同,不用先定義,直接寫在MAIN()后面就行
ID:77589 發(fā)表于 2023-6-16 15:58
大佬不少
ID:1084128 發(fā)表于 2023-6-14 18:46
在單片機(jī)中,中斷程序是在中斷事件發(fā)生時(shí)自動執(zhí)行的程序。中斷程序在執(zhí)行完成后,會返回到原來的程序繼續(xù)執(zhí)行。這樣可以讓單片機(jī)在執(zhí)行一個(gè)任務(wù)的同時(shí),可以在中斷事件發(fā)生時(shí)及時(shí)響應(yīng)事件。  在使用中斷程序時(shí),首先需要在程序中聲明中斷函數(shù),并指定中斷服務(wù)程序的編號。例如,在8051單片機(jī)中,可以使用關(guān)鍵字`interrupt`來聲明中斷函數(shù)。如下所示:  ```c void interrupt my_interrupt()  {     // 中斷事件發(fā)生時(shí)需要執(zhí)行的代碼 } ```  然后,需要調(diào)用一個(gè)函數(shù)來啟用中斷。在8051單片機(jī)中,可以使用`IE`寄存器來開啟中斷。例如,如果需要開啟`Timer 0`的中斷,則可以設(shè)置`IE`寄存器中`ET0`位為1。如下所示:  ```c ET0 = 1;  // 開啟Timer 0中斷 ```  當(dāng)中斷事件發(fā)生時(shí),會自動執(zhí)行中斷函數(shù)。執(zhí)行完成后,程序會回到原來的執(zhí)行點(diǎn)繼續(xù)執(zhí)行。
ID:1082650 發(fā)表于 2023-6-14 17:54

感謝感謝。。
ID:213173 發(fā)表于 2023-6-11 21:18
Grealish 發(fā)表于 2023-6-9 14:13
這是老師給的參考代碼抄下來的,我感覺應(yīng)該是老師敲錯(cuò)了把,也有一個(gè)警告,*** WARNING L16: UNCALLED  ...


  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. }
復(fù)制代碼



ID:712097 發(fā)表于 2023-6-11 15:27
main函數(shù)中加入以下語句
IT0 = 1;                    //設(shè)置INT0的中斷類型為僅下降沿,下降沿喚醒
EX0 = 1;                    //使能INT0中斷
IT1 = 1;                    //設(shè)置INT0的中斷類型為僅下降沿,下降沿喚醒
EX1 = 1;                    //使能INT0中斷
EA = 1;                     //開總中斷

原main函數(shù)中的這兩句刪除
t0_ini();
ex_ini();

t0_ini和ex_ini這兩個(gè)中斷函數(shù)放到main函數(shù)前面。

中斷函數(shù)無法通過其它函數(shù)調(diào)用。
當(dāng)外部中斷觸發(fā)后,中斷正在執(zhí)行的語句,自動執(zhí)行中斷函數(shù)中的語句。執(zhí)行完成后返回之前中斷的語句繼續(xù)執(zhí)行。
ID:1082650 發(fā)表于 2023-6-9 14:13
Hephaestus 發(fā)表于 2023-6-9 13:36
這兩個(gè)函數(shù)是硬件中斷調(diào)用的,你放到main()里面幾個(gè)意思?
  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. }
復(fù)制代碼

這是老師給的參考代碼抄下來的,我感覺應(yīng)該是老師敲錯(cuò)了把,也有一個(gè)警告,*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
所以改了一下,或者是不是我電路連錯(cuò)了
ID:404160 發(fā)表于 2023-6-9 13:46
Hephaestus 發(fā)表于 2023-6-9 13:36
這兩個(gè)函數(shù)是硬件中斷調(diào)用的,你放到main()里面幾個(gè)意思?

另外,沒有對中斷,定時(shí)器進(jìn)行初始化。
ID:883242 發(fā)表于 2023-6-9 13:36
Grealish 發(fā)表于 2023-6-9 13:31
TEXT1.C(35): warning C206: 'ex_int': missing function-prototype就只刪掉這兩行報(bào)錯(cuò)了又

這兩個(gè)函數(shù)是硬件中斷調(diào)用的,你放到main()里面幾個(gè)意思?
  1.                 t0_int();
  2.                 ex_int();
復(fù)制代碼
ID:1082650 發(fā)表于 2023-6-9 13:31

TEXT1.C(35): warning C206: 'ex_int': missing function-prototype就只刪掉這兩行報(bào)錯(cuò)了又
ID:883242 發(fā)表于 2023-6-9 11:43
這兩行刪掉!
  1. void t0_int(void){}
  2. void ex_int(void){}
復(fù)制代碼

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表