原创 单片机实验

原创说明:此随笔为单片机(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);
}

实验结果:

                                                                                                                           欢迎一起讨论!!!

                                    

 

posted @ 2016-05-19 13:19  我很低调  阅读(3662)  评论(0编辑  收藏  举报