单片机原理实验.docx

上传人:b****7 文档编号:10097205 上传时间:2023-02-08 格式:DOCX 页数:22 大小:204.53KB
下载 相关 举报
单片机原理实验.docx_第1页
第1页 / 共22页
单片机原理实验.docx_第2页
第2页 / 共22页
单片机原理实验.docx_第3页
第3页 / 共22页
单片机原理实验.docx_第4页
第4页 / 共22页
单片机原理实验.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

单片机原理实验.docx

《单片机原理实验.docx》由会员分享,可在线阅读,更多相关《单片机原理实验.docx(22页珍藏版)》请在冰豆网上搜索。

单片机原理实验.docx

单片机原理实验

《单片机原理及应用》

系别:

 

班级:

自动化142

 

姓名:

学号:

实验一:

熟悉keilc51集成开发环境及常用指令

、实验目的:

(1)了解80C51典型应用系统的开发过程,熟悉keilc51集

成开发环境;

(2)掌握单步执行程序,查看专用寄存器和单片机RAM的

执行结果;

(3)掌握80C51的寻址方式及常用指令的使用方法。

、实验内容

(1)基本指令练习;

(2)数据转送(循环方式)三、思考题

1、分别执行以下程序,在调试状态下观察有关单元的内容

顺序执行的程序:

ORG00H

SJMPMAIN

ORG30H

MAIN:

 

MOV

SP,#60H

MOV

R0,#40H

MOV

R1,#30H

MOV

30H,#50H

A,#40H

MOV

 

INC

 

循环程序:

XUNHUAN1:

MOV

R0,#30H

;要赋值的首地址

MOV

R2,#10H

;一共赋值16次

CLR

A;从0开始赋值

 

L00P1:

MOV

@RO,A;赋值16次后停止赋值

 

INC

A;32H=2,37H=7,3BH=0B,3FH=0F

 

INC

R0

DJNZ

R2,LOOP1

XUNHUAN2:

MOV

R0,#30H

MOV

R1,#40H

MOV

R2,#10H

LOOP2:

MOV

A,@R0;从40H开始一直赋值

MOV

@R1,A;赋的值从30H开始

INC

R0;就是40H=30H,41H=31H

INC

R1;一直到R2=0

 

DJNZ

R2,L00P2;就是4FH=3FH

汇编程序3:

PANDUAN1:

MOV

30H,#10H

MOV

31H,#4BH

MOV

R0,#30H

MOV

R1,#31H

PAN0:

MOV

A,@R0

CLR

C;进位位清零

SUBB

A,@R1;带进位位的加法

JNC

PAN1;判断进位位C,不为零跳转

MOV

A,@R0;所以当C等于零时,将

MOV

40H,@R1;30H和30H的内容互换

MOV

@R0,40H

MOV

@R1,A

PAN0:

 

NOP

END

2、编程完成:

单片机内部RAM40H~4FH置初值A0H~4FH

RAM

中的2000H~200FH单元的内容传送到单片机内部

RAM的50H〜5FH单元。

汇编代码:

ORG00H

AJMPMAIN

ORG30H

MAIN:

LOOP1:

MOV@R0,A

MOVX@DPTR,A

INC

DPTR

INC

RO

INC

A

DJNZ

R1,LOOP1

MOV

R0,#50H

MOV

R1,#16

MOV

DPTR,#2000H

LOOP2:

MOVX

A,@DPTR

MOV

@R0,A

INC

DPTR

INC

R0

DJNZ

R1,LOOP2

END

中断、定时器与I/O口控制

、实验目的

 

(2)掌握定时/计数器方式2的编程方法;

(3)掌握中断的编程方法;

(4)掌握使用单片机P1口和P3口做I/O输出,各参数的配置。

二、实验任务

完成在每隔50MS/1S下接在P1口的八个发光二极管循

环亮灭程序设计和调试。

使P1口的八个发光二极管循环亮灭。

2、用定时器与计数器的方式,使TO工作定时产生

50MS,使T1工作与计数器,计数10次,每次TO溢出后从

P3.0给T1端P3.5一个脉冲。

(1)用定时器定时,计数器计数,当50ms到来时,取反

(2)

是在下降沿时计数,所以应该让P3.0—开始就输出低电平。

At>A

电路图如下:

i-l:

It?

