单片机原理实验.docx
- 文档编号:8740876
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:17
- 大小:96.69KB
单片机原理实验.docx
《单片机原理实验.docx》由会员分享,可在线阅读,更多相关《单片机原理实验.docx(17页珍藏版)》请在冰豆网上搜索。
单片机原理实验
《单片机原理及应用》
实验报告册
系别:
电气学院
班级:
自动化142
姓名:
学号:
实验一:
熟悉keilc51集成开发环境及常用指令
1、实验目的:
(1)了解80c51典型应用系统的开发过程,熟悉keilc51集成开发环境;
(2)掌握单步执行程序,查看专用寄存器和单片机RAM的执行结果;
(3)掌握80c51的寻址方式及常用指令的使用方法。
2、实验内容
(1)基本指令练习;
(2)数据转送(循环方式)。
3、思考题
1、分别执行以下程序,在调试状态下观察有关单元的内容
顺序执行的程序:
ORG00H
SJMPMAIN
ORG30H
MAIN:
MOVSP,#60H
MOVR0,#40H
MOVR1,#30H
MOV30H,#50H
MOVA,#40H
MOV@R0,A;R0与A内容相等为40H
INCA
MOVA,@R1;A的内容为30H,R1的内容给A
PUSHACC;61H给A
POP32H;60H给30H
MOVA,#5FH
SWAPA;高四位低四位交换,A为F5H
MOVDPTR,#0030H
MOVX@DPTR,A
循环程序:
XUNHUAN1:
MOVR0,#30H;要赋值的首地址
MOVR2,#10H;一共赋值16次
CLRA;从0开始赋值
LOOP1:
MOV@R0,A;赋值16次后停止赋值
INCA;32H=2,37H=7,3BH=0B,3FH=0F
INCR0
DJNZR2,LOOP1
XUNHUAN2:
MOVR0,#30H
MOVR1,#40H
MOVR2,#10H
LOOP2:
MOVA,@R0;从40H开始一直赋值
MOV@R1,A;赋的值从30H开始
INCR0;就是40H=30H,41H=31H
INCR1;一直到R2=0
DJNZR2,LOOP2;就是4FH=3FH
汇编程序3:
PANDUAN1:
MOV30H,#10H
MOV31H,#4BH
MOVR0,#30H
MOVR1,#31H
PAN0:
MOVA,@R0
CLRC;进位位清零
SUBBA,@R1;带进位位的加法
JNCPAN1;判断进位位C,不为零跳转
MOVA,@R0;所以当C等于零时,将
MOV40H,@R1;30H和30H的内容互换
MOV@R0,40H
MOV@R1,A
PAN0:
NOP
END
2、编程完成:
单片机内部RAM40H~4FH置初值A0H~4FH的内容传送到外部RAM中的2000H~200FH单元,在把外部RAM中的2000H~200FH单元的内容传送到单片机内部RAM的50H~5FH单元。
汇编代码:
ORG00H
AJMPMAIN
ORG30H
MAIN:
MOVR0,#40H
MOVR1,#16
MOVA,#01H
MOVDPTR,#2000H
LOOP1:
MOV@R0,A
MOVX@DPTR,A
INCDPTR
INCR0
INCA
DJNZR1,LOOP1
MOVR0,#50H
MOVR1,#16
MOVDPTR,#2000H
LOOP2:
MOVXA,@DPTR
MOV@R0,A
INCDPTR
INCR0
DJNZR1,LOOP2
END
实验二:
中断、定时器与I/O口控制
1、实验目的
(1)掌握定时器/计数器、中断初始化程序设计的方法;
(2)掌握定时/计数器方式2的编程方法;
(3)掌握中断的编程方法;
(4)掌握使用单片机P1口和P3口做I/O输出,各参数的配置。
2、实验任务
完成在每隔50MS/1S下接在P1口的八个发光二极管循环亮灭程序设计和调试。
要求:
1、选择定时器T0方式一定时,中断方式产生50MS,使P1口的八个发光二极管循环亮灭。
2、用定时器与计数器的方式,使T0工作定时产生50MS,使T1工作与计数器,计数10次,每次T0溢出后从P3.0给T1端P3.5一个脉冲。
三、
(1)用定时器定时,计数器计数,当50ms到来时,取反P3.0让P3.0口能够输出一个周期为100ms的脉冲,通过外接导线到P3.5,则计数器就有了外部脉冲的信号,而计数器是在下降沿时计数,所以应该让P3.0一开始就输出低电平。
电路图如下:
(2)定时器方式一和方式二最大定时间分别是:
方式一:
65.536ms(2^13微秒)
方式二:
0.256ms(2^8微秒)
实验三:
扩展并行接口8155
1、实验目的:
(1)掌握8051单片机与8155的接口方法
(2)掌握keilc51集成开发环境在硬件仿真条件下各参数的设置;
(3)掌握软件延时和定时器中断延时的编程方法。
2、实验内容
画出实验电路图:
汇编程序:
ORG0000H
LJMPMAIN
ORG000BH
LJMPTIMEO
MAIN:
MOVSP,#60H
MOVTMOD,#01H
MOVTH0,#3CH
MOVTL0,#0B0H;定时50ms
MOVDPTR,7FF8;DPTR指向命令寄存器8155
MOVA,#03H;设定A,B,C工作方式
MOVX@DPTR,A;启动8155
MOVDPTR,#7FF9H;打开A口
MOVA,#0FEH
MOVX@DPTR,A;将流水灯值给PA口
SETBEA
SETBET0
SETBTR0;打开单片机定时器0
SJMP$
TIME0:
MOVTH0,#3CH
MOVTL0,0B0H
RLA
MOVX@DPTR,A;将左移的值给PA口
RETI
END
实验四:
并行A/D转换
1、实验目的:
(1)掌握并行A/D芯片ADC0809与单片机的接口方法
(2)了解ADC0809芯片的性能;
(3)通过实验了解单片机实现数据采集的方法。
2、实验内容:
画出电路图:
按图中cs接P2.7则
模拟输入通道的地址值INT0~INT7:
7FF8~7FFF
#include"stdio.h"
typedef int ElemType;
typedef int Status;
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(ElemType));
if(!
p)
{
printf("存储空间分配失败!
");
exit
(1);
}
L1->list1 = p; /*使list1指向新线性表空间*/
L1->listSize=L1->listSize + 1; /*把线性空间大小修改为新的长度*/
}
//附加2:
遍历线性表元素
Status Traverse(struct List *L1)
{
int i;
for(i = 0;i < L1->length;i++)
{
printf("%d ",L1->list1[i]);
}
}
//1.创建线性表,给定长度
Status InitList(struct List *L1,int ms)
{
if(ms<0)
{
printf("初始化线性表的长度不能小于0\n");
exit
(1);
}
L1->length = 0;
L1->listSize = ms;
//给list1分配空间,单元大小为定义的ElemType类型,长度为ms
L1->list1 = (ElemType *)malloc(ms * sizeof(ElemType));
if(!
L1)
{
printf("空间分配失败!
");
exit
(1);
}
else
{
printf("空间分配成功!
\n");
printf("您分配的空间大小为%d\n",ms);
}
return 0;
}
//2.销毁线性表
Status DestoryList(struct List *L1)
{
if(L1 !
= NULL)
{
L1->length = 0;
L1->listSize = 0;
free(L1);
}
printf("销毁成功!
\n");
return 0;
}
//3.清空线性表
Status ClearList(struct List *L1)
{
//清空只需要将线性表的长度记为0即可。
L1->length = 0;
printf("清空成功!
\n");
return 0;
}
//4.判断线性表是否为空(如果为空返回0,如果不为空返回1)
Status ListEmpty(struct List *L1)
{
if(L1->length !
= 0)
{
printf("线性表不为空!
\n");
return 1;
}
else
{
printf("线性表为空!
\n");
return 0;
}
}
//5.返回线性表的当前长度
int ListLength(struct List *L1)
{
return L1->length;
}
//6.返回第i个元素的值
ElemType GetElem(struct List *L1,int i)
{
if((i < 1)||(i > L1->listSize))
{
printf("查找的位置超出线性表的范围!
");
//退出
exit
(1);
}
else
{
//返回第pos个元素的值
return L1->list1[i-1];
}
}
//7.判断某个元素是否是线性表元素,如果是,返回这个元素第一次在线性表中出现的位置,如果不是返回0
intIsElem(structList*L1,ElemTypee)
{
//必须要先定义,后使用!
inti;
for(i=0;i
{
if(L1->list1[i]==e)
//因为i是从0,开始,所有返回i+1
returni+1;
}//如果没有找到相应的元素,返回-1;
return0;
}
//8.返回某个元素的前驱元素(如果这个元素是第一个,则提示“这是第一个元素”)
//1、如果这个元素不是线性表元素,返回-1
//2、如果这个元素是线性表第一个元素,返回0,提示第一个元素没有前驱元素
ElemType PriorElem(struct List *L1,ElemType e)
{
//判断这个元素是否是线性表元素,如果是返回它的第一个位置 //调用IsElem函数,并将结果返回给temp变量
int temp = IsElem(L1,e);
if(temp == 0)
{
printf("这个元素不是线性表的元素");
return -1;
}
else if(temp == 1)
{
printf("这个元素是第一个元素,没有前驱元素");
return 0;
}
else
{
//返回e元素的前驱元素
return L1->list1[temp-2];
}
}
//9.返回某个元素的后继元素(如果这个元素是最后一个,则提示“这是最后一个元素”)
//1、如果这个元素不是线性表元素,返回-1
//2、如果这个元素是线性表的最后一个元素,返回0,提示最后一个元素没有后继元素
ElemType NextElem(struct List *L1,ElemType e)
{
//判断这个元素是否是线性表元素,如果是返回它的第一个位置 //调用IsElem函数,并将结果返回给temp变量
int temp = IsElem(L1,e);
if(temp == 0)
{
printf("这个元素不是线性表的元素");
return -1;
}
else if(temp == L1->length)
{
printf("这个元素是最后一个元素,没有后继元素");
return 0;
}
else
{
//返回e元素的后继元素
return L1->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);
}//将位置i之后的元素向后以一个位置
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返回
ElemType ListDelete(struct List *L1,int i)
{
ElemType e;
int temp;
if((i < 1)||(i > L1->length))
{
printf("要删除的元素超出线性表的范围!
");
exit
(1);
} //将第i个位置的元素返回给e
e = L1->list1[i-1];
for(temp = i;i < L1->length;i++)
{
//将第i+1个元素的值赋值给第i个位置
L1->list1[i-1] = L1->list1[i];
}
//将长度减去1
L1->length = L1->length - 1;
return e;
}
int main()
{
int itemp = 0;
int anytemp = 0;
int i = 1;
int listlength = 0;
ElemType e;
struct List L1;
printf("线性表的基本操作!
\n");
printf("**************初始化操作*****************\n");
printf("请输入初始化的长度:
");
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)
printf("请输入,要返回第几个元素值:
\n");
//输入时,要在这里赋值地址“&”
scanf("%d",&anytemp);
printf("第%d个位置元素的对应的元素值为:
%d\n",anytemp,GetElem(&L1,anytemp));
//8.返回某个元素的前驱--PriorElem(struct List *L1,ElemType e)
printf("返回线性表元素的前驱,请输入线性表元素:
\n");
scanf("%d",&e);
printf("元素%d的前驱元素是:
%d\n",e,PriorElem(&L1,e));
//9.返回某个元素的后继--NextElem(struct List *L1,ElemType e)
printf("返回线性表元素的后继,请输入线性表元素:
\n");
scanf("%d",&e);
printf("元素%d的后继元素是:
%d\n",e,NextElem(&L1,e));
//11.删除线性表指定位置i的元素,将结果e返回--ListDelete(struct List *L1,int i)
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;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 原理 实验