单片机原理实验.docx

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

单片机原理实验.docx

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

单片机原理实验.docx

单片机原理实验

 

《单片机原理及应用》

 

实验报告册

 

系别:

电气学院

班级:

自动化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;ilength;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;

}

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

当前位置:首页 > 高等教育 > 农学

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

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