单片机设计报告

多功能无线数字钟

摘要:本系统装置的主要功能包括数字钟、无线控制和温度计。数字钟通过时钟芯片DS1302实现,时钟准确,误差小;无线控制采用红外遥控,成本低,操作距离适中;温度采集采用温度传感器DS18B20,精度高。系统扩展、系统配置灵活。容易构成何种规模的应用系统,且应用系统较高的软、硬件利用系数。单片机具有可编程性,硬件的功能描述可完全在软件上实现,而且设计时间短,成本低,可靠性高。综上所述,利用振荡电路与单片机结合实现电阻、电容、电感测试仪更为简便可行,节约成本。所以,本次设计选定以STM8S105系列单片机为核心来进行。

关键词:STM8单片机、红外无线、DS18B20、DS1302

目录

1. 设计任务及要求... 4

1.1 数字钟任务及要求... 4

1.2 温度计任务及要求... 4

2. 方案比较及选择... 4

2.1显示部分... 4

2.2 红外遥控器... 5

2.3 红外接收电路... 5

2.4 语言模块... 5

2.5温度采集... 5

2.3  MCU方案... 5

3. 硬件电路设计... 6

3.1 单元电路设计... 6

3.1.1 单片机控制电路设计... 6

3.1.2 显示电路设计... 7

3.1.4 时钟电路设计... 8

3.1.5 温度采集电路设计... 8

3.1.6 红外接收电路设计... 8

3.1.7 蜂鸣器电路设计... 9

3.1.8 电源电路设计... 9

3.2 整体电路... 10

4. 软件程序设计... 11

4.1 程序算法设计流程图... 11

5. 系统测试及结果... 12

6. 设计总结... 12

参考文献... 12

附录1 电路原理图及印刷板图... 13

附录2 源程序... 14

1. 设计任务及要求

1.1 数字钟任务及要求

(1)显示年月日时分秒及星期信息。
(2)具有可调整日期和时间功能
(3)增加闰年计算功能

(4)实现语音报时

(5)电子秤设计

1.2 温度计任务及要求

(1)基本范围-50℃-110℃
(2)精度误差小于0.5℃
(3)LED数码直读显示
(4)实现语音报数

2. 方案比较及选择

2.1显示部分

方案一:

数值显示可采用LED点阵显示,如16*16点阵

方案二:

采用七段数码管显示数值,如共阴数码管

方案选择:

考虑到数码管显示操作简单,硬件电路少,本设计采用数码管显示。

2.2 红外遥控器

方案一:

采用红外发射二极管,搭配单片机,软件编码再结合按键检测可以自制专业红外反射器

方案二:

采用市面上现成的遥控器

方案选择:

由于自己搭建发射电路复制和制作成本高,这里采用现成的红外遥控器,38KHZ载波。

2.3 红外接收电路

方案选择:

结合发射器,这里采用一体化红外接收头HS0038,方案不做比较。

2.4 语言模块

方案选择:

采用语音模块,它是主要由语音芯片组合的模块电路。

2.5温度采集

方案一:

可以采用AD595温度传感器,结合STM8S单片机内嵌的ADC采集电压经过软件计算,进而得到温度值

方案二:

采用单总线数字温度传感器DS18B20

方案选择:

由于模拟传感器需要配合前置电路和数模转换器,需消耗成本,这里采用数字传感器DS18B20

2.3  MCU方案

方案一:51单片机

51单片机是目前应用最广泛的8位单片机之一,很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。其功能特点如下:

a、可以仿真63K程序空间,接近64K 的16位地址空间;

b、可以仿真64Kxdata 空间,全部64K 的16位地址空间;

c、可以真实仿真全部32 条IO脚;

d、完全兼容keilC51 UV2 调试环境,可以通过UV2 环境进行单步,断点, 全速等操作;

e、可以使用C51语言或者ASM汇编语言进行调试 ;

f、可选 使用用户晶振,支持0-40MHZ 晶振频率;

g、片上带有768字节的xdata,可以在仿真时选用,进行xdata 的仿真;

h、可以仿真双DPTR 指针;

i、可以仿真去除ALE 信号输出。

方案二:STM8单片机

STM8S是意法半导体公司近些年推出的8位微处理器,与AVR等新一代8位微处理器相比,其功能更强大,但价格相对便宜。其功能特点如下:

a、最大支持128kB FLASH、6Kb RAM、2Kb EEPROM, 可达30万次擦写,最大封装有68引脚;