IPIJ-

P1.4

瞰51F"

Pit?

P3...

(2)定时器方式一和方式二最大定时间分别是:

方式一:

65.536ms(2八13微秒)

方式二:

0.256ms(2八8微秒)

实验三:

扩展并行接口8155

、实验目的:

(1)掌握8051单片机与8155的接口方法

(3)掌握keilc51集成开发环境在硬件仿真条件下各参数

的设置;

(4)掌握软件延时和定时器中断延时的编程方法。

、实验内容

画出实验电路图:

 

汇编程序:

MAIN:

MOVSP,#60H

MOVTMOD,#01H

MOVTH0,#3CH

MOVA,#0FEH

SETBEA

SETBET0

ORG

0000H

LJMP

MAIN

ORG

000BH

LJMP

TIMEO

SJMP$

TIME0:

MOVTH0,#3CH

MOVTL0,0B0H

RLA

RETI

END

实验四:

并行A/D转换

、实验目的:

(1)掌握并行A/D芯片ADC0809与单片机的接口方法

(2)了解ADC0809芯片的性能;

(3)通过实验了解单片机实现数据采集的方法。

二、实验内容:

画出电路图:

.-.F'J■

.3•珂

二包垦

AL

寸上I亠

----

u

二」

豈殳订匕,二丄二

-£,-r

-T-

■■f-r-

rb

cs接P2.7贝y

按图中

7FF8〜7FFF

模拟输入通道的地址值INTO〜INT7:

 

#inelude

"stdio.h"

typedef

intElemType;

typedef

intStatus;

struct

List{

ElemType*list1;

//指向线性表的第一个节点

int

length;

//

线性表的实际长度

int

listSize;

//线性表的最大长度324

};

//附加

1:

给线性表增加空间

Status

AgainMalloc(struct

List*L1)

ElemType*p

(ElemType*)realloc(L1->list1,(L1->listSize

+1)*sizeof(ElemTy

pe));

if

(!

p)

