原創 單片機實驗


原創說明:此隨筆為單片機(AT89C51、AT89C52)實驗

  前三個實驗類型為匯編編程,難度較大,重在思路和細節的把握。

  后四個實驗為動手較強的單片機實驗,編程相對簡單。

考查點:

  1.對單片機匯編基本編程把握

  2.單片機的中斷,包括外部中斷、定時計數、串口通信

  3.對單片機的結構、工作原理,各個端口的特點使用把握

  4.會使用proteus仿真軟件的使用,以及與keil的聯調使用


單片機實驗(一)

一、實驗題目: 試編寫一段程序,其功能為將21H單元的內容8位分別依次存放到從22H開始的8單元中。 (21H)0→(22H),(21H)1→(23H)...

二、實驗目的:

  1、掌握Keil軟件的使用方法。

  2、掌握51單片機匯編語言程序設計的方法。

三、實驗要求:

    1、獨立完成實驗內容。

    2、掌握在Keil中調試程序的方法。

    3、掌握在Keil中建立存儲器窗口的方法(C、D、X)

  四、實驗代碼

    

 1 org 0000h
 2     ljmp start
 3     org 0100h
 4 start:
 5     mov 21h,#0xff
 6     mov r7,#0
 7     mov r1,#22h
 8     mov a,21h
 9 loop:
10     rrc a
11     jc k0
12     mov @r1,#0
13     jmp k1
14 k0:
15     mov @r1,#1
16 k1:
17     inc r1
18     inc r7
19     cjne r7,#8,loop
20     jmp $
21 end

 

單片機實驗 (二)

一、實驗題目: 若0-5號鍵的鍵值分別是:EEH、DEH、BEH、7EH、EDH、DDH。設鍵值存放在內部RAM 20H單元中,編程實現根據2OH中的鍵值分別使程序轉移到PR0-PR4程序段。要求當以上程序段的功能完成后,都采用RET指令,指定返回到程序的初始入口START標號處。

要求:PR0 :教材75頁習題7 PR1 :同上 習題9題 PR2:同上 習題10 其余入口,只需完成空操作就返回。

二、實驗目的

1、掌握散轉的編程方法。

2、掌握指定放回的編程方法。

三、實驗要求:

1、獨立完成實驗內容。

2、掌握在Keil中調試程序的方法。

3、掌握在Keil中建立存儲器窗口的方法(C、D、X)

提示:

1 ORG 0000H
2 LJMP START
3 ORG 0100H
4 START:
5 PR0:
6 PR1:
7 PR2:
8 PR3:
9 NOP 
10 PR4:
11 NOP
12 PR5:
13 NOP
14 ORG 0E00H
15 TAB DB PR0,PR1,PR2,PR3,PR4,PR5

 

四、實驗代碼

  1 org 0000h
  2     ljmp start
  3     org 0100h
  4 start:
  5     mov 20h,#0xbe
  6       mov dptr,#key_vaule
  7     mov a,#0
  8 loop:
  9       push acc
 10       movc a,@a+dptr
 11       cjne a,20h,agan
 12       pop acc
 13 
 14       mov dptr,#func
 15     rl a
 16       jmp @a+dptr
 17 agan:
 18       pop acc
 19       inc acc
 20       cjne a,#6,loop
 21       sjmp $
 22 func: 
 23     ajmp PR0
 24     ajmp PR1
 25     ajmp PR2
 26     ajmp PR3
 27     ajmp PR4
 28     ajmp PR5
 29 
 30 SJMP $    
 31 
 32 PR0: 
 33         mov 30h,#44h
 34         mov 3fh,#0f1h
 35         mov r0,#30h
 36         mov r1,#50h
 37     loop0:          
 38         mov a,@r0
 39         jnb acc.7,not_z
 40         inc r5         //負數
 41         mov @r1,a
 42         inc r1
 43     continue:    
 44         inc r0
 45         cjne r0,#40h,loop0
 46     not_z:
 47         cjne a,#00,not_roze
 48         inc r6
 49         jmp continue
 50     not_roze:             //正數
 51         inc r4
 52         mov 60h,r0
 53         push acc
 54         mov a,#50h
 55         add a,r4
 56         dec a
 57         mov r0,a
 58         pop acc
 59         mov @r0,a
 60         mov r0,60h
 61         sjmp  loop0
 62  
 63     ret
 64 PR1:
 65     mov 40h,#0f3h
 66     mov 41h,#34h
 67     mov 42h,#45h
 68     mov 43h,#56h
 69 
 70     mov r1,#44h
 71     mov r0,#40h    
 72     mov a,@r0
 73     cpl a
 74     addc a,1
 75     mov @r1,a
 76     inc r1
 77     inc r0
 78 loop1:
 79     mov a,@r0
 80     cpl a
 81     addc a,#0
 82     mov @r1,a
 83     inc r0      
 84     inc r1
 85     cjne r0,#44h,loop1
 86     ret
 87 PR2:
 88     mov a,#0xff
 89     mov r0,#0
 90     mov P2,#0
 91     mov b,#16
 92     mov r2,#16     //i
 93     mov r1,#buf1
 94     movx @r1,a
 95     clr c
 96 loop2:
 97     clr c
 98     movx a,@r1
 99     add a,r0