b、灵活的时钟控制,4个主时钟源,并带有时钟监控的时钟安全保障系统

c、带有32个中断的嵌套中断控制器,6个外部中断向量,最多27个外部中断;

d、高级控制定时器:4 个捕获/ 比较通道,3 个互补输出,死区控制和灵活的同步,16 位通用定时器,带有3 个捕获/ 比较通道(IC、OC 或 PWM),带有8位预分频器的8 位基本定时器,自动唤醒定时器,2 个看门狗定时器:窗口看门狗和独立看门狗;

e、非常强健的I/O 设计,对倒灌电流有非常强的承受能力。

方案选择:

51 单片机是一款典型的单片机,但是由于51 单片机的FLASH 和RAM 都比较小,寄存器和定时器的数量少,体积大,所以不建议采用。方案二中的STM8S 系列单片机,体积小,功能强大,价格便宜。所以选择STM8 作为主控制MCU。

3. 硬件电路设计

      3.1 单元电路设计

3.1.1 单片机控制电路设计

单片机控制电路主要包括单片机及其周围元件。

3.1.2 显示电路设计

显示电路主要包括四位共阴数码管、锁存器74HC573、译码器74HC138。电路如下图所示:

3.1.4 时钟电路设计

时钟电路主要包括DS1302、32768晶振及纽扣电池。电路如下图所示:

3.1.5 温度采集电路设计

       温度采集电路包括DS18B20及其插座。电路如下图所示:

3.1.6 红外接收电路设计

电路如下图所示:

3.1.7 蜂鸣器电路设计

电路如下图所示:

3.1.8 电源电路设计

电路如下图所示:

      3.2 整体电路

整体电路图如下图所示:

4. 软件程序设计

4.1 程序算法设计流程

单片机设计报告

5. 系统测试及结果

经实验检测,本装置系统能实现数字钟、闹钟设定、红外无线控制、语音报时、温度采集及显示灯功能。功能强大,并且系统稳定,造价低,达到了课程设计的要求,是理想的多功能数字时钟。

6. 设计总结

经过几个星期的努力,本设计系统终于完成了。通过该课程设计,掌握了硬件电路制作和软件编译的基本过程及其各阶段的基本任务,熟悉了产品设计制作的总流程框图,了解了编译程序的生成过程及其相关的技术,对课本上的知识也有了更深的理解。老师常说,课本上的知识是机械的,要学会去运用,要举一反三。现在终于深刻的了解了这句话。经过这次的课程设计,发现书本上很深奥的知识变的更为简单,同样,对实验原理也了有更深的理解。知道和理解了该理论在计算机中是怎样执行的, 对该理论在实践中的应用有深刻的理解 。通过该课程设计,把死板的课本知识变得生动有趣,激发了学习的积极性。能够把课堂上学的知识通过自己设计表示出来,加深了对理论知识的理解。

课程设计中的电路和程序比较复杂,因此调试的过程更是考验我们耐性和细心。除了课堂外,课程设计是最能学到东西的,最考验人的。在做课程设计的这段时间,时刻都感到自己学的知识有多么的贫瘠。经过这次课程设计,让我对PCB电路设计和单片机C语言编程有了更深的认识,操作能力有了提高。

参考文献

[1]童诗白 华英成,模拟电子技术基础[M].北京:高等教育出版社,2006.

[2]阎石,数字电子技术基础[M].北京:高等教育出版社,2006.

[3]胡斌 胡松,电子元器件[M].北京.电子工业出版社,2010.

[4]孙肖子,电子设计指南[M].北京.高等教育出版社,2006.

[5]谭浩强,C程序设计[M].北京:清华大学出版社,2010.

附录1 电路原理图及印刷板图

PCB电路正面:

PCB电路反面:

附录2 源程序

(1)主函数文件程序

stm8/

;*********************************************

;功能:遥控数字时钟

;时间:2012/11/30

;地点:广东工业大学

;**********************************************

  #INCLUDE "STM8S105C_S.INC"

  #include "mapping.inc"

  #INCLUDE "RAM.INC"

  #INCLUDE "ISD1730.INC"

  segment 'rom'

main.l

  ; initialize SP

  ldw X,#stack_end

  ldw SP,X

  #ifdef RAM0  

  ; clear RAM0

ram0_start.b EQU $ram0_segment_start

ram0_end.b EQU $ram0_segment_end

  ldw X,#ram0_start

