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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6486|回復: 2
收起左側

MCS-51單片機實驗指導書

[復制鏈接]
ID:115111 發表于 2016-5-16 03:10 | 顯示全部樓層 |閱讀模式
MCS-51單片機實驗指導書

word格式的全書打包下載:http://www.zg4o1577.cn/bbs/dpj-50225-1.html

編者:朱飛鵬 趙勇

目錄
.              實驗一  IO口的輸出應用
一              實驗目的
二              實驗內容
三              實驗器材
四              實驗步驟
五              附注
六              附注例程
.              實驗二  IO口的輸入應用
一              實驗目的
二              實驗內容
三              實驗器材
四              實驗步驟
五              附注
六              實驗附注例程
.              實驗三  定時器中斷實驗(PERIODIC INTERRUPT TIMER)
一              實驗目的
二              實驗內容
三              實驗器材
四              實驗步驟
五              附注實驗例程:
.              實驗四  外部中斷的應用
一  實驗目的
二              實驗內容
三              實驗器材
三              實驗步驟
四              附注
五              實驗附注例程
.              實驗五  單片機串口的應用
一              實驗目的
二              實驗內容
三              實驗器材
四              實驗步驟
五              附注
六              附注例程



1
         
.             實驗一  IO口的輸出應用1   實驗目的
通過此次實驗學習普通IO口作為輸出口的應用。
2   實驗內容
我們通過普通IO口驅動一個LED燈閃爍。(采用灌電流方式)
3   實驗器材
STC89C52RC單片機、LED燈或實驗箱。
4   實驗步驟
  • Keil開發環境下建立一個工程。
  • 程序的編寫。
  • 程序下載調試(可先進行仿真)。
5   附注
采用灌電流的方式原因:因為單片機輸出的電流比較小,當然可以驅動發光二極管,但是在很多時候,例如:我們驅動數碼管的時候,會因為輸出電流比較小,所以發光二極管不夠亮,所以當我們采用灌電流的方式的時候可以避免這一點。
為了防止電流過大燒壞二極管,一般應接200Ω左右的限流電阻。
6   附注例程
#include

#define unint unsigned int
#define unchar unsigned char

sbit Led = P1^0;              //位定義

void delay(unint k)                               //延時函數
{
              unint i;
              for(k;k>0;k--)
                            for(i=0;i<121;i++);
}

void main()
{
              while(1)              //死循環
              {
                            Led = 0;                                          //灌電流方式,低電平點亮
                            delay(1000);
                            Led = 1;
                            delay(1000);
              }
}

匯編源代碼:
                            LED                            EQU                            P1.0                 ;宏定義

                            ORG              0000H                                             ;起始地址
                            JMP                            MAIN

                            ORG              0100H                                             ;主程序起始地址
MAIN:              CLR                            LED                                                           ;點亮二極管
                            LCALL              DELAY                                             ;延時
                            SETB              LED                                                           ;息滅二極管
                            LCALL              DELAY
                            SJMP              MAIN                                             ;相當于C語言中的死循環

DELAY:              MOV              R6,#200                                             ;延時函數
DEL1:              MOV              R7,#221
                            NOP
DEL2:              DJNZ              R7,DEL2
                            DJNZ              R6,DEL1
                            RET

                            END

附實驗仿真圖:
2.001.jpg


1
         
.             實驗二  IO口的輸入應用1   實驗目的
通過此次實驗學習普通IO口作為輸入口的應用,并結合輸入輸出方式熟練掌握IO口的應用
2   實驗內容
采用按鍵控制一個LED燈的亮滅。
3   實驗器材
STC89C52RC 單片機、LED燈,獨立按鍵或實驗箱。
4   實驗步驟
  • Keil開發環境下建立一個工程。
  • 程序的編寫,采用查詢方式判斷鍵是否按下,并確定是否點亮二極管。
  • 程序下載調試(可先進行仿真)。
5   附注
按鍵控制LED燈的亮滅,我們可以采用外部中斷的方式(實驗四會講),獨立按鍵的接法希望大家注意,直接接地,在沒有按鍵的情況下IO口為高電平(注:因為本實驗中按鍵接P1口,內部集成上拉電阻。若使用P0口作為通用IO口使用時必須外接500Ω左右的上拉電阻。見實驗四附圖2),當有按鍵按下時IO口為低電平。
6   實驗附注例程
#include

#define unint unsigned int
#define unchar unsigned char

sbit Led = P1^0;
sbit Key = P1^1;                              //位定義

