您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>C/C++語言編程>

外部中斷典型實(shí)驗(yàn)案例分享

大?。?/span>0.15 MB 人氣: 2017-09-06 需要積分:0
外部中斷典型實(shí)驗(yàn)案例分享

1、兩個(gè)外部中斷實(shí)驗(yàn)

/* ch06-3-3.c - 兩個(gè)外部中斷實(shí)驗(yàn) */
//==聲明區(qū)===================================
#include??//?定義8x51暫存器之標(biāo)頭檔,P2-17~19?
#define?LED?P1???//?定義LED接至Port 1
void delay1ms(int);??//?聲明延遲函數(shù)?
void left(int);???//?聲明單燈左移函數(shù)?
void right(int);??//?單燈右移函數(shù)開始
//==主程序===================================
main()?????//?主程序開始?
{?IE=0x85;???//?準(zhǔn)許INT 0,INT 1中斷(6-4頁)
?IP=0x01;???//?設(shè)定INT 0具有最高優(yōu)先權(quán)(6-5頁)
?LED=0x00;???//?初值=0000 0000,燈全亮?
?while(1)???//?無窮循環(huán),程序一直跑?
?{?delay1ms(250);?//?延遲250 1m=0.25s?
??LED=~LED;??//?LED反相?
?}?????//?while循環(huán)結(jié)束?
}??????//?主程序結(jié)束?
//==子程序===================================
/* INT 0的中斷子程序 - 單燈左移3圈 */
void my_int0(void) interrupt 0?//?INT0 中斷子程序開始?
{?unsigned saveLED=LED;?//?儲(chǔ)存中斷前LED狀態(tài)?
?left(3);???//?單燈左移3圈?
?LED=saveLED;??//?寫回中斷前ED狀態(tài)???
}??????//?結(jié)束INT0 中斷子程序?
/* INT 1的中斷子程序 - 單燈右移3圈 */
void my_int1(void) interrupt 2?//?INT1 中斷子程序開始?
{?unsigned saveLED=LED;?//?儲(chǔ)存中斷前LED狀態(tài)?
?right(3);???//?單燈右移3圈?
?LED=saveLED;??//?寫回中斷前LED狀態(tài)?
}??????//?結(jié)束INT1 中斷子程序?
/* 延遲函數(shù),延遲約x 1ms */
void delay1ms(int x)?//?延遲函數(shù)開始?
{?int i,j;???//?聲明整數(shù)變數(shù)i,j?
?for (i=0;i ??for (j=0;j<120;j++);?//?計(jì)數(shù)120次,延遲1ms?
}??????//?延遲函數(shù)結(jié)束?
/* 單燈左移函數(shù),執(zhí)行x圈 */
void left(int x) ??//?單燈左移函數(shù)開始?
{?int i, j;???//?聲明變數(shù)i,j
?for(i=0;i ?{?LED=0xfe;??//?初始狀態(tài)=1111 1110,最右燈亮?
??for(j=0;j<7;j++)?//?j循環(huán),左移7次?
??{?delay1ms(250);?//?延遲250 1m=0.25s
???LED=(LED<<1)|0x01; ?//?左移1位後,LSB設(shè)為1
??}????//?j循環(huán)結(jié)束?
??delay1ms(250);?//?延遲250 1m=0.25s
?}?????//?i循環(huán)結(jié)束*/
}??????//?單燈左移函數(shù)結(jié)束?
/* 單燈右移函數(shù),執(zhí)行x圈 */
void right(int x) ??//?單燈右移函數(shù)開始
{?int i, j;???//?聲明變數(shù)i,j
?for(i=0;i ?{?LED=0x7f;??//?初始狀態(tài)=0111 1111
??for(j=0;j<7;j++)//?j循環(huán),右移7次?
??{?delay1ms(250);?//?延遲250 10m=0.25s
???LED=(LED>>1)|0x80; ?//?右移1位後,MSB設(shè)為1
??}????//?j循環(huán)結(jié)束?
??delay1ms(250);?//?延遲250 1m=0.25s
?}?????//?i循環(huán)結(jié)束*/
}??????//?單燈右移函數(shù)結(jié)束?
?

2、INT1中斷實(shí)驗(yàn)

/* ch06-3-2.c - INT1中斷實(shí)驗(yàn) */
//==聲明區(qū)====================================
#include??//?定義8x51暫存器之標(biāo)頭檔,P2-17~19?
#define?SEG?P0?//?定義七節(jié)顯示器接至Port 0
void delay1ms(int);?//?聲明延遲函數(shù)?
/* 聲明七節(jié)顯示器驅(qū)動(dòng)信號(hào)陣列(共陽) */
unsigned char code TAB[]={?0xc0, 0xf9, 0xa4, 0xb0, 0x99,?//數(shù)字0-4
?????????? ?0x92, 0x83, 0xf8, 0x80, 0x98 };?//數(shù)字5-9
//==主程序=====================================
main()?????//?主程序開始 ?
{?int i;????//?聲明i變數(shù)(計(jì)數(shù)值)
?IE=0x84;???//?準(zhǔn)許INT 1中斷(6-4頁)
?while(1)???//?無窮循環(huán),程序一直跑?
?{?for(i=0;i<10;i++)?//?顯示0-9(上數(shù))
??{?SEG=TAB[i];?//?顯示數(shù)字至七節(jié)顯示器?
???delay1ms(500);?//?延遲500 1m=0.5s?
??}
?}?????//?for循環(huán)結(jié)束?
}??????//?主程序結(jié)束?
//==子程序===================================
/* INT 1的中斷子程序 - 數(shù)字閃爍倒數(shù)9-0 */
void my_int1(void) interrupt 2? //?INT1 中斷子程序開始?
{?int i;????//?聲明i變數(shù)(計(jì)數(shù)值)
?for (i=9;i>=0;i--)?//?for循環(huán)顯示9-0(下數(shù))
?{?SEG=TAB[i];??//?顯示數(shù)字至七節(jié)顯示器?
??delay1ms(250);?//?延遲500 1m=0.5s?
??SEG=0xff;??//?關(guān)閉七節(jié)顯示器?
??delay1ms(250);?//?延遲500 1m=0.5s?
?}?????//?for循環(huán)結(jié)束?
}??????//?結(jié)束中斷子程序?
/* 延遲函數(shù),延遲約x*1ms */
void delay1ms(int x)?//?延遲函數(shù)開始?
{?int i,j;???//?聲明整數(shù)變數(shù)i,j?
?for (i=0;i ??for (j=0;j<120;j++);?//?計(jì)數(shù)120次,延遲1ms?
}??????//?延遲函數(shù)結(jié)束?
?

3、INT0中斷實(shí)驗(yàn)

/* ch06-3-1.c - INT0中斷實(shí)驗(yàn) */
//==聲明區(qū)===================================
#include??//?定義8x51暫存器的標(biāo)頭檔,P2-17~19?
#define?LED?P1???//?定義LED接至Port 1
void delay1ms(int);??//?聲明延遲函數(shù)?
void left(int);???//?聲明單燈左移函數(shù)?
//==主程序===================================
main()?????//?主程序開始?
{?IE=0x81;???//?準(zhǔn)許INT 0中斷(6-4頁)
?LED=0x00;???//?初值=0000 0000,燈全亮?
?while(1)???//?無窮循環(huán),程序一直跑?
?{?delay1ms(250);?//?延遲250*1m=0.25s?
??LED=~LED;??//?LED反相?
?}?????//?while循環(huán)結(jié)束?
}??????//?主程序結(jié)束?
//==子程序===================================
/* INT 0的中斷子程序 - 單燈左移3圈 */
void my_int0(void) interrupt 0?//?INT0 中斷子程序開始?
{?unsigned saveLED=LED;?//?儲(chǔ)存中斷前LED狀態(tài)?
?left(3);???//?單燈左移3圈?
?LED=saveLED;??//?寫回中斷前LED狀態(tài)?
}??????//?結(jié)束INT0 中斷子程序?
/* 延遲函數(shù),延遲約x 1ms */
void delay1ms(int x)?//?延遲函數(shù)開始?
{?int i,j;???//?聲明整數(shù)變數(shù)i,j?
?for (i=0;i ??for (j=0;j<120;j++);?//?計(jì)數(shù)120次,延遲1ms?
}??????//?延遲函數(shù)結(jié)束?
/* 單燈左移函數(shù),執(zhí)行x圈 */
void left(int x) ??//?單燈左移函數(shù)開始?
{?int i, j;???//?聲明變數(shù)i,j
?for(i=0;i ?{?LED=0xfe;??//?初始狀態(tài)=1111 1110,最右燈亮?
??for(j=0;j<7;j++)//?j循環(huán),左移7次?
??{?delay1ms(250);?//?延遲250*1m=0.25s
???LED=(LED<<1)|0x01; ?//?左移1位後,LSB設(shè)為1
??}????//?j循環(huán)結(jié)束?
??delay1ms(250);?//?延遲250*1m=0.25s
?}?????//?i循環(huán)結(jié)束*/
}???? ?//?單燈左移函數(shù)結(jié)束?

4、4x4鍵盤實(shí)驗(yàn)

/* ch06-3-4.c - 4x4鍵盤實(shí)驗(yàn),外部INT0(P3.2) */
//==聲明區(qū)===================================
#include??//?定義8x51暫存器之標(biāo)頭檔,P2-17~19?
#define?LED?P1???//?定義LED接至Port 1
#define?KEYBCD? P2? ?// 定義接鍵盤掃瞄(低4位元)及BCD輸出(高4位元)
#define?RR(x)?(x==0x7f)? 0xfe:(x<<1)|0x01?// x向左旋轉(zhuǎn)1bit
void delay1ms(int);?//?聲明延遲函數(shù)?
//==主程序===================================
main()?????//?主程序開始?
{?IE=0x81;???//?準(zhǔn)許INT 0中斷(6-4頁)
?LED=0xfe;???//?初值=1111 1110,最右燈亮?
?while(1)???//?無窮回圈,程序一直跑?
?{?delay1ms(250);?//?延遲250 1m=0.25s
??LED=RR(LED);?//?LED向左旋轉(zhuǎn)1bit
?}?????//?while回圈結(jié)束?
}??????//?主程序結(jié)束?
//==子程序===================================
/* 延遲函數(shù),延遲約x 1ms */
void delay1ms(int x)?//?延遲函數(shù)開始?
{?int i,j;???//?聲明整數(shù)變數(shù)i,j?
?for (i=0;i ??for (j=0;j<120;j++);//?計(jì)數(shù)120次,延遲1ms?
}??????//?延遲函數(shù)結(jié)束?
/* INT 0的中斷子程序 - 單燈左移3圈 */
void my_int0(void) interrupt 0?//?INT0 中斷子程序開始?
{?unsigned saveLED=LED;?//?儲(chǔ)存中斷前LED狀態(tài)?
?KEYBCD=0xff;??//?規(guī)劃輸入?
?KEYBCD>>=4;???//?高四位元移至低四位元?
?LED=saveLED;??//?寫回中斷前ED狀態(tài)?
}??????//?結(jié)束INT0 中斷子程序?
?
?

5、4x4鍵盤與4個(gè)7節(jié)顯示器實(shí)驗(yàn)

/* ch05-4-4.c - 4x4鍵盤與4個(gè)7節(jié)顯示器實(shí)驗(yàn), P1.4~7為共用掃描信號(hào) */
/* P1.0~3為鍵盤輸入值,P2為7節(jié)顯示器直接輸出 */
//==聲明區(qū)================================================
#include???// 定義8051暫存器之標(biāo)頭檔?
#define?KEYP? P2???// 掃瞄輸出端口(高位元)及鍵盤輸入端口(低位元)
#define?SEG7P? P0?? ?// 7節(jié)顯示器(g~a)輸出埤?
unsigned char code TAB[17]=?// 共陽7節(jié)顯示器(g~a)編碼?
{ ?0xc0, 0xf9, 0xa4, 0xb0, 0x99,?// 數(shù)字0-4
? ?0x92, 0x82, 0xf8, 0x80, 0x98, ?// 數(shù)字5-9
? ?0xa0, 0x83, 0xa7, 0xa1, 0x84, ?// 字母a-e(10-14)
? ?0x8e, 0xbf};? ???// 字母F(15),負(fù)號(hào)(-)
unsigned char disp[4]={ 0xbf, 0xbf, 0xbf, 0xbf }; // 顯示陣列初值為負(fù)號(hào)(-)
unsigned char scan[4]={ 0xef, 0xdf ,0xbf ,0x7f }; // 7顯示器及鍵盤之掃瞄碼?
void? delay1ms(int);???// 聲明延遲函數(shù)?
void? scanner(void);???// 聲明掃瞄函數(shù)?
//==主程序================================================
main()???????// 主程序開始?
{?while(1)?????// 無窮回圈,程序一直跑?
?scanner();?????// 掃瞄鍵盤及顯示7段顯示器?
}????????// 主程序結(jié)束?
// === 延遲函數(shù),延遲約x*1ms ================================
void delay1ms(int x)???// 防彈跳函數(shù)開始?
{?int i,j;?????// 聲明整數(shù)變數(shù)i?
?for(i=0;i ??for(j=0;j<120;j++);??// 計(jì)數(shù)120次,延遲約1ms?
}????????// 防彈跳函數(shù)結(jié)束?
// ======= 掃瞄4*4鍵盤及4個(gè)7節(jié)顯示器函數(shù) ================
void scanner(void)????// 掃瞄函數(shù)開始?
{?unsigned char col,row,dig;? // 聲明變數(shù)(col:行,row:列,dig:顥示位)
?unsigned char rowkey,kcode;?// 聲明變數(shù)(rowkey:列鍵值,kcode:按鍵碼)
?for(col=0;col<4;col++)??? ?// for回圈,掃瞄第col行?
?{?KEYP? = scan[col];??// 高4位輸出掃瞄信號(hào),低4位元輸入列值?
??SEG7P = disp[col];??// 輸出第col行數(shù)字?
??rowkey= ~KEYP & 0x0f;
??// 讀入KEYP低4位,反相再清除高4位求出列鍵值?
??if(rowkey != 0)???// 若有按鍵?
??{?if(rowkey == 0x01)???? ?row=0;?// 若第0列被按下?
???else if(rowkey == 0x02)?row=1;?// 若第1列被按下?
???else if(rowkey == 0x04)?row=2;?// 若第2列被按下?
???else if(rowkey == 0x08)?row=3;?// 若第3列被按下?
???kcode = 4 * col + row;???// 算出按鍵之號(hào)碼?
???for(dig = 0; dig < 3 ; dig++)?// 顯示陣列之左3字?
????disp[dig]=disp[dig+1];??// 將右側(cè)編碼左移1位?
???disp[3]=TAB[kcode];????// 鍵值編碼後,寫入最右側(cè)?
???while(rowkey != 0)????// 當(dāng)按鈕未放開?
????rowkey=~KEYP & 0x0f;??// 再讀入列鍵值?
??}??????//?if敘述(有按鍵時(shí))結(jié)束?
??delay1ms(4);???//?延遲4ms
?}???????//?for回圈結(jié)束(掃瞄col行)
}????????//?掃瞄函數(shù)scanner()結(jié)束?
?

6、MM74C922實(shí)驗(yàn)

/* ch05-4-5.c - MM74C922實(shí)驗(yàn),P2.4~7為鍵盤值,P2.0~3輸出至7447 */
//==聲明區(qū)===================================
#include? ??// 定義8051暫存器之標(biāo)頭檔,P2-17~19?
sbit? IRQ=P3^2;? ???// 聲明P3.2 偵測(cè)是否輸入?
//==主程序===================================
main()??????// 主程序開始?
{?P2=0xff;????// 規(guī)劃P2.4~7為輸入埠,并關(guān)閉顯示器(P2.0~3)
?while(1)????// 無窮循環(huán),程序一直跑?
??if (IRQ==1)??? ?// 判讀是否按下按鍵?
???P2=(P2>>4)|0xf0;?
?/* 高4位元(輸入)移至低4位元(輸出),再將高4位元設(shè)為1(規(guī)劃輸入)*/
}?????? ??// 主程序結(jié)束?
?

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?