clear_ram0.l

  clr (X)

  incw X

  cpw X,#ram0_end  

  jrule clear_ram0

  #endif

  #ifdef RAM

  ; clear RAM1

ram1_start.w EQU $ram1_segment_start

ram1_end.w EQU $ram1_segment_end

  ldw X,#ram1_start

clear_ram1.l

  clr (X)

  incw X

  cpw X,#ram1_end  

  jrule clear_ram1

  #endif

  ; clear stack

stack_start.w EQU $stack_segment_start

stack_end.w EQU $stack_segment_end

  ldw X,#stack_start

clear_stack.l

  clr (X)

  incw X

  cpw X,#stack_end 

  jrule clear_stack

  INTEL

  MOV CLK_CKDIVR,#00H               ;主频16M

;*********************延时***********************

  CALL IO_INIT

;*********************时钟初始化*****************

  CALL TIM1_INIT     ;

  CALL TIM2_INT      ;红外解码定时器2初始化

  CALL TIM3_INIT     ;定期3初始化

  CALL TIM4_INIT

;------------------------------

  MOV ITC_SPR3,#0

  MOV ITC_SPR4,#01110100B

  MOV ITC_SPR6,#0

;-------------------------------

; CALL DS1302_INIT   ;时钟初始化

;*********************相关寄存器初始化***********

  MOV {CLOCK_LED+2},#16   ;数码第3位显示“-”

  MOV {CLOCK_LED+5},#16   ;数码第6位显示“-”

  MOV {TEMPERATURE+4},#17 ;温度模式下数码第3位显示“o”

  MOV {TEMPERATURE+5},#0CH;温度模式下数码第4位显示“C”

  MOV X_TIMES_TRMPERATURE,#100

  MOV TIM1_TIMES_TEMP,#10

  MOV {ALARM_LED+2},#16   ;闹钟设置模式下第3位显示‘-’

  MOV ALARM_MIN,#55H

  MOV ALARM_HOUR,#01H

  MOV X_TIM1,#35          ;红外接收成功指示灯闪烁时间

  MOV X_TIM2,#90          ;时间/日期更新时间

  MOV X_TIM3,#20          ;调整模式下数码管闪烁效果快慢

  RIM                     ;开总中断

  MOV BEEP_TIME,#3

;************************************************************

;调试区

  CALL ISD1730_INIT

  MOV X_MS,#10

  CALL DELAY_MS

;************************************************************

  JP CLOCK_MAIN           ;进入任务分配

  interrupt TIM1_INTERRUPT

TIM1_INTERRUPT.l

  JP TIM1_INTERRUPT_CODE

  interrupt TIM4_INTERRUPT

TIM4_INTERRUPT.l

  JP TIM4_INTERRUPT_CODE

;******************定时器3更新中断*******************

  interrupt TIMER_3

TIMER_3.l

  BRES   TIM3_SR1,#0       ;必要时的清除更新产生的更新标志

  BTJF LED_SHAN,TIMER_3_EXIT

  DEC X_TIM3

  JRNE TIMER_3_EXIT

  MOV X_TIM3,#50

  BTJT IR_CH1_F,ALARM_LED_SHAN

  BCPL DISPLAY_SP,#0      ;任务0/1切换,闪烁效果

  JRA TIMER_3_EXIT

ALARM_LED_SHAN

  BCPL ALARM_SHAN         ;闹钟模式下闪烁标志

TIMER_3_EXIT

  BTJT LED_OFF,LED_DATA_NOTSHOW

  CALL LED_DATA_SHOW      ;调用数码管显示函数

LED_DATA_NOTSHOW

  DEC X_TIM2

  JRNE TIMER_3_EXIT_1     ;判断是否需要更新时间/日期

  MOV X_TIM2,#90

  BTJT LED_DATE_TEM,LED_DISPLAY_TEM

  BSET DS1302_FLAG        ;采集时间

  BRES DS1820_FLAG

  JRA TIMER_3_EXIT_1

LED_DISPLAY_TEM

  BSET DS1820_FLAG        ;采集温度

  BRES DS1302_FLAG

TIMER_3_EXIT_1

  BTJF RX_SUCCESS_LED,TIMER_3_EXIT_2;判断是否需要闪烁一下RX_SUCCESS_LED

  DEC X_TIM1

  JRNE TIMER_3_EXIT_2

  BSET IR_LED

  BRES RX_SUCCESS_LED

  MOV X_TIM1,#35

