华中科技大学单片机实验报告-完整版-LED灯控制器
———————————————————————————————— 作者:
———————————————————————————————— 日期:
【任务要求】
利用C8051F310单片机设计一个LED灯控制器, LED灯外接于P0.0端,LED灯分别按2Hz,1Hz和0.5Hz三种不同频率闪动,各持续10s,在LED灯开始和停止闪烁时蜂鸣器分别鸣响1次,利用单片机内部定时器定时,要求采用中断方式。
设计思路
【设计思路】
设置定时器T0定时时间为25ms,每隔25ms开一次中断,共R1次,R0与R2共同作用构成循400次循环,以达到定时10秒的目的。首先LED灯以2Hz频率闪动,初始赋值R1=10,循环执行10次中断后,即过去0.25s,灯闪烁一次,依次循环,直至10s定时时间到,蜂鸣器响一次,2Hz频率的闪烁结束。然后LED灯以1Hz频率闪动,设置R1=20,与上类似,每过0.5s灯闪烁一次,十秒定时到,蜂鸣器响一次,到下一阶段。最后LED灯以0.5Hz频率闪动,设置R1=40即可,思路同上。当三十秒执行完毕后,使用无条件转移语句跳转到程序开始处,循环以上过程。
【资源分配】
R1:定时0.25秒,0.5秒或1秒
R0,R2:循环400次,定时10秒
定时器T0:定时中断25ms
定时器T1:定时10s
【流程图】
【源代码 (含文件头说明、资源使用说明、语句行注释)】
;------------------------------------
;- Generated Initialization File --
;------------------------------------
$include (C8051F310.inc)
public Init_Device
INIT SEGMENT CODE
rseg INIT
ORG 0000H
? LJMP MAIN
ORG 000BH?
;T0中断入口
? LJMP IT0P? ? ? ;转T0中断服务程序
? ORG 001BH ? ;T1中断入口
LJMP IT1P ;转T1中断服务程序
? ORG 1000H ? ? ;主程序
MAIN: LCALL Init_Device ;设备初始化
MOV SP , #60H ;赋堆栈指针
MOV TMOD , #11H?
;T1定时方式1,T0定时方式1
? MOV R0 , #40 ? ? ;循环400次
MOV R2 , #10
? MOV
R1 , #10 ? ;定时0.25s
MOV TH1 , #38H
;T1置初值
? MOV TL1 , #9EH
? MOV TH0 , #38H? ?
;T0置初值
? MOV TL0 , #9EH
? SETB EA ;允许中断
? SETB ET0
SETB ET1
LOOP: SETB TR0 ;计时开始
SETB TR1
?
CJNE
R1 , #0,LOOP ? ;判断是否到达0.25s
CLR P3.1
CPL P0.0 ;取反
? MOV R1 , #10
? CJNE R0 , #0,LOOP ;判断是否到达10s
? CLR TR0 ? ;清零
CLR TR1
? MOV R1 , #20 ? ;R1重新赋值
MOV R0 , #40 ;循环400次
MOV R2 , #10
? SETB P3.1
LOOP1: SETB TR0 ?
;计时
SETB TR1
? CJNE R1 , #0 ,LOOP1 ;判断是否到达0.5s
? CLR P3.1
CPL P0.0 ;取反
MOV R1 , #20
CJNE R0 , #0 ,LOOP1? ? ;判断是否到达10s
CLR TR0 ? ;清零
? CLR TR1
? MOV R1 , #40? ? ;R1再次赋值
MOV R0 , #40? ;循环
MOV R2 , #10
LOOP2: SETB P3.1
SETB TR0 ?
;计时
SETB TR1
CJNE R1 , #0 ,LOOP2 ? ;判断是否到达1s
? CLR
P3.1
? CPL P0.0
;取反
? MOV R1 , #40
?
CJNE R0 , #0 , LOOP2 ? ;判断是否到达10s
? CLR TR0 ? ;清零
? CLR TR1
HERE: AJMP HERE ? ;等待中断
? ORG 1500H ? ? ;T0中断服务程序
IT0P:
MOV TH0 , #38H? ? ;重置计数初值
MOV TL0 , #9EH
?
DJNZ R2 , LOOP0
;循环
?
MOV R2 , #10
? DEC
R0
? RETI
LOOP0: RETI
ORG 1600H ? ? ;T1中断服务程序
IT1P: MOV TH1 , #38H? ? ;重置计数初值
? MOV TL1 , #9EH
? DEC R1
? RETI
; Peripheral specific initialization functions,
; Called from the Init_Device label
PCA_Init:
anl PCA0MD, #0BFh
mov PCA0MD, #000h
ret
Timer_Init:
mov TMOD,
#001h
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
mov XBR1, #040h
ret
Oscillator_Init:
mov
OSCICN, #083h
ret
Interrupts_Init:
mov IE, #082h
ret
; Initialization function for device,
; Call Init_Device from your main program
Init_Device:
lcall PCA_Init
lcall Timer_Init
lcall Port_IO_Init
lcall Oscillator_Init
lcall Interrupts_Init
ret
end
【程序测试方法与结果、软件即硬件性能分析】
【一】软件测试与性能分析
1.开始时,LED灯以2Hz频率闪动,P0.0位输入,可以看到P0.0位的闪动。10秒前,蜂鸣器位P3.1一直为低电平。截图如下:
此时时间为:
2.10s时刻,蜂鸣器响一次,P3.1恰变为高电平,截图如下:
此时时间为:
3.之后LED灯以1Hz频率闪动,观察发现,P0.0口的闪动比之前慢,且与显示时间对应,符合设计要求,截图如下:
此时时间为:
4.20s时刻,蜂鸣器响一次,对应的P3.1口变为高电平。截图如下:
此时时间为:
5.20s之后,LED灯以0.5Hz频率闪动,观察发现,P0.0口的闪动比之前又慢一些,且与显示时间对应,符合设计要求,截图如下:
此时时间为:
6.30s时刻,蜂鸣器又响一次,P3.1口变为高电平,截图如下:
此时时间为:
7.30s之后,LED灯又以2Hz闪动,即循环执行以上过程,截图如下:
通过以上分析可知程序在每一步骤运行正常,0~10sLED灯内以频率2Hz闪动,10s时蜂鸣器响一次,之后10s~20s间,LED灯以频率1Hz闪动,20s时蜂鸣器又响一次,之后LED灯以频率0.5s闪动,30s时蜂鸣器响一次,30s之后循环以上操作。软件运行结果达到预期目标,测试成功!
【二】硬件测试(照片说明)
【思考题】
1.若想实现3种闪耀方式的持续时间在5s-20s范围内可调,且每种方式的持续时间各不相同,应如何设计程序?
答:可以通过更改定时器T1的多次循环计时次数,来使10s计时变为其他时间。通过KINT键进入更改模块,使用矩阵键盘以1s的步长增减T1计时时间。
相关热词搜索: 完整版 单片机 控制器 华中科技大学 实验