void main()
{
              while(1)                                          //死循環
              {
                            if(!Key)                            //判斷是否按下按鍵,按下為0
                                          Led = 0;              //點亮燈
                            else
                                          Led = 1;
              }
}


匯編代碼:
                            LED                                          EQU                            P1.0
                            KEY                            EQU                            P1.1

                            ORG              0000
                            JMP                            MAIN

                            ORG              0100
MAIN:              JB                            KEY,LIGHT   ;判斷鍵是否按下
                            CLR                            LED
                            SJMP              MAIN
LIGHT:              SETB              LED
                            SJMP              MAIN

                            END

附實驗仿真電路:

2.002.jpg
注:若使用實驗箱,開關接P1.1即可。


1
         
.             實驗三  定時器中斷實驗(Periodic Interrupt Timer)1   實驗目的
掌握定時器相關寄存器的配置,以及定時時間的計算等
2   實驗內容
定期器中斷及查詢方式控制P1.0口輸出方波,用實驗箱上的示波器觀察波形,不同定時值對其影響。
3   實驗器材
STC89C51RC或實驗箱。
4   實驗步驟
  • Keil開發環境下建立一個工程。
  • 程序的編寫,
a.定時常數的確定
     定時器/計數器的輸入脈沖周期與機器周期一樣, 為振蕩頻率的1/12。本實驗中時鐘頻率為6.0 MHZ,現要采用中斷方法來實現0.5秒延時,要在定時器1中設置一個時間常數,使其每隔0.1秒產生一次中斷,CPU響應中斷后將R0中計數值減一,令R0=05H,即可實現0.5秒延時。
    時間常數可按下述方法確定:
    機器周期=12÷晶振頻率=12/(6×106)=2us
    設計數初值為X,則(2e+16-X)×2×106=0.1,可求得X=15535
    化為十六進制則X=3CAFH,故初始值為TH1=3CH,TL1=AFH
b.初始化程序
     包括定時器初始化和中斷系統初始化,主要是對IE、TCON、TMOD的相應位進行正確的設置,并將時間常數送入定時器中。由于只有定時器中斷,IP便不必設置。
c.設計中斷服務程序和主程序
     中斷服務程序除了要完成計數減一工作外,還要將時間常數重新送入定時器中,為下一次中斷做準備。
3              程序下載調試
4              附注:定時器常用方式1和方式2(在實驗五  單片機串口的應用中用到),方式2 為自動重裝計數初值的8位定時器,主要用于串行通信中波特率的產生和短時精確定時(因為不必軟件重裝初值所以更精確)。
5   附注實驗例程:
#include

#define unchar unsigned char
#define unint unsigned int

sbit fangbo = P1^0;

void main()
{
              TMOD = 0x01;                            //定時器0工作方式1
              TH0 = 0x3c;
              TL0 = 0xb0;                                                        //裝入定時器初值定時50ms
              ET0 = 1;                                          //定時器0中斷允許
              EA = 1;                                          //總中斷允許
              TR0 = 1;                                          //定時器0開始計時
              while(1);                                          //等待
}

void time0() interrupt 1                                            //定時器0中斷服務函數
{
              TH0 = 0x3c;
              TL0 = 0xb0;                                                                                                    //重裝計數器值
              fangbo=~fangbo;                                                                        //P1.0取反,產生方波
}
對應匯編代碼:
                                          FANGBO                            EQU                            P1.0

                                          ORG                                          0000H
                                          LJMP                                          MAIN
                                          ORG                                          000BH
                                          LJMP                                          TIME

                                          ORG                                          0010H
MAIN:                            MOV                                          TMOD,#01H
                                          MOV                                          TH0,#03CH
                                          MOV                                          TL0,#0B0H
                                          SETB                                          ET0
                                          SETB                                          EA
                                          SETB                                          TR0
                                          SJMP                                          $                                          ;等待

TIME:                            MOV                                          TH0,#03CH
                                          MOV                                          TL0,#0B0H
                                          CPL                                                        FANGBO
                                          RETI

                                          END
查詢方式C代碼:
#include

#define unchar unsigned char
#define unint unsigned int

sbit fangbo = P1^0;

