北京工业大学8051单片机实验报告
- 格式:docx
- 大小:45.36 KB
- 文档页数:18
8051单片机实验报告本次8051课程主要学习了MCS-51单片机结构,以及通过μVision2软件对MCS-51单片机进行编程,掌握了该单片机的并行接口设计、中断系统设计、定时计数器设计、串行接口设计以及扩展和接口设计技术。
下面将以并行接口输入输出实验,中断实验以及定时/计数器实验给出实验报告。
实验一并行接口输入、输出实验一.实验目的1.熟悉51单片机并行口的输入方式、输出方式的编程。
2.熟悉51单片机并行口的应用编程软件仿真调试方法。
3.学会在线烧写单片机程序的方法。
二.实验原理MCS-51单片机有P0、P1、P2、P3四个8位双向I/O口,每个端口可以按字节输入或输出,也可以按位进行输入或输出,四个口共32根口线,用作位控制十分方便。
P0口为三态双向口,能带8个TTL电路;P1、P2、P3口为准双向口,负载能力为4个TTL电路。
5.1 PO~P3端口的功能和内部结构5.1.1 端口功能大多数口线都有双重功能,具体介绍如下:PO口—1.作为输入/输出口。
2.作为地址/数据总线,接外围芯片时PO口分时输出低8 位地址与数据信号。
●P1口—1.作为输入/输出口。
2.在增强型(52系列)和ISP型(在系统编程型)中有如下功能:P1.0 T2引脚,定时/计数器2外部计数脉冲输入P1.1 T2EX引脚,定时/计数器2触发和方向控制P1.5 MOSI引脚,在系统编程数据输入P1.6 MISO引脚,在系统编程数据输出P1.7 SCK引脚,在系统编程时钟输入●P2口—1.作为输入/输出口。
2.作为高8位地址总线。
●P3口—P3口为双功能1.作第一功能使用时,其功能为输入/输出口。
2.作第二功能使用时,每一位功能定义如下表所示:归纳四个并行口使用的注意事项如下:1。
如果单片机内部有程序存贮器,不需要扩展外部存贮器和I/O 接口,单片机的四个口均可作I/O口使用。
2。
四个口在作输入口使用时,均应先对其写“1”,以避免误读。
电子工程设计报告题目:温度测量系统/闭环温度控制系统设计专业:电子科学与技术小组: 7:学号:袁彬 11023221赖力 11023222指导教师:高新完成日期:目录一、摘要 (3)二、设计任务与要求 (3)〔二〕、设计要求 (4)(三)单片机 (5)〔一〕、电路工作原理及主要元件的功能 (5)〔二〕、电路的调试 (9)四数/模(D/A)转换电路 (10)〔一〕、电路工作原理及主要元件功能 (10)〔二〕、电路主要参数计算 (12)(三)、电路调试 (12)五、模/数(A/D)转换电路 (13)〔一〕、ADC0804芯片介绍 (13)〔二〕、电路主要参数计算 (14)〔三〕、电路调试 (15)六、电路显示与键盘控制电路 (16)〔一〕、电路工作原理 (16)(二).电路调试 (19)七、温度测量 (22)八、心得体会 (25)九、附录 (26)一、摘要在上学期我们完成了温度控制系统的第一阶段,在这一阶段,我们完成了焊接包括电源板、驱动器和变送器在内的一些工作。
也为我们这次的第二阶段做好了准备。
通过上学期的准备,我们对焊接电路已经基本上熟练掌握了,对一些电路的原理和设计也都到达了必要的要求,正是基于此我们目前已经完成了第二阶段的所有内容。
下面就主要介绍一下我们第二阶段的工作。
二、设计任务与要求设计小型温度测量与控制系统 --- 典型电子系统⑴核心单元—单片机应用电路⑵模拟量接口—A/D、D/A 电路⑶人机交互单元—显示、键盘控制电路⑴控制模/数转换进行温度数据采集⑵控制数/模转换改变控温元件工作状态,进行温度控制。
⑶控制键盘与显示器,进行控制温度设定和测量温度显示。
⑷将温度数据转换为显示温度数值的算法程序。
(5)控制温度精确、平稳变化的的算法程序。
⑴电路系统联调,配合测试程序实现基本的测温、控温功能。
⑵程序联调,通过电路系统实现精确、平稳的温度控制⑴设计并实现了一个能够精确、稳定控制温度的系统。
⑵知道了一个典型的电子系统应该具备哪些主要功能⑶知道了一个典型电子系统的设计实现过程和工作方法。
51单片机实验报告(共五则)第一篇:51单片机实验报告51单片机实验报告实验一点亮流水灯实验现象 Led灯交替亮,间隔大约10ms。
实验代码#include 〈reg51、h> void Delay10ms(unsigned int c);voidmain(){)1(elihwﻩ{ ﻩP0= 0x00;Delay10ms(50);;ffx0 =0Pﻩﻩ;)05(sm01yaleDﻩ } } void Delay10ms(unsigned int c){unsigned char a,b;for(;c>0;c-—){)——b;0〉b;83=b(rofﻩ{ ﻩﻩfor(a=130;a〉0;a--);}ﻩﻩ}} 实验原理W W hi i le(1)表示一直循环。
循环体内首先将P0 得所有位都置于零,然后延时约5 5 0*10=500ms,接着 0 P0 位全置于 1 1,于就是 D LED 全亮了。
接着循环,直至关掉电源..延迟函数就是通过多个for r 循环实现得。
实验 2 流水灯(不运用库函数)实验现象起初 led 只有最右面得那一个不亮,半秒之后从右数第二个led也不亮了,直到最后一个也熄灭,然后 led 除最后一个都亮,接着上述过程 #includemain(){unsigned char LED;LED = 0xfe;while(1){ ﻩ;DEL = 0PﻩDelay10ms(50);00x0 == 0P(fiﻩ {;1〈〈 DEL = DELﻩ)ﻩ;efx0 = DELﻩ} ﻩ}ﻩ} void Delay10ms(unsigned int c){unsigned char a,b;for(;c>0;c-—){)—-b;0〉b;83=b(rofﻩ{ ﻩﻩﻩ;)--a;0>a;031=a(rofﻩ} ﻩ} ﻩ} 实验原理这里运用了C语言中得位运算符, , 位运算符左移, , 初始值得二进制为1111 1 110, 之后左移一次变成1111 1 100 0,当变成00000 0000 时通过 f if 语句重置 1 1 11 1 11110、延迟函数在第一个报告已经说出了,不再多说..实验 3 流水灯(库函数版)实验现象最开始还就是最右边得一个不亮,然后不亮得灯转移到最右边得第二个,此时第一个恢复亮度,这样依次循环.实验代码#include 〈reg51、h> #include 〈intrins、h〉void Delay10ms(unsigned int c); void main(void){unsigned char LED;;EFx0 = DELﻩ)1(elihwﻩ{ ﻩP0 = LED;;)05(sm01yaleDﻩﻩ;)1,DEL(_lorc_ = DELﻩ} ﻩ} void Delay10ms(unsigned in t c){unsigned chara, b;for(;c〉0;c——){ ﻩfor(b=38;b〉0;b—-){ ﻩﻩ;)-—a;0〉a;031=a(rofﻩ} ﻩ}}实验原理利用头文件中得函数,_cro l_(,), 可以比位操作符更方便得进行 2 2 进制得移位操作, , 比位操作符优越得就是,该函数空位补全时都就是用那个移位移除得数据, , 由此比前一个例子不需要f if 语句重置操作..数码管实验实验现象单个数码管按顺序显示0-9与 A-F。
验三 8051单片机P1口应用实验1 实验目的(1)掌握P1口作为I/O口时的使用方法。
(2)理解读引脚和读锁存器的区别。
3 实验器材(1)超想-3000TB综合实验仪 1 台(2)超想3000仿真器 1 台(3)连线若干根(4)计算机 1 台4 实验原理由8051组成的单片机系统通常情况下,P0口分时复用作为地址、数据总线,P2口提供A15-A8即高8,位地址,P3口用作第二功能,只有P1口通常用作I/0口。
P1口是8位准双向口,它的每一位都可独立地定义为输入或输出,因此既可作为8位的并行I/O口,也可作为8位的输入输出端。
当工作在输入方式时,对应位的锁存器必须先置1,才能正确地读到引脚上的信号,否则,执行读引脚指令时,若对应位的锁存器的值为0,读的结果永远为0。
每个I/0端口都有两种读入,即读锁存器和读引脚,读引脚指令一般都是以I/0端口为源操作数的指令,如MOV C,P1.3,而读锁存器指令一般为“读-修改-写”指令,如ANL P1.3,C指令,请同学们在实验中体会。
图示中,P1.2作为输出口,P1.3作为输入口。
P1口作为输出实验电路实验程序ORG 0000HSTART:MOV A,#01HLP: MOV P1,AMOV R1,#10DEL1:MOV R2,#200DEL2:MOV R3,#126DEL3:DJNZ R3,DEL3DJNZ R2,DEL2DJNZ R1,DEL1RL ALJMP LPEND8路指示灯读出8路开关量的状态org 0000h ;开始loop: mov p2,#0ffhMOV A,P2 ;P2口的状态(开关)读到A MOV P1,A ;把A的数据送到P1口(指示灯)SJMP LOOP ;重新开始END广告灯实验框图实验电路程序ORG 0000H START: MOV DPTR,#TABLE LOOP: CLR AMOVC A,@A+DPTRCJNE A,#25H,LOOP1SJMP STARTLOOP1: MOV P1,AMOV R3,#20LCALL DELAYINC DPTRSJMP LOOPDELAY: MOV R4,#20D1: MOV R5,#248DJNZ R5,$DJNZ R4,D1DJNZ R3,DELAYRETTABLE: DB 01H,02H,04H,08HDB 10H,20H,40H,80HDB 01H,02H,04H,08HDB 10H,20H,40H,80HDB 80H,40H,20H,10HDB 08H,04H,02H,01HDB 80H,40H,20H,10HDB 08H,04H,02H,01HDB 00H, 0FFH,00H, 0FFHDB 00H, 0FFH,00H, 0FFHDB 25HEND实验四外部中断实验1.实验目的与要求通过本实验加深对8051单片机中断系统的理解,学习外部中断的基本使用方法和相关编程3.实验器材:(1)超想-3000TB综合实验仪 1 台(2)超想3000仿真器 1 台(3)连线若干根(4)计算机 1 台4.实验原理:MCS-51单片机有5个中断源,其中两个是由/INT0、/INT1引脚输入的外部中断源;另外三个是内部中断源即由T0、T1的溢出引起中断和串行口发送完一个字节或接收到一个字节数据引起中断。
51单片机实验报告
根据所提供的信息,我可以为您提供一个基本的51单片机实验报告的样例。
以下是一个可能的实验报告结构:
实验名称:51单片机的基本使用
实验目的:掌握51单片机的基本使用方法和功能。
实验器材:51单片机开发板、USB接口线、计算机、电源。
实验步骤:
1. 连接电源,将开发板与计算机连接。
2. 打开软件IDE,新建一个工程。
3. 在工程中编写代码,实现将LED灯进行亮灭交替的功能。
4. 将编写好的代码下载到51单片机开发板中。
5. 检查电路连接是否正确,确保没有问题。
6. 启动51单片机开发板,观察LED灯的亮灭情况。
7. 记录实验结果。
8. 关闭开发板和计算机。
实验结果:
通过编写的代码,成功地实现了LED灯的亮灭交替功能。
LED灯每隔一段时间亮起,然后又灭掉,不断循环。
实验分析:
实验结果表明,51单片机因其高性价比和广泛应用领域,可以使用简单的代码实现一些基本功能。
在这个实验中,我们使
用了51单片机的GPIO口控制LED灯的亮灭,通过不断循环的方式实现了交替闪烁的效果。
实验总结:
通过这次实验,我了解了51单片机的基本使用方法,学会了如何编写简单的代码来控制外部设备。
这对于我以后的学习和应用起到了很好的基础作用。
单片机实训报告范文精选5篇(总8页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--单片机实训报告范文精选5篇单片机课程设计心得体会在学校学习期间我有幸的参加了学校的单片机学习小组,在小组里我了解了什么是单片机,单片机有哪些用途,利用单片机可以实现哪些功能来方便人们的生活如交通灯,时钟,还有手机中,电子玩具等等,它们里面都有单片机的存在来实现某种功能。
通过在单片机小组里的学习我简单总结了几点心得和体会:第一:万事开头难,要勇敢的迈出第一步,不要总找借口说没有学习过就总推脱。
凡事都有第一步可以先可简单的来,然后可以逐步的向深层次学习。
可以从建项目开始,然后可以找一个简单的小程序先把它敲进单片机内然他运行起来,感觉一下单片机的运行,让自己了解单片机整个运行。
第二:对于知识点,学过的要掌握牢固,对于没有学的和暂时用不到的先不用学习。
比如:小灯得点亮就没有用到中断可以先不用看。
这样可以避免知识过多记不住的麻烦。
对于程序这里的知识点不能只停留在理论层次上,一定要结合着程序进行学习这样才能掌握的很牢靠,当用到哪里的知识点不记得了可以去看书,对于用不到的可以不去看。
第三:程序不要只是看别人得,一定要自己写过才是自己的。
开始不懂可以参考别人的,看看每一句代表着什么意思,能够实现什么现象。
明白之后自己再重新写一遍,你会发现看别人的能懂到自己写的时候很困难。
当你自己能写出来的时候说明你真懂了。
第四:一定要学会程序调试的方法。
有时候把程序写完了然后运行时不能实现理想的现象。
这时有人就晕了不知该怎么办,然后就去问别人。
当别人找出问题出在哪里时就会恍然大悟。
其实当遇到问题一定要自己尝试着解决,不能遇到问题就去问别人。
自己一定要掌握解决问的方法和思路。
第五:在学习初期看别人的代码,学习别人的思路这个很有用。
通过看别人的代码特别是有多年编程经验的人的程序,可以迅速提高自己的编程水平。
51单片机实验报告51单片机是一种广泛应用于控制领域的微型处理器。
本文将介绍我所进行的两个基础实验,包括实验目的、实验内容、实验原理和实验结果。
实验一——点亮LED灯实验目的:了解51单片机的基本接口和编程方法;学会使用单片机的开发工具和调试器;掌握51单片机控制LED灯的方法。
实验内容:将LED灯连接至51单片机的P1.0引脚,并进行控制。
编写程序,使得LED灯能稳定地点亮。
实验原理:单片机可通过其IO口控制外部设备,使用高低电平来控制LED灯的开关。
P1.0是51单片机的一个输出端口,可通过赋予其电平状态从而控制LED的点灯与熄灭。
当单片机输出高电平时,LED灯会点亮,否则会熄灭。
实验结果:经过编写程序和调试后,成功实现了LED灯的点亮和熄灭。
按下按键即可改变LED的状态。
实验二——数码管计数器实验目的:了解51单片机的数字口和中断响应机制;掌握编写定时器中断程序的方法;学会使用键盘进行输入和外接数码管进行输出。
实验内容:通过对8位数码管控制台的编程,实现对数字的控制,使用定时器中断实现计数器功能,加深对51单片机中断响应机制的理解。
实验原理:单片机中断请求源包括外部中断源、定时器/计数器中断源以及串口中断源。
本次实验使用定时器中断,可实现一定时间间隔内数字的加减;使用键盘进行输入,采用P3口中断请求源实现按键响应,输出则通过数码管接口外设实现。
实验结果:通过定时器计数器、中断响应和数码管接口外设,成功实现一组数字的计数。
按下按键即可进行数字的加减,并通过数码管显示出来。
结语:本文所述实验为51单片机的基础操作,相信可以为读者提供实用的参考和帮助,帮助大家更加深入地理解51单片机的基础知识和使用方法。
北京工业大学8051单片机实验实验报告学号:******** 姓名:***指导教师:*** 2017年10 月目录目录可以使用Word的目录自动生成功能生成。
引用->目录(或者更新目录),使用缺省三级即可。
第一单元单片机程序调试环境使用及并行数据传送操作训练修改例程一的源程序:(1)将A寄存器的初值改为80H(正逻辑,数据位为1表示发光二极管点亮),再对源程序进行简单修改,使程序运行后发光二极管点亮情况与修改前相同。
(2)将LED向左循环移位点亮改为向右循环移位点亮。
(3)加快LED循环移位点亮速度。
将例程二0-F的循环显示改为0-9的循环显示实验过程修改部分用粗体显示1.1(1)修改后的源程序:$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令LCALL Init_Device ;调用初始设置子程序MOV A,#080H ;赋初始值并在发光二极管上显示该数值CPL A ;将A内容按逻辑取反MOV P3,ALOOP: CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYRR A ;A寄存器内容右移1位并送发光二极管显示MOV P3,AAJMP LOOP ;无限循环DELAY: MOV R5,#0H ;延时子程序D1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END(2)修改后的源程序:$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令LCALL Init_Device ;调用初始设置子程序MOV A,#07FH ;赋初始值并在发光二极管上显示该数值MOV P3,ALOOP: CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYRL A ;A寄存器内容左移1位并送发光二极管显示MOV P3,AAJMP LOOP ;无限循环DELAY: MOV R5,#0H ;延时子程序D1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END(3)修改后的源程序:$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令LCALL Init_Device ;调用初始设置子程序MOV A,#07FH ;赋初始值并在发光二极管上显示该数值MOV P3,ALOOP: CALL DELAYCALL DELAY ;删除部分延时指令RR A ;A寄存器内容右移1位并送发光二极管显示MOV P3,AAJMP LOOP ;无限循环DELAY: MOV R5,#0H ;延时子程序D1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END1.2修改后的源程序:$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令ORG 0000HLJMP INITTAB:DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ; 段码0-7DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH ; 段码8-FINIT: LCALL Init_Device ;调试初始设置子程序INIT1: MOV R1,#00H ;操作数据初始值MOV A,R1MAIN: MOV DPTR,#TAB ;读取与A中数值对应的显示段码MOVC A,@A+DPTRMOV P5,A ;段码送并行口5显示CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYINC R1 ;操作数据(R1)增1MOV A,R1CJNE A,#0AH,MAIN ;检查操作数据是否大于显示范围(9)SJMP INIT ;无限循环DELAY: MOV R5,#0H ;延时子程序D1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END实验总结与心得体会第一次上机实验,比较简单,程序段也很短比较容易读懂。
51单片机实验报告总结51单片机实验是必修课程之一,目的是让学生了解和掌握嵌入式系统开发的基本原理和方法。
本次实验涵盖了单片机的基本操作、输入输出控制、时序控制、通信技术、中断处理、PWM技术等内容,让我们一步步进入嵌入式系统的世界。
通过这些实验,我们深刻体会到嵌入式系统开发的艰辛和复杂程度。
在每个实验中,我们需要认真思考实验目的,设计符合要求的电路,编写精确并且有效的程序。
我们还要学会阅读芯片数据手册,并对不同的芯片进行适配,合理利用芯片的资源。
这些实战经验对我们今后从事嵌入式系统开发会有很大帮助。
在这些实验中,我们学会了使用单片机进行输入输出控制。
通过外部电路(比如数码管、LED灯、按键等),让单片机可以感知外界的状态变化,并根据程序控制输出对应的信号。
我们实现了按键控制LED灯亮灭、数码管显示数字和摆动等功能。
在实验中我们还学习了流水灯和矩阵键盘控制的实现方法,这给我们后续实验和项目提供了很好的思路和解决方案。
在时序控制实验中,我们掌握了计时器和定时器的基本原理和使用方法。
它们可以精确地生成特定频率和宽度的高低电平,也能间歇性地输出脉冲信号,这为摆线电机的控制和PWM驱动电机等实际应用打下了基础。
通过这些实验,我们更加深入地了解到计时器、定时器和中断的运作原理和使用方法。
在串口通信和I2C通信实验中,我们还学习了如何使用串口和I2C通信实现数据传输,可以将单片机与其他设备进行沟通和交流。
在日常工程开发中,这样的应用场景非常广泛,例如单片机与PC的数据传输、I2C总线上多个设备之间的通信等。
在PWM技术实验中,我们学习了如何使用定时器和PWM输出控制电机转速,这些技术可以实现高精度的电机控制和驱动,这是在机器人控制、智能家居等应用中必不可少的技术。
在这些实验中,我们不仅学会了单片机的基本原理和使用方法,而且也经历了从理论到实践的探索和体验。
这些实验的收获在于训练我们的动手实践能力,增强我们的团队合作精神,提高我们的问题解决能力,也让我们更加深入地了解嵌入式系统的精髓。
8051单片机实验报告专业:电子科学与技术姓名:学号:******指导教师:***第一单元单片机程序调试环境使用及并行数据传送操作训练1-1修改例程一的源程序:将A寄存器的初值改为80H(正逻辑,数据位为1表示发光二极管点亮),再对源程序进行简单修改,使程序运行后发光二极管点亮情况与修改前相同。
$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令LCALL Init_Device ;调用初始设置子程序MOV A,#080H ;赋初始值并在发光二极管上显示该数值 CPL AMOV P3,ALOOP: CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYRR A ;A寄存器内容右移1位并送发光二极管显示 MOV P3,AAJMP LOOP ;无限循环DELAY: MOV R5,#0H ;延时子程序D1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc) ;初始设置子程序文件包含伪指令 END将LED向左循环移位点亮改为向右循环移位点亮。
$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令LCALL Init_Device ;调用初始设置子程序MOV A,#07FH ;赋初始值并在发光二极管上显示该数值 MOV P3,ALOOP: CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYRL A ;A寄存器内容右移1位并送发光二极管显示 MOV P3,AAJMP LOOP ;无限循环DELAY: MOV R5,#0H ;延时子程序D1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END加快LED循环移位点亮的速度。
(删除几个延迟指令!)$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令LCALL Init_Device ;调用初始设置子程序MOV A,#07FH ;赋初始值并在发光二极管上显示该数值MOV P3,ALOOP: CALL DELAYCALL DELAYRR A ;A寄存器内容右移1位并送发光二极管显示MOV P3,AAJMP LOOP ;无限循环DELAY: MOV R5,#0H ;延时子程序D1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END1-2将例程二0-F的循环显示改为0-9的循环显示。
$include (C8051F020.inc)ORG 0000HLJMP INITTAB:DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ; 段码0-7DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH ; 段码8-FINIT: LCALL Init_DeviceMOV R1,#00H ;操作数据初始值MOV A,R1MAIN:MOV DPTR,#TAB ;读取与A中数值对应的显示段码MOVC A,@A+DPTRMOV P5A ;段码送并行口5显示CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYINC R1 ;操作数据(R1)增1MOV A,R1CJNE A,#0AH,MAIN. ;检查操作数据是否大于显示范围(F)SJMP INIT ;无限循环DELAY:MOV R5,#0H ;延时子程序D1:MOV R6,#0HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc)END实验2.中断控制及定时器/计数器操作训练2-1通过对例程5的程序进行修改和上机调试,改变原程序的功能。
(1)将KEY2,KEY4的功能对调。
(2)每次停下再启动后,更改发光二极管点亮的循环方向。
$include (C8051F020.inc) ;C8051F02x单片机信息头文件包含伪指令 ORG 0000HLJMP INITIAL ;主程序入口ORG 0013HLJMP STAR ;外中断0服务程序入口,开始键(STAR)ORG 0003HLJMP STOP ;外中断1服务程序入口停止键(STOP)ORG 0100HINITIAL: LCALL Init_Device ;调用初始设置子程序MOV P3,#0FFH ;熄灭全部发光二极管MOV A,#0FFHMOV DPTR,#7F80HMOVX @DPTR,A ;清除数码管2(NUM2)显示MOV A,#0FEH ;点亮发光二极管的初始数据MOV R1,#1H ;发光二极管点亮位置初值MOV IP,#04H ;设置INT0(开始键STAR)为高优先级MOV TCON,#05H ;外中断采用边沿触发SETB EX1 ;INT1(停止键STOP)开中断SETB EA ;开放中断LOOP:LOOP: CLR EA ;关闭中断RL AMOV P3,A ;刷新发光二极管控制数据INC R1 ;发光二极管点亮位置计数值增1SETB EA ;开放中断LCALL DELAY1 ;延时LCALL DELAY1CJNE R1,#8,LOOP ;发光二极管点亮位置计数值有效性检测MOV R1,#0H ;发光二极管点亮位置计数值等于8则回0 SJMP LOOP ;无限次循环;停止键的中断服务程序STOP: PUSH ACC ;保护A寄存器内容MOV A,R1 ;读取发光二极管点亮位置计数值MOV DPTR,#TABMOVC A,@A+DPTR ;获取发光二极管点亮位置计数值的显示段码 MOV DPTR,#7F80HMOVX @DPTR,A ;发光二极管点亮位置计数值的显示数据送显示 SETB EX1 ;INT0(启动键STAR)开中断JNZ $ ;等待重新启动条件--A=0MOV A,#0FFHMOVX @DPTR,A ;清除数码管2(DS2)显示CLR EX1 ;禁止INT0中断(避免程序误动作)POP ACC ;恢复A寄存器内容CLR IE0 ;清除INT1中断标志(避免程序误动作) RETI ;中断返回;启动键的中断服务程序STAR: MOV A,#00H ;设置启动条件--A=0CLR IE1 ;清除INT0中断标志(避免程序误动作) RETI ;中断返回TAB: DB 0C0H,0F9H,0A4H,0B0H,099H ;0--4段码 DB 092H,082H,0F8H,080H ;5--8段码DELAY1: MOV R6,#0 ;延时子程序D1: MOV R7,#0DJNZ R7,$DJNZ R6,D1RET$include (Init_Device.inc);初始设置子程序文件包含伪指令2-2修改例程6,将计数范围由0-F扩展至00-FF(使用定时器/计时器0),并在2位数码管上用10进制数显示计数结果(00-99)。
16进制→10进制方法Hex/10:商=10进制十位,余数=10进制个位$include (C8051F020.inc)DP2 EQU 07F80HDP1 EQU 07F90H ;增加一个DP_L EQU 30HDP_H EQU 31HMAIN: LCALL Init_DeviceMOV TMOD,#00000110B ;使计数器工作在模式2MOV A,#0MOV DP_L,A ;显示计数的低位MOV DP_H,A ;显示计数高位CALL DISPLAYMOV TL0,#0 ;使TL0的初值为0SETB TR0 ;启用定时器0LOOP: MOV A,TL0CJNE A,#100,L1 ;A不等于100时,转到L1显示MOV TL0,#0 ;当A等于100时,TL0清零MOV A,TL0L1: MOV B,#10DIV AB ;将16进制数转化为10进制数MOV DP_L,BMOV B,#10DIV ABMOV DP_H,B ;将B显示为高位CALL DISPLAYSJMP LOOP ;循环LOOPDISPLAY: MOV A,DP_LCALL DECODEMOV DPTR,#DP1MOVX @DPTR,AMOV A,DP_HCALL DECODEMOV DPTR,#DP2MOVX @DPTR,AMOV P5,ARETDECODE: MOV DPTR,#TABMOVC A,@A+DPTRRETTAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8HDB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH $include (Init_Device.inc)END实验三.串行数据传送操作程序调试练习(1)将发送1,2,3,4的ASC码改为发送A,B,C,D的ASC码$include (C8051F020.inc)NUM2 EQU 07F80H ;NUM2地址NUM3 EQU 07F90H ;NUM3地址NUM4 EQU 07FA0H ;NUM4地址NUM5 EQU 07FB0H ;NUM5地址TIM_L EQU 0FDH ; T/C1低字节计数值TIM_H EQU 0FDH ;T/C1高字节计数值REC_BUF0 EQU 32H ;数据接收缓冲器0REC_BUF1 EQU 33H ;数据接收缓冲器1REC_BUF2 EQU 34H ;数据接收缓冲器2FLAG BIT 01H ;数据发送完成标志ORG 0000HLJMP MAIN ;转主程序ORG 0023HLJMP RECE ;转串行通信中断程序MAIN: lcall Init_DeviceMOV A,#0FFHMOV P5,A ;清除数码管NUM1的显示MOV DPTR,#NUM2MOVX @DPTR,A ;清除数码管NUM2的显示MOV DPTR,#NUM3MOVX @DPTR,A ;清除数码管NUM3的显示MOV DPTR,#NUM4MOVX @DPTR,A ;清除数码管NUM4的显示MOV DPTR,#NUM5MOVX @DPTR,A ;清除数码管NUM5的显示MOV R6,#0 ;通信操作状态寄存器清除MOV SP,#40H ;堆栈栈底设置MOV TMOD,#00100000B ;T/C1方式2MOV TH1,#TIM_H ;T/C1重装填值MOV TL1,#TIM_L ;T/C1计数值SETB TR1 ;启动T/C1MOV SCON0,#01010000B ;串口方式1SETB ES ;串口中断允许SETB EA ;开中断LOOP: CALL KEYBOARD ;调用案件状态分析子程序CJNE A,#0FFH,L0 ;按键状态发生变化转L0CLR FLAG ;按键状态无变化,清除发送完成标志SJMP LOOP ;L0: JB FLAG,LOOP ;数据发送完成,返回主循环MOV R7,A ;否则,键值暂存R7MOV A,#043H ;CMOV SBUF0,A ;发送字符C的ASCII码值CALL DELAY ;MOV A,#04FH ;OMOV SBUF0,A ;发送字符O的ASCII码值CALL DELAY ;MOV A,#04DH ;MMOV SBUF0,A ;发送字符M的ASCII码值CALL DELAY ;MOV A,#04BH ;KMOV SBUF0,A ;发送字符K的ASCII码值CALL DELAY ;MOV A,#30H ;发送数字0的ASCII码值MOV SBUF0,ACALL DELAY ;MOV A,R7 ;ADD A,#40H ;生成键值的ASCII码值MOV SBUF0,A ;发送键值的ASCII码值SETB FLAG ;置位发送完成标志SJMP LOOP ;中断服务程序RECE: JNB TI,REC1 ;非发送转接收处理CLR TI ;否则,清除发送中断标志RETI ;中断返回REC1: PUSH ACC ;保护累加器AMOV A,SBUF0 ;读接收缓冲器CJNE R6,#0,REC2 ;CJNE A,#43H,REC6 ;接收状态为0,进行字符C的过滤处理MOV R6,#1 ;接收状态改为1SJMP REC6 ;REC2: CJNE R6,#1,REC3 ;CJNE A,#4FH,REC5 ;接收状态为1,进行字符O的过滤处理MOV R6,#2 ;接收状态改为2SJMP REC6 ;REC3: CJNE R6,#2,REC4 ;CJNE A,#4DH,REC5 ;接收状态为2,进行字符M的过滤处理MOV R6,#3 ;接收状态改为3MOV R5,#3 ;数据接收计数器设置为3SJMP REC6 ;REC4: CJNE R6,#3,REC6 ;PUSH ACC ;接收状态为3,暂存接收的内容MOV A,#REC_BUF0ADD A,R5MOV R0,A ;生成接收数据存放缓冲器地址POP ACC ;恢复接收数据至A寄存器MOV @R0,A ;保存接收的数据DEC R5 ;接收数据计数器减1CJNE R5,#0,REC6 ;CALL DISPLAY ;接收数据计数器减为0,进行接收结果的显示REC5: MOV R6,#0 ;接收状态恢复为0(就绪状态)REC6: POP ACC ;恢复累加器ACLR RI ;清除接收中断标志RETI ;中断返回KEYBOARD: MOV A,P2 ;读按键状态输入端口RR ARR ARRC A ;KEY1有效键值移入位累加器CJC K1 ;键值无效转KEY2键值的分析MOV A,#1 ;否则,KEY1代码送A寄存器SJMP K5K1: RRC A ;KEY2有效键值移入位累加器C JC K2 ;键值无效转KEY3键值的分析MOV A,#2 ;否则,KEY2代码送A寄存器SJMP K5K2: RRC A ;KEY3有效键值移入位累加器C JC K3 ;键值无效转KEY4键值的分析MOV A,#3 ;否则,KEY3代码送A寄存器SJMP K5K3: RRC A ;KEY4有效键值移入位累加器C JC K4 ;键值无效转按键无效处理MOV A,#4 ;否则,KEY4代码送A寄存器SJMP K5K4: MOV A,#0FFH ;按键无效代码送A寄存器K5: RETDISPLAY: MOV A,REC_BUF1 ;读取接收的第2字节数据SWAP A ;高、低4位交换ANL A,#0FH ;分离高4位有效数值CALL DECODE ;换码MOV DPTR,#NUM2MOVX @DPTR,A ; NUM2显示第2字节数据高4位数值MOV A,REC_BUF1 ;读取接收的第2字节数据ANL A,#0FH ;提取低4位有效数值CALL DECODE ;换码MOV DPTR,#NUM3MOVX @DPTR,A ; NUM3显示第2字节数据低4位数值MOV A,REC_BUF2 ;读取接收的第3字节数据SWAP A ;高、低4位交换ANL A,#0FH ;分离高4位有效数值CALL DECODE ;换码MOV DPTR,#NUM4MOVX @DPTR,A ; NUM4显示第3字节数据高4位数值MOV A,REC_BUF2 ;读取接收的第3字节数据ANL A,#0FH ;提取低4位有效数值CALL DECODE ;换码MOV DPTR,#NUM5MOVX @DPTR,A ; NUM5显示第3字节数据低4位数值RET;换码程序DECODE: MOV DPTR,#TABMOVC A,@A+DPTRRET ;延时程序DELAY: MOV R5,#80HD1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RETTAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH$include (Init_Device.inc)END(2)将第二字节和第三字节互换位置$include (C8051F020.inc)NUM2 EQU 07F80H ;NUM2地址NUM3 EQU 07F90H ;NUM3地址NUM4 EQU 07FA0H ;NUM4地址NUM5 EQU 07FB0H ;NUM5地址TIM_L EQU 0FDH ; T/C1低字节计数值TIM_H EQU 0FDH ;T/C1高字节计数值REC_BUF0 EQU 32H ;数据接收缓冲器0REC_BUF1 EQU 33H ;数据接收缓冲器1REC_BUF2 EQU 34H ;数据接收缓冲器2FLAG BIT 01H ;数据发送完成标志ORG 0000HLJMP MAIN ;转主程序ORG 0023HLJMP RECE ;转串行通信中断程序MAIN: lcall Init_DeviceMOV A,#0FFHMOV P5,A ;清除数码管NUM1的显示MOV DPTR,#NUM2MOVX @DPTR,A ;清除数码管NUM2的显示MOV DPTR,#NUM3MOVX @DPTR,A ;清除数码管NUM3的显示MOV DPTR,#NUM4MOVX @DPTR,A ;清除数码管NUM4的显示MOV DPTR,#NUM5MOVX @DPTR,A ;清除数码管NUM5的显示MOV R6,#0 ;通信操作状态寄存器清除MOV SP,#30H ;堆栈栈底设置MOV TMOD,#00100000B ;T/C1方式2MOV TH1,#TIM_H ;T/C1重装填值MOV TL1,#TIM_L ;T/C1计数值SETB TR1 ;启动T/C1MOV SCON0,#01010000B ;串口方式1SETB ES ;串口中断允许SETB EA ;开中断LOOP: CALL KEYBOARD ;调用案件状态分析子程序CJNE A,#0FFH,L0 ;按键状态发生变化转L0CLR FLAG ;按键状态无变化,清除发送完成标志SJMP LOOP ;L0: JB FLAG,LOOP ;数据发送完成,返回主循环MOV R7,A ;否则,键值暂存R7MOV A,#043H ;CMOV SBUF0,A ;发送字符C的ASCII码值CALL DELAY ;MOV A,#04FH ;OMOV SBUF0,A ;发送字符O的ASCII码值CALL DELAY ;MOV A,#04DH ;MMOV SBUF0,A ;发送字符M的ASCII码值CALL DELAY ;MOV A,#04BH ;KMOV SBUF0,A ;发送字符K的ASCII码值CALL DELAY ;MOV A,#30H ;发送数字0的ASCII码值MOV SBUF0,ACALL DELAY ;MOV A,R7 ;ADD A,#30H ;生成键值的ASCII码值MOV SBUF0,A ;发送键值的ASCII码值SETB FLAG ;置位发送完成标志SJMP LOOP ;中断服务程序RECE: JNB TI,REC1 ;非发送转接收处理CLR TI ;否则,清除发送中断标志RETI ;中断返回REC1: PUSH ACC ;保护累加器AMOV A,SBUF0 ;读接收缓冲器CJNE R6,#0,REC2 ;CJNE A,#43H,REC6 ;接收状态为0,进行字符C的过滤处理MOV R6,#1 ;接收状态改为1SJMP REC6 ;REC2: CJNE R6,#1,REC3 ;CJNE A,#4FH,REC5 ;接收状态为1,进行字符O的过滤处理MOV R6,#2 ;接收状态改为2SJMP REC6 ;REC3: CJNE R6,#2,REC4 ;CJNE A,#4DH,REC5 ;接收状态为2,进行字符M的过滤处理MOV R6,#3 ;接收状态改为3MOV R5,#3 ;数据接收计数器设置为3SJMP REC6 ;REC4: CJNE R6,#3,REC6 ;PUSH ACC ;接收状态为3,暂存接收的内容MOV A,#REC_BUF0ADD A,R5MOV R0,A ;生成接收数据存放缓冲器地址POP ACC ;恢复接收数据至A寄存器MOV @R0,A ;保存接收的数据DEC R5 ;接收数据计数器减1CJNE R5,#0,REC6 ;CALL DISPLAY ;接收数据计数器减为0,进行接收结果的显示REC5: MOV R6,#0 ;接收状态恢复为0(就绪状态)REC6: POP ACC ;恢复累加器ACLR RI ;清除接收中断标志RETI ;中断返回KEYBOARD: MOV A,P2 ;读按键状态输入端口RR ARR ARRC A ;KEY1有效键值移入位累加器CJC K1 ;键值无效转KEY2键值的分析MOV A,#1 ;否则,KEY1代码送A寄存器SJMP K5K1: RRC A ;KEY2有效键值移入位累加器C JC K2 ;键值无效转KEY3键值的分析MOV A,#2 ;否则,KEY2代码送A寄存器SJMP K5K2: RRC A ;KEY3有效键值移入位累加器C JC K3 ;键值无效转KEY4键值的分析MOV A,#3 ;否则,KEY3代码送A寄存器SJMP K5K3: RRC A ;KEY4有效键值移入位累加器C JC K4 ;键值无效转按键无效处理MOV A,#4 ;否则,KEY4代码送A寄存器SJMP K5K4: MOV A,#0FFH ;按键无效代码送A寄存器K5: RETDISPLAY: MOV A,REC_BUF1 ;读取接收的第2字节数据SWAP A ;高、低4位交换ANL A,#0FH ;分离高4位有效数值CALL DECODE ;换码MOV DPTR,#NUM4MOVX @DPTR,A ; NUM2显示第2字节数据高4位数值MOV A,REC_BUF1 ;读取接收的第2字节数据ANL A,#0FH ;提取低4位有效数值CALL DECODE ;换码MOV DPTR,#NUM5MOVX @DPTR,A ; NUM3显示第2字节数据低4位数值MOV A,REC_BUF2 ;读取接收的第3字节数据SWAP A ;高、低4位交换ANL A,#0FH ;分离高4位有效数值CALL DECODE ;换码MOV DPTR,#NUM2MOVX @DPTR,A ; NUM4显示第3字节数据高4位数值MOV A,REC_BUF2 ;读取接收的第3字节数据ANL A,#0FH ;提取低4位有效数值CALL DECODE ;换码MOV DPTR,#NUM3MOVX @DPTR,A ; NUM5显示第3字节数据低4位数值RET;换码程序DECODE: MOV DPTR,#TABMOVC A,@A+DPTRRET ;延时程序DELAY: MOV R5,#80HD1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RETTAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH $include (Init_Device.inc)END。