TIMER_3_EXIT_2

  ;*********************关闹钟*******************

  BTJF ALARM_CLOCK,TIMER_3_EXIT_3

  ;BCPL BEEPER

TIMER_3_EXIT_3 

  IRET

  IRET

  IRET

  IRET

  IRET

;***********定时2更新中断***********

  interrupt TIMER_2

TIMER_2.l

  JP TIM2_INTERRUPT

;***********定时器2捕获中断*********

  interrupt TIMER_2_CAPTURE

TIMER_2_CAPTURE.l

  JP TIM2_CAPTURE

(2)根据时钟计时分配任务

STM8/

;*********************************************

;功能:遥控数字时钟

;时间:2012/11/30

;地点:广东工业大学

;**********************************************

  #INCLUDE "STM8S105C_S.INC"

  #include "mapping.inc"

  #INCLUDE "RAM.INC"

  #INCLUDE "ISD1730.INC"  

  SEGMENT 'rom'

  INTEL

;--------------------时钟任务分配------------------  

.CLOCK_MAIN

  BTJT RX_SUCCESS,GET_IR_FUNCTION   ;红外是否有更新

  BTJT DS1302_FLAG,GET_TIME         ;是否需要更新时间

  BTJT DS1820_FLAG,GET_TEMPERATURE  ;是否是显示温度模式

  BTJT READ_TIME_FLAG,READ_NOWTIME  ;报时

  BTJT READ_WENDU_FLAG,READ_NOWWENDU;报温

  JP CLOCK_MAIN

GET_TIME;---------------------------更新时间

  BRES DS1302_FLAG                  ;清除更新时间标志位

  CALL DS1302_GETTIME               ;调用读取时间函数

  JP CLOCK_MAIN                     ;返回任务分配

GET_TEMPERATURE;--------------------温度显示模式

  BRES DS1820_FLAG                  ;清除显示温度模式标志位

  CALL READ_TEMPERATURE             ;取温度显示

  JP CLOCK_MAIN

GET_IR_FUNCTION;--------------------遥控有按键按下,并成功接收

  JP IR_TASK                        ;解码

  JP CLOCK_MAIN

READ_NOWTIME;-----------------------报时

 BRES READ_TIME_FLAG

; CALL READ_TIME

 JP CLOCK_MAIN

READ_NOWWENDU;-----------------------报温度值

; CALL READ_WENDU

 BRES READ_WENDU_FLAG

 JP CLOCK_MAIN

  END

(3)红外遥控任务管理文件

  STM8/

;*********************************************

;功能:红外按键执行程序

;时间:2012/11/30

;地点:广东工业大学

;**********************************************

  #INCLUDE "STM8S105C_S.INC"

  #include "mapping.inc"

  #INCLUDE "RAM.INC"  

  #INCLUDE "ISD1730.INC"

  SEGMENT 'rom'

  INTEL

;************************红外任务解码********************** 

.IR_TASK

  BSET RX_SUCCESS_LED

  BRES IR_LED

  BRES RX_SUCCESS

  BTJF LED_OFF,IR_TASK_NEXT ;判断此时是否数码管关闭

  LD A,{RX_BUF+3}           ;是关闭

  CP A,IR_ON_OFF            ;判断是否为开关按键

  JRNE  IR_CODE_TASK_ERROR  ;不是,错误,返回

  JP IR_TASK2_OFF           ;是,执行IR_TASK2_OFF

IR_TASK_NEXT

  CLRW X

  LD A,#21                  ;21个任务码

  LD XL,A

  LD A,{RX_BUF+3}

IR_CODE_TASK_LOOP

  DECW X

  JREQ IR_CODE_TASK_ERROR   ;小于0,出错

  CP A,(IR_TASKCODE,X)      ;查表方式取出值

  JRNE IR_CODE_TASK_LOOP

  JRA IR_CODE_TASK_SUCCESS

IR_CODE_TASK_ERROR

 ;                           ;清相关标志位

  JP CLOCK_MAIN

IR_CODE_TASK_SUCCESS

  LD A,XL

  LD IR_TASK_SP,A            ;任务号放IR_TASK_SP

  CPW X,#15

  JRNC IR_CODE_FUNCTION_TASK ;功能键

  CPW X,#5

  JRNC IR_CODE_FIGURE_TASK   ;数字键

  LD A,#3

  JRA IR_TASK_CONTROL 