void main()
{
              TMOD = 0x01;                            //定時器0工作方式1
              TH0 = 0x3c;
              TL0 = 0xb0;                                                        //裝入定時器初值定時50ms
              ET0 = 1;                                          //定時器0中斷允許
              EA =0;                                                        //總中斷允許
              TR0 = 1;                                          //定時器0開始計時
              while(1)                               //死循環
              {
                            while(!TF0);              //查詢中斷標志并等待
                            TF0 = 0;                            //清除標志
                            TH0 = 0x3c;
                            TL0 = 0xb0;                            //重裝初值
                            fangbo=~fangbo;                                                                        //P1.0取反,產生方波
              }
}
對應匯編代碼:
                                          FANGBO                            EQU                            P1.0

                                          ORG                                          0000H
                                          LJMP                                          MAIN

                                          ORG                                          0010H
MAIN:                            MOV                                          TMOD,#01H
                                          MOV                                          TH0,#03CH
                                          MOV                                          TL0,#0B0H
                                          SETB                                          ET0
                                          SETB                                          TR0
TIME:                            JNB                                                        TF0,$
                                          MOV                                          TH0,#03CH
                                          MOV                                          TL0,#0B0H
                                          CLR                                                        TF0
                                          CPL                                                        FANGBO
                                          SJMP                                          TIME

                                          END
附實驗仿真電路:
2.003.jpg
注:實驗箱中有模擬示波器,可通過電腦觀察波形。




.             實驗四  外部中斷的應用一  實驗目的
通過此次實驗學習51單片機外部中斷的使用,并結合輸入輸出方式熟練掌握外部中斷的應用
二              實驗內容
采用按鍵以中斷方式控制一個LED燈的亮滅。
三              實驗器材
STC89C52RC 單片機、LED燈,獨立按鍵或實驗箱。
三              實驗步驟
  • Keil開發環境下建立一個工程。
  • 程序的編寫,采用中斷方式判斷鍵是否按下,并確定是否點亮二極管。
  • 程序下載調試(可先進行仿真)。
四              附注
中斷方式可以提高CPU的效率,當發生中斷事件時處理器可快速響應中斷,沒有中斷事件時處理器正常工作,不必時刻查詢中斷事件的發生與否,提高代碼效率。
本例中,若采用電平觸發方式,則Key為低電平時Led亮,否則Led息滅;若采用邊沿觸發方式,則Key的每個下降沿,即Key由高變為低時,Led的狀態改變一次。
五              實驗附注例程
#include

#define unchar unsigned char
#define unint unsigned int

sbit Led = P1^0;
sbit Key = P3^2;                            //外部中斷0引角

void main()
{
              IT0 = 0;  //外部中斷0采用電平觸發方式;邊沿觸發為1下降沿有效
              EA = 1;   //中斷允許
              EX0 = 1;  //開外部中斷0
              while(1);
}

void int0() interrupt 0
{
              Led = 0;                              //Led 亮
              while(Key == 0);  //等待鍵釋放
              Led = 1;                              // Led 滅
}
/*
void int0() interrupt 0                               //邊沿觸發方式中斷函數。每次Key下降沿改變Led狀態
{
              Led = ~Led;       //改變Led狀態
}
*/
對應匯編代碼:
                                          KEY                                          EQU                            P3.2
                                          LED                                                        EQU                            P1.0

                                          ORG                                          0000H
                                          LJMP                                          MAIN
                                          ORG                                          0003H
                                          LJMP                                          INIT

                                          ORG                                          0010
MAIN:                            CLR                                                        IT0                               ;電平觸發方式,邊沿觸發為SETB              IT0
                                          SETB                                          EA
                                          SETB                                          EX0
                                          SJMP                                          $
INIT:                            CLR                                                        LED
                                          JNB                                                        KEY,$
                                          SETB                                          LED
                                          RETI
;INIT:                            CPL                                                        LED                                          ;邊沿觸發方式中斷程序

                                          END
附實驗仿真電路:
2.004.jpg
附圖1
2.005.jpg
附圖2  P0口上拉電阻






.             實驗五  單片機串口的應用1   實驗目的
通過此次實驗學習單片機串口的應用,掌握串口相關寄存器的配置,并學會用串口做簡單的雙機通信。
2   實驗內容
通過串口實現雙機通信,用Key控制發光二極管。
3   實驗器材
STC89C52RC單片機、LED燈或實驗箱。
4   實驗步驟
  • Keil開發環境下建立一個工程。
  • 程序的編寫。
  • 程序下載調試(可先進行仿真)。
