第一篇:单片机实验报告大全
单片机原理与应用实
学校:合肥工业大学
班级:计算机科学与技术
学号:
姓名:
验报告
第一章MC51 单片机原理及应用软件实验
实验1:系统认识实验
1. 实验目的
(1)了解ZY15MCU12BC2单片机实验开发装置的接线与安排。掌握实验箱内拨位开关KF,KC的使用方法。(2)通过实例程序的编辑、编译、链接及调试,熟悉Keil C51软件的使用方法和基本操作。(3)教育学生爱抚实验装置,养成良好的实验习惯。
2. 试验设备
(1)ZY15MCU12BC2单片机实验开发装置一台。(2)PC系列微机及相关软件。
3. 试验内容
(1)使用串行通讯电缆将实验开发装置与PC机相连。
(2)开启PC机及实验开发装置,启动Keil C51软件进入uVision2集成开发环境。(3)确认拨位开关KF的开关为A端,确认89C51处于仿真状态。(4)在uVision2开发平台上建立并编辑示例程序:
计算N个数求和程序。其中N个数分别放在片内RAM区50H到55H单元中,N=6,求和的结果放在片内RAM区03H(高位)和04H(低位)单元中。
题目:
1)32H+41H+01H+56H+11H+03H=? 2)895H+02H+02H+44H+48H+12H=?(5)编译连接源程序。
(6)在Keil uVision2主菜单窗口进入DEBUG调试环境,打开存储器窗口输入数据至片内RAM区50H到55H单元中,全速运行程序,并检查程序的运行结果,即观察在存储器窗口片内RAM区03H(高位)、04H(低位)单元中的数据是否正确。(7)实验结束,撤出接线,将一切整理复原。
4.实验源程序
ORG 0000H LJMP MAIN ORG 1000H MAIN: MOV R2,#06H MOV R3,#03H MOV R4,#04H MOV R0,#50H L1: MOV A,R4 ADD A,@R0 MOV R4,A INC R0 CLR A ADDC A,R3 MOV R3,A DJNZ R2,L1 END
5.实验结果截图
6.实验总结
这次试验,熟悉了单片机开发的基本流程,对于实验的两道题目 1)32H+41H+01H+56H+11H+03H=? 2)895H+02H+02H+44H+48H+12H=? 实验结果如上图所示50H~54H存放数据,第一道题计算出来是0x00DEH,第二道题目 计算出来是0x0137H,实验结果和预期相符,成功的完成了实验。这次试验对硬件开发有了基本的认识,特别是对于单片机的存储器有了进一步的认识,在程序中把数据放入RAM中,结果存放在R3和R4中,实验时不知道R3和R4的地 址,后来了解到R3和R4可以直接用他的地址03H和04H,这样进一步深化了书本上 的知识。另外通过这次试验,对于51单片机的几种寻址方式也有了具体的认识。总之,还是要多动手虽然程序不是自己写的,但是阅读理解了还是有点收获的。
实验六.数据排序实验
1. 实验目的
(1)理解并掌握排序程序的设计方法。(2)掌握减法指令的功能,并联系其使用。
(3)逐步提高调试程序的能力及编写程序的能力。
2. 试验设备
(1)ZY15MCU12BC2单片机实验开发装置一台。(2)PC系列微机及相关软件。
3. 试验内容
(1)使用串行通讯电缆将实验开发装置与PC机相连。
(2)开启PC机及实验开发装置,启动Keil C51软件进入uVision2集成开发环境。
(3)编写程序,实现从平台连续输入六个数,数码管将马上从小到大的顺序显示这六个数。要求被排序的数放在70H到7FH单元中。(4)编译连接源程序。
(5)调试程序,在存储器窗口输入被排序数放在70H到7FH单元中,全速运行程序,并检查程序员的运行结果,观察是否正确。
(5)若程序中出现错误,则可以采用单步分段调试,排除程序错误,直到正确为止。
4.实验源程序
MAIN:
LOP2:
LOP1:
LOP5:
ORG 0000H LJMP MAIN ORG 0030H MOV R2,#70H MOV R3,#71H MOV R4,#0FH ACALL LOP1 DJNZ R4,LOP2 LJMP LOP6 MOV A,R2 MOV R0,A MOV A,R3 MOV R1,A MOV A,@R0 CLR C SUBB A,@R1 JC LOP4 MOV A,@R0 XCH A,@R1
LOP4:
LOP6:
MOV @R0,A INC R1 INC R0 MOV A,@R0 CJNE
R1,#80H,LOP5 RET END 5.实验结果截图
6.实验总结
本次试验是在冒泡排序算法实现对70H~7FH中的数据进行排序,如上第一张图所示RAM中70H~7FH存放了数据,第二张图显示的是通过冒泡排序整理过的数据。成功完成了实验,收到了预期效果。
对于习惯了使用高级语言编程的我,看这些绕来绕去的汇编还是有些头大,觉得这个例子写的不太好,跳来跳去,程序层次不分明,可读性很差,冒泡不应该有内外两层吗,看书上有一个例子就写得很好,跟用高级语言写差不多,然而实验的这个好像是要考我们对各种跳转指令的了解,所以读起来晕头转向的。从另一方面来说,通过这次试验,我也熟悉了汇编的跳转与分支指令。另外,所以ORG 0000H
LJMP MAIN
ORG 0030H,这三句ljmp这句跳到了main,那么还要后面一句干嘛。不甚理解。
总之,这次实验让我了解了各种分支与跳转,还是有所收获的。
第二章MC51 单片机原理及应用硬件实验
实验一:广告灯实验
1. 实验目的
(1)熟悉ZY15MCU12BC2单片机实验开发装置的试验箱,学会选用其功能电路,连接成实验需要的系统。掌握实验箱内拨位开关KFKC使用。(2)加深了解MCS-51单片机P1端口的应用方法。(3)学习编写接口应用程序。
2.试验设备
(1)ZY15MCU12BC2单片机实验开发装置一台。(2)PC系列微机及相关软件。
3. 试验内容
(1)使用串行通讯电缆将实验开发装置与PC机相连,确认拨位开关KF的位置。(2)开启PC机及实验开发装置,启动Keil C51软件进入uVision2集成开发环境,确认89C51处于仿真状态。
(3)用试验箱上的发光二极管L0到L7模拟外界各种场合的动态广告灯,将试验箱上的发光二极管L0到L7分别与单片机的P1.0到P1.7相连。
(4)编写程序,实现从P1口输出信号驱动发光二极管L0到L7模拟外界广告灯动态点亮的功能。
(5)在uVision2开发平台上输入程序,编译、连接程序,调试通过后将拨位开关KF拨至B端。
(6)单步执行程序,观察是否进入表格首地址。
(7)单步执行程序,观察发光二极管L0到L7的变化。
(8)全速运行程序,观察发光二极管L0到L7的变化,并注意程序将循环下去。(9)实验结束,撤除接线,将一切整理复原。
4.实验源程序
ORG 0000H MAIN: MOV DPTR,#TAB
MOV R5,71H LOOP: MOV A,#00H
MOVC A,@A+DPTR
MOV P1,A
ACALL DELAY
ACALL DELAY
INC DPTR
DJNZ R5,LOOP
LJMP MAIN DELAY: MOV R7,#00H
MOV R6,#00H DE:
DJNZ R7,$
DJNZ R6,DE
RET TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
DB 0FFH,7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH
DB 80H,00H,80H,0C0H,0E0H,0F0H,0F8H,0FCH
DB 0FEH,0FFH,7FH,3FH,1FH,0FH,07H,03H
DB 01H,00H,01H,03H,07H,0FH,1FH,3FH
DB 7FH,0FFH,7EH,3CH,18H,00H,18H,3CH
DB 7EH,0FFH,0FEH,0FCH,0FCH,0F9H,0F3H,0E7H
DB 0CFH,9FH,3FH,7FH,0FFH,7FH,3FH,9FH
DB 0CFH,0E7H,0F3H,0F9H,0FCH,0FEH,0FFH
DB 0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,80H,00H
DB 80H,40H,20H,10H,08H,04H,02H,01H,00H
DB 01H,02H,04H,08H,10H,20H,40H,80H,00H
DB 80H,0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH
END
5.实验结果
6.实验总结
广告灯按照程序所给的效果循环的有序的点亮,如果应用到广告霓虹灯,的确可以到达璀璨的效果,程序的最后的TAB是最纠结的,你要按照效果一点一点的编写十六进制的数字,换算出效果,可见真正的商业广告的效果的确是很麻烦的一件事,通过这个实验,我清楚地认识到了单片机的控制的灵活性,另外对于查表指令也有所理解。实验二:P1端口应用实验
1.实验目的
(1)进一步熟悉ZY15MCU12BC2实验箱上的资源,掌握实验箱内拨位开关KF,KC使用。(2)加深了解MCS-51单片机P1端口的应用方法。(3)学习编写接口应用程序。
2.试验设备
(1)ZY15MCU12BC2单片机实验开发装置一台。(2)PC系列微机及相关软件。
3. 试验内容
(1)使用串行通讯电缆将实验开发装置与PC机相连,确认拨位开关KF的位置。(2)开启PC机及实验开发装置,启动Keil C51软件进入uVision2集成开发环境,确认89C51处于仿真状态。
(3)将试验箱上的L0到L3接到P1.0到P1.3,开关K0到K3接到P1.4到P1.7。(4)编写程序实现如下功能: 拨动K0到K3,使L0到L3出现以下组合变化。K3 K2 K1 K0 L3 L2 L1 L0 0 0 0 0 全亮 0 0 0 1 全暗
0 0 1 0 一灯亮其余灯暗并左环依 0 0 1 1 一灯亮其余灯暗并右环依 0 1 0 0 一灯暗其余灯亮并左环依 0 1 0 1 一灯暗其余灯亮并右环依 ? ? ? 显示开关状态Ki为0,Li灯亮 要求:
1)设40H单元为标志单元,(40H)=0时开关状态无变化,(40H)=FFH时开关状态发生变化。
2)设41H单元为开关状态缓冲器,读入开关状态和41H单元内容比较,相同时开关状态无变化,不同是开关状态有变化。3)设42H单元为当前指示灯状态。
(4)在uVision2开发平台上输入程序,编译、连接程序,调试通过后将拨位开关KF拨至B端。
(5)根据准双向口的特性,对P1口写操作使灯L0到L7的状态随写入P1.0到P1.3的内容而变化;读P1口的高四位,读出内容随开关状态的变化而变化。如不对,则检查开关K0到K3的接线,检查K0到K3的电平是否随开关状态变化而变化。
(6)从开始运至BK1处,检查A的内容是否对应开关状态,接着单步运行程序,检查是否转到相应入口使L0到L3状态产生相应的变化。(7)全速运行程序至BK2,在检查A的内容是否与开关状态一致,如不对,则检查前面对P1口的操作指令。
(8)全速运行程序实现所要求的功能。
4.实验源程序
ORG 0000H STRL: MOV A,P1
SWAP A
ANL A,#0FH
MOV 41H,A
MOV 40H,#0FFH MLP0: CJNE A,#6,$+3
JNC PK6
MOV DPTR,#CTAB
MOV R1,A
RL
A
ADD A,R1
JMP @A+DPTR CTAB: LJMP PK0
LJMP PK1
LJMP PK2
LJMP PK3
LJMP PK4
LJMP PK5 PK6:
MOV 42H,A
LJMP MLP1 PK5:
MOV A,40H
CJNE A,#0FFH,PK51
MOV 42H,#01
LJMP MLP1 PK51: MOV A,42H
LCALL RR7
ANL A,#0FH
JNZ PK52
MOV A,#1 PK52: MOV 42H,A
LJMP MLP1 PK4:
MOV A,40H
CJNE A,#0FFH,PK41
MOV 42H,#1
LJMP MLP1 PK41: MOV A,42H
LCALL RL9
ANL A,#0FH
JNZ PK42
MOV A,#1 PK42: MOV 42H,A
LJMP MLP1 PK3:
MOV A,40H
CJNE A,#0FFH,PK31
MOV 42H,#0F7H
LJMP MLP1 PK31: MOV A,42H
LCALL RR9
ANL
A,#0FH
CJNE A,#0FH,PK32
MOV
A,#0F7H PK32: ORL
A,#0F0H
MOV
42H,A
LJMP MLP1 PK2:
MOV
A,40H
CJNE A,#0FFH,PK21
MOV
42H,0FEH
LJMP MLP1 PK21: MOV
A,42H
RL A
ANL A,#0FH
CJNE A,#0FH,PK22
MOV A,#0FEH PK22: ORL A,#0F0H
MOV 42H,A
LJMP MLP1 PK1:
MOV 42H,#0FH
LJMP MLP1 PK0:
MOV 42H,#0 MLP1: MOV A,42H
ORL A,#0F0H
MOV P1,A
MOV R7,#0
MOV R6,#0 DEL1: DJNZ R6,DEL1
DJNZ R7,DEL1
MOV
A,P1
SWAP A
ANL A,#0FH
CJNE A,41H,MLP2
MOV 40H,#0
LJMP MLP0 MLP2: MOV 41H,A
MOV 40H,#0FEH
LJMP MLP0 RR9:
RR A
RR A RR7:
RR A
RR A
RR A
RR A
RR A
RR A
RR A
RET RL9:
RL A
RL A RL7:
RL A
RL A
RL A
RL A
RL A
RL A
RL A
RET
END
5.实验结果截图
6.实验结论
试验中我们把P1口作为输入输出口来测试以下的内容 1.P1 口做输出口,接八只发光二极管循环点亮。2.P1 口低四位接四只发光二极管L1-L4, P1 口高四位接开关K1-K4,编写程序,将开关的状态在发光二极管上显示出来。
在这次试验中我认识到课本上的关于P1口的介绍的知识 P1 口为准双向口,P1 口的每一位都能独立地定义为输出线或输入线,作为输入的口线,必须向锁存器相应位写入“1”,该位才能作为输入。8031中所有口锁存器在复位时均置为“1”,如果后来往口锁存器写入过“0”,再作为输入时,需要向口锁存器对应位写入“1”。延时程序的编写可以用两种方法,一种是用定时器来实现,一种使用指令循环来实现。在系统时间允许的情况下可以采用后一种方法。
实验三:串转并实验
1.实验目的
(1)掌握51系列单片机串口工作方式0的应用。
(2)学习8位串行输入和并行输出的同步移位寄存器74LS164和8位并行输入和穿行 输出的同步移位寄存器74LS165两个接口芯片的应用性能。(3)研究单片机串行口如何用于扩展并行I/O口。
2.试验设备
(1)ZY15MCU12BC2单片机实验开发装置一台。(2)PC系列微机及相关软件。
3. 试验内容
(1)使用串行通讯电缆将实验开发装置与PC机相连,确认拨位开关KF的位置。(2)开启PC机及实验开发装置,启动Keil C51软件进入uVision2集成开发环境,确 认89C51处于仿真状态。(3)实验步骤:
1)通过单片机串口用一片8位串行输入/并行输出的同步移位寄存器74LS164扩展 8位并行输出口。
2)通过单片机串口用一片8位并行输入/串行输出的同步移位寄存器74LS165扩展 8位并行输入口。(4)将单片机的RXD端与74LS164的串行输入端SERIAL(PA)相连,将单片机的TXD 端与74LS164的脉冲CLOCK(PB)相连,74LS164的输出Q0到Q7接发光二极管 L8到 L15。(5)调试程序:
1)实验采用终端方式调试,既目标程序装入仿真器后,使操作界面进入终端方式。2)单步进入执行程序,打开Keil的寄存器窗口,观察串口数据缓冲区SBUF里的值有何变化。
3)单步执行程序,注意中断标志T1的变化以及所亮的发光二极管的位置。
4.实验源程序
ORG 0000H SJMP MAIN ORG 0023H SJMP SBV MAIN: MOV SCON,#00H SETB EA SETB ES MOV A,#80H MOV SBUF,A MOV SBUF,A MOV SBUF,A SJMP $ SBV: ACALL DELAY CLR T1 RR A MOV SBUF,A RETi DELAY: MOV R7,#00H MOV R6,#00H DEL: DJNZ R7,$
5.实验结果截图
6.实验结论
在实验中我明白了串行口和并行口的相关知识8位串行输入和并行输出的同步移位寄存器74LS164和8位并行输入和穿行输出的同步移位寄存器74LS165两个接口芯片的应用性能。知道了单片机串行口如何用于扩展并行I/O口
第二篇:单片机实验报告[范文模版]
实 实 验 验 报 报 告
实验课程:
单片机原理及应用
班
级:
自动化 2 班
学
号:
姓
名:
教
师:
张
玲
成绩:
实 验 日 期 :
****年**月**日
实验名称:
实验 1-—计数显示器
一、实验目得: 学习Proteus 软件得使用,掌握单片机原理图得绘图方法。
二、实验内容:
ﻩ1、绘制“计数显示器”电路原理图;2、利用提供得hex 文件验证此电路得运行效果。
三、实验要求:
提交得实验报告中应包括:1、绘图方法简述,要求说明元件与电源得选取、摆放及属性编辑,总线与标签得画法等内容;2、电路原理图;3、仿真运行效果展示,要求就仿真文件加载方法及 3~4幅运行截图进行简要说明;4、实验小结,说明遇到得主要问题或实验 1 体会等.参考电路原理图如下:
元件类别 电路符号 元件名称 Microprocessor ICs “U1“ 80C51 Miscellaneous “X1”/12MHz CRYSTAL Capacitors “C1”~“C2”/1nF CAP Capacitors “C3”/22μF CAP—ELEC Resistors Packs “RP1“/7—100Ω RESPACK—7 Resistors “R1"/100Ω RES Optoelectronics “LED1”~“LED2” 7SEG--CAT-GRN Switches & Relays “BUT” BUTTON 1、、及 编程思路及 C51 源程序:
2、电路原理图:
:
3、仿真运行效果展示:
4、实验小结 :
熟悉Proteus 软件,了解软件得结构组成与功能;学习ISIS 模块得使用方法,学会设置图纸、选元件、线画总线、修改属性等基本操作;学会可执行文件 加载及程序仿法;理解Proteus在单片机开发中得作用,完成单片机电路原 理图得绘制. 实验名称:
实验 2——LED 指示灯循环控制
一、实验目得 熟悉μVision3 编译软件、掌握 C51编程与调试方法。
二、
实验内容 1、按照教材 P243 得图 A、34,绘制实验二电路原理图; 2、编写 C51 程序,实现 8 个 LED 灯依次点亮得功能: P0、0→P0、1→ P0、2→P0、3→ ┅ →P0、7→P0、6→P0、5→ ┅ →P0、0 得顺序,无限循环,间隔约50ms; 3、观察仿真结果,完成实验报告。
三、
实验要求 1、采用两种加载并运行可执行文件得方法,即proteus独立运行与prote
us + Keil 联合运行,体会其中得差异与意义;2、练习采用单步、断点以及监视窗等手段进行程序调试得方法;3、观察仿真结果,完成实验报告:绘制得电路原理图、编程思路分析及 C51源程序、调试过程简述,仿真运行效果以及实验小结。、电路原理图:
:
及 2、编程思路及 C51 源程序:、仿真运行效果:、实验小结 :
通过本次实验我熟悉 uVision3 编译软件了解软件得结构组成与功能学习C51 语言得程序设计方法)学会在 uVision3中进行 C51 程序录入、编译、与 调试理解 Proteus 与 Keil 联合得仿真原理实现 LED 指示灯循环控制功能。
更好得将 C 语言与 C51 语言联系在了一起)学到得知识能准确得利用了出来。
实验名称:
实验3——指示灯与数码管得中断控制
一、实 验目得 掌握外部中断得工作原理,学会中断程序设计.二、实验内容 1、按照教材帕图 A、53,绘制实验四电路原理图;2、要求采用外部中断原理完成本次实验,其中按键 K1、K2 均设置为下降沿触发方式,自然优先级; 3、编写 C51 程序实现如下功能:开机后 D1灭灯,LED1黑屏,随后单击 K1→D1状态反转,单击 K2 →LED1 从 0 开始循环显示0~F 字符。
4、观察仿真结果,完成实验报告。
三、
实验要求 提交得实验报告中应包括:电路原理图,外部中断工作原理阐述(以 K1 为例说明中断响应过程),C51 源程序(含流程图与注释语句),运行效果(含运行截图
与说明),实验小结. 1、电路原理图 :
2、外部中断工作原理阐述:
持续按下 K1 则 D1 将“亮→灭→亮→灭→„→亮→灭如此循环,表明实现了 K1 对应于 D1 状态反转这个功能;持续按下持续按 K2 则数码显示管依次显 示 1-F,实现了 K2 对应于 0~F 间得数码管加一计数显示.
3、、及 编程思路及 C51 源 源 程序:、仿真运行效果:
5、实验小结:
通过实验对 Protues 有了更多得了解,同时了解到中断系统在实际中得更好 应用。经过编程操作起来更加熟练能很快得完成绘图,编程时也得心应手,能熟练得运用软件找出自己所编程中得语法问题及其她问题,并以改正。
实验名称:
实验4—-电子秒表显示器
一、实 实 验目得 掌握定时/计数器得中断法工作原理,熟悉 C51 编程与调试方法
二、实验要求:
1、实验电路原理图如教材 P260 A、65 图所示.程序开始时显示“00”;当1s 产生时,秒计数加1;秒计数到 59 后,自动从“00”开始。
2、采用12MHz晶振频率,T0 定时方式 1、50ms 定时中断法编程(1s 需要经过 20 软循环)(流程图与参考程序模版如下所示).//定时中断方式实现得电子秒表
15()件文头ﻩ(定义无符号字符型变量 t—-中断次数计数器,并赋初值0(定义无符号字符型变量 second—-秒计数器,并赋初值 0(定义位于 ROM 区得无符号字符型数组table-—显示字模)timer0()
(中断函数关键词){ ﻩ()0T 闭关ﻩ(初值重装载 0x3cb0)
()1增器数计数次断中ﻩ {)02==t(fiﻩﻩ
ﻩ
// 秒1于当相,次 02断中若ﻩ
;0=tﻩﻩﻩﻩﻩﻩﻩﻩ //中断次数计数器清零 ﻩ
;++dnocesﻩﻩ ﻩ // 零清器数计秒ﻩ
}()零清,06 到达值器数计秒若ﻩﻩ()值示显得 dnoces 量变出输别分口 2P与0Pﻩ()0T动启ﻩﻩ} main(){
ﻩ
;]01/dnoces[elbat=0Pﻩﻩ // 值示显出输别分口 2P 与 0Pﻩ
;]01%dnoces[elbat=2Pﻩ(定义T0 定时方式 1—-TMOD)05()0LT与0HT——载加0bc3x0值初出溢 smﻩ()AE,0TE——化始初断中ﻩ(启动 T0)
(死循环)3、编程思路及C1 51 源程序: :
4、仿真运行效果:
5、实验小结 :
本次实验进行得比较顺利,根据指导材料中提供得流程图完成了源程序得编 写,成功生成了、hex文件,经过仿真运行达到了预期得实验结果.通过本次得 实验,我更加深入得了解到单片机定时/计数功能实现得机理,通过与单片机中 断功能得结合,可以完成更多得预期功能。但就是进过讨论我也发现,程序还就是存 在很大得缺陷,想要实现更加准确实现计时功能还需综合利用各种知识完善程 序。
第三篇:单片机实验报告
《单片机原理及应用》
实 验 报 告
2017—2018学年第一学期
班级: 152 专业: 电子科学与技术 姓名: 子路 学号: 教师:
实验一:Keil C51
一、实验目的
1、熟悉Keil C51单片机应用开发系统
2、熟悉Keil C51的调试技巧
二、实验内容
1、安装好了Keil软件以后,我们打开它。打开以后界面如下:
2、我们先新建一个工程文件,点击“Project->New Project„”菜单,如下图:
3、选择工程文件要存放的路径 ,输入工程文件名 LED, 最后单击保存.4、在弹出的对话框中选择 CPU 厂商及型号
5、选择好 Atmel 公司的 AT89S52 后 , 单击确定
6、在接着出现的对话框中选择“是”。
7、新建一个 C51 文件 , 单击左上角的 New File 如下图所示:
8、保存新建的文件,单击SAVE如下图:
9、在出现的对话框中输入保存文件名MAIN.C(注意后缀名必须为.C),再单击“保存”,如下图:
10、保存好后把此文件加入到工程中方法如下 : 用鼠标在 Source Group1 上单击右键 , 然后再单击 Add Files to Group ‘Source Group 1' 如下图:
11、选择要加入的文件 , 找到 MAIN.C 后 , 单击 Add, 然后单击 Close
12、在编辑框里输入如下代码:
13、到此我们完成了工程项目的建立以及文件加入工程 , 现在我们开始编译工程如下图所示 : 我们先单击编译, 如果在错误与警告处看到 0 Error(s)表示编译通过:
14、生成.hex 烧写文件,先单击Options for Target,如图:
15、在下图中,我们单击 Output, 选中 Create HEX F。再单击“确定”
16、打开文件夹‘实验1’,查看是否生成了HEX文件。如果没有生成,在执行
一遍步骤10到步骤12,直到生成。
三、实验工具(软件、硬件等)
1、Keil
2、计算机
实验二:Proteus软件学习
一、实验目的
1、了解Proteus的基本功能
2、熟悉Proteus的设计环境Preoteus ISIS及第三方编译工具Keil
3、掌握Proteus中实现单片机系统设计与仿真的步骤与方法
二、实验内容
设计与仿真的开发过程
Proteus强大的单方机系统设计与仿真功能,使之成为单片机系统应用开发和改进手段之一。
开发的整个过程都是在计算机上完成的,其过程一般分为三步: 1)Proteus 电路设计:在ISIS平台上进行单片机系统电路设计、选择元器件、接插件、连接电路和电气现则检查等。
2)Proteus 源程序设计和生成目标代码文件:在ISIS平台上或借助第三方编译工具进行单片机系统程序设计、编辑、汇编编译、代码级调试,最后生成目标代码文件(*hex)。
3)Proteus仿真:在ISIS平台上将目标代码文件加载到单片机系统中,由此实现系统实时交互与协同伤真。
三、实验工具(软件、硬件等)
1、载有Proteus的计算机一台
实验三:LED流水灯
一、实验目的
1、用Keil软件编写程序并利用开发板仿真
2、学习LED灯工作原理
二、实验内容
延时实现LED流水灯效果P2口八个灯作跑马灯。采用了寄存器存中间数。
三、实验工具(软件、硬件等)1.载有Keil软件的计算机一台 2.开发板一套
四、实验结果及分析
实验四:静态数码管
一、实验目的
1、用Keil软件编写程序并利用开发板仿真
2、学习静态显示管工作原理
二、实验内容
静态数码管流动显示0~9
二、实验工具(软件、硬件等)1.载有Keil软件的计算机一台 2.开发板一套
四、实验结果及分析
实验五:按键移位动态显示
一、实验目的
1、用Keil软件编写程序并利用开发板仿真
2、学习静态显示管工作原理
二、实验内容
静态显示管,按键不同显示不同
三、实验工具(软件、硬件等)1.载有Keil软件的计算机一台 2.开发板一套
四、实验结果及分析
实验六:中断INT0+INT1
一、实验目的
1、用Keil软件编写程序并利用开发板仿真
2、学习中断INT0和INT1的工作原理
二、实验内容
试验数码管上显示外部中断计数,用单片机脚直接控制数码管和外部中断使用
三、实验工具(软件、硬件等)1.载有Keil软件的计算机一台 2.开发板一套
四、实验结果及分析
第四篇:单片机实验报告
目录
第一章单片机简介....................................................2 第二章
实验要求..................................................3 第三章实验设备......................................................3 第四章实验安排......................................................4 第五章实验内容......................................................4
LED灯实验.......................................................4 步进马达试验....................................................5 独立按键控制LED实验............................................7 矩阵键盘实验....................................................9 静态数码管实验.................................................12 动态数码管实验.................................................14 NE555脉冲发生器实验(定时/计数器).............................16 RS232串口通信实验(接收与发送)..................................21 第六章收获体会.....................................................25
单片机实验报告
第一章单片机简介
单片机也被称为微控制器(Microcontroller),是因为它最早被用在工业控制领域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!
单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。
1.SCM即单片微型计算机(Single Chip Microcomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。在开创嵌入式系统独立发展道路上,Intel公司功不可没。
2.MCU即微控制器(Micro Controller Unit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关,因此,发展MCU的重任不可避免地落在电气、电子技术厂家。从这一角度来看,Intel逐渐淡出MCU的发展也有其客观因素。在发展MCU方面,最著名的厂家当数Philips公司。
Philips公司以其在嵌入式应用方面的巨大优势,将MCS-51从单片微型计算机迅速发展到微控制器。因此,当我们回顾嵌入式系统发展道路时,不要忘记Intel和Philips的历史功绩。
3.单片机是嵌入式系统的独立发展之路,向MCU阶段发展的重要因素,就是寻求
单片机实验报告
应用系统在芯片上的最大化解决;因此,专用单片机的发展自然形成了SoC化趋势。随着微电子技术、IC设计、EDA工具的发展,基于SoC的单片机应用系统设计会有较大的发展。因此,对单片机的理解可以从单片微型计算机、单片微控制器延伸到单片应用系统。
MCS51系列微控制器应用广泛,在家电、汽车甚至航空等领域都有其活跃的身影。然而,普通51系列微控制器内部资源有限,像我用Proteus构建微控制器虚拟实验室选用的AT89C52只有三个定时器、一个全双工的串行口和中断控制,并且其数据处理能力有限,不适合对大量数据进行复杂分析和运算。
因此,在不重新选型(可选用SoC)的前提下,为实现我们所需要的功能,就需要进行外围扩展。针对微控制器的特点,我们首先考虑串行扩展,因为微控制器的I/O引脚有限,并行扩展一则外围芯片面积比较大,二则对抑制EMI不利。
第二章 实验要求
1.学习Keil C51集成开发工具的操作及调试程序的方法,包括:仿真调试与脱机运行间的切换方法
2.熟悉TD-51单片机系统板及实验系统的结构及使用
3.进行MCS51单片机指令系统软件编程设计与硬件接口功能设
4. 学习并掌握Keil C51软件联机进行单片机接口电路的设计与编程调试
5.完成指定MCS51单片机综合设计题
第三章实验设备
1.HC600S-51单片机开发板 2.Keil C51 3.普中自动下载软件
第四章 实验安排
1.LED灯实验
单片机实验报告
2.步进马达试验
3.独立按键控制LED实验 4.矩阵键盘实验 5.静态数码管实验 6.动态数码管实验
7.NE555脉冲发生器实验(定时/计数器)8.RS232串口通信实验(接收与发送)
第五章 实验内容
一、LED灯实验
1.基本要求
利用位移循环指令实现LED灯的闪烁 2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图
4.电路原理图
单片机实验报告
5.程序
#include
main(){unsigned int i;while(1)
{for(i=0,P0=1;i<4;i++){d(500);P0=(P0<<2);}}}
二、步进马达试验
1.基本要求
编程实现马达的正反转,调速等功能 2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图(图一)
单片机实验报告
图一 图二
4.电路原理图
上图图二 5.程序
#include “reg52.h” #define speed 2 sbit PH1 = P1^0;
//定义管脚 sbit PH2 = P1^1;sbit I01 = P1^2;sbit I11 = P1^3;sbit I02 = P1^4;sbit I12 = P1^5;
void delay(int time);
void Go(){ //A
PH1 = 0;//PH1为0 则A线圈为反向电流
I01 = 0;I11 = 0;
//以最大电流输出
PH2 = 0;//PH2为0 则B线圈为反向电流
I02 = 1;I12 = 1;
//输出0 delay(speed);//圈为反向电流
I01 = 1;//输出0 I11 = 1;
PH2 = 1;//PH2为1 则B线圈为正向电流
I02 = 0;//以最大电流输出
I12 = 0;
delay(speed);//B PH1 = 1;
//PH1为1 则A线圈为
正向电流
I01 = 0;
//以最大电流输出
I11 = 0;
PH2 = 1;//PH2为1 则B线圈为正
向电流
I02 = 1;//输出0 I12 = 1;
delay(speed);
PH1 = 1;
//PH1为1 则A线圈为正向电流
I01 = 1;I11 = 1;
PH2 = 0;
//PH2为0 则B线圈为反向电流
I02 = 0;I12 = 0;delay(speed);}
void delay(int time){
int i,j;
for(j=0;j <= time;j++)
for(i =0;i <= 120;i++);}
void main(){
while(1)
{
Go();//步进电机运行
} }
单片机实验报告
三、独立按键控制LED实验
1.基本要求
通过编程控制8个独立按键分别控制8个LED灯的开关 2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图(图一)
图一 图二
4.电路原理图 上图图二 5.程序
#include
P1口
#define uchar unsigned char #define uint unsigned int
void Delayms(unsigned int c);
//延时10ms uchar Key_Scan();void main(void){
unsigned char ledValue, keyNum;
ledValue = 0x01;
while(1)
{
keyNum = Key_Scan();//扫描键
盘
switch(keyNum)
{
case(0xFE):
//返回按
键K1的数据
ledValue = 0x01;
break;
单片机实验报告
case(0xFD):
ledValue = 0x02;
break;case(0xFB):
ledValue = 0x04;
break;case(0xF7):
ledValue = 0x08;
break;case(0xEF):
ledValue = 0x10;
break;case(0xDF):
ledValue = 0x20;
break;case(0xBF):
ledValue = 0x40;
break;case(0x7F):
ledValue = 0x80;
//返回按键K2的数据
//返回按键K3的数据
//返回按键K4的数据
//返回按键K5的数据
//返回按键K6的数据
//返回按键K7的数据
//返回按键K8的数据
break;default:
break;
}
GPIO_LED = ledValue;//点亮LED灯
}
}
uchar Key_Scan(void)//键盘扫描函数 { uchar i,n=0xff;
if(P1==0xff)goto Scan_r;//无键按
下,返回
goto Scan_r;Scan_1:
while(P1!=0xff);//等待键释放
Delayms(10);Scan_r:
return n;}
void Delayms(uint x){
uint n;
for(;x>0;x--)
{
for(n=0;n<123;n++)
{;}
} }
四、矩阵键盘实验
1.基本要求
编程由16个矩阵按键控制数码管显示相应的数值 2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。
3.接线图
单片机实验报告
见下图图一
图一 图二
4.电路原理图
见上图图二 5.程序
#include
uchar ScanKey(void);void Delayms(uint x);main(){ unsigned char ledValue;uchar i;ledValue = 0x01;loop: i = ScanKey();
switch(i)
{ case 0xee:
ledValue = ~0x3F;
break;
case 0xde:
ledValue = ~0x06;
break;
case 0xbe:
ledValue = ~0x5B;
break;
case 0x7e:
ledValue = ~0x4F;
break;
case 0xed:
ledValue = ~0x66;
break;
case 0xdd:
ledValue = ~0x6D;
break;
单片机实验报告
case 0xbd:
ledValue = ~0x7D;
break;
case 0x7d:
ledValue = ~0x07;
break;
case 0xeb:
ledValue = ~0x7F;
break;
case 0xdb:
ledValue = ~0x6F;
break;
case 0xbb:
ledValue = ~0x77;
break;
case 0x7b:
ledValue = ~0x7C;
break;
case 0xe7:
ledValue = ~0x39;
break;
case 0xd7:
ledValue = ~0x5E;
break;
case 0xb7:
ledValue = ~0x79;
break;
case 0x77:
ledValue = ~0x71;
break;
}
GPIO_LED = ledValue;i=0;goto loop;}
void Delayms(uint x){uint n;for(;x > 0;x--)
{ for(n=0;n<123;n++)
{;}
} }
uchar ScanKey(void)//键盘扫描函数 { uchar i,n=0xff;
P1=0xf0;
if(P1==0xf0)goto Scan_r;//无键按下,返回
for(i=0,P1=0xfe;i<4;i++)
{ if((P1&0xf0)!=0xf0)
{ Delayms(10);
if((P1&0xf0)!=0xf0)
{ n=
P1;
goto
Scan_1;}
}
P1=(P1<<1)+1;
//扫描下
一行
} goto Scan_r;Scan_1:
单片机实验报告
P1=0xf0;while((P1&0xf0)!=0xf0);//等待键
释放
Delayms(10);
Scan_r:
P1=0xff;return n;} }
五、静态数码管实验
1.基本要求
编程使数码管显示字符0-F 2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线框图(图一)
图一
单片机实验报告
图二
4.电路原理图
见上图图二 5.程序
#include
{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D, ~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};main(){
unsigned int LedNumVal;//定义变量 while(1)
{
// 将字模送到P0口显示
LedNumVal++;
P0 = LED7Code[LedNumVal%16];
Delayms(1000);
//调用延时程序
}
}
单片机实验报告
void Delayms(uint x){uint n;for(;x > 0;x--)
{ for(n=0;n<123;n++)
{;}
} }
六、动态数码管实验
1.基本要求
编程实现8个数码管的动态扫描。通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图(图一)
图一 图二
单片机实验报告
图三
4.电路原理图
见上图图
二、图三 5.程序
#define uint unsigned int void Dsplay();void Delayms(uint x);uchar mDS[6];uchar code cDsCode[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main(){ uchar i;
for(i=0;i<6;i++)mDS[i]=i+1;
loop:
Dsplay();
goto loop;}
void Dsplay()//动态扫描显示
{uchar i;
for(i=0,P2=0x01;i<6;i++)
{ P1=cDsCode[mDS[i]];//输出段
Delayms(1000);
P2=P2<<1;
//选通下一位
}
P2=0x00;
//关闭位选通 }
void Delayms(uint x){uint n;for(;x > 0;x--)
{ for(n=0;n<123;n++)
{;}
} }
七、NE555脉冲发生器实验(定时/计数器)
1.基本要求
2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图
4.电路原理图
5.程序
#include
CYMOMETER
”};uchar code EN_CHAR2[16]={“FREQ:
HZ”};
单片机实验报告
void TIMER_Configuration();//初始化定时器 ulong Freq;
//用来存放要显示的频率值 ulong TimeCount;//用于计算1S钟的
void main(){ uchar i, freqValue[6];
LcdInit();TIMER_Configuration();for(i=0;i<16;i++){
LcdWriteData(EN_CHAR1[i]);}
LcdWriteCom(0xc0);//第二行显示
for(i=0;i<16;i++){
LcdWriteData(EN_CHAR2[i]);}
while(1){
if(TR0==0)
//当计数器停下的时候,表明计数完毕
{
Freq = Freq + TL1;
//读取TL的值
Freq = Freq +(TH1 * 256);//读取TH的值
LcdWriteCom(0xc8);
//--求频率的个十百千万十万位--//
freqValue[0]='0'+Freq%1000000/100000;
freqValue[1]='0'+Freq%100000/10000;
freqValue[2]='0'+Freq%10000/1000;
freqValue[3]='0'+Freq%1000/100;
freqValue[4]='0'+Freq%100/10;
freqValue[5]='0'+Freq%10;
for(i=0;i<5;i++)//从最高位开始查找不为0的数开始显示(最低位为0显示0)
{
if(freqValue[i]==0x30)
{
freqValue[i]=0x20;//若为0则赋值空格键
}
else
单片机实验报告
{
break;
}
}
for(i=0;i<6;i++)
{
LcdWriteData(freqValue[i]);
}
Freq=0;//将计算的频率清零
TH1=0;//将计数器的值清零
TL1=0;
TR0=1;//开启定时器
TR1=1;//开启计数器
} } }
void TIMER_Configuration(){ TMOD=0x51;TH0=0x3C;TL0=0xB0;ET0=1;ET1=1;EA=1;TR0=1;TR1=1;} void Timer0()interrupt 1 { TimeCount++;if(TimeCount==20)//计时到1S {
TR0=0;
TR1=0;
TimeCount=0;
}
//--12MHZ设置定时50ms的初值--// TH0=0x3C;TL0=0xB0;} void Timer1()interrupt 3 {
单片机实验报告
//--进入一次中断,表明计数到了65536--// Freq=Freq+65536;
}
#include“lcd.h”
void Lcd1602_Delay1ms(uint c)
//误差 0us {
uchar a,b;for(;c>0;c--){
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
} #ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时 void LcdWriteCom(uchar com)
//写入命令 { LCD1602_E = 0;
//使能
LCD1602_RS = 0;
//选择发送命令
LCD1602_RW = 0;
//选择写入
LCD1602_DATAPINS = com;
//放入命令
Lcd1602_Delay1ms(1);//等待数据稳定
LCD1602_E = 1;
//写入时序
Lcd1602_Delay1ms(5);
//保持时间
LCD1602_E = 0;} #else
void LcdWriteCom(uchar com)
//写入命令 { LCD1602_E = 0;//使能清零
LCD1602_RS = 0;//选择写入命令
LCD1602_RW = 0;//选择写入
LCD1602_DATAPINS = com;// Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);LCD1602_E = 0;Lcd1602_Delay1ms(1);
单片机实验报告
LCD1602_DATAPINS = com << 4;//发送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif #ifndef LCD1602_4PINS
void LcdWriteData(uchar dat)
//写入数据 { LCD1602_E = 0;//使能清零
LCD1602_RS = 1;//选择输入数据
LCD1602_RW = 0;//选择写入
LCD1602_DATAPINS = dat;//写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
//写入时序
Lcd1602_Delay1ms(5);
//保持时间
LCD1602_E = 0;} #else void LcdWriteData(uchar dat)
//写入数据 { LCD1602_E = 0;//使能清零
LCD1602_RS = 1;
//选择写入数据
LCD1602_RW = 0;
//选择写入
LCD1602_DATAPINS = dat;
Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat << 4;//写入低四位
Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif #ifndef LCD1602_4PINS void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x38);//开显示
单片机实验报告
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点 } #else void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x32);//将8位总线转为4位总线
LcdWriteCom(0x28);//在四位线下的初始化
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点 } #endif
八、RS232串口通信实验(接收与发送)
1.基本要求
a.通过实验了解串口的基本原理及使用,理解并掌握对串口进行初始化; b.使用串口调试助手(Baud 9600、数据位
8、停止位
1、效验位无)做为上位机来做收发试验;
c.利用串口调试助手中字符串输入进行数据发送,接受窗口显示收到的数据。2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图
单片机实验报告
4.电路原理图
5.程序
#include
LcdWriteData(ChCode[i]);} UsartConfiguration();while(1){
if(RI == 1)
//查看是否接收到数据
{
receiveData = SBUF;//读取数据
单片机实验报告
RI = 0;
//清除标志位
LcdWriteCom(0xC0);
LcdWriteData('0' +(receiveData / 100));
// 百位
LcdWriteData('0' +(receiveData % 100 / 10));// 十位
LcdWriteData('0' +(receiveData % 10));
// 个位
} } } void UsartConfiguration(){ SCON=0X50;
//设置为工作方式1 TMOD=0X20;//设置计数器工作方式2 PCON=0X80;
//波特率加倍
TH1=0XF3;
//计数器初始值设置,注意波特率是4800的TL1=0XF3;TR1=1;
//打开计数器 }
#include“lcd.h”
void Lcd1602_Delay1ms(uint c)
//误差 0us {
uchar a,b;for(;c>0;c--){
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
} #ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时 void LcdWriteCom(uchar com)
//写入命令 { LCD1602_E = 0;
//使能
LCD1602_RS = 0;
//选择发送命令
LCD1602_RW = 0;
//选择写入
LCD1602_DATAPINS = com;
//放入命令
Lcd1602_Delay1ms(1);//等待数据稳定
LCD1602_E = 1;
//写入时序
单片机实验报告
Lcd1602_Delay1ms(5);
//保持时间
LCD1602_E = 0;} #else
void LcdWriteCom(uchar com)
//写入命令 { LCD1602_E = 0;//使能清零
LCD1602_RS = 0;//选择写入命令
LCD1602_RW = 0;//选择写入
LCD1602_DATAPINS = com;Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);LCD1602_E = 0;Lcd1602_Delay1ms(1);LCD1602_DATAPINS = com << 4;//发送低四位
Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat)
//写入数据 { LCD1602_E = 0;//使能清零
LCD1602_RS = 1;//选择输入数据
LCD1602_RW = 0;//选择写入
LCD1602_DATAPINS = dat;//写入数据
Lcd1602_Delay1ms(1);LCD1602_E = 1;
//写入时序
Lcd1602_Delay1ms(5);
//保持时间
LCD1602_E = 0;} #else void LcdWriteData(uchar dat)
//写入数据 { LCD1602_E = 0;
//使能清零
LCD1602_RS = 1;
//选择写入数据
LCD1602_RW = 0;//选择写入
LCD1602_DATAPINS = dat;
Lcd1602_Delay1ms(1);LCD1602_E = 1;
//写入时序
Lcd1602_Delay1ms(5);
单片机实验报告
LCD1602_E = 0;LCD1602_DATAPINS = dat << 4;//写入低四位
Lcd1602_Delay1ms(1);LCD1602_E = 1;
//写入时序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif
#ifndef LCD1602_4PINS void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x38);//开显示
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点 } #else void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x32);//将8位总线转为4位总线
LcdWriteCom(0x28);//在四位线下的初始化
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点 } #endif
单片机实验报告
第六章 收获体会
本次微控制器综合设计基本上使用了所选微控制器的所有资源,进一步熟悉和加深了对中断、定时器和串行通信的理解和使用。我觉得软件实验就是让我们初学者熟悉keil的使用,然后复习下汇编的思想和掌握程序的流程,所以软件实验可以很快的完成,并且慢慢熟悉调试的强大功能。硬件设计中,仿真让我很有感触,感觉蛮好玩的,可以摒弃麻烦的实验硬件自己在寝室玩而且不受硬件状态的限制,即便出错了也不会损坏。当然更重要的是这种好习惯,仿真完后再去在实验板上验证会比直接要来的确切而且便捷,至少不要老是去插拔线。在做实验中在同学指导下我试用C语言来编写程序,确实发现比汇编语言容易编写也容易理解,以前的实验还是有参考资料的习惯,现在什么都开始自己写感觉还是很有成就感的,当然这是基于程序本身就那么几行很容易编写,也不是说参考不好。总而言之,这学期的单片机实验还是收获颇丰的。相信在以后的实验学习实践工作中都会有个潜移默化的作用的。
第五篇:单片机实验报告
单片机实验报告
一、实验目的
1.熟练使用Keil、Protues两款软件 2.通过上机操作,增强个人动手实践能力 3.加深对理论知识的理解
4.培养运用汇编语言进行初步编写程序的能力
二、实验内容
1.将片外RAM3050-306FH中数据转移至片内70-8FH中。
要求:可以从Keil或Protues上看到RAM的数据转移结果。2.设计一个外部中断触发流水灯系统:当外部中断来临时,启动流水灯,即令P2口的LED轮流循环点亮。
要求:开发板或Prrotues演示
3.将片内存储器80H中存放的BCD码转换为ASCII码,要求使用表格查询技术。
要求:在Keil或Protues上看到数据转换结果。
4.各使用中断方式和查询方式设计一个方波发生器,频率为50HZ。
要求:Protues使软件间示波器显示方波。
三、实验程序
1.将片外RAM3050-306FH中数据转移至片内70-8FH中
ORG 0000H AJMP MAIN 上电,转向主程序
ORG 0030H 主程序入口
MAIN: MOV DPTR,#3050H 数据指针指向地址3050H MOV A,#04H 将立即数04H送A寄存器
MOV R0,#20H NEXT: MOVX @DPTR,A INC DPTR 数据指针DPTR自加一
DJNZ R0,NEXT 判断是否跳转到NEXT或继续向下执行
MOV DPTR,#3050H MOV R0,#70H MOV R2,#20H NEXT1: MOVX A,@DPTR MOV @R0,A INC DPTR INC R0 DJNZ R2,NEXT1
SJMP $ 等待
END 2.设计一个外部中断触发流水灯系统:当外部中断来临时,启动流水灯,即令P2口的LED轮流循环点亮 ORG 0000H SJMP MAIN 上电,转向主程序
ORG 0003H 外部中断0向量入口
AJMP INSER ORG 0030H 主程序入口
MAIN: SETB EX0 SETB IT0
SETB EA CPUHERE: SJMP HERE ORG 0200H INSER: MOV R2,#08H MOV A,#01H NEXT: MOV P2,A LCALL DELAY RL A DJNZ R2,NEXT NEXT或继续向下执行
RETI DELAY: MOV R3,#0FFH DEL2: MOV R4,#0FFH DEL1: NOP
允许外部中断0中断 选择边沿触发方式 开中断 等待中断 设置循环次数 赋初值,设置高电平亮 将初值送往P2口 延时 左移一位
判断循环次数,是否跳转到中断返回 延时程序 DJNZ R4,DEL1 DJNZ R3,DEL2 RET END 3.将片内存储器80H中存放的BCD码转换为ASCII码,要求使用表格查询技术 ORG 0000H LJMP MAIN ORG 0030H主程序起始地址 MAIN: MOV 80H,#05H 将立即数50H转送内存单元80H MOV A,80H 将内存单元80H中的内容送寄存器A MOV DPTR,#TAB MOVC A,@A+DPTR A寄存器内容加指针偏移量后送A寄存器 MOV 80H,A RET TAB: DB 30H,31H,32H,33H,34H DB 35H,36H,37H,38H,39H 4.1中断方式产生50HZ方波
ORG 0000H
AJMP MAIN
ORG 0030H 主程序入口 MAIN: MOV TMOD,#10H 设置定时器工作模式为模式1 MOV TH1,#0D8H 装入T1计数初值
MOV TL1,#0F0H
SETB ET1 开中断
SETB EA CPU开中断
SETB TR1 启动定时器T1 HERE: SJMP HERE 等待中断 ORG 001BH T1中断向量地址
CLR TF1 将TF1清零
CPL P2.0 P2.0取反输出
MOV TH1,#0D8H 重装初值
MOV TH0,#0F0H
RETI;中断返回
END 4.2 查询方式产生50HZ方波
ORG 0000H
AJMP MAIN
ORG 0030H 主程序入口
MAIN: MOV TMOD,#10H 设置定时器的工作模式为模式1 SETB TR1 启动定时器T1 LOOP: MOV TH1,#0D8H 装入T1计数初值
MOV TH0,#0F0H JNB TF1,$ T1没有溢出则等待
CLR TF1
产生溢出,清标志位
CPL P2.0 P2.0取反输出
SJMP LOOP 循环
END
四、实验结果截图
1.2
3.4.1
4.2