IR_CODE_FIGURE_TASK

  LD A,#1

  JRA IR_TASK_CONTROL

IR_CODE_FUNCTION_TASK 

  LD A,#2

IR_TASK_CONTROL

  LD XL,A

  LD A,#3

  MUL X,A

  JP (IR_TASK_CONTROL_1,X)

IR_TASK_CONTROL_1

  JP IR_TASK0

  JP IR_TASK1

  JP IR_TASK2

  JP IR_TASK3

IR_TASK0

  JP CLOCK_MAIN

;----------------------------------------------------------------

IR_TASK1                  ;数字键

  BTJT IR_MODE_F,IR_TASK1_EXIT

  JP CLOCK_MAIN           ;不是设置模式,返回

IR_TASK1_EXIT

  CLRW X

  LD A,IR_TASK_SP         ;'9'->IR_TASK_SP=6 '8'->IR_TASK_SP=7

  SUB A,#5                ;'0'->IR_TASK_SP=15  15-6=9

  LD XL,A                                ;'9'->IR_TASK_SP=6    6-6=0

  LD A,#3

  MUL X,A

  JP (IR_TASK1_CONTROL_1,X)

IR_TASK1_CONTROL_1

  JP IR_TASK19

  JP IR_TASK18

  JP IR_TASK17

  JP IR_TASK16

  JP IR_TASK15

  JP IR_TASK14

  JP IR_TASK13

  JP IR_TASK12

  JP IR_TASK11

  JP IR_TASK10

;----------------------"0"-----------------------

IR_TASK10  

  MOV ADJUST_H,#0

  BTJF IR_CH1_F,IR_TASK10_EXIT

  JP ALARM_ADJUST

IR_TASK10_EXIT

  JP IR_ADJUST_TASK

IR_TASK11  

  MOV ADJUST_H,#1

  BTJF IR_CH1_F,IR_TASK11_EXIT

  JP ALARM_ADJUST

IR_TASK11_EXIT

  JP IR_ADJUST_TASK

IR_TASK12  

  MOV ADJUST_H,#2

  BTJF IR_CH1_F,IR_TASK12_EXIT

  JP ALARM_ADJUST

IR_TASK12_EXIT

  JP IR_ADJUST_TASK

IR_TASK13  

  MOV ADJUST_H,#3

  BTJF IR_CH1_F,IR_TASK13_EXIT

  JP ALARM_ADJUST

IR_TASK13_EXIT

  JP IR_ADJUST_TASK

IR_TASK14  

  MOV ADJUST_H,#4

  BTJF IR_CH1_F,IR_TASK14_EXIT

  JP ALARM_ADJUST

IR_TASK14_EXIT

  JP IR_ADJUST_TASK

IR_TASK15  

  MOV ADJUST_H,#5

  BTJF IR_CH1_F,IR_TASK15_EXIT

  JP ALARM_ADJUST

IR_TASK15_EXIT

  JP IR_ADJUST_TASK

IR_TASK16  

  MOV ADJUST_H,#6

  BTJF IR_CH1_F,IR_TASK16_EXIT

  JP ALARM_ADJUST

IR_TASK16_EXIT

  JP IR_ADJUST_TASK

IR_TASK17  

  MOV ADJUST_H,#7

  BTJF IR_CH1_F,IR_TASK17_EXIT

  JP ALARM_ADJUST

IR_TASK17_EXIT

  JP IR_ADJUST_TASK

IR_TASK18  

  MOV ADJUST_H,#8

  BTJF IR_CH1_F,IR_TASK18_EXIT

  JP ALARM_ADJUST

IR_TASK18_EXIT

  JP IR_ADJUST_TASK

IR_TASK19  

  MOV ADJUST_H,#9

  BTJF IR_CH1_F,IR_TASK19_EXIT

  JP ALARM_ADJUST

IR_TASK19_EXIT

  JP IR_ADJUST_TASK

IR_ADJUST_TASK

  LD A,IR_MODE_SP

  CP A,#2

  JREQ DS1302_TIME_ADJUST

  CP A,#3

  JREQ DS1302_DATE_ADJUST

  JP IR_ADJUST_TASK_EXIT

