多功能无线数字钟
摘要:本系统装置的主要功能包括数字钟、无线控制和温度计。数字钟通过时钟芯片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