單片機實驗四

1、實驗內容一
1.1、問題一:
設實驗連線如圖4-1所示,P1口與J9(發光二極管)相連,將一個獨立按鍵接到外部中斷0(或1)。
這裏寫圖片描述

圖4-1

(1)、將外部中斷0設爲邊沿觸發,設定初值爲發光二極管偶數管亮,分別按下和按住獨立按鍵,實現P1口電平取反,觀察二極管點亮現象。
(2)、將外部中斷0設爲電平觸發,設定初值爲發光二極管偶數管亮,分別按下和按住獨立按鍵,觀察現象,並與上例比較,理解外部中斷在邊沿觸發和電平觸發下的不同。
(3)、編程實現無中斷時,8位發光二極管常亮,有外部中斷時8位二極管從低至高依次循環點亮一遍後恢復常亮狀態。
1.2、問題一的代碼
問題(1)的C語言代碼如下:

#include <reg51.h>
#include <absacc.h>
int i = 0;
void delay();
void main()
{
    EA = 1;
    EX0 = 1;
    IT0 = 1; 
    P1 = 0x55;
    while (1)
    {

    }
}
void int0() interrupt 0
{
    P1 = ~P1;  
    delay();

}
void delay() 
{   int x,y;
    for(x=100;x>0;x--)
    for(y=625;y>0;y--);
}

問題(2)的C語言代碼如下:

#include <reg51.h>
#include <absacc.h>
int i = 0;
void delay();
void main()
{
    EA = 1;
    EX0 = 1; 
    IT0 = 0;
    P1 = 0x55;
    while (1)
    {

    }
}
void int0() interrupt 0
{
    P1 = ~P1;  
    delay();

}
void delay() 
{   int x,y;
    for(x=100;x>0;x--)
    for(y=625;y>0;y--);
}

問題(3)的C語言代碼如下:

#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
int i;
char temp;
void delay();
void main()
{
    EA = 1;
    EX0 = 1;
    IT0 = 0;
    P1 = 0;
    while (1)
    {

    }
}
void int0() interrupt 0
{
    i = 0;
    temp = 0xFE;
    while (i < 9)
    {
        P1 = temp;
        delay();
        temp = _crol_(temp,1);
        i++;
    }
}
void delay() 
{   int x,y;
    for(x=200;x>0;x--)
    for(y=625;y>0;y--);
}

1.3、問題一的結果和現象:
問題(1)的結果和現象:
當按下獨立按鍵時,偶數位燈亮轉變爲奇數燈亮,再按下奇數燈亮變爲偶數燈亮,依次循環(在實際操作中因爲在低電平時會有震盪,會造成在實際過程中可能會有兩次下降沿)。當按住獨立按鍵的時候,每次按住跳變一次,依次循環(在實際操作中可能仍會有下降沿的影響,但是下降沿的時間較短,看不出差異)。
問題(2)的結果和現象:
當按下獨立按鍵時,偶數位燈亮轉變爲奇數燈亮,再按下奇數燈亮變爲偶數燈亮,依次循環(在實際操作中因爲在低電平時會有震盪,會造成在實際過程中可能會有多次轉變)。當按住獨立按鍵時,大約每經過0.5s進行一次轉變一次。
問題(3)的結果和現象:
當不按下獨立按鍵時,8位發光二極管常亮,當按下獨立按鍵時,8位二極管從低至高依次循環點亮一遍後恢復常亮狀態。
2、實驗內容二
2.1、問題二:
設將P1口與J9(發光二極管)相連,將兩個獨立按鍵分別接到外部中斷0和1,連線如圖4-2所示 。
這裏寫圖片描述

圖4-2-1

(1)、編程實現無中斷時,發光二極管常亮,有外部中斷時8位二極管依次從K1-K8點亮一遍,有外部中斷時8位二極管依次從K8-K1點亮一遍。
(2)、驗證中斷查詢的自然優先順序(給出驗證方法及結果)。
(3)、通過IP寄存器設置優先級,驗證中斷的兩個優先級結構(給出驗證方法及結果)。
2.2、問題二的代碼:
問題(1)的C語言代碼如下:

#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
int i;
int j;
char temp;
void delay();
void main()
{
    EA = 1;
    EX0 = 1;
    IT0 = 0;
    EX1 = 1;
    IT1 = 0;
    P1 = 0;
    while (1)
    {
        P1 = 0;
    }
}
void int0() interrupt 0
{
    i = 0;
    temp = 0xFE;
    while (i < 8)
    {
        P1 = temp;
        delay();
        temp = _crol_(temp,1);
        i++;
    }
}
void int1() interrupt 2
{
    j = 0;
    temp = 0x7F;
    while (j < 8)
    {
        P1 = temp;
        delay();
        temp = _cror_(temp,1);
        j++;
    }
}
void delay() 
{   int x,y;
    for(x=100;x>0;x--)
    for(y=625;y>0;y--);
}

問題(2)的C語言代碼如下:
如問題(1)代碼。
問題(3)的C語言代碼如下:

#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
char temp,temp1;
void delay();
void delay1();
void main()
{
    EA = 1;
    EX0 = 1;
    IT0 = 0;
    EX1 = 1;
    IT1 = 0;
    P1 = 0;
    PX1 = 1;
    while (1)
    {
        P1 = 0;
    }
}
void int0() interrupt 0
{
    int i = 0;
    temp = 0xFE;
    while (i < 8)
    {
        P1 = temp;
        delay();
        temp = _crol_(temp,1);
        i++;
    }
}
void int1() interrupt 2
{
    int j = 0;
    temp1 = 0x7F;
    while (j < 8)
    {
        P1 = temp1;
        delay1();
        temp1 = _cror_(temp1,1);
        j++;
    }
}
void delay() 
{   int x,y;
    for(x=100;x>0;x--)
    for(y=625;y>0;y--);
}
void delay1() 
{   int x,y;
    for(x=100;x>0;x--)
    for(y=625;y>0;y--);
}

2.3、問題二的實驗結果和現象:
問題(1)的實驗現象:
當按下外部中斷0對應的獨立按鍵時,8位二極管依次從K1-K8點亮一遍; 當按下外部中斷1對應的獨立按鍵時,8位二極管依次從K8-K1點亮一遍;兩者之間不能互相打斷。
問題(2)的實驗方法和實驗現象:
同時按下外部中斷0對應得獨立按鍵和外部中斷1對應得獨立按鍵時,單片機運行外部中斷0對應的程序,即8位二極管依次從K1-K8點亮一遍。說明當爲自然優先級時,同時來臨兩個中斷,相應自然優先級高的中斷。
問題(3)的實驗方法和實驗現象:
前提條件爲外部中斷1設置了高優先級,實驗結果如表4-1:
表4-1 驗證中斷的兩個優先級結構
實驗操作方式 同時按下兩個外部中斷對應的獨立按鍵 先按下外部中斷0對應的獨立按鍵,在未執行完該中斷時,按下外部中斷1對應的獨立按鍵 先按下外部中斷1對應的獨立按鍵,在未執行完該中斷時,按下外部中斷0對應的獨立按鍵
實驗現象 單片機相應外部中斷1對應的程序 單片機首先相應外部中斷0對應的程序,當按下獨立按鍵1時,相應外部中斷1對應的程序,而後返回到外部中斷1相應前的狀態繼續實現。 單片機運行一次外部中斷1對應的程序後恢復常亮,不執行外部中斷0對應的程序。

3、實驗內容三
3.1、問題三:
如圖4-3-1、圖4-3-2和圖4-3-3爲八段數碼管的原理圖將P1口連至單個共陽數碼管(J6),將兩個獨立按鍵分別接到外部中斷0和外部中斷1。編程實現有外部中斷時顯示數字加1,有外部中斷時顯示數字減1。
這裏寫圖片描述

圖4-3-1

這裏寫圖片描述
圖4-3-2

這裏寫圖片描述
圖4-3-3

3.2、問題三的代碼:
C語言代碼如下:

#include <reg51.h>
#include <absacc.h>
void delay()    ;
int i = 0;
int code TAB[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void main()
{
    EA = 1;
    EX0 = 1;
    EX1 = 1;
    IT0 = 0; 
    IT1 = 0;
    P1 = TAB[i];
    while (1)
    {

    }
}
void init0() interrupt 0
{
    if (i == 9)
    {
        i = 0; 
        P1 = TAB[i];    
    }
    else
        P1 = TAB[++i];
    delay();
}

void init1() interrupt 2
{
    if (i == 0)
    {
        i = 9;
        P1 = TAB[i];
    }
    else
        P1 = TAB[--i];
    delay();
}
void delay()
{
    int i,j;
    for (i = 200; i > 0;i--)
        for(j = 125 ; j > 0;j--)
        ;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章