单片机实验报告_第1页
单片机实验报告_第2页
单片机实验报告_第3页
单片机实验报告_第4页
单片机实验报告_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第 PAGE27 页 共 NUMPAGES27 页单片机实验报告实 实 验 验 报 报 告实验课程:单片机原理及应用班级:12 自动化 2 班学号:姓名:教师:张玲成绩:实 验 日 期 :年月日实验名称:实验 1计数显示器一、实验目得: 学习 Prts 软件得使用,掌握单片机原理图得绘图方法。二、实验内容:1、绘制“计数显示器”电路原理图; 2、利用提供得x 文件验证此电路得运行效果。三、实验要求:提交得实验报告中应包括:、绘图方法简述,要求说明元件与电得选取、摆放及属性编辑,总线与标签得画法等内容;2、电路原理图; 3、仿真运行效果展示,要求就仿真文件加载方法及 3幅运行截图进行简要说明;4

2、、实验小结,说明遇到得主要问题或实验 1 体会等.参考电路原理图如下:元件类别 电路符号 元件名称 icrrocesor IC “U1 8051 Miellaneous “X1”/1Mz CRYSTAL Capios “C”“C2/1nF AP Cpacitor “C3”/22F CELEC Resisor Packs “1/71 ESAC7 Resistors “R1/10 RE Optlectrnics “LED1”“LE2” 7SE-AT-GR witces Ray “BUT” BTTON 1、及 编程思路及 C51 程序: 2 、电路原理图:、仿真运行效果展示: 4 、实验小结 :熟悉

3、roeus 软件,了解软件得结构组成与功能;学习 ISIS 模块得使用方法, 学会设置图纸、选元件、线画总线、修改属性等基本操作;学会可执行文件 加载及程序仿法;理解roeu在单片机开发中得作用,完成单片机电路原 理图得绘制 实验名称:实验 2LED 指示灯循环控制一、实验目得 熟悉Viion3 编译软件、掌握 C5编程与调试方法。二、实验内容 1、按照教材 P243 得图 A、34,绘制实验二电路原理图; 、编写 C51 程序,实现 8 个 LED 灯依次点亮得功能: P0、00、1 P、2、 0、70、6、5 P0、0 得顺序,无限循环,间隔约s; 3、观察仿真结果,完成实验报告。三、实验

4、要求 1、采用两种加载并运行可执行文件得方法,即rteu独立运行与rots + Keil 联合运行,体会其中得差异与意义; 、练习采用单步、断点以及监视窗等手段进行程序调试得方法; 3、观察仿真结果,完成实验报告:绘制得电路原理图、编程思路分析p 及 C51程序、调试过程简述,仿真运行效果以及实验小结。1 、电路原理图:及 、编程思路及 C51 程序:3 、仿真运行效果: 4 、实验小结 :通过本次实验我熟悉 uViion3 编译软件了解软件得结构组成与功能学习 51 语言得程序设计方法)学会在 uVision中进行 C1 程序录入、编译、与 调试理解 Poteus 与 Keil 联合得仿真原

5、理实现 LED 指示灯循环控制功能。更好得将 C 语言与 C1 语言联系在了一起)学到得知识能准确得利用了出来。实验名称:实验指示灯与数码管得中断控制一、实 验目得 掌握外部中断得工作原理,学会中断程序设计.二、实验内容 1、按照教材帕图 A、53,绘制实验四电路原理图; 2、要求采用外部中断原理完成本次实验,其中按键 K1、K2 均设置为下降沿触发方式,自然优先级; 3、编写 C51 程序实现如下功能:开机后 D灭灯,LED黑屏,随后单击 K1D状态反转,单击 K LE1 从 0 开始循环显示F 字符。4、观察仿真结果,完成实验报告。三、实验要求 提交得实验报告中应包括:电路原理图,外部中断

