单片机实验报告-片内外RAM的数据转移

一、实验目的:

1.掌握C51编程基础,C51程序结构。

2.掌握C51数据类型、函数设计。

3.掌握C51程序的编辑、编译、调试和运行

 

二、编程提示 

  1. 编程将片外8000H单元开始的10字节的内容移至8100H开始的各单元中。8000H单元开始的10字节内容用编程方式赋值。
  2. 编程将片内50H单元开始10字节的内容初始化为0~9,然后移至55H开始的各单元中。
  3. 在片外RAM的2000~200FH中查找零,把零的个数放在2010H中。
  4. Number单元是字数据单元,将其拆分成十进制数, 存入 Result 数组。Number单元地址为片内0x30。三、流程图

  单片机实验报告-片内外RAM的数据转移_第1张图片             单片机实验报告-片内外RAM的数据转移_第2张图片

实验内容1程序流程                                     实验内容3程序流程

    

 

      四、每小题代码及流程图

  1. 编程将片外8000H单元开始的10字节的内容移至8100H开始的各单元中。8000H单元开始的10字节内容用编程方式赋值

代码:

#include

#include

#define uchar unsigned char

void main(void)

{

 uchar xdata *xdp1;

 uchar xdata *xdp2;

 uchar data i;

 xdp1=0x8000;

 xdp2=0x8100;

 for(i=0;i<=9;i++)

 {

   *(xdp1+i)=10+i;

 }

 for(i=0;i<=9;i++)

 {

   *(xdp2+i)=*(xdp1+i);

 }

}

#include

#define uchar unsigned char

xdata uchar rom8000[10] _at_ 0x8000;

xdata uchar rom8100[10] _at_ 0x8100;

void main(void)

{

 uchar data i;

 for(i=0;i<=9;i++)

 {

   rom8000[i]=i;

 }

 for(i=0;i<=9;i++)

 {rom8100[i]=rom8000[i]; }}

结果:

单片机实验报告-片内外RAM的数据转移_第3张图片

分析:

1.用for循环给片外8000H赋值,值从0A开始,

2.再把8000H的值传给8100H

 

2、编程将片内50H单元开始10字节的内容初始化为0~9,然后移至55H开始的各单元中。

代码:

#include

#include

#define uchar unsigned char

void main(void)

{

 uchar data *dp1;

 uchar data *dp2;

 uchar data i;

 dp1=0x50;

 dp2=0x5e;

 for(i=0;i<=9;i++)

 {

   *(dp1+i)=i;

 }

 for(i=0;i<10;i++)

 {

   *(dp2-i)=*(dp1-i+9);

 }

}

结果:

 

单片机实验报告-片内外RAM的数据转移_第4张图片

分析:

1.用for循环给片内50H开始赋值,值开始为0,赋值10个数一直到59H单元

2.用59H开始将其单元的内容值赋给5e结束的单元,最后变为55-5E单元的内容分别为50-59H单元的内容

 

3、在片外RAM的2000~200FH中查找零,把零的个数放在2010H中

代码:

#include

#include

#define uchar unsigned char

void main(void)

{

 uchar xdata *xdp1;

 uchar xdata *xdp2;

 uchar data i;

 xdp1=0x2000;

 xdp2=0x2010;

 *xdp2=0x00;

 for(i=0;i<16;i++)

 {

   if(i%2==0)

   *(xdp1+i)=0;

   else  

   *(xdp1+i)=i;

 }

  for(i=0;i<16;i++)

  {

     if(*(xdp1+i)==0)  

 *xdp2=*xdp2+1;

  }

}

#include

#define uchar unsigned char

xdata uchar rom2000[16] _at_ 0x2000;

xdata uchar rom2010 _at_ 0x2010;

void main(void)

{

 uchar data i;

rom2010=0;

 for(i=0;i<16;i++)

 {

   if(i%2==0)

   rom2000[i]=0;

   else  

   rom2000[i]=i;

 }

  for(i=0;i<16;i++)

  {

     if(rom2000[i]==0)  

 rom2010=rom2010+1;  }}

结果:

 

单片机实验报告-片内外RAM的数据转移_第5张图片

分析:

  1. 用i是否整除2判断存到片外2000H-200F内存单元,能整出为0,不能整除为i
  2. 最后统计为8个0

4、Number单元是字数据单元,将其拆分成十进制数, 存入 Result 数组。Number单元地址为片内0x30

代码:

#include

#include

#define uint unsigned int

#define uchar unsigned char

void main(void)

{uint data  *Number;

 uchar data   Result[2],c[5];

 uchar data i,j;

 Number=0x30;

 *Number=23456;

 c[0]=*Number/100000;

 c[1]=*Number%100000/10000;

 c[2]=*Number%10000/1000;

 c[3]=*Number%1000/100;

 c[4]=*Number%100/10;

 c[5]=*Number%10;

 for(i=0,j=0;i<5,j<3;i=i+2,j++)

 {Result[j]=c[i]*(0x10)+c[i+1];}}

#include

#include

#define uint unsigned int

#define uchar unsigned char

data uint number _at_ 0x30;

data uchar result[2] _at_ 0x40;

void main(void)

{

 uchar data  c[5];

 uchar data i,j;

 number=23456;

 c[0]=number/100000;

 c[1]=number%100000/10000;

 c[2]=number%10000/1000;

 c[3]=number%1000/100;

 c[4]=number%100/10;

 c[5]=number%10;

 for(i=0,j=0;i<5,j<3;i=i+2,j++)

 {

  result[j]=c[i]*(0x10)+c[i+1];

 }

}

结果:

 

单片机实验报告-片内外RAM的数据转移_第6张图片

分析:

  1. 在Number单元是字数据单元存的内容为23456,十六制为5BA0H
  2. 变化之后为00,02,03,04,05,06
  3. 两个数存到Result 数组的一个内存单元,最后值为02,34,56
  4. 存储类型默认为AUTO,存储模式为small模式,存储器类型为data,则Number单元、Result 单元分配之后,会出现覆盖情况

你可能感兴趣的:(文档)