久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2155|回復: 12
打印 上一主題 下一主題
收起左側

單片機中斷程序聲明調用是怎么用的呀?

[復制鏈接]
跳轉到指定樓層
樓主
求大佬幫幫!為了實現設計實現24秒計時器。要求(1)倒計時功能(2)24秒復位鍵功能(3)啟動/暫停鍵功能;proteus仿真圖是這樣子畫的,代碼是下面這樣子寫得,但是仿真一點反應都沒有,代碼編譯說有一段代碼沒有被用到,到底是哪里出了問題,單片機萌新真不會啊,是不是中斷程序聲明調用那部分出了問題


單片機源程序如下:
#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;
                        }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
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();
復制代碼
回復

使用道具 舉報

5#
ID:404160 發表于 2023-6-9 13:46 | 只看該作者
Hephaestus 發表于 2023-6-9 13:36
這兩個函數是硬件中斷調用的,你放到main()里面幾個意思?

另外,沒有對中斷,定時器進行初始化。
回復

使用道具 舉報

6#
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
所以改了一下,或者是不是我電路連錯了
回復

使用道具 舉報

7#
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函數前面。

中斷函數無法通過其它函數調用。
當外部中斷觸發后,中斷正在執行的語句,自動執行中斷函數中的語句。執行完成后返回之前中斷的語句繼續執行。
回復

使用道具 舉報

8#
ID:213173 發表于 2023-6-11 21:18 | 只看該作者
Grealish 發表于 2023-6-9 14:13
這是老師給的參考代碼抄下來的,我感覺應該是老師敲錯了把,也有一個警告,*** 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. }
復制代碼



回復

使用道具 舉報

9#
ID:1082650 發表于 2023-6-14 17:54 | 只看該作者

感謝感謝!!!
回復

使用道具 舉報

10#
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中斷 ```  當中斷事件發生時,會自動執行中斷函數。執行完成后,程序會回到原來的執行點繼續執行。
回復

使用道具 舉報

11#
ID:77589 發表于 2023-6-16 15:58 | 只看該作者
大佬不少
回復

使用道具 舉報

12#
ID:116103 發表于 2023-6-16 16:51 | 只看該作者
中斷子程序和其他的子程序不同,不用先定義,直接寫在MAIN()后面就行
回復

使用道具 舉報

13#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本一区二区三区在线观看 | av黄色在线 | 日韩电影免费在线观看中文字幕 | 黄久久久| 久久久久久久国产精品视频 | 国产一区在线免费观看视频 | 国产成人99久久亚洲综合精品 | 中文字幕国产 | 天天色综 | 国产欧美一区二区精品忘忧草 | 精品久久久久久久久久久久久久久久久 | 一区二区三区在线看 | 国产精品久久久av | 久久人人爽人人爽人人片av免费 | 午夜精品久久久久久久久久久久久 | 九九久久99 | 黄免费在线 | 一区二区三区中文字幕 | 性欧美精品一区二区三区在线播放 | 一区二区三区回区在观看免费视频 | 亚洲精品久久久久久久不卡四虎 | 久久精品国产一区二区电影 | 欧美日韩一区在线 | 亚洲成人一级 | 中文字幕蜜臀av | 九九色综合 | 国产免费拔擦拔擦8x高清 | 亚州国产 | 人人人人爽 | 在线一级片 | 91在线电影| 日韩一级不卡 | 国产精品久久久久久久免费大片 | 99久久精品国产一区二区三区 | 欧美日韩在线观看一区 | 久久av一区二区三区 | 97色在线视频 | 国产98色在线 | 亚洲高清在线播放 | 欧美一级黄色片在线观看 | 91在线观看视频 |