6、工作原理阐述(以 K1 为例说明中断响应过程),C51 程序(含流程图与注释语句),运行效果(含运行截图与说明),实验小结 1 、电路原理图 :2 、外部中断工作原理阐述:持续按下 K1 则 D1 将“亮灭亮灭亮灭如此循环,表明实现了 K1 对应于 D1 状态反转这个功能;持续按下持续按 K2 则数码显示管依次显 示 1-F,实现了 K2 对应于 0F 间得数码管加一计数显示3、及 编程思路及 C51 程序:4 、仿真运行效果: 5 、实验小结:通过实验对 Potues 有了更多得了解,同时了解到中断系统在实际中得更好 应用。经过编程操作起来更加熟练能很快得完成绘图,编程时也得心应手, 能熟练

7、得运用软件找出自己所编程中得语法问题及其她问题,并以改正。实验名称:实验- 电子秒表显示器一、实 实 验目得 掌握定时/计数器得中断法工作原理,熟悉 C1 编程与调试方法二、实验要求:1、实验电路原理图如教材 P260 A、65 图所示.程序开始时显示“00”;当s 产生时,秒计数加;秒计数到 59 后,自动从“00”开始。2、采用2H晶振频率,T0 定时方式 1、5ms 定时中断法编程(s 需要经过 20 软循环)(流程图与参考程序模版如下所示)./定时中断方式实现得电子秒表15( )件文头(定义无符号字符型变量 t中断次数计数器,并赋初值 (定义无符号字符型变量 second-秒计数器,并

8、赋初值 0 (定义位于 RM 区得无符号字符型数组e显示字模) mer0()(中断函数【关键词】:p ) ( )0T 闭关 (初值重装载 0 x3cb0) ( )增器数计数次断中 )2=(i/ 秒于当相,次 0断中若;0=t /中断次数计数器清零 ;+dns / 零清器数计秒 ( )零清,06 到达值器数计秒若()值示显得 dnces 量变出输别分口 2与P( )0动启 a();/dnoceslbat0P / 值示显出输别分口 2P 与 0P;0dnoceselbat=2P (定义0 定时方式 1-MO) 05( )0与T载加bc3x值初出溢 sm( )A,0TE化始初断中 (启动 T0)(死

9、循环)3 3 、编程思路及1 51 程序: :4 、仿真运行效果: 、实验小结 :本次实验进行得比较顺利,根据指导材料中提供得流程图完成了程序得编 写,成功生成了、e文件,经过仿真运行达到了预期得实验结果.通过本次得 实验,我更加深入得了解到单片机定时/计数功能实现得机理,通过与单片机中 断功能得结合,可以完成更多得预期功能。但就是进过讨论我也发现,程序还就是存 在很大得缺陷,想要实现更加准确实现计时功能还需综合利用各种知识完善程 序。作者写这篇文章的目的达到了!感情丰富。实验一一、实验题目:试编写一段程序,其功能为将21H单元的内容8位分别依次存放到从22H开始的8单元中。二、keil代码:

10、org 0000h jmp start org 0100h start: mov 21h,_8; mov A ,21h;取出21中的数 mov R0,_22h ;初始化 mov R1,_7h ;循环次数为7 loop:RRC A;把A之中的最低位移到CJC real;判断C里面是数是否为1,如果是1.则跳转到real mov R0,_0h jmpkk; real: mov R0,_1h;如果是1,则将1赋到R0单元里 kk: INC r0;依次判断A中的每一位DJNZ R1,loop; jmp ;死循环 end三、实验截图:四、实验小结:这是我们单片机的第一个实验,因为刚接触,所以会感觉很陌生

11、,内心有一种畏惧感,看到题目的时候也是没有头绪,可以说完全是不知道到底题目是一个什么意思,更是不知道我们应该如何编写程序。不过后面通过老师的讲解,自己也去查看了一些有关的书籍,慢慢也理解了该如何去实现这种实验题目。 在认真琢磨之后,我开始学会像以前刚开始学习C语言一样慢慢绘制一个程序的流程图,理清思绪,然后根据流程图编写相应的代码。下面是本题的实验流程图:通过完成这个实验,我对单片机的程序有了很大的认识。实验中,也是深刻的理解到了一个单片机程序每一步的实现与运行。当然,也掌握了在keil中调试的方法。实验二一、实验题目:若0-5号键的键值分别是:EEH、DEH、BEH、7EH、EDH、DDH。

12、设键值存放在内部RAM 20H单元中,编程实现根据2OH中的键值分别使程序转移到PR0-PR4程序段。要求当以上程序段的功能完成后,都采用RET指令,指定返回到程序的初始入口START标号处。 要求:PR0 :教材75页习题。PR1 :同上习题9题 PR2:同上习题10 其余入口,只需完成空操作就返回。二、keil代码:org 0000 ljmp start org 0100 TAB: DB 0EEH,0DEH,0BEH,7EH,0EDH,0DDH start: movdptr ,_start pushdpl pushdph mov A,_0EEH MOV 20H,A MOV DPTR ,_T

13、ABMOV A,_0 NEXT: PUSH ACC;先保存A寄存器中的值MOVC A,A+DPTR ;A是键码表的编码;置键码表首址;表的起始位置的偏移量为零 CJNE A,20H,NEXT1 POP ACC RL A ;将20H值和键码表的值比较;如相等,序号乘以2,得到分支表内偏移量2n (8位变16位)MOV DPTR,_APJJMP A+DPTR PRn指令NEXT1: POP ACCINC A CJNE A,_6,NEXT;表示如果=6了,说明编码查完了也没有相等的,程序直接结束SJMP APJ: AJMP PR0 AJMP PR1 AJMP PR2 AJMP PR3 AJMP PR

14、4;不相等,则比较下一个;置分支表首址 ;执行表JPT+2H中的AJMPPR0: MOV R7,_5H MOV 3DH,_00H MOV 3EH,_20H MOV 4EH,_88H MOV 5EH,_98H MOV A,_0 MOV R4,A MOV R5,A MOV R6,A;正数个数;负数个数;零的个数MOV R0,_40H MOV R1,_50H MOV SP,_3FH LOOP: POP ACC JZ ZERO JB ACC.7,FS INC R4 MOV R0,A INC R0 AJMP DJ FS: INC R5 MOV R1,A INC R1 AJMP DJ ZERO: INC

15、R6 DJ: DJNZ R7,LOOP RET DATA1:DB 0EFH,3FH,3EH,07H PR1: MOV R7,_03H;进行3次循环 MOV R0,_DATA1 MOV A,R0 CPL A ;取反 ADD A,_01;加1 MOV R0,A AB1: INC R0 MOV A,R0 CPL A ADDC A,_0 ;带进位 DJNZ R7,AB1 ;SJMP RET BUF1:DB 1111B,0B,0010B,0100B,0B,0010B,0001B,0000B,1001B,0000B,0B,1B,0000B,0011B,0010B,0001B BUF2:DB 0 BUF:D

16、B 0 PR2: ;30h放平均值 40h放余数 MOV R0,_BUF1 MOV R7,_16 ;循环16次数 MOV B,_0 MOV A,R0 MOV R2,A LOOP1: MOV A,R2 INC R0 ADD A,R0 MOV R2,A MOV A,B ADDC A,_0 MOV B,A DJNZ R7,LOOP1 MOV R6,_04H MOV 30H,_BUF2 MOV 30H,A MOV 40H,_BUF MOV 40H,_0 NEX: CLR C MOV A,B RRC A MOV B,A MOV A,30H RRC A MOV 30H,A MOV A,40H RRC A

17、MOV 40H,A DJNZ R6,NEX SJMP RET PR5:RET PR3:RET PR4:RET END三、实验截图:初始化:结果:四、实验小结:本实验中,将键码排成表,将键码表中的值和20H单元中的内容进行比较;另外编制一张转移表,存放AJMP指令,利用JMP A+DPTR执行表内的AJMP指令,从而实现分支转移。“RL A”:因为每个AJMP指令占两个字节,将刚记下来的键码中的值(即:键码的序号)乘以2即为转移表的偏移地址,在利用JMP A+DPTR执行表内的AJMP指令,从而实现分支转移。“movdptr ,_start Pushdpl push dph”:指定每次主程序返回

18、到start。在单片机中,每一个子程序的返回用RET指令,而RET指令的功能正好可以使得子程序从栈顶弹出断点到PC,从而返回到主程序实验三一、实验题目:使用C语言完成,实验一,实验二。二、keil代码:实验一:_include _include void main char *p1=0 x21; char *p2=0 x22; int i=1;*p1=0 x8;while(i*p2=*p1&0 x01;*p1=*p11; p2+; i+; 实验二: _include void PR0; void PR1; void PR2; void PR3; void PR4; void PR5; int

19、main int i;/键码表code的下表int key=0; char code1=0 xEE,0 xDE,0 xBE,0 x7e,0 xED,0 xDD; char *p0=0 x20;/指针变量*p0指向20H这个单元*p0=0 xDE;/给20H单元赋初值(20H单元里存放键码表中任一值)for(i=0;ikey=i; switch(key) if(*p0=code1i)break; return 0; case 0:PR0;break; case 1:PR1;break; case 2:PR2;break; case 3:PR3;break; case 4:break; case

20、5:break; default:break; void PR0 char table116=1,2,-6,7,8,9,0,-1,-2,-3,-4,-5,-6,1,4,6; char data *p30 = 0 x30; char data *p40 = 0 x40; char data *p50 = 0 x50; int i; int countR4=0; R4,R5,R6中int countR5=0;/分别将正数、负数和零的个数存入 int countR6=0; for(i=0;i/依次将table1表里的16个数据存入30H单元开始的单元里。 for(i=0;iif(*p300) els

21、e if(*p30 else *p50=*p30; +p50; +countR5;*p40=*p30; +p40; +countR4;p30i=table1i; +countR6;+p30; void PR1 char data1=0 x10,0 x11,0 x12,0 x13; int i; int j; char Cy=PSW7; data10=(data10)+0 x1; /while(j data1i=(data1i)+Cy; i+;void PR2 char buf1=0 x1,0 x2,0 x3,0 x4,0 x5,0 x6,0 x7,0 x8,0 x9,0 x0A,0 x0B,0

22、 x0C,0 x0D,0 x0E,0 xF; char buf2=0; charbuf=0; int sum=0; int i=1; while(i sum=sum+buf1i;+i; buf2=sum/0 x10; buf=sum%0 x10; 三、实验截图:实验一:实验二:四、实验小结:在本实验中,我们用C语言编写代码的时候,特别注意指针的使用。另外,在单片机中使用C语言,与我们之前写C语言的时候还是有一些不同的地方,尤其是在指针使用上面的不同。C语言是一种通用的程序设计语言,代码率高,数据类型丰富,且具有良好的程序结构;单片机的C语言采用C51编译器,由C51产生的目标代码短,运行速度快

23、,所需内存空间小。实验中,注意:“for(i=0;ip30i=table1i; ”:表示依次将table1表里的16个数据存入30H单元开始的单元里。实际上,在C中指针就相当于一个数组。在本实验中,我可以根据之前的汇编程序实验,较为容易的根据每个子程序编子函数模块。由于之前有C语言的基础,所以能够比较好的完成本实验。实验四五、实验题目: 当K1键按下后,首先使蜂鸣器响一声,然后使LED1- LED8完成3种闪亮的花样(自己定义),每一种花样循环 3次,然后周而复始。 六、keil代码:/*当K1键按下后,首先使蜂鸣器响一声,然后使LED1- LED8完成3种闪亮的花样(自己定义),每一种花样循

24、环 3次,然后周而复始。*/ _include sbit P2_0=P20;/接蜂鸣器 sbit P2_7=P27; sbit P1_0=P10; sbit P1_1=P11; sbit P1_2=P12; sbit P1_3=P13; sbit P1_4=P14; sbit P1_5=P15; sbit P1_6=P16; sbit P1_7=P17;void DELAY(int time)/延时 while(time-) void BUZ_ON if(P2_7=0) P2_0=1; else P2_0=0; void F1(void) int i; char data_group_mide

25、5=0 x00,0 x18,0 x24,0 x42,0 x81;/向两边延伸 for(i=0;iP1=0 x00; void F2(void) int i; char data_group_left8=0 xFF,0 x7F,0 x3F,0 x0F,0 x07,0 x03,0 x01,0 x00;/向左延伸 for(i=0;iP1=0 x00; void F3(void) int i; char date_group_right8=0 x00,0 x01,0 x03,0 x07,0 x0f,0 x3f,0 x7f,0 xff;/向右延伸 for(i=0;iP1=0 x00; void main

26、 unsigned int i; /每种花样循环三次P2_0=0;P2_7=1;BUZ_ON;P1=0 x00; while(P2_7=0)for(i=0;iF1;for(i=0;iF2;for(i=0;iF3; 三、protues电路图:四、实验截图:五、实验小结:通过本次实验,我们熟悉了protues的编译环境,对以后的单片机学习有很大帮助。 实验五一、实验题目: 程序启动后4位LED显示器滚动显示“-”,每按下1次K1键后,首先使蜂鸣器响一声。然后,依次使LED滚动显示CNT的计数值(0-9)。二、Keil代码:/*程序启动后4位LED显示器滚动显示“-”,每按下才1次K1键后,首先使蜂

27、鸣器响一声。然后,依次使LED滚动显示CNT的计数值(0-9)。1、按键K1采用中断来管理。(INT0采用边沿触发)2、中断服务程序完成四个功能:1)消除按键K1抖动。2)CNT计数。3)查表将计数值转换成LED显示器的段代码。4)将段代码分别放入4个显示缓冲单元。*/ _include _define uchar unsigned char _define uint unsigned int sbit P2_7=P27; sbit P3_3=P33; uchar CORDING=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x

28、90,0 xc0,0 xf9,0 xa4,; /0,1,2,3,49,0,1,2的段码 intdelayms(uint t) uint n; while(-t) n=200; while(-n); ; return 0; int main uint CNT=0;P2_7=0;P3_3=1; P1=0 xF7; while(1) if(P3_3=0)uint i; CNT+;P2_7=1; delayms(100); for(i=1;i/4位P1=CORDINGCNT-1;switch(i)/点亮第1位/点亮第2位 /点亮第3位 /点亮第4位delayms(100);casecasecaseca

29、se P2=0 x00; 1:P2=0 x01;break; 2:P2=0 x02;break; 3:P2=0 x04;break; 4:P2=0 x08;break;/ 熄灭if(CNT10) CNT=CNT-10; 三、protues电路图:P2_7=0; return 0; 四、实验截图:五、实验总结:通过本次实验,我们熟悉了CNT计数,学会了如何使LED灯上显示0-9数字。实验六一、实验题目:两个数码管,K1,K2两个按键,完成K1启动计数,K2暂停计数,每一秒钟数码管增加1,60秒钟后,数码管回归0,重新计数。二、keil代码:/*两个数码管,K1,K2两个按键,完成K1启动计数,K

30、2暂停计数,每一秒钟数码管增加1,60秒钟后,数码管回归0,重新计数。按键K1,K2采用中断来管理。(INT0采用边沿触发)*/ _define uchar unsigned char _define uint unsigned int _include uchar CNT=0; ucharm=0; sbit P3_7=P37; sbit P3_2=P32; sbit P0_0=P00; uchar CORDING=0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F; /0,1,2,3,49的段码 void Delay(uint a) while(-a); voidintproc interrupt 0 TR0=0; void Time0 interrupt 1 m+;/中断一次,m加1if(m=20) m=0;/中断次数清零 CNT+; /秒加1 if(CNT=60) CNT=0;P1=C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论