![]() |
發布時間: 2020-3-31 21:16
正文摘要:按照郭天祥的單片機學習視頻照著編了個程序,發現程序在執行中斷時,主函數還在運行。程序所設計的就是當P3.2接地時產生中斷,且中斷程序使得p1.0所接的燈亮。但當我做的時候p3.2沒接地時,沒有發生中斷,系統正常運 ... |
本帖最后由 zwf33 于 2021-1-10 18:26 編輯 51外部中斷有兩種方式 低電平觸發 IT0=0 (檢測到引腳為低電平就觸發 ) 下降沿觸發IT0=1 (測到引腳從高到低下降時就觸發) 你的程序是下降沿觸發的,中斷點亮d1又回到了斷點位置執行主程序 增加IT0=0,中斷程再加延時delay(200),P3.2一直保持低電平,數碼管就不走了 #include <REGX52.H> typedef unsigned char uchar; typedef unsigned int uint; sbit wela=P2^7; sbit dula=P2^6; void delay(uint z); sbit d1=P1^0; uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 }; //數碼管編碼表 uchar num; //定義num數據類型 void main() { //********************外部中斷0,電平觸發中斷********************// EA=1; //打開總中斷 EX0=1; //開外部中斷0 IT0=0; //電平觸發 //********************外部中斷0,電平觸發中斷********************// //********************打開位選********************// wela=1; P0=0xc0; wela=0; //********************打開位選********************// while(1) { d1=1; for(num=0; num<16; num++) //unmp賦初值,判斷自加 { dula=1; //打開段選 P0=table[num]; //table等于自加后的num值 dula=0; delay(50); } } } void delay(uint z) //延時子程序 { uint x,y; for(x=z; x>0; x--) { for(y=110; y>0; y--); } } //********************中斷程序********************// void exter0() interrupt 0 //中斷函數不用聲明 { d1=0; delay(200); } //********************中斷程序********************// |
silvanesw 發表于 2020-4-3 22:09 感謝 這樣就解決了 厲害啊 我的大神 |
www12www 發表于 2020-4-1 07:00 是 原理是這樣 可我的程序執行時 沒按這個原理運行 不知道哪里出現問題了 |
man1234567 發表于 2020-3-31 22:53 我也知道啊 ![]() |