100     mov r0,a
101     inc r1
102     dec r2
103     cjne r2,#0,loop2  
104     
105     div ab
106     mov r0,#buf2
107     movx @r0,a
108     mov r0,#buf
109     mov a,b
110     movx @r0,a
111     ret
112 PR3:
113     NOP  
114     ret 
115 PR4:
116     NOP  
117     ret 
118 PR5:
119     NOP  
120     ret 
121 ORG 0E00H
122 buf1 equ 200
123 buf2 equ 123
124 buf equ 220
125 key_vaule: db 0xee,0xde,0xbe,0x7e,0xed,0xdd      
126  end

 

單片機實驗 (三)

一、實驗題目: 使用C語言完成,實驗一,實驗二

二、實驗目的

1.掌握Keil C使用方法

三、實驗要求:

1、獨立完成實驗內容。

2、掌握無仿真器,程序調試的方法。

 

四、實驗代碼

  1 #pragma small
  2 
  3 #include<reg52.h>
  4 #define uchar unsigned char
  5 
  6 void main()
  7 {
  8     char *p=0x21;
  9     char *q=0x29;
 10     uchar i;
 11     *p=0xfe;
 12     for(i=0;i<8;i++)
 13     {
 14          
 15          *(q--)=*p>>i&0x01;
 16     }
 17 }
 18  
 19 
 20 #include<reg52.h>
 21 #include<math.h>
 22 #include<stdio.h>
 23 #define uchar unsigned char
 24 #define uint unsigned int
 25 #define buf1 0x80
 26 #define buf2 0x90
 27 #define buf 0x72
 28 #define data1 0x30
 29 uchar key_value[6]={0xee,0xde,0xbe,0x7e,0xed,0xdd};
 30 void pr0()
 31 {
 32     uchar i=0,r4=0,r5=0,r6=0;
 33         char table[16]={1,2,3,4,5,6,0,0,-1,-2,-3,-4,-5,-6,-7,-8},*pz=0x40,*pf=0x50;
 34     
 35     for(i=0;i<16;i++)
 36     {
 37         if(table[i]>0)
 38         {
 39             r4++;
 40             *(pz++)=table[i];
 41         }            
 42         else 
 43         {
 44             if(table[i]==0) r5++;
 45             else 
 46             {
 47                 r6++;
 48                 *(pf++)=table[i];
 49             }
 50         }
 51     }
 52 }
 53 void pr1()
 54 {
 55     char data *p = data1;
 56     uchar i,cy=0;
 57     *(p+3)=0x0f4;
 58     if((*(p+3)&0x80)!=0)
 59     {
 60         for(i=0;i<4;i++,p++)
 61         {
 62             *p=~*p;
 63         }
 64         p=data1;
 65         if(0x0ff==*p) 
 66         {
 67             cy++;
 68             *p=0;
 69         }
 70         else (*p)++;
 71         for(i=1,p++;i<3;i++,p++)
 72         {
 73             if(*p==0x0ff&&cy==1)
 74             {
 75                 cy=1;
 76                 *p=0;
 77             }
 78             else if(cy==1)
 79             {
 80                 (*p)++;
 81                 cy=0;
 82             }
 83             
 84         }
 85     }
 86 }
 87 
 88 void pr2()
 89 {
 90     uchar i;
 91     uint sum=0;
 92     data char xdata *p=buf1;
 93     data char data *q;
 94     for(i=0;i<16;i++)
 95     {
 96         sum +=*(p++);
 97     }
 98     q=buf2;
 99     *q=sum/16;
100     q=buf;
101     *q=sum%16;
102 
103 }
104 
105 void pr3()
106 {
107 }
108 void pr4()
109 {
110 }
111 void pr5()
112 {
113 }
114 
115 void main()
116 {
117      char *key=0x20;
118      uchar i; 
119      *key=0xde;
120      for(i=0;i<6;i++)
121     {
122         if(*key==key_value[i]) break;
123     }
124       switch(0)
125         {
126             case 0:pr0();
127             case 1:pr1();
128             case 2:pr2();
129             case 3:pr3();
130             case 4:pr4();
131             case 5:pr5();
132             default:break;
133         }
134 }

 