DS1302_TIME_ADJUST    ;*---------时间调整

  CLRW X

  LD A,LED_SHANSHUO_1 ;第几位

  LD XL,A

  LD A,(TIME_ADJUST,X)

  LD ADJUST_W,A

  BTJF LED_SHANSHUO,#0,ADJUST_SHI

  DEC LED_SHANSHUO_1

  LD A,LED_SHANSHUO_1

  LD XL,A

  LD A,(CLOCK_LED,X)  ;取显示值

  INC LED_SHANSHUO_1

  SWAP A

  AND A,#11110000B

  OR A,ADJUST_H

  LD ADJUST_H,A

  JRA IR_ADJUST_TASK_ONE

ADJUST_SHI 

  INC LED_SHANSHUO_1

  LD A,LED_SHANSHUO_1

  LD XL,A

  LD A,(CLOCK_LED,X)  ;取显示值

  DEC LED_SHANSHUO_1  

  AND A,#0FH

  SWAP A

  OR A,ADJUST_H

  SWAP A

  LD ADJUST_H,A

IR_ADJUST_TASK_ONE

  CALL DS1302_ADJUST

  JRA IR_ADJUST_TASK_EXIT

DS1302_DATE_ADJUST    ;----------日期调整

  CLRW X

  LD A,LED_SHANSHUO_1 ;第几位

  LD XL,A

  LD A,(DATE_ADJUST,X)

  LD ADJUST_W,A

  BTJF LED_SHANSHUO,#0,ADJUST_DATE_SHI

  DEC LED_SHANSHUO_1

  LD A,LED_SHANSHUO_1

  LD XL,A

  LD A,(CLOCK_LED,X)  ;取显示值

  INC LED_SHANSHUO_1

  SWAP A

  AND A,#11110000B

  OR A,ADJUST_H

  LD ADJUST_H,A

  JRA IR_ADJUST_DATE_TASK_ONE

ADJUST_DATE_SHI

  INC LED_SHANSHUO_1

  LD A,LED_SHANSHUO_1

  LD XL,A

  LD A,(CLOCK_LED,X)  ;取显示值

  DEC LED_SHANSHUO_1  

  AND A,#0FH

  SWAP A

  OR A,ADJUST_H

  SWAP A

  LD ADJUST_H,A

IR_ADJUST_DATE_TASK_ONE

  CALL DS1302_ADJUST

IR_ADJUST_TASK_EXIT

  JP IR_TASK2_YOU     ;调整完,闪烁位自动加1

  JP CLOCK_MAIN

;---------------------闹钟模式设置----------

ALARM_ADJUST

  CLRW X

  LD A,LED_SHANSHUO_1 ;第几位

  LD XL,A

  LD A,ADJUST_H

  LD (ALARM_LED,X),A

ADJUST_ALARM_ONE      ;更新一下ALARM_SEC,ALARM_MIN,ALARM_HOUR

  CLRW X

  LD A,(ALARM_LED,X)  ;小时十位

  INCW X

  SWAP A

  OR A,(ALARM_LED,X)  ;小时个位

  LD ALARM_HOUR,A

  INCW X

  INCW X

  LD A,(ALARM_LED,X)  ;分钟十位

  INCW X

  SWAP A

  OR A,(ALARM_LED,X)  ;分钟个位

  LD ALARM_MIN,A   

ADJUST_ALARM_EXIT

  JP IR_TASK2_YOU     ;闪烁位自动加1,下1位

  JP CLOCK_MAIN

;------------------------------------------------------------------

IR_TASK2                  ;功能键

  CLRW X

  LD A,IR_TASK_SP         ;'MOED'->IR_TASK_SP=21 'ZUO'->IR_TASK_SP=20

  SUB A,#15                ;'BACK'->IR_TASK_SP=16  16-16=0

  LD XL,A                 ;'MOED'->IR_TASK_SP=21  21-16=5

  LD A,#3

  MUL X,A

  JP (IR_TASK2_CONTROL_1,X)

IR_TASK2_CONTROL_1

  JP IR_TASK2_BACK

  JP IR_TASK2_STOP

  JP IR_TASK2_OFF

  JP IR_TASK2_YOU

  JP IR_TASK2_ZUO

  JP IR_TASK2_MODE

;-----------------------MODE-------------------------------------

IR_TASK2_MODE                ;设置模式

  BSET IR_MODE_F             ;置标志位

  LD A,IR_MODE_SP

  CLRW X

  LD XL,A

  LD A,#3

  MUL X,A

  JP (ONE_IR_TASK2_MODE_1,X)

