当前位置: 首页 > 范文大全 > 公文范文 >

[华中科技大学单片机实验报告完整版led灯控制器]单片机实验led流水灯

时间:2021-10-15 13:23:15 来源:网友投稿

华中科技大学单片机实验报告-完整版-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计时时间。

相关热词搜索: 完整版 单片机 控制器 华中科技大学 实验