南昌大学单片机原理实验报告打印上交Word文档下载推荐.docx
《南昌大学单片机原理实验报告打印上交Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《南昌大学单片机原理实验报告打印上交Word文档下载推荐.docx(43页珍藏版)》请在冰豆网上搜索。
用导线连接八位逻辑电平输出模块的K0到CPU模块的RXD(P3.0口;
用8位数据线连接八位逻辑电平显示模块的JD4B到CPU模块的JD8(P1口。
2启动PC机,打开THGMW-51软件,输入源程序,并编译源程序。
编译无误后,下载程序运行。
3观察发光二极管显示跑马灯效果,拨动K0可改变跑马灯的方向。
程序流程图:
七、实验现象和心得体会
实验现象:
程序下载到单片机以后,现象是LED灯沿着一个方向循环流动,当拨动K0开关后,亮的LED灯跳到边缘然后沿着相反的方向循环流动。
心得体会:
通过这次实验,我掌握了单片机P1口、P3口的使用方法。
了解并熟悉了单片机I/O口和LED灯的电路结构,对于单片机实验台上的相关器件有了一定了解,深化了课本上对于I/O口功能的理解,P1口是准双向口,它作为输出口时与一般的双向口使用方法相同。
如果让我自己通过跑马灯的工作原理来编写实验程序,就现在的只是水平来讲肯定是做不到的,这需要我在日后的学习过程中,不断加强自己的动手能力和编程方面理论的学习。
八、实验参考程序
本实验参考程序
;
//******************************************************************
文件名:
PortforMCU51
功能:
I/O口输入、输出实验
接线:
用导线连接八位逻辑电平输出模块的K0到CPU模块的RXD(P3.0口;
用8位数据线连接八位逻辑电平显示模块的JD2B到CPU模块的JD8(P1口。
//******************************************************************DIRBITP3.0
ORG0000H
LJMPSTART
ORG0100H
START:
Output1:
mova,#0fEH
movr5,#8
loop1:
CLRC
movC,DIR
JCOutput2
movP1,a
rla
AcallDelay
djnzr5,loop1
SjmpOutput1
Output2:
mova,#07fH
loop2:
JNCOutput1
rra
djnzr5,loop2
SjmpOutput2
Delay:
movr6,#0
DelayLoop1:
movr7,#0
DelayLoop2:
NOP
djnzr7,DelayLoop2
djnzr6,DelayLoop1
ret
学习外部中断技术的基本使用方法。
INT0端接单次脉冲发生器。
按一次脉冲产生一次中断,CPU使P1.0状态发生一次反转,P1.0接LED灯,以查看信号反转。
1外部中断的初始化设置共有三项内容:
中断总允许即EA=1,外部中断允许即EXi=1(i=0或1,中断方式设置。
中断方式设置一般有两种方式:
电平方式和脉冲方式,本实验选用后者,其前一次为高电平后一次为低电平时为有效中断请求。
因此高电平状态和低电平状态至少维持一个周期,中断请求信号由引脚INT0(P3.2和INT1(P3.3引入。
2中断服务的关键:
a、保护进入中断时的状态。
堆栈有保护断点和保护现场的功能使用PUSH指令,在转中断服务程序之前把单片机中有关寄存单元的内容保护起来。
b、必须在中断服务程序中设定是否允许中断重入,即设置EX0位。
c、用POP指令恢复中断时的现场。
3中断控制原理:
中断控制是提供给用户使用的中断控制手段。
实际上就是控制一些寄存器,51系列用于此目的的控制寄存器有四个:
TCON、IE、SCON及IP。
4中断响应的过程:
首先中断采样然后中断查询最后中断响应。
采样是中断处理的第一步,对于本实验的脉冲方式的中断请求,若在两个相邻周期采样先高电平后低电平则中断请求有效,IE0或IE1置“1”;
否则继续为“0”。
所谓查询就是由CPU测试TCON和SCON中各标志位的状态以确定有没有中断请求发生以及是那一个中断请求。
中断响应就是对中断请求的接受,是在中断查询之后进行的,当查询到有效的中断请求后就响应一次中断。
本实验需要用到CPU模块(F3区和八位逻辑电平显示模块(B5区、单次脉冲模块(E3区。
1系统各跳线器处在初始设置状态,用导线连接单次脉冲模块的输出端到CPU模块的P32;
CPU模块的P10接八位逻辑电平显示模块的灯。
3连续按动单次脉冲产生电路的按键,发光二极管L0每按一次状态取反,即隔一次点亮。
七、实验分析和实验现象
实验现象
把外部中断引脚连接到脉冲开关,每次拨动开关时就会触发中断,经过中断服务程序的处理会把P1.0取反,即LED的状态随之改变。
如果拨动开关数次,LED会随之一亮一灭。
心得体会:
通过这次实验,我学到了如何通过外部的控制,要使用外部中断要从两方面进行准备:
首先,在硬件上必须将中断信号引到DSP的外部中断引脚上;
其次是在软件上的配置对单片机实现中断的处理,外部中断首先要初始化设置,中断总允许即EA=1,外部中断允许即EXi=1(i=0或1,中断方式的选择可以选择电平方式或者脉冲方式,掌握如何通过产生脉冲来控制单片机的中断处理。
外部中断在专业领域应用十分广泛,能有机会通过实验掌握它的基本原理让人受益匪浅。
//*************************************************
EXintforMCU51
外部中断实验
导线连接单次脉冲模块的输出端到CPU模块的P32,
CPU模块的P10接八位逻辑电平显示模块的L0灯。
LEDBITP1.0
LEDBufBIT20H
org0
ljmpStart
org3
Interrupt0:
pushPSW;
保护现场
cplLEDBuf;
取反LED
movc,LEDBuf
movLED,c
popPSW;
恢复现场
retiStart:
clrLEDBuf
clrLED
movTCON,#01h;
外部中断0下降沿触发
movIE,#81h;
打开外部中断允许位(EX0及总中断允许位(EAOK:
ljmpOK
End
学习MCS-51内部计数器的使用和编程方法。
使用MCS-51内部定时/计数器,定时一秒钟,CPU运用定时中断方式,实现每一秒钟输出状态发生一次反转,即发光管每隔一秒钟亮一次。
四、实验说明
关于内部计数器的编程主要是定时常数的设置和有关控制寄存器的设置。
内部计数器在单片机中主要有定时器和计数器两个功能。
本实验使用的是定时器,定时为一秒钟。
定时器有关的寄存器有工作方式寄存器TMOD和控制寄存器TCON。
TMOD用于设置定时器/
计数器的工作方式0-3,并确定用于定时还是用于计数。
TCON主要功能是为定时器在溢出时设定标志位,并控制定时器的运行或停止等。
内部计数器用作定时器时,是对机器周期计数。
每个机器周期的长度是12个振荡器周期。
假设实验系统的晶振是12MHZ,程序工作于方式2,即8位自动重装方式定时器,定时器100uS中断一次,所以定时常数的设置可按以下方法计算:
机器周期=12÷
12MHz=1uS
(256-定时常数×
1uS=100uS
定时常数=156。
然后对100uS中断次数计数10000次,就是1秒钟。
在本实验的中断处理程序中,因为中断定时常数的设置对中断程序的运行起到关键作用,所以在置数前要先关对应的中断,置数完之后再打开相应的中断。
本实验需要用到CPU模块(F3区和八位逻辑电平显示模块(B5区。
1系统各跳线器处在初始设置状态,用导线连接CPU模块P10到八位逻辑电平显示模块的L0。
3运行程序观察发光二极管隔一秒点亮一次,点亮时间为一秒。
把P1.0连接到LED灯上,下载程序后发现LED隔一秒点亮一次,亮一秒灭一秒。
通过本次实验,我对单片机的定时/计数功能有了一定的了解,加上复习巩固课本上的知识,熟悉了定时/计数器的设置、控制和最基本的应用,初步获悉了定时/计数器的内部结构,能够和上一次实验对中断的实验结合起来思考问题,可以说是学习得比较扎实了。
定时器和计数器是单片机里比较重要的部分,在实验中我也遇到了一些困难,程序复制中由于粗心没有复制正确导致电脑一直报错,后来通过逐一地读程序排查得到了解决,顺利完成了实验。
TimerforMCU51
定时/计数器实验
导线连接CPU模块P10到八位逻辑电平显示模块的L0.
Tickequ10000;
10000x100us=1s
T100usequ156;
100us时间常数(6M
C100usequ30h;
100us记数单元
LEDBufbit20h
org000bh
T0Int:
pushPSW
mova,C100us+1
jnzGoon
decC100us
Goon:
decC100us+1
mova,C100us
orla,C100us+1
jnzExit;
100us记数器不为0,返回
movC100us,#27H;
#high(Tick
movC100us+1,#10H;
#low(Tick
100us记数器为0,重置记数器;
Exit:
popPSW
reti
Start:
movTMOD,#02h;
方式2,定时器
movTH0,#t100us
movTL0,#t100us
movIE,#10000010b;
EA=1,IT0=1
setbTR0;
开始定时
clrP1.0
#high(Tick
#low(Tick
Loop:
movc,LEDBuf
movP1.0,c
ljmpLoop
end
掌握十字路口交通灯控制方法。
利用系统提供的双色LED显示电路,和四位静态数码管显示电路模拟十字路口交通信号灯。
4位LED数码管显示时间,LED显示红绿灯状态。
交通信号灯控制逻辑如下:
假设一个十字路口为东西南北走向。
开始为四个路口的红灯全部亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后(20秒,东西路口的绿灯,闪烁若干次后(3秒,东西路口的绿灯熄灭,同时东西路口的黄灯亮,延时一段时间后(2秒,东西路口的红灯亮,南北路口的绿灯亮,南北路口方向通车,延时一段时间后(20秒,南北路口的绿灯闪烁若干次后(3秒,南北路口的绿灯熄灭,同时南北路口的黄灯亮,延时一段时间后(2秒,再切换到东西路口的绿灯亮,南北路口的红灯亮,之后重复以上过程。
双色LED是由一个红色LED管芯和一个绿色LED管芯封装在一起,共用负极,当红色正端加高电平,绿色正端加低电平时,红灯亮;
红色正端加低电平,绿色正端加高电平时,绿灯亮;
两端都加高电平时,黄灯亮。
本实验需要用到CPU模块(F3区、静态数码管/双色LED显示模块(B4区。
双色LED显示电路原理参见图4-1。
图4-1双色LED显示电路
五、实验程序参考框图
实验示例程序参考框图如图4-2。
图4-2程序流程图
六、实验预习要求
八、实验步骤
P10同时接G1、G3;
P11同时接R1、R3;
P1.2同时接G2、G4;
P1.3同时接R2、R4;
P1.6、P1.7分别接静态数码显示的DIN、CLK。
3观察十字路口交通灯效果。
通过本次实验,我了解到交通灯其实是通过编程一步步实现的,共有六种状态。
本实验的程序比较长,看起来也很费劲,但是功能很强大,所以在阅读程序的过程中我也回顾了比如定时器的设置,查询中断,查表的方法,以及大量的调用和循环语句,另外我对数码管的显示原理也有了进一步的深入。
实验成功后,发现了交通灯的变化,从交通灯变成了有各种闪光形式的霓虹灯。
//*******************************************************************
交通灯程序FORMCU51
双色LED模拟交通灯信号,并通过调用静态数码显示状态时间。
P1.0同时接G1、G3,P1.1接R1、R3,P1.2接G2、G4,P1.3同时接R2、R4,
P1.6、P1.7接静态数码显示的DIN、CLK。
SECOND1EQU30H;
东西秒寄存器
SECOND2EQU31H;
南北秒寄存器
DBUFEQU40H;
显示缓冲1
TEMPEQU44H;
显示缓冲2
LED_G1BITP1.0;
东西绿灯
LED_R1BITP1.1;
东西红灯
LED_G2BITP1.2;
南北绿灯
LED_R2BITP1.3;
南北红灯
DinBITP1.6;
串行显示数据
CLKBITP1.7;
串行显示时钟
LCALLSTATE0;
调用状态0
LCALLDELAY;
调用延时
MOVTMOD,#01H;
置T0工作方式1
MOVTH0,#3CH;
置T0定时初值50mS
MOVTL0,#0B0H
SETBTR0;
启动T0CLREA
LOOP:
MOVR2,#20;
置1S计数初值50mS*20=1S
MOVR3,#20;
红灯20S
MOVSECOND1,#25;
东西秒显示初值25S
MOVSECOND2,#25;
南北秒显示初值25S
LCALLDISPLAY
LCALLSTATE1;
调用状态1
WAIT1:
JNBTF0,WAIT1;
查询50mS到否
CLRTF0
恢复T0定时初值50mS
启动T0
DJNZR2,WAIT1;
判1S到否?
未到继续状态1
MOVR2,#20;
置50mS计数初值
DECSECOND1;
东西秒显示减一
DECSECOND2;
南北秒显示减一
DJNZR3,WAIT1;
状态1维持20S
***************************************************
MOVR2,#5;
置50mS计数初值5*4=20
MOVR3,#3;
绿灯闪3S
MOVR4,#4;
闪烁间隔200mS
MOVSECOND1,#5;
东西秒显示初值5S
MOVSECOND2,#5;
南北秒显示初值5S
WAIT2:
LCALLSTATE2;
调用状态2
JNBTF0,WAIT2;
DJNZR4,WAIT2;
判200mS到否?
未到继续状态2CPLLED_G1;
东西绿灯闪
DJNZR2,WAIT2;
未到继续状态2
DJNZR3,WAIT2;
状态2维持3S
MOVR3,#2;
黄灯2S
MOVSECOND1,#2;
东西秒显示初值2S
MOVSECOND2,#2;
南北秒显示初值2S
WAIT3:
LCALLSTATE3;
调用状态3
JNBTF0,WAIT3;
查询30mS到否
DJNZR2,WAIT3;
未到继续状态3MOVR2,#20;
DJNZR3,WAIT3;
状态3维持2S
WAIT4:
LCALLSTATE4;
调用状态4
JNBTF0,WAIT4;
DJNZR2,WAIT4;
未到继续状态4MOVR2,#20;
DJNZR3,WAIT4;
状态4维持20S
置50mS计数初值5*4=20MOVR4,#4;
WAIT5:
LCALLSTATE5;
调用状态5
JNBTF0,WAIT5;
查询50mS到