原创 单片机实验

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

实验结果:

                                                                                                                           欢迎一起讨论!!!

                                    

时间: 2024-11-05 20:42:05

原创 单片机实验的相关文章

单片机实验的小记录~~PWM

一.源程序: #include#define uchar unsigned char#define uint unsigned intuchar T_H_N = 50;uchar T_H_N0 = 50;uchar T_N = 100;uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67}; //定义引脚sbit IN1 = P3^5;sbit IN2 = P3^4;sbit ENA = P3^3;sbit K1 = P

【单片机实验】串口通信实验

实验三:串口通信实验 内容: (1)利用电脑串口与实验台串口进行连接: (2)根据帧格式定义.波特率定义,编程配置串口,并编写控制程序: (3)实现从电脑上输入控制字符,由单片机通过串口接收,并控制LED显示的功能: (4)对所编程序进行调试及验证. 要求: (1)掌握波特率的概念.学会编程设置波特率和工作方式: (2)掌握串口通信的编程控制方法: (3)理解解MAX232串口通信的硬件电路结构. 注意实验三,需要同学们自己编写程序,实现从电脑串口助手(利用单片机下载软件提供的串口调试助手),发

[原创]单片机 HexToStr and HexToBcd BcdToStr

网上的很多例子都是不好用的 我这个是我验证过的,大家可以放心用啊 1 //------------------------------------------ 2 //适合于9999以下的数据转换 3 // 9999 -> 0x270F Max 4 // 5 unsigned int uHex2Bcd_SubFunction(uint16_t sbcd_data) 6 { 7 if ((sbcd_data&0x0f)>9) 8 { 9 sbcd_data=sbcd_data+6; 10

单片机入门指南系列(七) 准备实验板——萝卜青菜,各有所爱

本文由PurpleSword(jzj1993)原创,转载请注明.原文网址 http://blog.csdn.net/jzj1993 单片机的学习,最重要的一点就是多实践.站在岸上学不会游泳.没有实践,恐怕永远也学不好单片机.我将和大家一起,选择一款适合自己的单片机实验板. 我们主要有三个可选方案: 1.自己动手搭建学习板: 2.购买成品开发板: 3.使用Proteus等仿真软件. 方案一非常适合动手能力较强,想锻炼动手能力,时间比较充裕的读者选用.自己动手搭建电路,能让我们对单片机更加了解,充分

单片机入门指南系列(八) 用面包板搭建实验电路

本文由PurpleSword(jzj1993)原创,转载请注明.原文网址 http://blog.csdn.net/jzj1993 前面介绍了几种准备实验板的方案.这里先介绍方案一,我将同大家一起搭建一块简易的单片机实验板,一起感受动手实践的乐趣. 我们有两种自己搭建实验板的方案,一是用面包板,二是用万用焊板.本篇我们介绍面包板搭建电路. 面包板是一种用于电路实验的器材,上面有很多孔,我们可以将元器件和导线插进去,组成我们需要的电路.如果发现电路有错,拔下元件和导线重新插接即可.电路做完后,所有

第五篇:本人多年来积累的单片机程序 资料下载(绝对干货,内附下载链接)

首先打个广告:如果需要做毕设以及嵌入式项目合作,欢迎进入我们工作室:创想嵌入式设计工作室 本人搜集的大量单片机源码资料及毕业设计资料,足有1200+套,很多实用的demo源码和毕业设计参考方案,可用于做项目时借鉴,博尾附有下载链接.(内附本人联系方式,可一起交流探讨,交朋友) 为了方便 查找,我已将项目源码的目录整理出来了,方便 采用"ctrl +F"快速查找验证是否有需要的demo.可以一键打包下载,也可只下载需要的demo. 下载链接内附本人联系方式,如果在安装过程中遇到问题,可以

学习单片机的八大步骤

学习使用单片机就是理解单片机硬件结构,以及内部资源的应用,在汇编或C语言中学会各种功能的初始化设置,以及实现各种功能的程序编制. 第一步:数字I/O的使用 使用按钮输入信号,发光二极管显示输出电平,就可以学习引脚的数字I/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,例如,必须设置很多寄存器对引脚进行初始化处理,才能使引脚具备有数字输入和输出输出功能.每使用单片机的一个功能,就要对控制该功能的寄存器进行设置,这就是单片机

学习单片机的步骤

学习使用单片机就是理解单片机硬件结构,以及内部资源的应用,在汇编或C语言中学会各种功能的初始化设置,以及实现各种功能的程序编制. 第一步:数字I/O的使用 使用按钮输入信号,发光二极管显示输出电平,就可以学习引脚的数字I/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,例如,必须设置很多寄存器对引脚进行初始化处理,才能使引脚具备有数字输入和输出输出功能.每使用单片机的一个功能,就要对控制该功能的寄存器进行设置,这就是单片机

51单片机定时器中断函数中变量初始化的问题

前几天在进行单片机实验时,目的是用定时器0写一个流水灯的程序,代码如下,编译没有问题,但就是灯不亮,检查了好几次始终找不到问题,现在找到了,分享一下 #include<reg51.h>//调用头文件 #define uint unsigned int //宏定义 #define uchar unsigned char #define long_time 10 //定时时间,每次50ms uint n=0; //查表变量 uchar temp[]={0xfe,0xfd,0xfb,0xf7,0xe