單片機實驗 (四)

一、實驗題目

當K1鍵按下后,首先使蜂鳴器響一聲,然后使LED1- LED8完成3種閃亮的花樣(自己定義),每一種花樣循環 3次,然后周而復始。

二、實驗目的

1.掌握51單片機I/O口的使用方法。

2.掌握基本單片機輸入/輸出程序的設計。

三、實驗要求:

1、獨立完成實驗內容。

2、掌握ISP下載。

3、掌握無仿真器,程序調試的方法。

4、提供實驗報告(電子檔)

5、實驗報告中提供實驗電路圖

四、實驗代碼及圖 

 1 #include<reg52.h>
 2 #define uchar unsigned char 
 3 uchar table[3]={0x44,0x55,0xcc};
 4 uchar flag=0;
 5 sbit P3_2=P3^2;                                              
 6 
 7 void delay(int z)
 8 {
 9     uchar i=250;
10     while(z--)
11     {
12         i=250;
13         while(i--);
14     }
15 }
16 void INT0_proc() interrupt 0
17 {
18      flag=!flag;
19 }
20 void main()
21 {
22     uchar i;
23     P2=0XFF;
24     P3_2=1;
25     EA=1;                                                    
26     IT0=1;
27     EX0=1;
28     while(1)
29     {
30         if(flag==1)
31         {
32                 for(i=0;i<3;i++)
33                 {
34                     P1=table[i];
35                     delay(500);
36                 }
37         }
38     }
39 }

 

 

單片機實驗 (五)

一、實驗目的:

1、掌握51單片機中斷控制器的使用方法

2、掌握51單片機控制動態LED顯示器的方法

二、實驗設備

1、硬件:PC 單片機實驗箱

2、軟件:Kiel uVision4

三、實驗內容

 程序啟動后4位LED顯示器滾動顯示“-”,每按下1次K1鍵后,首先使蜂鳴器響一聲。然后,依次使LED滾動顯示CNT的計數值(0-9)。

四、實驗要求

1、按鍵K1采用中斷來管理。(INT0采用邊沿觸發)

2、中斷服務程序完成四個功能:

1)消除按鍵K1抖動。

2)CNT計數。

3)查表將計數值轉換成LED顯示器的段代碼。

4)將段代碼分別放入4個顯示緩沖單元。

3、掌握無仿真器,程序調試的方法

4、實驗報告中提供實驗電路圖

5、闡述實驗原理