5   附注
51單片機串行口的SBUF有兩個:接收SBUF和發送SBUF,二者在物理結構上是獨立的,單片機用它們來接收和發送數據。串行通訊的波特率隨串行口工作方式選擇的不同而不同,它除了與系統的振蕩頻率f,電源控制寄存器PCON的SMOD位有關外,還與定時器T1的設置有關。
     1、在工作方式0時,波特率固定不變,僅與系統振蕩頻率有關,其大小為f/12。
     2、在工作方式2時,波特率也只固定為兩種情況:
        當SMOD=1時, 波特率=f/32
        當SMOD=0時, 波特率=f/64
     3、在工作方式1和3時,波特率是可變的:
        當SMOD=1時, 波特率=定時器T1的溢出率/16
        當SMOD=0時, 波特率=定時器T1的溢出率/32
        其中,定時器T1的溢出率=f/(12*(256-N)),N為T1的定時時間常數。
    在實際應用中,往往是給定通訊波特率,而后去確定時間常數。例如:f=6.144MHZ,波特率等于1200,SMOD=0時,則1200=6144000/(12*32*(256-N)),計算得N=F2H。
     本例程中設置串行口工作于方式1,SMOD=0,波特率為1200。
6    附注例程
中斷方式C代碼:
#include

#define unchar unsigned char
#define unint unsigned int

sbit Key = P1^1;
sbit Led = P1^0;

void uartsend(unchar dat);

void Uartsend(unchar k)                                                                        //串口發送子函數
{
              SBUF = k;                                                                         //發送數據
              while(!TI);                                                                         //待待發送結束
}                                                                                   

void main()
{
              unchar tmp;
              TMOD = 0x20;                            //定時器1工作方式2
              TH1 = 0xfa;
              TL1 = 0xfa;                                          //裝入定時器初值11.0592M晶振,波特率4800
              PCON = 0;                                          //波特率不倍增
              ET1 = 0;                                                        //定時器1中斷允許
              EA = 1;                                                        //總中斷允許
              ES = 1;                                                        //串口中斷允許
              TR1 = 1;                                                        //定時器0開始計時
              SCON = 0x50;                            //串口工作方工1,準備接收
              while(1)                                                        //死循環
              {
                            if(Key)                                          //判斷是否有鍵按下
                            {
                                          Uartsend(0xaa);                              //用串口發送0xaa
                                          while(Key);                                            //等待鍵釋放
                            }
                            else
                            {
                                          Uartsend(0x55);                                          
                                          while(!Key);
                            }
              }
}

void uart() interrupt 4
{
              unchar temp;
              if(RI)                                                                                    //判斷是否為接收中斷
              {
                            temp = SBUF;                                                          //讀數據
                            switch(temp)                                                          //判斷數據
                            {
                                          case 0x55:Led = 1;break;
                                          case 0xaa:Led = 0;break;
                                          default:break;
                            }
                            RI = 0;                                                                      //清除中斷標志
              }            
              TI = 0;                                                                                    //清除中斷標志                                                                     
}

對應匯編代碼:
                                          KEY                            EQU                            P1.1
                                          LED                                          EQU                            P1.0

                                          ORG                            0000H
                                          LJMP                            MAIN
                                          ORG                            0023H
                                          LJMP                            UART

                                          ORG                            0100H
MAIN:                            MOV                            TMOD,#020H
                                          MOV                            TH1,#0FAH
                                          MOV                            TL1,#0FAH
                                          MOV                            PCON,#00H
                                          CLR                                          ET1
                                          SETB                            EA
                                          SETB                            ES
                                          SETB                            TR1
                                          MOV                            SCON,#050H
KEYLED:              JNB                                          KEY,OFFL
                                          MOV                            SBUF,#0AAH
KEY0:                            JB                                          KEY,$
OFFL:                            MOV                            SBUF,#055H
KEY1:                            JNB                                          KEY,$
                                          SJMP                            KEYLED

UART:                            JNB                                          RI,RRET
                                          CLR                                          RI
                                          MOV                            R7,SBUF
                                          CJNE                            R7,#0AAH,OFFLED
                                          CLR                                          LED
                                          SJMP                            RRET
OFFLED:              SETB                            LED
RRET:                            CLR                                          TI
                                          RETI

                                          END
查詢方式C代碼:
#include

#define unchar unsigned char
#define unint unsigned int

sbit Key = P1^1;
sbit Led = P1^0;

void uartsend(unchar dat)                               //串口發送子函數
{
              SBUF = dat;                                                                         //發送數據
              while(!TI);                                                                         //待待發送結束
              TI = 0;                                                                                       //清除中斷標志
}

void uartrec()                                                                      //串口接收數據子函數
{
              unchar temp;
              if(RI)
              {
                            temp = SBUF;                              //讀數據
                            switch(temp)                              //判斷數據
                            {
                                          case 0x55:Led = 1;break;
                                          case 0xaa:Led = 0;break;
                                          default:break;
                            }
                            RI = 0;                                                                      //清除中斷標志
              }            
}                                                                                   