ONE_IR_TASK2_MODE_1

  JP ONE_IR_TASK0

  JP ONE_IR_TASK1

  JP ONE_IR_TASK2

  JP ONE_IR_TASK3

ONE_IR_TASK0                ;按1下

  BSET DS1302_GET_DATE_TIME  

  JRA ONE_IR_TASK2_MODE_EXIT 

ONE_IR_TASK1                ;按2下

  BRES DS1302_GET_DATE_TIME  ;显示时间;IR_MODE_SP=2

  BSET LED_SHAN              ;闪烁显示

  JRA ONE_IR_TASK2_MODE_EXIT

ONE_IR_TASK2                 ;按3下

  BSET DS1302_GET_DATE_TIME  ;显示日期

  BSET LED_SHAN              ;闪烁显示  

  JRA ONE_IR_TASK2_MODE_EXIT

ONE_IR_TASK3               ;4

  CLR LED_SHANSHUO_1       ;回0

  BRES IR_MODE_F           ;模式键按下标志位清除

  BRES LED_SHAN            ;停止闪烁

  BRES DS1302_GET_DATE_TIME;显示时间

  CLR  DISPLAY_SP

  BRES LED_DATE_TEM

  CLR IR_MODE_SP

  JP CLOCK_MAIN

ONE_IR_TASK2_MODE_EXIT

  INC IR_MODE_SP             ;模式显示指针加1

  JP CLOCK_MAIN

;----------------------"<<<"------------------------------------

IR_TASK2_ZUO

  BTJF IR_MODE_F,IR_TASK2_YOU_EXIT

  DEC LED_SHANSHUO_1

  LD A,LED_SHANSHUO_1

  JRPL IR_TASK2_ZUO_1

  MOV LED_SHANSHUO_1,#7 ;LED_SHANSHUO_1<0

  JRA IR_TASK2_ZUO_EXIT

IR_TASK2_ZUO_1

  CP A,#2

  JRNE IR_TASK2_ZUO_2

  DEC LED_SHANSHUO_1

  JRA IR_TASK2_ZUO_EXIT

IR_TASK2_ZUO_2

  CP A,#5

  JRNE IR_TASK2_ZUO_EXIT

  DEC LED_SHANSHUO_1

IR_TASK2_ZUO_EXIT       ;模式退出

  CALL SP_SWAP         ;计算LED_SHANSHUO

  JP CLOCK_MAIN

;----------------------">>>"-------------------------------------

IR_TASK2_YOU

  BTJF IR_MODE_F,IR_TASK2_YOU_EXIT

  INC LED_SHANSHUO_1

  LD A,LED_SHANSHUO_1

  CP A,#2

  JRNE IR_TASK2_YOU_1

  INC LED_SHANSHUO_1

  JRA IR_TASK2_YOU_EXIT

IR_TASK2_YOU_1

  CP A,#5

  JRNE IR_TASK2_YOU_2

  INC LED_SHANSHUO_1

  JRA IR_TASK2_YOU_EXIT

IR_TASK2_YOU_2

  CP A,#8

  JRC IR_TASK2_YOU_EXIT

  CLR LED_SHANSHUO_1

IR_TASK2_YOU_EXIT          ;模式退出

  CALL SP_SWAP         ;计算LED_SHANSHUO

  JP CLOCK_MAIN

;----------------------ON/OFF------------------------------------

IR_TASK2_OFF              ;开/关闭

  BCPL LED_OFF            ;开/关数码管标志位

  CLR PB_ODR              ;请数码管显示

; BCPL TIM3_CR1,#0        ;开/关闭定时器

  JP CLOCK_MAIN

;-----------------------STOP-------------------------------------

IR_TASK2_STOP

  BCPL IR_STOP_F

  BTJT IR_STOP_F,DS1302_STOP

  MOV RTC_ADDR,#8EH

  MOV RTC_DATA,#0H

  CALL WIRTE_DATA1302

  MOV RTC_ADDR,#80H

  LD A,SEC

  AND A,#01111111B

  LD RTC_DATA,A

  CALL WIRTE_DATA1302        ;写入秒

  JRA IR_TASK2_STOP_EXIT

DS1302_STOP

  MOV RTC_ADDR,#8EH

  MOV RTC_DATA,#0H

  CALL WIRTE_DATA1302

  MOV RTC_ADDR,#80H

  LD A,SEC

  OR A,#080H

  LD RTC_DATA,A

  CALL WIRTE_DATA1302        ;写入秒