printf("存储空间分配失败!

");

exit

(1);

L1->list1

p;/*使list1指向新线性表空间*/

L1->listSize=L1->listSize

+1;/*把线性空间大小修改为新的长度*/

 

//附加2:

遍历线性表元素

 

Status

Traverse(struct

List*L1)

 

i;

int

 

for(i

0;i

length;i++)

 

printf("%d

"丄1->list1[i]);

 

//1.

创建线性表,给定长度

Status

InitList(struct

List*L1,intms)

if

(ms<0)

 

 

printf("初始化线性表的长度不能小于0\n");

exit

(1);

 

//给list1分配空间,单元大小为定义的ElemType类型,长度为ms

 

if(!

L1)

printf("空间分配失败!

");

exit

(1);

else

printf("空间分配成功!

\n");

〃2.销毁线性表

free(L1);

 

return0;

113.清空线性表

printf("清空成功!

\n");

return0;

//4.判断线性表是否为空(如果为空返回0,如果不为空返回1)

*L1)

StatusListEmpty(structList

if(L1->length!

=0)

return1;

else

 

return0;

 

//5.

返回线性表的当前长度

intListLength(struct

List*L1)

 

returnL1->length;

〃6.返回第i个元素的值

ElemType

GetElem(structList*L1,inti)

 

printf("查找的位置超岀线性表的范围!

");

//退岀exit

(1);

else

//返回第pos个元素的值returnL1->list1[i-1];

//7.

判断某个元素是否是线性表元素,如果是,返回这个元素第一次在线性表中岀现的位置,如果不是返回0

intIsElem(structList*L1,ElemTypee)

//必须要先定义,后使用!

inti;

for(i=0;ivL1->length;i++)

if(L1->list1[i]==e)

//因为i是从0,开始,所有返回i+1

returni+1;

}//如果没有找到相应的元素,返回-1;

return0;

//8.返回某个元素的前驱元素(如果这个元素是第一个,则提示"这是第一个元素"

//1、如果这个元素不是线性表元素,返回-1

//2、如果这个元素是线性表第一个元素,返回0,提示第一个元素没有前驱元素

ElemTypePriorElem(structList*L1,ElemTypee)

//调用IsElem函数,并将结

//判断这个元素是否是线性表元素,如果是返回它的第一个位置果返回给temp变量

inttemp=lsElem(L1,e);

printf("这个元素不是线性表的元素");

return-1;

printf("这个元素是第一个元素,没有前驱元素");

return0;

else

//返回e元素的前驱元素

returnL1->list1[temp-2];

//9.返回某个元素的后继元素(如果这个元素是最后一个,则提示"这是最后一个元素"

//1、如果这个元素不是线性表元素,返回-1

//2、如果这个元素是线性表的最后一个元素,返回0,提示最后一个元素没有后继元素

ElemTypeNextElem(structList*L1,ElemTypee)

//调用IsElem函数,并将

//判断这个元素是否是线性表元素,如果是返回它的第一个位置结果返回给temp变量

inttemp=IsElem(L1,e);

 

printf("这个元素不是线性表的元素");

return-1;

 

elseif(temp

L1->length)

printf("这个元素是最后一个元素,没有后继元素");

return0;

 

else

//

返回e元素的后继元素

returnL1->list1[temp];

〃10.在线性表的指定位置i之前插入元素e

StatusListInsert(

structList*L1,inti,ElemTypee)

inttemp;

if

((i<1)||(i>L1->length+1))

printf("i越界,不能插入");

exit

(1);

//如果线性表的长度等于最大长度,增加空间

if

(L1->length==L1->listSize)

//每次增加1个ElemType单位的个空间

AgainMalloc(L1);

 

for(temp=(L1->length+1);temp>=i;temp--)

L1->list1[temp]=L1->list1[temp-1];

//在i-1的位置插入新元素e

L1->list1[i-1]=e;

//长度加1

L1->length=L1->length+1;

return0;

//11.删除线性表中指定位置i的元素e,并将e返回

List*L1,inti)

ElemTypeListDelete(struct

 

inttemp;

 

exit

(1);

//将第i个位置的元素返回给e

e=L1->list1[i-1];

 

//将第i+1个元素的值赋值给第i个位置

L1->list1[i-1]

L1->list1[i];

 

//将长度减去1

 

L1->length

L1->length

1;

returne;

 

intmain()

int

itemp

0;

int

anytemp=0;

inti

1;

intlistlength

0;

ElemType

e;

structList

L1;

 

printf("线性表的基本操作!

\n");

 

scanf("%d",&itemp);

//1.创建--InitList(structList*L1,intms)

InitList(&L1,itemp);

printf("请输入线性表的值,不能超过%d个,以911结束,911不算长度:

\n",itemp);

for(i=1;i<=itemp;i++)

scanf("%d",&e);

//这里不能是exit,exit直接退岀了所有程序,所以是break

if(e==911)

break;

//10.在线性表指定位置i之前插入元素e

ListInsert(&L1,i,e);

//5.返回长度--ListLength(structList*L1)

listlength=ListLength(&L1);

printf("目前,线性表的长度为:

%d\n",listlength);

//遍历线性表printf("目前,线性表的值为:

\n");

//遍历,在Traverse中输岀

Traverse(&L1);

//6.返回第i个元素值--GetElem(structList*L1,inti)

//输入时,要在这里赋值地址“&

scanf("%d",&anytemp);

 

printf("第%d个位置元素的对应的元素值为:

%d\n",anytemp,GetElem(&L1,anytemp));

List*L1,ElemTypee)

//8.返回某个元素的前驱--PriorElem(struct

printf("返回线性表元素的前驱,请输入线性表元素:

\n");

scanf("%d",&e);

printf("元素%4的前驱元素是:

%d\n",e,PriorElem(&L1,e));

//9.返回某个元素的后继--NextElem(structList*L1,ElemTypee)

printf("返回线性表元素的后继,请输入线性表元素:

\n");

scanf("%d",&e);

printf("元素%4的后继元素是:

%d\n",e,NextElem(&L1,e));

〃11.删除线性表指定位置i的元素,将结果e返回

--ListDelete(struct

List*L1,inti)

 

listlength

ListLength(&L1);

printf("目前,线性表的长度为:

%d\n",listlength);

printf("请输入要删除第几个位置的元素:

\n“);

scanf("%d",&i);

ListDelete(&L1,i);

listlength=ListLength(&L1);

printf("目前,线性表的长度为:

%d\n",listlength);

printf("目前,线性表的值为:

\n");

//遍历,在Traverse中输岀

Traverse(&L1);

return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1