微机实验报告.docx
《微机实验报告.docx》由会员分享,可在线阅读,更多相关《微机实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
微机实验报告
实验名称
指导教师
专业班级姓名学号
联系电话
一、任务要求
实验目的:
加深对定时/计数器、中断、IO端口的理解,掌握定时/计数器、中断的应用编程技术及中断程序的调试方法。
实验内容:
利用C8051F310单片机设计一个LED灯控制器
主要功能和技术指标要求:
1.LED灯外接于P0.0端。
2.LED灯分别按2Hz,1Hz和0.2Hz三种不同频率闪动,各持续10s。
3.在LED灯开始和停止闪烁时蜂鸣器分别鸣响1次。
4.利用单片机内部定时器定时,要求采用中断方式。
提高要求:
使用按键(KINT)控制LED灯闪烁模式的切换。
二、设计思路
使用TO计时器,先设置25MS的定时,CPL反转20次是一个周期,即产生500ms为周期且占空比为百分之五十的方波,十秒结束即闪烁四十次,选用一个寄存器R3来储存闪烁次数,赋值为40,利用subbA,#39指令来判断是否达到40,并讲R3自加1,当R3到39时,MOVA,R3,SUBBA,#39,CY不会变为一,利用JNC判断转移来进入下一频率的闪烁。
同理,产生周期为1S的方波,需要有20次25ms的定时,并且用R4计数20次来判断是否达到10s即p0.0反转10次,同理,产生0.2HZ的方波,需要有100次25ms的定时,用R5=4来判断是否达到10s。
当0.2HZ达到10s时,跳转HERE指令,完成蜂鸣器指令。
三、资源分配
R0为长定时标志寄存器,为达到250ms,设为10,即25ms循环10次
R1为长定时标志寄存器,为达到500ms,设为20,即25ms循环20次
R2为长定时标志寄存器,为达到2.5s,设为100,即25ms循环100次
R3为闪烁次数寄存器,为达到10s,需要p0.0翻转40次,即闪烁20次
R4为闪烁次数寄存器,为达到10s,需要p0.0翻转20次,即闪烁10次
R5为闪烁次数寄存器,为达到10s,需要p0.0翻转4次,即闪烁2次
R6为延时循环计数器,控制蜂鸣器鸣声的时间。
四、流程图
五、源代码(含文件头说明、语句行注释)
$include(C8051F310.inc)
ORG0000H
LJMPMAIN
ORG000BH;T0计数中断
LJMPIT0_0
ORG0100H
MAIN:
CLRP3.1
MOVP0,#0FFH;把P0口都赋高电平
ACALLInit_Device;调用初始化程序
MOVSP,#60H
MOVTMOD,#01H;设定定时器模式
MOVTH0,#38H
MOVTL0,#8EH;设置初值25ms
SETBET0;中断允许
SETBEA;开总中断
setbTR0;开启定时器
MOVR0,#10;设置250MS的寄存器
MOVR1,#20;设置500MS的寄存器
MOVR2,#100;设置2.5s的寄存器
MOVR3,#0
MOVR4,#0
MOVR5,#0;循环寄存器赋初值
SETBP3.1;开启蜂鸣器
ACALLDELAY;调用延时子程序
CLRP3.1;关闭P3.1
ljmp$
HERE:
SETBP3.1;打开蜂鸣器
LCALLDELAY
NOP
LCALLDELAY;调用延时子程序
CLRP3.1;延时之后关闭蜂鸣器
LJMP$;踏步指令
IT0_0:
_2HZ:
CLRC;清除cy位
MOVA,R3;读取R3的值
SUBBA,#40;作减法运算,判断R3是否达到40
JNC_1HZ;若达到40即10s2hz闪烁结束,跳转1hz
MOVTH0,#38H
MOVTL0,#8EH;重装初值
DJNZR0,NEXT;当R0减到0,达到250MS
MOVR0,#10;重新给R0赋值
CPLP0.0;P0.0翻转
INCR3;R3加一
LJMPNEXT;跳转NEXT
_1HZ:
MOVA,R4;读取R4的值
SUBBA,#20;作减法运算,判断R4是否达到20
JNC_0_2HZ;若达到20即10s1hz闪烁结束,跳转0.2hz
MOVTH0,#38H
MOVTL0,#8EH;重装初值
DJNZR1,NEXT;当R1减到0,达到500MS
MOVR1,#20;重新给R1赋值
CPLP0.0;P0.0翻转
INCR4;次数计数器加一
LJMPNEXT
_0_2HZ:
MOVA,R5;读取R5的值
SUBBA,#4;作减法运算,判断R5是否达到4
JNCHERE;若达到4即10s0.2hz闪烁结束,跳转HERE
MOVTH0,#38H
MOVTL0,#8EH;重装初值
DJNZR2,NEXT
MOVR2,#100;重新给R2赋值
CPLP0.0;P0.0翻转
INCR5;次数计数器加一
NEXT:
RETI
DELAY:
movR4,#10
movR6,#00
movR7,#00
DEL4:
NOP
DEL3:
NOP
NOP
DEL2:
NOP
NOP
NOP
NOP
DJNZR6,DEL2
djnzR7,DEL3
djnzR4,DEL4
RET
PCA_Init:
anlPCA0MD,#0BFh
movPCA0MD,#000h
ret
Port_IO_Init:
;P0.0-Unassigned,Open-Drain,Digital
;P0.1-Unassigned,Open-Drain,Digital
;P0.2-Unassigned,Open-Drain,Digital
;P0.3-Unassigned,Open-Drain,Digital
;P0.4-Unassigned,Open-Drain,Digital
;P0.5-Unassigned,Open-Drain,Digital
;P0.6-Unassigned,Open-Drain,Digital
;P0.7-Unassigned,Open-Drain,Digital
;P1.0-Unassigned,Open-Drain,Digital
;P1.1-Unassigned,Open-Drain,Digital
;P1.2-Unassigned,Open-Drain,Digital
;P1.3-Unassigned,Open-Drain,Digital
;P1.4-Unassigned,Open-Drain,Digital
;P1.5-Unassigned,Open-Drain,Digital
;P1.6-Unassigned,Open-Drain,Digital
;P1.7-Unassigned,Open-Drain,Digital
;P2.0-Unassigned,Open-Drain,Digital
;P2.1-Unassigned,Open-Drain,Digital
;P2.2-Unassigned,Open-Drain,Digital
;P2.3-Unassigned,Open-Drain,Digital
movP0MDOUT,#001h
movP3MDOUT,#002h
movXBR1,#040h
ret
Oscillator_Init:
movOSCICN,#083h
ret
Timer_Init:
movTMOD,#001h
ret
;Initializationfunctionfordevice,
;CallInit_Devicefromyourmainprogram
Init_Device:
lcallPCA_Init
lcallPort_IO_Init
lcallOscillator_Init
lcallTimer_Init
ret
end
六、程序测试方法与结果
程序测试方法:
软件仿真测试方法:
进入单步调试界面的波形仿真测试,调出P0.0以及P3.5的波形,仿真结果如截图所示。
如图所示,该图为P0.0的整体波形,还有蜂鸣器p3.1的波形
如图所示,前10s的闪烁,周期约为500ms,即为2HZ,满足实验要求
如图所示,为10-20s的LED闪烁,周期约为1s,即1HZ满足实验要求。
如图所示,为20-30s的LED闪烁,周期约为5s,满足0.2hz的实验要求。
如图所示,当2hz的闪烁达到10s时,进入1HZ闪烁阶段。
如图所示,当1HZ的闪烁达到10s时,进入0.2HZ闪烁阶段。
当0.2HZ闪烁结束时,即达到30s时,闪烁结束,蜂鸣器随后高电平鸣响,持续时间约为0.5s。
再次按键,此时再次循环进入2HZ的闪烁状态,此时,模式选择寄存器为工作模式0.如上图所示。
硬件调试方法:
在TARETOPTION界面选择DEBUG菜单,连接调试适配器之后,进行如下选择
随后点击进入调试界面。
程序全速运行时,蜂鸣器轻微鸣响,灯以比较快的速度(2HZ)闪烁,闪烁20次后频率变慢(1HZ),闪烁十次后频率进一步下降(0.2HZ),闪烁两次后蜂鸣器轻微鸣响,整个过程结束。
提高部分:
$include(C8051F310.inc)
ORG0000H
LJMPMAIN
ORG0003H
LJMPEXT0
ORG000BH;T0计数中断
LJMPIT0_0
ORG0200H
MAIN:
CLRP3.1
MOVP0,#0FFH;把P0口都赋高电平
ACALLInit_Device;调用初始化程序
CLRp0.0;P0.0清零
SETBIP.0;将外部中断设为高优先级
MOVSP,#60H
MOVTMOD,#01H;设定定时器模式
MOVTH0,#38H
MOVTL0,#09EH;设置初值25ms
SETBIT0;设置成下降沿触发
SETBEX0;开外部中断
SETBET0;中断允许
SETBEA;开总中断
setbTR0;开启定时器
MOVR0,#10;设置250MS的寄存器
MOVR1,#20;设置500MS的寄存器
MOVR2,#100;设置2.5s的寄存器
MOVR3,#100
LJMP$;踏步指令
EXT0:
INCR5;R5自加1
INCR6;R6自加1
INCR7;R7自加1
CJNER5,#3,LOOP;当R5不是3时跳转LOOP
MOVR5,#0;
MOVR6,#0;
MOVR7,#0;当R5,R6,R7均为3时,将这三个寄存器清零
LOOP:
RETI
IT0_0:
_2HZ:
CLRC
MOVA,R7;将R7赋值给A
SUBBA,#1;A-1
JNC_1HZ;若CY为0,即R7为1,进入_1HZ
MOVTH0,#38H
MOVTL0,#09EH;设置初值25ms
DJNZR0,NEXT;若R0未到10次,即250MS,则跳转NEXT
CPLP0.0;P0.0反转
MOVR0,#10;给R0重新赋值
LJMPNEXT
_1HZ:
CLRC;
MOVA,R6;将R6赋值给A
SUBBA,#2;A-2
JNC_0_2HZ;若CY为0,即R6为2,进入_0.2HZ
MOVTH0,#38H
MOVTL0,#09EH;设置初值25ms
DJNZR1,NEXT;若R1未到20次,即500MS,则跳转NEXT
CPLP0.0;P0.0反转
MOVR1,#20;给R1重新赋值
LJMPNEXT
_0_2HZ:
CLRC;
MOVA,R5;将R6赋值给A
SUBBA,#3;A-3
JNC_2HZ;若CY为0,即R5为3,进入_2HZ
MOVTH0,#38H
MOVTL0,#09EH;设置初值25ms
DJNZR2,NEXT;若R2未到100次,即2.5S,则跳转NEXT
CPLP0.0;P0.0反转
MOVR2,#100;给R2重新赋值
NEXT:
RETI
PCA_Init:
anlPCA0MD,#0BFh
movPCA0MD,#000h
ret
Port_IO_Init:
;P0.0-Unassigned,Open-Drain,Digital
;P0.1-Unassigned,Open-Drain,Digital
;P0.2-Unassigned,Open-Drain,Digital
;P0.3-Unassigned,Open-Drain,Digital
;P0.4-Unassigned,Open-Drain,Digital
;P0.5-Unassigned,Open-Drain,Digital
;P0.6-Unassigned,Open-Drain,Digital
;P0.7-Unassigned,Open-Drain,Digital
;P1.0-Unassigned,Open-Drain,Digital
;P1.1-Unassigned,Open-Drain,Digital
;P1.2-Unassigned,Open-Drain,Digital
;P1.3-Unassigned,Open-Drain,Digital
;P1.4-Unassigned,Open-Drain,Digital
;P1.5-Unassigned,Open-Drain,Digital
;P1.6-Unassigned,Open-Drain,Digital
;P1.7-Unassigned,Open-Drain,Digital
;P2.0-Unassigned,Open-Drain,Digital
;P2.1-Unassigned,Open-Drain,Digital
;P2.2-Unassigned,Open-Drain,Digital
;P2.3-Unassigned,Open-Drain,Digital
movP0MDOUT,#001h
movP3MDOUT,#002h
movXBR1,#040h
ret
Oscillator_Init:
movOSCICN,#083h
ret
Timer_Init:
movTMOD,#001h
ret
;Initializationfunctionfordevice,
;CallInit_Devicefromyourmainprogram
Init_Device:
lcallPCA_Init
lcallPort_IO_Init
lcallOscillator_Init
lcallTimer_Init
ret
end
调试:
软件仿真调试:
软件仿真测试方法:
进入单步调试界面的波形仿真测试,调出P0.0波形如截图所示(此时没有按下键,执行2HZ频闪)
如图所示,此时R5=0,即进入0状态,一个周期约为500MS,即2HZ,此时模式0为2HZ闪烁状态。
如图所示,采用下降沿触发方式,当P0.1变低时,R5,R6,R7,加一,此时进入1模式,一个周期约为1s,即模式1为1HZ的闪烁,波形如上图所示。
如图所示,当将P0.1拉高运行一段时间再拉低,此时再次进入中断,R5,R6,R7变成2,进入2模式,周期约为5S如上图所示,即工作模式2为0.2HZ闪烁的工作模式。
分析:
若使用电平触发,则会对循环产生影响,故选择使用下降沿触发。
使用R5,R6,R7,为了区分三种不同频率的工作模式,使思路更加简单(虽然消耗较多寄存器资源)。
硬件调试:
硬件调试方法:
在TARETOPTION界面选择DEBUG菜单,连接调试适配器之后,进行如下选择
随后点击进入调试界面。
全速运行,先是很快速的闪烁,按下按键,切换至1HZ模式闪烁,再按下,切换至0.2HZ频率闪烁,然后再次按下重新回到2HZ频率闪烁。
思考题:
1.若想实现3种闪烁方式的持续时间在5s-20s范围内可调,且每种方式的持续时间各不相同,应如何设计程序?
先采用三分频,然后设置单位循环时间为200ms,利用矩阵键盘不同的键盘按下后,对应的长定时寄存器加5,达到不同循环加一秒,然后当达到20s时,转化为初值,即5s
本人承诺:
本报告内容真实,无伪造数据,无抄袭他人成果。
本人完全了解学校相关规定,如若违反,愿意承担其后果。
签字:
年月日
其它说明:
1.标题:
黑体,小四号
2.正文:
宋体,五号,1.5倍行距
3.流程图使用SmartDraw7或Visio软件绘制
4.不要加封面