本文最后更新于 <span id="expire-date"></span> 天前,文中部分描述可能已经过时。

说来惭愧,大学三年来第一次靠自己完成的实验,刚开始做实验也没动脑,直接开始搜索,不过只搜到了汇编版,没办法只能自己试着做一下了,结果没想到自己做了出来。

正好也写一写,方便后人

注意:不保证对,但是通过实验足以

实验一 简单程序设计实验

1、置数程序

把2000H~20FFH的内容全部置成55H。

xdata unsigned char buffer[256] _at_ 0x2000;
void main(void)
{
unsigned char i;
for(i=0;i<256;i++)
{
buffer[i]=85;
}
}

运行结果:

2、拆字程序

把2000H的内容拆开,高位送2001H低位,低位送2002H低位,2001H、2002H高位清零,一般本程序用于把数据送显示缓冲区时用。

unsigned char x=0x34;
xdata unsigned char buffer[2] _at_ 0x2000;
void main(void)
{
unsigned char high=(x-x%0x10)/0x10;
unsigned char low=x%0x10;
buffer[0]=x;
buffer[1]=high;
buffer[2]=low;
}

运行结果:

3、内部、外部RAM数据传送程序

(1) 内部RAM之间数据传送;

将内部RAM 40H ~ 4FH单元内容传送到内部RAM 60H ~ 6FH单元中。

unsigned char a=0x00;
data unsigned char buffer[16] _at_ 0x40;
data unsigned char buffer1[16] _at_ 0x60;
void main(void)
{
unsigned char i;
for(i=0;i<16;i++)
{
buffer[i]=a;
buffer1[i]=buffer[i];
a++;
}
}

运行结果

(2) 内外RAM之间数据传送;

将内部RAM 40H ~ 4FH单元内容传送到外部RAM 2040H ~ 204FH单元中。

unsigned char a=0x00;
data unsigned char buffer[16] _at_ 0x40;
xdata unsigned char buffer1[16] _at_ 0x2040;
void main(void)
{
unsigned char i;
for(i=0;i<16;i++)
{
buffer[i]=a;
buffer1[i]=buffer[i];
a++;
}
}

运行结果:

(3) 外RAM之间数据传送;

将外部RAM 1000H ~ 1011H单元内容传送到外部RAM 2000H ~ 2011H单元中。

unsigned char a=0x00;
xdata unsigned char buffer[18] _at_ 0x1000;
xdata unsigned char buffer1[18] _at_ 0x2000;
void main(void)
{
unsigned char i;
for(i=0;i<18;i++)
{
buffer[i]=a;
buffer1[i]=buffer[i];
a++;
}
}

运行结果:

实验二 I/O口实验

P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。

(1)左移点亮1只发光二极管;

(2)右移点亮1只发光二极管;

(3)左移点亮2只相邻发光二极管;

(4)右移点亮2只相邻发光二极管。

(1)代码

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint i)
{
uchar t;
while (i--)
{
for(t=0;t<120;t++);
}
}

void main()
{
P1=0xfe;
while (1)
{
delay( 500 );
P1=_cror_(P1,1);
}
}

(4)代码

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint i)
{
uchar t;
while (i--)
{
for(t=0;t<120;t++);
}
}

void main()
{
P1=0xfc;
while (1)
{
delay( 500 );
P1=_crol_(P1,2);
}
}

其余两问修改对应位置的代码即可

Proteus如图连接

运行效果

单片机刷写

软件如图,下载:链接: https://pan.baidu.com/s/1A7LneFUHcOyQMqU5uTaEnQ 提取码: 2ey6

插上板子后如果电脑没识别出端口就把文件中的驱动装一装

识别没问题的话,选好对应单片机型号,【打开程序文件】中选择编译好的hex文件,刷入即可。

如果刷写卡住不动,可以开启/关闭板子上的电源试试

效果

另外根据板子的不同,需要修改代码,我的这块板子需要把P1修改为P2,LED才能正常亮灭。

实验三 定时器实验

编写程序,使定时器按一定间隔(500 ms~1s)对内部RAM某单元的内容加1,然后用8只发光二极管显示RAM单元中的二进制数值。

#include<reg51.h>
char i=100;
unsigned char b=0xff;
void main()
{
TMOD=0x01;
TH0=0xee;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
while(1);
{
;
}
}

void timer0() interrupt 1
{
TH0=0xee;
TL0=0x00;
i--;
if(i<=0)
{
P1=b;
b--;
i=100;
}
}

proteus连接同上,运行:

单片机刷写运行

评论