IR_TASK2_STOP_EXIT         ;退出

  JP CLOCK_MAIN

;---------------------BACK_MUNE----------------------------------

IR_TASK2_BACK

  BRES TIM1_CR1,#0

  BRES LED

  BSET PE_ODR,#6

  BRES TIM4_CR1,#0         ;关闹钟

  CLR LED_SHANSHUO_1       ;回0

  BRES IR_MODE_F           ;模式键按下标志位清除

  BRES IR_CH1_F            ;闹钟设置键标志位清除

  BRES LED_SHAN            ;停止闪烁

  BRES DS1302_GET_DATE_TIME;显示时间

  CLR  DISPLAY_SP

  BRES LED_DATE_TEM

  MOV RTC_ADDR,#8EH

  MOV RTC_DATA,#0H

  CALL WIRTE_DATA1302

  MOV RTC_ADDR,#80H

  LD A,SEC

  AND A,#01111111B

  LD RTC_DATA,A

  CALL WIRTE_DATA1302        ;写入秒

  JP CLOCK_MAIN

;----------------------CH1/CH2/EQ/-----------------------

IR_TASK3

  CLRW X

  LD A,IR_TASK_SP         ;'9'->IR_TASK_SP=6 '8'->IR_TASK_SP=7

  LD XL,A                                ;'9'->IR_TASK_SP=6    6-6=0

  LD A,#3

  MUL X,A

  JP (IR_TASK3_CONTROL_1,X)

IR_TASK3_CONTROL_1

  JP CLOCK_MAIN

  JP CLOCK_MAIN

  JP IR_TASK_CH1

  JP IR_TASK_CH2

  JP IR_TASK_EQ

IR_TASK_CH1           ;闹钟设置

  BSET IR_MODE_F      ;功能键按下

  BSET IR_CH1_F

  BSET LED_SHAN       ;闪烁

  MOV DISPLAY_SP,#4   ;闹钟设置模式显示

  JP CLOCK_MAIN

IR_TASK_CH2           ;开/关闹钟

  BCPL ALARM_CLOCK_F

  BTJF ALARM_CLOCK_F,IR_TASK_CH2_STOP

  MOV {CLOCK_LED+5},#18;指示灯开

  JRA IR_TASK_CH2_EXIT

IR_TASK_CH2_STOP

  MOV {CLOCK_LED+5},#16;指示灯关

  BRES ALARM_CLOCK     ;关闹钟到标志位

  BSET BEEPER          ;关蜂鸣器

IR_TASK_CH2_EXIT

  JP CLOCK_MAIN

;---------------------温度/时间-----------------------------------

IR_TASK_EQ

  BCPL LED_DATE_TEM

  BTJT LED_DATE_TEM,IR_TASK_EQ_1

  MOV DISPLAY_SP,#0

  JRA IR_TASK_EQ_EXIT

IR_TASK_EQ_1

  MOV DISPLAY_SP,#2

IR_TASK_EQ_EXIT         ;EQ退出 

  JP CLOCK_MAIN

;******************************

;功能:计算LED_SHANSHUO变量

;入口参数:LED_SHANSHUO_1

;出口参数:LED_SHANSHUO

;******************************

.SP_SWAP

  LD A,LED_SHANSHUO_1

  CP A,#2

  JRNC SP_SWAP_1          ;>=

  MOV LED_SHANSHUO,LED_SHANSHUO_1

  JRA SP_SWAP_EXIT_1

SP_SWAP_1

  CP A,#5

  JRNC SP_SWAP_2          ;>=

  DEC LED_SHANSHUO_1

  MOV LED_SHANSHUO,LED_SHANSHUO_1

  INC LED_SHANSHUO_1

  JRA SP_SWAP_EXIT_1

SP_SWAP_2

  DEC LED_SHANSHUO_1

  DEC LED_SHANSHUO_1

  MOV LED_SHANSHUO,LED_SHANSHUO_1

  INC LED_SHANSHUO_1

  INC LED_SHANSHUO_1

SP_SWAP_EXIT_1

  BTJF IR_CH1_F,SP_SWAP_EXIT

  LD A,LED_SHANSHUO_1

  CP A,#6

  JRC SP_SWAP_EXIT_2

  CLR LED_SHANSHUO_1

SP_SWAP_EXIT_2 

SP_SWAP_EXIT

  RET

  RET

  RET

  RET

  RET

  END

相关推荐