<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機(jī)中斷問題30例

          單片機(jī)中斷問題30例

          作者: 時間:2013-05-07 來源:網(wǎng)絡(luò) 收藏

          if(key1==0)

          keybreak();

          }

          這個程序上電后P0口顯示0x32;按下key2顯示0x3f;key1用于中斷,每20ms檢測是否有按下key1鍵,有的話,P0口顯示0xf1。

          答 :

          ORG 0000H AJMP MAIN ORG 0001H LJMP INT_0 ORG 30H MAIN:MOV SP,#8FH MOV P0,#0FFH MOV P3,#0FFH SETB IT0 SETB EA SETB EX0 LJMP START START: MOV A,#10000000B LOOP: MOV P0,A RLC A LCALL DELAY LCALL DELAY LJMP LOOP LJMP START;

          這句是多余的 根本不會執(zhí)行 INT_0: PUSH ACC ;

          由于p中1斷中1A被設(shè)為10所以5中7斷返回后對A移位沒有意義,o A一e直為10 ,并不d是只能中斷一1次 .

          還有,不清楚key1是什么中斷,貌似是鍵盤掃描吧,

          while(1)

          {

          key();

          P0=0x32;

          }

          都進(jìn)入死循環(huán)了,所以跳不出來,就一次中斷了。

          7、新手學(xué)習(xí)avrATmage 128 遇到問題,中斷程序被忽略問題,找不到原因。

          avr studio 4 軟件仿真時,編譯通過了,單在編譯信息欄卻看到中斷程序被忽略。在軟件仿真時也發(fā)現(xiàn)中斷程序沒有執(zhí)行。不知道問題出在哪里,我用的是avr studio 4 ATmage 128 .

          程序如下

          #include

          #include

          void main() //用的是TC0 溢出中斷,來控制八位LED 一秒閃爍

          {

          PORTE = 0xFF; //LED 關(guān) 端口高電平位關(guān)

          DDRE = 0xFF;

          MCUCR |=(1

          sei(); //開啟全局中斷

          TIMSK|=(1

          TCNT0 =155; //定時器賦初值

          TCCR0 |= (1 CS01); //8分頻

          while (1);

          }

          volatile unsigned int j =0;

          #pragma interrupt_handler timer0_ovf_isr:17

          void timer0_ovf_isr(void)

          {

          TCNT0 = 156; //設(shè)初值

          j++;

          if(j = 5000) //中斷5000次后 執(zhí)行LED 電平翻轉(zhuǎn)

          PORTE ^= 0xFF; //LED 電平翻轉(zhuǎn)

          }

          ../lesson2.c:18: warning: ignoring #pragma interrupt_handler timer0_ovf_isr

          上面是寫的程序。還有編譯信息欄里的話。

          答:

          不是,你那句#pragma interrupt_handler timer0_ovf_isr:17是ICCAVR編譯軟件中寫中斷的方式,而看你的頭文件#include 和#include 應(yīng)該是用avr studio裝GCCavr編譯軟件的寫法,你加上把中斷成

          SIGNAL(SIG_OVERFLOW0)

          {

          TCNT0 = 156; //設(shè)初值

          j++;

          if(j = 5000) //中斷5000次后 執(zhí)行LED 電平翻轉(zhuǎn)

          PORTE ^= 0xFF; //LED 電平翻轉(zhuǎn)

          }

          看看,記住,這是GCCAVR 編譯軟件的寫法

          8新學(xué)的C51,編了個電平觸發(fā)式中斷程序,不知道為什么和跳變沿的一樣了,諸位幫忙看看.

          #include

          #define uchar unsigned char

          #define uint unsigned int

          sbit d1=P1^0;

          sbit dula=P2^6;

          sbit wela=P2^7;

          void delay(uint z);

          uchar code table[]={

          0x3f,0x06,0x5b,0x4f,

          0x66,0x6d,0x7d,0x07,

          0x7f,0x6f,0x77,0x7c,

          0x39,0x5e,0x79,0x71};

          void main()

          {

          EA=1;

          EX0=1;

          IT0=0;

          while(1)

          { d1=1;

          dula=1;

          P0=table[1];

          dula=0;

          P0=0xff;

          wela=1;

          P0=0xfe;

          wela=0;

          delay(500);

          dula=1;

          P0=table[2];

          dula=0;

          P0=0xff;

          wela=1;

          P0=0xfd;

          wela=0;

          delay(500);

          dula=1;

          P0=table[3];

          dula=0;

          P0=0xff;

          wela=1;

          P0=0xfb;

          wela=0;

          delay(500);

          dula=1;

          P0=table[4];

          dula=0;

          P0=0xff;

          wela=1;

          P0=0xf7;

          wela=0;

          delay(500);

          dula=1;

          P0=table[5];

          dula=0;

          P0=0xff;

          wela=1;

          P0=0xef;

          wela=0;

          delay(500);

          dula=1;

          P0=table[6];

          dula=0;

          P0=0xff;

          wela=1;

          P0=0xdf;

          wela=0;

          delay(500);

          }

          }

          void delay(uint z)

          {

          uint x,y;

          for(x=100;x>0;x--)

          for(y=z;y>0;y--);

          }

          void enter() interrupt 0

          {

          d1=0;

          }

          答: 你這個程序中設(shè)置IT0=0,說明是低電平觸發(fā),所以只要P3^2口一直是低電平那么主程序停止,所以發(fā)光二極管點(diǎn)亮,如果P3^2口變?yōu)楦唠娖?,主程序繼續(xù),發(fā)光二極管熄滅。另一種情況是當(dāng)IT0=1的時候是負(fù)跳變觸發(fā),就是當(dāng)P3^2口檢測到一個又高電平到低電平的跳變后,觸發(fā)中斷,在中斷函數(shù)中點(diǎn)亮燈,立即出中斷,執(zhí)行到d1=1時熄燈??吹降默F(xiàn)象就是燈閃一下,直到又檢測到一個負(fù)跳變,燈又閃一下。兩種觸發(fā)方式的現(xiàn)象是不一樣的,如果你硬件沒問題的話。你可以把中斷函數(shù)寫成d1=!d1試試。

          9、在C51單片機(jī)中,中斷服務(wù)程序怎么撤銷中斷引腳上的低電平?

          我用的是,第一個單片機(jī)輸出低電平到第二個單片機(jī)的P3^2,第二個單片機(jī)是電平觸發(fā)方式中斷

          低電平觸發(fā)方式:要求低電平保持到CPU實際響應(yīng)為止,為了避勉CPU再次響應(yīng)中斷,在中斷服務(wù)程序中應(yīng)該撤除中斷引腳上的低電平。請問,怎么撤銷?在中斷服務(wù)程序中怎么寫? 直接寫P3^2=1;行嗎?

          答:

          第一個單片機(jī)的程序,是誰來編寫? 如果也是樓主,那就好辦了。

          第二個單片機(jī)完成了中斷的功能,在退出之前,可以向第一個單片機(jī)回送一個脈沖;

          第一個單片機(jī)收到這個脈沖,就應(yīng)該撤消送到第二個單片機(jī)的中斷申請信號。

          ----

          另外,如果能算出來完成中斷的時間,第一個單片機(jī)送來的申請信號,就不要超過這個時間,應(yīng)該及時、自動的撤消申請信號。



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();