void main()
{
              TMOD = 0x20;                            //定時器1工作方式2
              TH1 = 0xfa;
              TL1 = 0xfa;                                          //裝入定時器初值11.0592M晶振,波特率4800
              PCON = 0;                                          //波特率不倍增
              ET1 = 0;                                          //定時器0中斷允許
              EA = 0;                                                        //總中斷關閉
              ES = 1;                                                        //串口中斷允許
              TR1 = 1;                                          //定時器0開始計時
              SCON = 0x50;                            //串口工作方工1,準備接收
              while(1)
              {
                            if(Key)                                                                         //判斷鍵是否按下
                            {
                                          uartsend(0xaa);
                                          while(Key)uartrec();                //等鍵釋放并接收數據
                            }
                            uartsend(0x55);
                            while(!Key)uartrec();
              }
}
對應匯編代碼:
                                          KEY                            EQU                            P1.1
                                          LED                                          EQU                            P1.0

                                          ORG                            0000H
                                          LJMP                            MAIN

                                          ORG                            0100H
MAIN:                            MOV                            TMOD,#020H
                                          MOV                            TH1,#0FAH
                                          MOV                            TL1,#0FAH
                                          MOV                            PCON,#00H
                                          CLR                                          ET1
                                          CLR                                          EA
                                          SETB                            ES
                                          SETB                            TR1
                                          MOV                            SCON,#050H
KEYLED:              JNB                                          KEY,OFFL
                                          MOV                            SBUF,#0AAH
                                          JNB                                          TI,$
                                          CLR                                          TI
                                          SJMP                            KEY1
OFFL:                            MOV                            SBUF,#055H
                                          JNB                                          TI,$
                                          CLR                                          TI
KEY0:                            JB                                          KEY,KEYLED
                                          LCALL                            UARTRI
                                          SJMP                            KEY0
KEY1:                            JNB                                          KEY,OFFL
                                          LCALL                            UARTRI
                                          SJMP                            KEY1
UARTRI:                            JNB                                          RI,RETT
                                          CLR                                          RI
                                          MOV                            R7,SBUF
                                          CJNE                            R7,#0AAH,OFFLED
                                          CLR                                          LED
RETT:                            RET
OFFLED:              SETB                            LED
                                          SJMP                            RETT
                                          END
附實驗仿真電路:
2.006.jpg                            
注:MCU1的TX接MCU2的RX,MCU1的RX接MCU2的TX。



回復

使用道具 舉報

ID:63317 發表于 2016-5-17 12:08 | 顯示全部樓層
謝謝分享資料
回復

使用道具 舉報

ID:121636 發表于 2016-5-18 10:09 | 顯示全部樓層
按鍵控制LED燈的亮滅,我們可以采用外部中斷的方式(實驗四會講),獨立按鍵的接法希望大家注意,直接接地,在沒有按鍵的情況下IO口為高電平(注:因為本實驗中按鍵接P1口,內部集成上拉電阻。若使用P0口作為通用IO口使用時必須外接500Ω左右的上拉電阻。見實驗四附圖2),當有按鍵按下時IO口為低電平。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品在线观看 | 美女久久 | 欧美精品99| 中文字幕国产视频 | 久久精品国产99国产 | 色婷婷av久久久久久久 | 性色在线 | 国产午夜精品视频 | 欧美成人专区 | 午夜丁香视频在线观看 | 欧美日韩三区 | 色综合天天天天做夜夜夜夜做 | 国产成人久久精品 | 91精品久久久久久综合五月天 | 午夜影院在线观看视频 | 日韩欧美亚洲 | 欧美成人精品欧美一级 | 一区二区免费 | 91一区二区| 精区3d动漫一品二品精区 | 欧美一级黄色免费 | 国产精品揄拍一区二区久久国内亚洲精 | 久久久一区二区三区 | 亚洲精品一区二区网址 | 国产精品免费观看 | 亚洲狠狠 | 日日久 | av高清毛片| 亚州激情| 成人午夜电影在线观看 | 日操夜操 | 精品毛片在线观看 | 日本精品一区二区三区在线观看 | 黄色毛片在线看 | 国产一区二区自拍 | 国产精品69av | 一级a爱片性色毛片免费 | 国产精品日韩一区二区 | 亚洲人成网亚洲欧洲无码 | 亚洲欧美激情精品一区二区 | 国产女人精品视频 |