五、實驗代碼及電路圖

  

 1 #include<reg52.h>
 2 #define uchar unsigned char
 3 uchar code wei[4]={0x11,0x12,0x14,0x18};
 4 uchar code num[11]= {0xbf,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
 5 sbit    P3_2=P3^2;
 6 uchar count=0,temp=0,flag=0;
 7 
 8 void delay(uchar i)
 9 {
10     uchar j;
11     while(i--)
12     {
13         for(j=0;j<100;j++);
14     }
15 }
16 void int0_pro() interrupt 0
17 {
18     count++;
19     flag=1;
20 }
21 void display(){
22     uchar i=0;
23     if(flag)temp=count%10+1;
24     else temp=count%10;
25     for(i=0;i<4;i++)
26     {
27         P1=num[temp];
28         P2=wei[i];
29         delay(500);
30     }
31 }
32 void init()
33 {
34     P1=0xff;
35     P2=0x00;
36     P3_2=1;
37     EX0=1;
38     IT0=1;
39     EA=1;
40 }
41 void main()
42 {
43     init();
44     while(1)
45     {
46         display();
47     }
48 }

 

單片機實驗 (六)

一、實驗目的:

1、掌握51單片機中斷控制器的使用方法

2、掌握51單片機控制動態LED顯示器的方法

二、實驗設備

1、硬件:PC 單片機實驗箱

2、軟件:Kiel uVision4

三、實驗內容 兩個數碼管,K1,K2兩個按鍵,完成K1啟動計數,K2暫停計數,每一秒鍾數碼管增加1,60秒鍾后,數碼管回歸0,重新計數。

四、實驗要求

1、按鍵K1,K2采用中斷來管理。(INT0采用邊沿觸發)

2、中斷服務程序完成四個功能:

1)消除按鍵K1抖動。

2)CNT計數。

3)查表將計數值轉換成LED顯示器的段代碼。

4)將段代碼分別放入4個顯示緩沖單元。

3、掌握無仿真器,程序調試的方法。

4、提供實驗報告(電子檔)

5、實驗報告中提供實驗電路圖

6、闡述實驗原理

五、實驗代碼及電路圖

  

#include<reg52.h>
#define uchar unsigned char 
uchar num[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit k1=P3^2;
sbit k2=P3^3;
sbit wei0=P3^0;
sbit wei1=P3^1;    
uchar count=0;
uchar t=0;

void delay(int z)
{
    uchar i=250;
    while(z--)
    {
        i=250;
        while(i--);
    }
}
void display()
{
    count=count%61;
    P2=num[count/10];
    wei0=1;
    wei1=0;
    wei0=0;
    P2=num[count%10];
    wei0=0;
    wei1=1;
    wei1=0;
}
void INT0_proc() interrupt 0
{
    delay(10);
    if(k1==0)
    {
        TR0=1;
    }
}
void INT1_proc() interrupt 2
{    
    delay(10);
    if(k2==0)
    {

        TR0=0;
    }
}
void T0_pro() interrupt 1
{
    TH0=0X3C;
    TL0=0XB0;
    if(t==20)
    {
        count++;
        t=0;
    }
    t++;
}
void init()
{
    P3=0x0C;
    P2=0xff;
    IT0=1;
    EX0=1;
    IT1=1;
    EX1=1;
    ET0=1;
    TMOD=0X01;    
    TH0=0X3C;
    TL0=0XB0;
    EA=1;
}
void main()
{
    init();
    while(1)
    {
        display();
    }
}

 

單片機實驗 (七)

一、實驗目的:

1、掌握51單片機串口的使用方法

2、掌握protues上串口與PC通信的方法

二、實驗設備

1、硬件:PC 單片機實驗箱

2、軟件:Kiel uVision4 串口助手 虛擬串口(VSPD)

三、實驗內容

  晶振12MHz,波特率1200,程序啟動后單片機主動發出Hello Server,PC使用串口助手應答單片機,單片機收到數據后,不做任何修改返回PC。

四、實驗要求

1、串口中斷來實現。

2、中斷服務程序完成四個功能:

1)轉發數據。

2)設置TI,RI。

3、掌握無仿真器,程序調試的方法。

4、提供實驗報告(電子檔)

5、實驗報告中提供實驗電路圖

6、闡述實驗原理

 五、實驗代碼及電路圖

#include<reg51.h>
#define uchar unsigned char
uchar code data1[]="Hello Server";
uchar count=0;
char a;
void S_proc() interrupt 4
{
    if(TI)
    {
        TI=0;
        if(count<12)
        {
            SBUF=data1[++count];
        }
    }
    else
    {
        RI=0;
        a=SBUF;
        SBUF=a;
        while(!TI);
        TI=0;
    }

}
void main()
{        
    SCON=0X50;
    TMOD=0X20;
    TH1=TL1=230;
    EA=1;
    TR1=1;
    SBUF=data1[count];
    ES=1;    
    while(1);
}

實驗結果:

                                                                                                                           歡迎一起討論!!!

                                    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM