原创 数字钟改造电饭锅

2010-10-9 23:33 1269 4 4 分类: MCU/ 嵌入式

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;    变量定义  ;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
 FLAG1 BIT 55H   ;温度测量中的标志位
 TEMPER_L EQU 31H  ;温度测量中存放的高8位数据
 TEMPER_H EQU 32H  ;温度测量中存放的高8位数据
 TEMPER_NUM EQU 34H  ;存放温度数值
 DQ    BIT P0.7   ;外接温度传感器
 SL    BIT P1.0   ;调时键 
 JS    BIT P1.1   ;调时加一
 TM    BIT P1.3   ;煮饭定时器开关
 FR    BIT P1.5   ;火力调节
 SS    BIT P1.4   ;总开关
 JDQ   BIT P1.6   ;输出控制继电器
 MS    BIT P1.7   ;蜂鸣器开关
 NZ    BIT P1.2   ;音乐/闹铃开关
 XZ  EQU  P0 ;
 CD45 EQU  P2 ;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;   数据初始化  ;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


 ORG 00H
 LJMP START
 ORG 0BH
 LJMP TIM0    ;T0中断地址 
 ORG 30H
START: 
 MOV SP, #70H 
 MOV P1,#00H       ;断开继电器
 MOV P2,#00H ;
 MOV 33H, #100   ;33存放一次中断时间的乘数: 1s/0.01s
 
;延迟数据存放单元
 MOV 39H, #0H ;
 MOV 40H, #0H ;
;调时数据存放单元
 MOV 30H, #00H   ;
 MOV 53H,#200
 MOV 54H,#60 ;
 MOV 63H,#240 ;
 MOV R0,#41H    ;R0存放时间数据的地址
 MOV R1,#47H    ;R1存放定时数据的地址
 MOV TMOD, #01H   ;选择模式1
    MOV TH0,#0D8H   ;给计时器高8位赋值
    MOV TL0,#0F0H   ;给计时器低8位赋值
 MOV IE, #8AH   ;开启TIMER0 中断
 MOV P1,#3BH    ;给PORT1 复位
 SETB TR0    ;开启定时器


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;  主程序   ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


MAIN: 
 JB SS,MAIN1    ;判断总开关
 JB TM,DINGS    ;判断定时
 SETB JDQ ;   ;开启继电器
 SJMP MAIN2 ;
DINGS:      ;若定时开关开启,判断是否到时间.
 CLR  JDQ ;
 SJMP MAIN2 ;
 
MAIN1:      ;当总开关闭和时,运行以下程序.(设置)
 JNB FR, MAIN2   ;判断火力设置. 煮粥还是煮饭.
 MOV A, 54H
 CJNE A,#01H,MAIN2 ;
 DJNZ 63H,MAIN2 ;
 MOV 63H,#240 ;
 CLR JDQ     ;断开继电器
  
MAIN2: 
 MOV A,49H    ;判断定时时候与目前时间是否吻合.
 CJNE A,41H,SENS ;
 MOV A,4AH ;
 CJNE A,42H,SENS ;
 MOV A,4BH ;
 CJNE A,43H,SENS ;
 MOV A,4CH ;
 CJNE A,44H,SENS ;
 MOV A,46H ;
 CJNE A,#01H,SENS;
 JNB TM,BRI2 ;
 SETB JDQ    ;开启继电器
 MOV 63H,#240   ;为煮粥时间定时
BRI2:  
 JNB NZ,SENS ;   ;判断音乐开启与否
 LJMP MUSIC0    ;若是,执行音乐程序 否,执行温度测量程序



 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;  温度测量   ;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


 ;模块程序


SENS: 
 LCALL GET_TEMPER  
 LCALL TEMPER_COV;
 SJMP  MAIN ;
GET_TEMPER:
 SETB DQ  ;
BCD: 
 LCALL INIT_1820;
 JB FLAG1,S22 ;
 LJMP BCD ; 
S22: 
 LCALL DELAY2
 MOV A,#0CCH ;
 LCALL WRITE_1820;
 MOV A,#44
 LCALL WRITE_1820
 NOP
 LCALL DELAY1
 LCALL DELAY1
CBA:
 LCALL INIT_1820
 JB FLAG1,ABC
 LJMP CBA
ABC: LCALL DELAY2
 MOV A,#0CCH
 LCALL WRITE_1820
 MOV A,#0BEH
 LCALL WRITE_1820
 LCALL READ_18200
 RET 


 
 


INIT_1820: SETB DQ     ;初始化数字传感器
 NOP
 CLR DQ
 MOV 55H,#80H 
TSR1: DJNZ 55H,TSR1
 SETB DQ
 MOV 55H,#25H
TSR2: DJNZ 55H,TSR2
 JNB DQ,TSR3
 LJMP TSR4
TSR3: SETB FLAG1
 LJMP TSR5
TSR4: CLR FLAG1
 LJMP TSR7
TSR5: MOV 55H,#06BH


TSR6:  DJNZ 55H,TSR6


TSR7: SETB DQ


 RET  
  
READ_1820:
 MOV 55H,#8
RE1:
 CLR C
 SETB DQ
 NOP
 NOP
 CLR DQ
 NOP
 NOP
 NOP
 SETB DQ
 MOV 56H,#7
 DJNZ 56H,$
 MOV C,DQ
 MOV 56H,#23
 DJNZ 56H,$
 RRC A
 DJNZ 55H,RE1
 RET


WRITE_1820:
 MOV 55H,#8          ;写入温度传感器
 CLR C
WR1: CLR DQ
 MOV 56H,#6
 DJNZ 56H,$
 RRC A
 MOV DQ,C
 MOV 56H,#23
 DJNZ 56H,$
 SETB DQ
 NOP
 DJNZ 55H,WR1
 SETB DQ
 RET
READ_18200:        ;读温度传感器
 MOV 58H,#2
 MOV 55H,#36H
RE00: MOV 56H,#8
RE01:
 CLR C 
 SETB DQ
 NOP
 NOP
 CLR DQ
 NOP
 NOP 
 NOP
 SETB DQ
 MOV 57H,#7
 DJNZ 57H,$
 MOV C, DQ 
 MOV 57H,#23
 DJNZ 57H,$
 RRC A
 DJNZ 56H,RE01
 SETB PSW.4 
 MOV R1,56H 
 MOV @R1,A
 DEC 56H
 CLR PSW.4
 DJNZ 58H,RE00
 RET
TEMPER_COV:             ;温度转换
 MOV A,#0F0H
 ANL A,TEMPER_L
 SWAP A
 MOV TEMPER_NUM,A
 MOV A, TEMPER_L
 JNB ACC.3,TEMPER_COV1
 INC TEMPER_NUM
TEMPER_COV1:
 MOV A,TEMPER_H
 ANL A,#07H
 SWAP A
 ADD A,TEMPER_NUM
 MOV TEMPER_NUM,A
 LCALL BIN_BCD
 RET
BIN_BCD:        ;再次初始化
 MOV DPTR,#TEMP_TAB
 MOV A, TEMPER_NUM
 MOVC A,@A+DPTR
 MOV TEMPER_NUM,A
 MOV A,TEMPER_NUM
 MOV B,#10
 DIV AB
 MOV 47H,A
 MOV 48H,B
 RET
RE_CONFIG:
 JB FLAG1,RE_CONFIG1
 RET
RE_CONFIG1:
 MOV A,#0CCH
 LCALL WRITE_1820
 MOV A,#4EH
 LCALL WRITE_1820
 MOV A,#00H
 LCALL WRITE_1820
 MOV A,#00H
 LCALL WRITE_1820
 MOV A,#7FH
 LCALL WRITE_1820
 RET


 ;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;; 音乐程序 ;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;


 ;模块程序



MUSIC0: MOV       DPTR,#DAT         ;表头地址送DPTR
        MOV       30H,#00H          ;中断计数器清0
        MOV       B,#00H            ;表序号清0
MUSIC1: JNB SL,MUSICN;
        LCALL DELAY  ;
        JNB SL,MUSICN;
 CLR MS  


MUSICN: CLR A      ;CLEAR A
        MOVC      A,@A+DPTR         ;查表取代码
        JZ        END0         ;是00H,则结束
        CJNE      A,#0FFH,MUSIC5
        LJMP      MUSIC3
MUSIC5:
        NOP
        MOV       R6,A
        INC       DPTR
        MOV       A,B
        MOVC      A,@A+DPTR         ;取节拍代码送R7
        MOV       R7,A
               ;SETB      TR0             
MUSIC2:
        NOP
        CPL       MS
        MOV       A,R6
        MOV       R3,A
        LCALL     DEL
        MOV       A,R7
        CJNE      A,30H,MUSIC2      ;中断计数器(20H)=R7否?
                                 ;不等,则继续循环
        MOV       30H,#00H          ;等于,则取下一代码
        INC       DPTR
        INC       B
        LJMP      MUSIC1
MUSIC3:
        NOP
        CLR       MS    ;CLR       TR0 休止100毫秒
        MOV       R2,#0DH
MUSIC4:
        NOP
        MOV       R3,#0FFH
        LCALL     DEL
        DJNZ      R2,MUSIC4
        INC       DPTR
  SETB    MS
        LJMP      MUSIC1


MUSIC6:
        MOV       R3,#00H
        LCALL     DEL
        DJNZ      R2,MUSIC6
        LJMP      MUSIC0
END0:
  CLR MS ;
        LJMP MAIN          ;音乐程序执行完,返回主程序.


 



  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;;;;;;;;; 延迟系统    ;;;;;;;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DEL:
        NOP
DEL3:                 
        MOV       R4,#02H
DEL4:  
        NOP
        DJNZ      R4,DEL4
        NOP
        DJNZ      R3,DEL3
        RET


DELAY: 
  MOV 39H,#14H 
L1: 
  MOV 40H,#0F8H ;
 DJNZ 40H,$ ;
 DJNZ 39H,L1 ;
 RET
DELAY1: MOV 59H,#00H
MIN: DJNZ 59H,YS500
 RET
YS500:
 LCALL YS500US
 LJMP MIN
YS500US:
 MOV 60H,#00H
 DJNZ 60H,$
 RET


DELAY2:MOV 60H,#20H
 DJNZ 60H,$
 RET



 ;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;; 计时中断;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;


TIM0: 
 PUSH ACC
 PUSH PSW
 INC  30H             ;中断服务,中断计数器加1
 DJNZ 33H,SD       ;中断10MS
 MOV 33H, #100      ;重载100
 INC 46H  ;
 MOV A, 46H ;
 CJNE A,#0,SD      ;检测是否到60s
 MOV 46H, #0H      ;置数
 INC 45H        ;分钟加一
 MOV A,45H ;
 CJNE A,#6,SD      ;检测60M
 MOV 45H, #0       ;重载0
 INC 44H  ;
 MOV A,44H ;
 CJNE A,#0,SD      
 MOV 44H,#0       ;小时个位 
 INC 43H  ;
 MOV A, 43H ;
 CJNE A,#6,SD      
 MOV 43H, #0H 
 INC 42H        ;检测小时是否到24
 MOV A, 42H ;      ;检测小时个位
 CJNE A,#4,HOU ;
 MOV A, 41H ;
 CJNE A,#2,HOU ;     ;检测小时十位
 MOV 41H,#00 ;
 MOV 42H,#00 ;      ;时间处理完毕
 SJMP SD  ;
HOU:
 MOV A, 42H ;      ;41,42 用于显示
 CJNE A,#0,SD ;
 INC 41H        ;显示位移动


SD: MOV A, #0F0H      ;精准调时
 ADD A, TL0       ;
 MOV TL0, A       ;重载计时器低8位
 MOV TH0, #0D9H      ;重载计时器高8位



 ;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;  显示程序 ;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;


DISPLAY:
 JB JS,SWI ;      ;判断转换开关是否被按下
 JB SL,JUS1 ;      ;判断调时开关是否被按下
 INC R0        ;显示位移动
 INC XZ        ;
 MOV A,R0       ;数据位变化
 CJNE A,#49H,RRS ;
 MOV R0,#41H       ;寻址寄存器变化
 MOV XZ,#00H       ;寻址寄存器变化
RRS: MOV CD45,@R0     ;向CD4511传数据
          
 
  
R: DJNZ 53H,RR1 ;      ;检查煮粥时间. 
 MOV 53H,#200 ;     ;2个小时
 DJNZ 54H,RR1 ;
 MOV 54H,#60 ;


RR1: 
 POP PSW         ;从堆栈中弹出数据
 POP ACC
 RETI  ;       ;退出中断.


SWI:  
 JB SL,JUS3       ;防抖动程序
 INC R1  ;      ;显示位移动
 INC XZ  ;
 MOV A,R1       
 CJNE A,#4DH,RRS1 ;
 MOV R1,#47H ;      ;显示位还原
 MOV XZ,#00H ;      ;显示位还原
RRS1: MOV CD45,@R1 ;    
  ;
 LJMP R        ;退出



 ;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;  调时程序  ;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;


JUS1: 
 LCALL DELAY ;      ;防抖动程序
 DEC 33H  ;      ;精准定时
 JNB SL,DISPLAY;      ;检测松按键
 JB SL,$ ;       ;等待按键被弹起
 MOV R0,#41H ;       ;重置显示位
 MOV R1,#49H ;       ;重置显示位
 MOV XZ,#00H ;       ;重置78HC138


JUS0:
 MOV CD45,@R0      ;调时间
 JNB JS, JUS2 ;
 LCALL DELAY ;
 JNB JS,JUS2 ;
 INC @R0  ; 
 JB JS, $ ;
JUS2: JNB SL,JUS0 ;      ;防抖动
 LCALL DELAY ;
 JNB SL,JUS0 ;
 JB SL,$ ;
 INC R0  ;       ;显示下一位
 INC XZ  ;       ;显示下一位
 MOV A,R0 ;
 CJNE A,#47H,JUS0;      ;判断显示位
 MOV R0,#41H ;
 MOV CD45,#00H ;
 
 LJMP R  ;       ;退出


JUS3:           
 LCALL DELAY ;      ;调定时时间
 DEC 33H  ;      ;精准定时
 JNB SL,SWI ;      ;等待按键弹起
 JB SL,$ ;
 JB JS,$ ;
 MOV R0,#41H ;       ;改变显示位
 MOV R1,#49H ;
 MOV XZ,#00H ;      
JUS4: 
 MOV CD45,@R1 ;      ;置数CD4511
 JNB JS, JUS5 ;      ;判断是否有调节键按下
 LCALL DELAY ;
 JNB JS,JUS5 ;       ;调时,时间加一
 INC @R1  ; 
 JB JS, $ ;
JUS5: JNB SL,JUS4 ;      ;换待调节显示位
 LCALL DELAY ;       ;防抖动
 JNB SL,JUS4 ;
 JNB SL,$ ;
 INC R0  ;       ;时间加一
 INC XZ  ;       ;下一位显示
 MOV A,R0 ;         ;
 CJNE A,#5DH,JUS0;
 MOV R0,#49H ;
 MOV XZ,#00H ;
 LJMP R  ;       ;返回


 ;;;;;;;;;;;;;;;;;;;;;;;
 ;;;; 音乐程序数据表;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;
DAT:
db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
db 20h,10h,2bh,10h,26h,30h,30h,80h,00H


TEMP_TAB:;温度测量程序数据表
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H


 END

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条