一、实验目的:
1.掌握C51编程基础,C51程序结构。
2.掌握C51数据类型、函数设计。
3.掌握C51程序的编辑、编译、调试和运行
二、编程提示
- 编程将片外8000H单元开始的10字节的内容移至8100H开始的各单元中。8000H单元开始的10字节内容用编程方式赋值。
- 编程将片内50H单元开始10字节的内容初始化为0~9,然后移至55H开始的各单元中。
- 在片外RAM的2000~200FH中查找零,把零的个数放在2010H中。
- Number单元是字数据单元,将其拆分成十进制数, 存入 Result 数组。Number单元地址为片内0x30。三、流程图
实验内容1程序流程 实验内容3程序流程
四、每小题代码及流程图
- 编程将片外8000H单元开始的10字节的内容移至8100H开始的各单元中。8000H单元开始的10字节内容用编程方式赋值
代码:
#include<absacc.h>
#include<reg51.h>
#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<reg51.h>
#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]; }}
结果:
分析:
1.用for循环给片外8000H赋值,值从0A开始,
2.再把8000H的值传给8100H
2、编程将片内50H单元开始10字节的内容初始化为0~9,然后移至55H开始的各单元中。
代码:
#include<absacc.h>
#include<reg51.h>
#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);
}
}
结果:
分析:
1.用for循环给片内50H开始赋值,值开始为0,赋值10个数一直到59H单元
2.用59H开始将其单元的内容值赋给5e结束的单元,最后变为55-5E单元的内容分别为50-59H单元的内容
3、在片外RAM的2000~200FH中查找零,把零的个数放在2010H中
代码:
#include<absacc.h>
#include<reg51.h>
#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<reg51.h>
#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; }}
结果:
分析:
- 用i是否整除2判断存到片外2000H-200F内存单元,能整出为0,不能整除为i
- 最后统计为8个0
4、Number单元是字数据单元,将其拆分成十进制数, 存入 Result 数组。Number单元地址为片内0x30
代码:
#include<absacc.h>
#include<reg51.h>
#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<absacc.h>
#include<reg51.h>
#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];
}
}
结果:
分析:
- 在Number单元是字数据单元存的内容为23456,十六制为5BA0H
- 变化之后为00,02,03,04,05,06
- 两个数存到Result 数组的一个内存单元,最后值为02,34,56
- 存储类型默认为AUTO,存储模式为small模式,存储器类型为data,则Number单元、Result 单元分配之后,会出现覆盖情况