|
这个是友情定制版的定时控制器:lol:, 经过大半年的使用,反馈回的效果很好。:victory:
去年底,一个同学他吐槽那些电瓦煲 煮的老火汤口感差(这个我认同,我家也有电瓦煲 ,煲出的汤确实口味不好),原因是电瓦煲 功率小,而且瓦煲内胆传热慢,从凉水到煮沸这段时间要很长,汤料泡在这不冷不热的水里时间长了就口感差。
他说还是觉得老式电饭煲煮的汤好喝,(他有一个800W的老式电饭煲)但老式电饭煲没有定时器,如果只是简单加个定时器,那煮沸后再过三四十分钟就烧干那水。他问我有没有办法做个定时器,先把水煮沸,再转到慢火 煲两小时。我说 “这不是问题 ”,PBC打版,焊接,写程序,调试,大概经20天 ,已经完成了,给我测试能用,跟着送给他。
当时我还不会用C语言,只能用汇编语言写, 程序和电路如下:
按键K_P30(SW1) K_P31(SW2) 是左和右选择选择需要设置的数(选择的位在屏幕上闪烁)
K_P32(SW3) 是数值加1, >=10就回到0,
K_P33(SW4) 是取消/停止操作,按下后就停止和取消定时操作
K_P34(SW5) 是 开始运行
K_P35(SW6) 直接跳到 歇通电/断电 作慢火煲汤
K_P36,K_P37 是设计PCB板时作备用的,在这里没用上
电路里 P30/P31两端口用于程序下载, 于是用P11/P12与P32~P37 拼成一个8位口给LCD1602输出数据
电路图:
- ; STC8G1K17+LCD1602定时器
-
-
- ;下面是寄存器的分配使用
- TSRAM0 EQU 2CH ;定时器计数用的寄存器0
- TSRAM1 EQU 2DH ;定时器计数用的寄存器1
- TSRAM2 EQU 2EH ;定时器计数用的寄存器1
- TSRAM3 EQU 2FH ;定时器计数用的寄存器1
- TSRAM4 EQU 30H ;定时器计数用的寄存器1
- TSRAM5 EQU 31H
- TSRAM6 EQU 32H
- TSRAM7 EQU 33H
- TSRAM8 EQU 34H
- TSRAM9 EQU 35H
- YSRAM1 EQU 36H ;延时用寄存器1
- YSRAM2 EQU 37H ;延时用寄存器2
- YSRAM3 EQU 38H ; 延时用寄存器3
- RAMADDR EQU 39H ; RAMADDR,256字节的地址入口
- RAMDATA EQU 3AH ;RAMDATA 读写数据缓冲
- BUZRAM EQU 3BH ;报警时间存放--秒
- SS1 EQU 41H ;时钟1秒计数
- SS10 EQU 42H ;时钟10秒计数
- MM1 EQU 43H ;时钟分个位
- MM10 EQU 44H ;时钟分十位
- HH1 EQU 45H ;时钟小时个位
- HH10 EQU 46H ;时钟小时十位
- T1_1 EQU 47H ;定时1组
- T1_2 EQU 48H
- T1_3 EQU 49H
- T2_1 EQU 4AH ;定时2组
- T2_2 EQU 4BH
- T2_3 EQU 4CH
- S1_1 EQU 4DH ;间歇时间1
- S1_2 EQU 4EH
- S1_1A EQU 4FH ;S1时间重新加载保存处
- S1_2A EQU 50H
- S2_1 EQU 51H ;间歇时间2
- S2_2 EQU 52H
- S2_1A EQU 53H ; S2时间重新加载保存处
- S2_2A EQU 54H ;
- SWJC EQU 55H ; 设置键按下次数
- SWBUF1 EQU 56H ;按键状态移入,每2ms移入一次
- SWBUF2 EQU 57H ;按键状态移入,每2ms移入一次
- SWBUF3 EQU 58H ;按键状态移入,每2ms移入一次
- SWBUF4 EQU 59H ;按键状态移入,每2ms移入一次
- SWBUF5 EQU 60H ;按键状态移入,每2ms移入一次
- SWBUF6 EQU 61H ;按键状态移入,每2ms移入一次
- SWBUF7 EQU 62H ;按键状态移入,每2ms移入一次
- SWBUF8 EQU 63H ;按键状态移入,每2ms移入一次
- SWSTA1 BIT 10H ;按键当前状态位
- SWSTA2 BIT 11H ;按键当前状态位
- SWSTA3 BIT 12H ;按键当前状态位
- SWSTA4 BIT 13H ;按键当前状态位
- SWSTA5 BIT 14H ;按键当前状态位
- SWSTA6 BIT 15H ;按键当前状态位
- SWSTA7 BIT 16H ;按键当前状态位
- SWSTA8 BIT 17H ;按键当前状态位
- SWUP1 BIT 20H ;保存前一次按键状态位
- SWUP2 BIT 21H ;保存前一次按键状态位
- SWUP3 BIT 22H ;保存前一次按键状态位
- SWUP4 BIT 23H ;保存前一次按键状态位
- SWUP5 BIT 24H ;保存前一次按键状态位
- SWUP6 BIT 25H ;保存前一次按键状态位
- SWUP7 BIT 26H ;保存前一次按键状态位
- SWUP8 BIT 27H ;保存前一次按键状态位
- LCD_D0 BIT P1.2
- LCD_D1 BIT P1.3
- LCD_D2 BIT P3.2
- LCD_D3 BIT P3.3
- LCD_D4 BIT P3.4
- LCD_D5 BIT P3.5
- LCD_D6 BIT P3.6
- LCD_D7 BIT P3.7
- LCD_RS BIT P1.0 ;LCD1602 的 RS端 ,1-数据,0-指令
- LCD_EN BIT P1.1 ;LCD1602 的 E端 ,先从低变高,再变低,以确认输入数据或命令
- F2 BIT 00H ;秒标志
- F3 BIT 01H ;分标志
- F4 BIT 02H
- F5 BIT 03H
- F6 BIT 04H
- F7 BIT 05H
- F8 BIT 06H
- F9 BIT 07H
- F10 BIT 08H
- F11 BIT 09H
- F12 BIT 0AH
- PSW1 BIT P3.1 ;按键输入口
- PSW2 BIT P3.2
- PSW3 BIT P3.3
- PSW4 BIT P3.5
- PSW5 BIT P3.6
- PSW6 BIT P3.7
- PSW7 BIT P3.0
- PSW8 BIT P3.4
- SWEN BIT P1.4 ;按键选通口
- OUT1 BIT P5.4 ;第1路输出
- BUZ BIT P5.5 ;报警输出,为0时有响声
- RAM1602 EQU 43H ;LCD1602写入缓冲
- LCD1_1 EQU 80H ;LCD1602的第一行第1个
- LCD2_1 EQU 90H ;LCD1602的第二行第1个
- ORG 0000H
- LJMP AA1
- ;--------------------------
- ORG 00BH;T0中断入口
- LJMP T0INT
- ORG 0100H
- ;数值初始化
- AA1:MOV R0,#02H ;间接寻址,从02H开始到0FFH共256字节 全清空置零
- MOV R1,#255
- CL1:MOV @R0,#00H
- INC R0
- DJNZ R1,CL1
- MOV R0,#00
- MOV R1,#00
- MOV P0M0,#00H ;标准I/O口模式
- MOV P0M1,#000H
- MOV P1M0,#00H ;标准I/O口模式
- MOV P1M1,#000H
- MOV P2M0,#00H ;标准I/O口模式
- MOV P2M1,#000H
- MOV P3M0,#00H ;标准I/O口模式
- MOV P3M1,#000H
- MOV P4M0,#00H ;标准I/O口模式
- MOV P4M1,#000H
- MOV P5M0,#00H ;标准I/O口模式
- MOV P5M1,#000H
- MOV SP,#0E0H;设定堆栈底在RAM的0E0H
- ;---------定时器T0初始化--------10毫秒@11.0592MHz
- ANL AUXR,#7FH ;定时器T0时钟12T模式
- ANL TMOD,#0F0H ;设置定时器模式
- MOV TL0,#001H ;设置定时初值 #001H
- MOV TH0,#0DCH ;设置定时初值 #0DCH
- CLR TF0 ;清除TF0标志
- SETB TR0 ;定时器0开始计时
- SETB ET0 ;允许T0中断
- ;-------------------------
- SETB EA ;中断总开关
- SETB SWSTA1 ;按键当前状态置1
- SETB SWSTA2 ;按键当前状态置1
- SETB SWSTA3 ;按键当前状态置1
- SETB SWSTA4 ;按键当前状态置1
- SETB SWSTA5 ;按键当前状态置1
- SETB SWSTA6 ;按键当前状态置1
- SETB SWSTA7 ;按键当前状态置1
- SETB SWSTA8 ;按键当前状态置1
- SETB SWUP1 ;按键前一次状态置1
- SETB SWUP2 ;按键前一次状态置1
- SETB SWUP3 ;按键前一次状态置1
- SETB SWUP4 ;按键前一次状态置1
- SETB SWUP5 ;按键前一次状态置1
- SETB SWUP6 ;按键前一次状态置1
- SETB SWUP7 ;按键前一次状态置1
- SETB SWUP8 ;按键前一次状态置1
- ;---------------------------------------
- ;LCD1602初始化
- MOV RAM1602,#000 ;清P2
- LCALL DELAY15MS ;延时15毫秒
- MOV RAM1602,#38H ;16行*2,5*8
- LCALL ZL
- LCALL DELAY5MS ;延时5毫秒
- MOV RAM1602,#38H ;16行*2,5*8
- LCALL ZL
- LCALL DELAY5MS ;延时5毫秒
- MOV RAM1602,#08H ;关显示
- LCALL ZL
- LCALL DELAY1MS ;延时1毫秒
- MOV RAM1602,#01H ;清屏
- LCALL ZL
- LCALL DELAY5MS ;延时5毫秒
- MOV RAM1602,#06H ;地址计数器AC自动加1,光标右移 *******
- LCALL ZL ;
- LCALL DELAY1MS ;延时1毫秒
- MOV RAM1602,#0CH ;开显示
- LCALL ZL
- LCALL DELAY1MS ;延时1毫秒
- ;-----------------------------------
- MOV R0,#80H ;给80H到09FH都置空格(20H)
- MOV R1,#32 ;32个字符存储字节
- CL2: MOV @R0,#20H
- INC R0
- DJNZ R1,CL2
- ;运行主程序
- AA2: NOP
- LCALL SWCL10 ;按键处理程序2
- LCALL LCD_SC1 ;调用显示
- LCALL SXCL1
- LCALL T1JC1 ;调用T1计数
- LCALL S1JC1 ;间歇计时
- LCALL OUT1_1 ;输出
- LCALL BUZ1 ;响铃
- LJMP AA2
- ;------------------------------------------
- ;T0定时器中断处理程序
- T0INT:PUSH PSW;保护标志位中断现场保护--T0中断处理程序开始
- PUSH A
- INC TSRAM0;计数,11.0592MHZ,每10ms加一次
- NOP
- INC TSRAM1;时钟计数 11.0592MHZ,每10ms加一次
- NOP
- INC TSRAM2;*******备用****11.0592MHZ,每10ms加一次
- LCALL SWIN1 ;按键扫描输入程序2
- NOP
- MOV A,TSRAM1
- CJNE A,#010,AA3; RAM的TSRAM1加到100MS就清空
- MOV TSRAM1,#00H
- INC TSRAM3; 每100Ms就加1
- NOP
- AA3:MOV A,TSRAM0
- CJNE A,#010,AA4;TSRAM0加到100MS就清空(10)
- MOV TSRAM0,#000
- INC TSRAM4;每100Ms就加1
- AA4:MOV A,TSRAM2
- CJNE A,#100,AA5 ;TSRAM2加到1秒(100)就清空
- MOV TSRAM2,#00
- INC SS1 ;秒计时器加1
- SETB F2 ;秒标志
- INC TSRAM5
- MOV A,TSRAM5
- CJNE A,#60,AA5
- MOV TSRAM5,#00H
- SETB F3 ;分标志
- NOP
- AA5:POP A
- POP PSW;恢复标志位中断现场保护
- RETI
- ;--------------------------------------------------------
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- DELAY60US: ;@11.0592MHz/STC15W**延时60微秒
- NOP
- NOP
- NOP
- NOP
- NOP
- MOV YSRAM1,#130
- NEXT2:
- DJNZ YSRAM1,NEXT2
- NOP
- RET
- DELAY15MS: ;@11.0592MHz 15毫秒延时
- NOP
- NOP
- NOP
- NOP
- MOV YSRAM1,#130
- MOV YSRAM2,#18
- NEXT6:
- DJNZ YSRAM2,NEXT6
- DJNZ YSRAM1,NEXT6
- RET
- DELAY5MS: ;@11.0592MHz 5毫秒延时
- NOP
- NOP
- MOV YSRAM1,#44
- MOV YSRAM2,#2
- NEXT7:
- DJNZ YSRAM2,NEXT7
- DJNZ YSRAM1,NEXT7
- RET
- DELAY1MS: ;@11.0592MHz 1毫秒延时
- MOV YSRAM1,#9
- MOV YSRAM2,#150
- NEXT8:
- DJNZ YSRAM2,NEXT8
- DJNZ YSRAM1,NEXT8
- RET
- DELAY50US: ;@11.0592MHz 50微秒延时
- NOP
- NOP
- MOV YSRAM1,#107
- NEXT9:
- DJNZ YSRAM1,NEXT9
- RET
- DELAY20MS: ;@11.0592MHz 20毫秒延时
- MOV YSRAM1,#173
- MOV YSRAM2,#27
- NEXT11:
- DJNZ YSRAM2,NEXT11
- DJNZ YSRAM1,NEXT11
- RET
- ;显示这字符编码**************
- SQB: DB 30H ; 0
- DB 31H ; 1
- DB 32H ; 2
- DB 33H ; 3
- DB 34H ; 4
- DB 35H ; 5
- DB 36H ; 6
- DB 37H ; 7
- DB 38H ; 8
- DB 39H ; 9
- DB 41H ;A
- DB 42H ;B
- DB 43H ;C
- DB 44H ;D
- DB 45H ;E
- DB 46H ;F
- DB 3AH ; :
- DB 2BH ; +
- DB 2DH ; -
- DB 2AH ; *
- DB 0FEH ; ÷
- DB 3DH ; =
- DB 0DFH ; °
- DB 7EH ; →
- DB 7FH ; ←
- DB 23H ; #
- DB 25H ; %
- DB 24H ; $
- DB 28H ; (
- DB 29H ; )
- DB 2FH ; /
- DB 3FH ; ?
- DB 20H ;空格
- DB 21H ; !
- DB 22H ; "
- DB 23H ; #
- DB 24H ; $
- DB 25H ; %
- DB 26H ; &
- DB 27H ; '
- DB 28H ; (
- DB 29H ; )
- DB 2AH ; *
- DB 2BH ; +
- DB 2CH ; ,
- DB 2DH ; -
- DB 2EH ; .
- DB 2FH ; /
- DB 30H ; 0
- DB 31H ; 1
- DB 32H ; 2
- DB 33H ; 3
- DB 34H ; 4
- DB 35H ; 5
- DB 36H ; 6
- DB 37H ; 7
- DB 38H ; 8
- DB 39H ; 9
- DB 3AH ; :
- DB 3BH ; ;
- DB 3CH ; <
- DB 3DH ; =
- DB 3EH ; >
- DB 3FH ; ?
- DB 40H ; @
- DB 41H ;A
- DB 42H ; B
- DB 43H ;C
- DB 44H ; D
- DB 45H ; E
- DB 46H ; F
- DB 47H ; G
- DB 48H ; H
- DB 49H ; I
- DB 4AH ; J
- DB 4BH ; K
- DB 4CH ; L
- DB 4DH ; M
- DB 4EH ; N
- DB 4FH ; O
- DB 50H ; P
- DB 51H ; Q
- DB 52H ;R
- DB 53H ; S
- DB 54H ;T
- DB 55H ;U
- DB 56H ;V
- DB 57H ; W
- DB 58H ; X
- DB 59H ;Y
- DB 5AH ; Z
- DB 5BH ; [
- DB 5CH ;\
- DB 5DH ;]
- DB 5EH ; ︿
- DB 5FH ;_
- DB 60H ; `
- DB 61H ; a
- DB 62H ; b
- DB 63H ;c
- DB 64H ;d
- DB 65H ;e
- DB 66H ;f
- DB 67H ; g
- DB 68H ;h
- DB 69H ; i
- DB 6AH ; j
- DB 6BH ; k
- DB 6CH ; l
- DB 6DH ; m
- DB 6EH ; n
- DB 6FH ; o
- DB 70H ; p
- DB 71H ; q
- DB 72H ; r
- DB 73H ;s
- DB 74H ; t
- DB 75H ;u
- DB 76H ;v
- DB 77H ; w
- DB 78H ; x
- DB 79H ;y
- DB 7AH ;z
- DB 7BH ; {
- DB 7CH ; |
- DB 7DH ; }
- DB 7EH ;→
- DB 7FH ;←
- DB 00H ; 自编字符
- DB 01H ; 自编字符
- DB 02H ; 自编字符
- DB 03H ; 自编字符
- DB 04H ; 自编字符
- DB 05H ; 自编字符
- DB 06H ; 自编字符
- DB 07H ; 自编字符
- ;------------------------------------
- ;**********LCD1602显示程序,16字*2行 **************************
- ;第一行显示内容在RAM的80H到8FH,
- ;第二行显示内容在RAM的90H到9FH
- LCD_SC1: PUSH 00H ;保存R0的内容
- MOV RAM1602,#080H ;第一行显示 &&&&&&&&
- LCALL ZL ;调用指令输出 &&&&&&&&&
- MOV R0,#LCD1_1 ;内部显示RAM的首址 #80H
- MOV R2,#16 ;每行16字符的计数
- LCD_SC2: MOV RAM1602,@R0 ;显示的内容送到缓冲
- LCALL LCD_SS1 ;调用字符代码转换
- LCALL SZ ;调用显示数据输出
- DJNZ R2,LCD_SC3 ;计算是否输出16个字符
- MOV RAM1602,#0C0H ;第二行显示
- LCALL ZL ;调用指令输出
- MOV R2,#16 ;每行16字符的计数
- INC R0
- LCD_SC4: MOV RAM1602,@R0 ;显示的内容送到缓冲
- LCALL LCD_SS1 ;调用字符代码转换
- LCALL SZ ;调用显示数据输出
- DJNZ R2,LCD_SC5 ;计算是否输出16个字符
- POP 00H ;恢复R0的数据
- RET
- LCD_SC3:INC R0
- LJMP LCD_SC2
- LCD_SC5:INC R0
- LJMP LCD_SC4
- ;显示字符转换*****************
- LCD_SS1: PUSH A ;保护A的数据
- PUSH 82H ;DPTR低位
- PUSH 83H ;DPTR高位
- MOV A,RAM1602
- MOV DPTR,#SQB ;字符集首址
- MOVC A,@A+DPTR ;获取字符编码
- MOV RAM1602,A
- POP 83H ;DPTR高位
- POP 82H ;DPTR低位
- POP A
- RET ;恢复A的数
- ;-----------------------------
- ;----------------------------------------
- ;字符数据写入*******
- ;
- SZ:SETB LCD_RS ;RS,数据
- SETB LCD_EN ;E
- MOV F1,C ;保护C
- PUSH A
- MOV A,RAM1602
- MOV C,ACC.7
- MOV LCD_D7,C
- MOV C,ACC.6
- MOV LCD_D6,C
- MOV C,ACC.5
- MOV LCD_D5,C
- MOV C,ACC.4
- MOV LCD_D4,C
- MOV C,ACC.3
- MOV LCD_D3,C
- MOV C,ACC.2
- MOV LCD_D2,C
- MOV C,ACC.1
- MOV LCD_D1,C
- MOV C,ACC.0
- MOV LCD_D0,C
- MOV C,F1 ;恢复C
- POP A
- NOP
- NOP
- CLR LCD_EN ;E,下降沿
- LCALL DELAY50US ;延时50微秒
- RET
- ;---------------------------
- ;指令写入/地址设置
- ZL:CLR LCD_RS ;RS,数据
- SETB LCD_EN ;E
- MOV F1,C ;保护C
- PUSH A
- MOV A,RAM1602
- MOV C,ACC.7
- MOV LCD_D7,C
- MOV C,ACC.6
- MOV LCD_D6,C
- MOV C,ACC.5
- MOV LCD_D5,C
- MOV C,ACC.4
- MOV LCD_D4,C
- MOV C,ACC.3
- MOV LCD_D3,C
- MOV C,ACC.2
- MOV LCD_D2,C
- MOV C,ACC.1
- MOV LCD_D1,C
- MOV C,ACC.0
- MOV LCD_D0,C
- MOV 0FH,C
- MOV C,F1 ;恢复C
- POP A
- NOP
- NOP
- CLR LCD_EN ;E,下降沿
- LCALL DELAY50US ;延时50微秒
- RET
- ;_____________________________________
- ;时钟计时程序SJ1
- SJ1:MOV A,SS1
- CJNE A,#60,SJ2 ;返回 8888888888888888888888888
- MOV SS1,#00
- INC MM1
- MOV A,MM1
- CJNE A,#10,SJ2 ;返回
- MOV MM1,#00
- INC MM10
- MOV A,MM10
- CJNE A,#06,SJ2;返回
- MOV MM10,#00
- INC HH1 ;小时个位加1
- MOV A,HH10 ;计算小时是否到24小时
- MOV B,#10
- MUL AB
- ADD A,HH1
- CJNE A,#24,SJ3
- MOV HH1,#00
- MOV HH10,#00
- SJ3:MOV A,HH1
- CJNE A,#10,SJ2
- MOV HH1,#00
- INC HH10
- SJ2:MOV R0,#80H
- MOV @R0,HH10 ;送时十位到显示
- INC R0
- MOV @R0,HH1 ; 送时个位到显示
- INC R0
- MOV @R0,#3AH ;送时钟点:到显示
- INC R0
- MOV @R0,MM10 ;送分十位到显示
- INC R0
- MOV @R0,MM1 ;送分个位到显示
- RET
- ;_____________________________________
- ;按键扫描输入程序2 @@@@@@@@@@@@@@@@@@@@@@@@@@@
- SWIN1:
- MOV P3,#0FFH ;把按键输入的P2口置1
- CLR SWEN ;按键选通线拉低
- NOP
- SWIN10:MOV A,SWBUF1
- MOV C,PSW1
- RLC A ;把按键PSW移入
- MOV SWBUF1,A
- CJNE A,#00H,SWIN11
- CLR SWSTA1
- LJMP SWIN20 ;扫描下一个
- SWIN11:CJNE A,#0FFH,SWIN12
- SETB SWSTA1
- SWIN12:LJMP SWIN20 ;扫描下一个
- SWIN20:MOV A,SWBUF2
- MOV C,PSW2
- RLC A ;把按键PSW移入
- MOV SWBUF2,A
- CJNE A,#00H,SWIN21
- CLR SWSTA2
- LJMP SWIN30 ;扫描下一个
- SWIN21:CJNE A,#0FFH,SWIN22
- SETB SWSTA2
- SWIN22:LJMP SWIN30 ;扫描下一个
- SWIN30:MOV A,SWBUF3
- MOV C,PSW3
- RLC A ;把按键PSW移入
- MOV SWBUF3,A
- CJNE A,#00H,SWIN31
- CLR SWSTA3
- LJMP SWIN40 ;扫描下一个
- SWIN31:CJNE A,#0FFH,SWIN32
- SETB SWSTA3
- SWIN32:LJMP SWIN40 ;扫描下一个
- SWIN40:MOV A,SWBUF4
- MOV C,PSW4
- RLC A ;把按键PSW移入
- MOV SWBUF4,A
- CJNE A,#00H,SWIN41
- CLR SWSTA4
- LJMP SWIN50 ;扫描下一个
- SWIN41:CJNE A,#0FFH,SWIN42
- SETB SWSTA4
- SWIN42:LJMP SWIN50 ;扫描下一个
- SWIN50:MOV A,SWBUF5
- MOV C,PSW5
- RLC A ;把按键PSW移入
- MOV SWBUF5,A
- CJNE A,#00H,SWIN51
- CLR SWSTA5
- LJMP SWIN60 ;扫描下一个
- SWIN51:CJNE A,#0FFH,SWIN52
- SETB SWSTA5
- SWIN52:LJMP SWIN60 ;扫描下一个
- SWIN60:MOV A,SWBUF6
- MOV C,PSW6
- RLC A ;把按键PSW移入
- MOV SWBUF6,A
- CJNE A,#00H,SWIN61
- CLR SWSTA6
- LJMP SWIN70 ;扫描下一个
- SWIN61:CJNE A,#0FFH,SWIN62
- SETB SWSTA6
- SWIN62:LJMP SWIN70 ;扫描下一个
- SWIN70:MOV A,SWBUF7
- MOV C,PSW7
- RLC A ;把按键PSW移入
- MOV SWBUF7,A
- CJNE A,#00H,SWIN71
- CLR SWSTA7
- LJMP SWIN80 ;扫描下一个
- SWIN71:CJNE A,#0FFH,SWIN72
- SETB SWSTA7
- SWIN72:LJMP SWIN80 ;扫描下一个
- SWIN80:MOV A,SWBUF8
- MOV C,PSW8
- RLC A ;把按键PSW移入
- MOV SWBUF8,A
- CJNE A,#00H,SWIN81
- CLR SWSTA8
- LJMP SWIN90 ;扫描下一个
- SWIN81:CJNE A,#0FFH,SWIN82
- SETB SWSTA8
- SWIN82:LJMP SWIN90 ;扫描下一个
- SWIN90: SETB SWEN ;按键选通线拉高
- RET
- ;按键处理程序2 @@@@@@@@@@@@@@@@@@@@@@@@@
- SWCL10:MOV A,#00 ;把SWSTAT和SWUP分别放到A和R2 按键1
- MOV R2,#00
- MOV C,SWSTA1
- MOV ACC.0,C
- MOV R2,A
- MOV A,#00
- MOV C,SWUP1
- MOV ACC.0,C
- XRL A,R2 ;两者异或比较
- MOV C,ACC.0
- JC SWCL11
- LJMP SWCL20 ;下一个
- SWCL11:MOV C,SWSTA1
- MOV SWUP1,C ;保存当前状态到SWUP,作下次比较
- JB SWSTA1,SWCL20 ;如果当前状态是0,那就作按键需要的处理
- ; $这个是按键需要处理结果&&&&&&&&&&&
- LCALL KEYINC1 ;----------按键值加1,显示设置的位置右移-----
- SWCL20:MOV A,#00 ;把SWSTAT和SWUP分别放到A和R2 按键2
- MOV R2,#00
- MOV C,SWSTA2
- MOV ACC.0,C
- MOV R2,A
- MOV A,#00
- MOV C,SWUP2
- MOV ACC.0,C
- XRL A,R2 ;两者异或比较
- MOV C,ACC.0
- JC SWCL21
- LJMP SWCL30 ;下一个
- SWCL21:MOV C,SWSTA2
- MOV SWUP2,C ;保存当前状态到SWUP,作下次比较
- JB SWSTA2,SWCL30 ;如果当前状态是0,那就作按键需要的处理
- ; $这个是按键需要处理结果&&&&&&&&&&&
- LCALL KEYDEC1 ;---------按键值减1,显示设置的位置左移----------
- SWCL30:MOV A,#00 ;把SWSTAT和SWUP分别放到A和R2 按键3
- MOV R2,#00
- MOV C,SWSTA3 ;*
- MOV ACC.0,C
- MOV R2,A
- MOV A,#00
- MOV C,SWUP3 ;*
- MOV ACC.0,C
- XRL A,R2 ;两者异或比较
- MOV C,ACC.0
- JC SWCL31 ;*
- LJMP SWCL40 ;下一个 ;*
- SWCL31:MOV C,SWSTA3 ;*
- MOV SWUP3,C ;保存当前状态到SWUP,作下次比较 ;*
- JB SWSTA3,SWCL40 ;如果当前状态是0,那就作按键需要的处理 ;*
- ; $这个是按键需要处理结果&&&&&&&&&&&
- LCALL JCINC1 ;按键加数
- SWCL40:MOV A,#00 ;把SWSTAT和SWUP分别放到A和R2 按键4
- MOV R2,#00
- MOV C,SWSTA4 ;*
- MOV ACC.0,C
- MOV R2,A
- MOV A,#00
- MOV C,SWUP4 ;*
- MOV ACC.0,C
- XRL A,R2 ;两者异或比较
- MOV C,ACC.0
- JC SWCL41 ;*
- LJMP SWCL50 ;下一个 ;*
- SWCL41:MOV C,SWSTA4 ;*
- MOV SWUP4,C ;保存当前状态到SWUP,作下次比较 ;*
- JB SWSTA4,SWCL50 ;如果当前状态是0,那就作按键需要的处理 ;*
- ; $这个是按键需要处理结果&&&&&&&&&&&
- LCALL CLR_STOP1 ;调用 取消/停止 操作
- SWCL50:MOV A,#00 ;把SWSTAT和SWUP分别放到A和R2 按键5
- MOV R2,#00
- MOV C,SWSTA5 ;*
- MOV ACC.0,C
- MOV R2,A
- MOV A,#00
- MOV C,SWUP5 ;*
- MOV ACC.0,C
- XRL A,R2 ;两者异或比较
- MOV C,ACC.0
- JC SWCL51 ;*
- LJMP SWCL60 ;下一个 ;*
- SWCL51:MOV C,SWSTA5 ;*
- MOV SWUP5,C ;保存当前状态到SWUP,作下次比较 ;*
- JB SWSTA5,SWCL60 ;如果当前状态是0,那就作按键需要的处理 ;*
- LCALL STAR_RUN1 ;调用开始运行操作
- SWCL60:MOV A,#00 ;把SWSTAT和SWUP分别放到A和R2 按键6
- MOV R2,#00
- MOV C,SWSTA6 ;*
- MOV ACC.0,C
- MOV R2,A
- MOV A,#00
- MOV C,SWUP6 ;*
- MOV ACC.0,C
- XRL A,R2 ;两者异或比较
- MOV C,ACC.0
- JC SWCL61 ;*
- LJMP SWCL70 ;下一个 ;*
- SWCL61:MOV C,SWSTA6 ;*
- MOV SWUP6,C ;保存当前状态到SWUP,作下次比较 ;*
- JB SWSTA6,SWCL70 ;如果当前状态是0,那就作按键需要的处理 ;*
- LCALL STAR_MIN1 ; 调用小火操作,——这个是按键需要处理结果&&&&&&&&&&&
- SWCL70:MOV A,#00 ;把SWSTAT和SWUP分别放到A和R2 按键7
- MOV R2,#00
- MOV C,SWSTA7 ;*
- MOV ACC.0,C
- MOV R2,A
- MOV A,#00
- MOV C,SWUP7 ;*
- MOV ACC.0,C
- XRL A,R2 ;两者异或比较
- MOV C,ACC.0
- JC SWCL71 ;*
- LJMP SWCL80 ;下一个 ;*
- SWCL71:MOV C,SWSTA7 ;*
- MOV SWUP7,C ;保存当前状态到SWUP,作下次比较 ;*
- JB SWSTA7,SWCL80 ;如果当前状态是0,那就作按键需要的处理 ;*
- ;$这个是按键需要处理结果&&&&&&&&&&&
- SWCL80:MOV A,#00 ;把SWSTAT和SWUP分别放到A和R2 按键8
- MOV R2,#00
- MOV C,SWSTA8 ;*
- MOV ACC.0,C
- MOV R2,A
- MOV A,#00
- MOV C,SWUP8 ;*
- MOV ACC.0,C
- XRL A,R2 ;两者异或比较
- MOV C,ACC.0
- JC SWCL81 ;*
- LJMP SWCL90 ;下一个 ;*
- SWCL81:MOV C,SWSTA8 ;*
- MOV SWUP8,C ;保存当前状态到SWUP,作下次比较 ;*
- JB SWSTA8,SWCL90 ;如果当前状态是0,那就作按键需要的处理 ;*
- ; $这个是按键需要处理结果&&&&&&&&&&&
- SWCL90:RET ;全部处理完
- ;-------------
- KEYINC1:INC SWJC
- MOV A,SWJC
- CJNE A,#11,KEYINC2
- MOV SWJC,#00
- KEYINC2:RET
- KEYDEC1:MOV A,SWJC
- JZ KEYDEC2
- DEC SWJC
- LJMP KEYDEC3
- KEYDEC2:MOV SWJC,#10
- KEYDEC3:RET
- T1JC10:INC T1_1
- MOV A,T1_1
- CJNE A,#10,T1JC11
- MOV T1_1,#00
- T1JC11:RET
- T1JC20:INC T1_2
- MOV A,T1_2
- CJNE A,#10,T1JC21
- MOV T1_2,#00
- T1JC21:RET
- T1JC30:INC T1_3
- MOV A,T1_3
- CJNE A,#2,T1JC31
- MOV T1_3,#00
- T1JC31:RET
- ;---------------------------
- T2JC10:INC T2_1
- MOV A,T2_1
- CJNE A,#10,T2JC11
- MOV T2_1,#00
- T2JC11:RET
- T2JC20:INC T2_2
- MOV A,T2_2
- CJNE A,#10,T2JC21
- MOV T2_2,#00
- T2JC21:RET
- T2JC30:INC T2_3
- MOV A,T2_3
- CJNE A,#2,T2JC31
- MOV T2_3,#00
- T2JC31:RET
- ;----------------------------------
- S1JC10:INC S1_1
- MOV A,S1_1
- CJNE A,#10,S1JC11
- MOV S1_1,#00
- S1JC11:RET
- S1JC20:INC S1_2
- MOV A,S1_2
- CJNE A,#10,S1JC21
- MOV S1_2,#00
- S1JC21:RET
- ;----------------------------------
- S2JC10:INC S2_1
- MOV A,S2_1
- CJNE A,#10,S2JC11
- MOV S2_1,#00
- S2JC11:RET
- S2JC20:INC S2_2
- MOV A,S2_2
- CJNE A,#10,S2JC21
- MOV S2_2,#00
- S2JC21:RET
- JCINC1:MOV A,SWJC
- CJNE A,#1,JCINC2
- LJMP T1JC30
- JCINC2:MOV A,SWJC
- CJNE A,#2,JCINC3
- LJMP T1JC20
- JCINC3:MOV A,SWJC
- CJNE A,#3,JCINC4
- LJMP T1JC10
- ;-------
- JCINC4:MOV A,SWJC
- CJNE A,#4,JCINC5
- LJMP T2JC30
- JCINC5:MOV A,SWJC
- CJNE A,#5,JCINC6
- LJMP T2JC20
- JCINC6:MOV A,SWJC
- CJNE A,#6,JCINC7
- LJMP T2JC10
- ;-------------
- JCINC7:MOV A,SWJC
- CJNE A,#7,JCINC8
- LJMP S1JC20
- JCINC8:MOV A,SWJC
- CJNE A,#8,JCINC9
- LJMP S1JC10
- JCINC9:MOV A,SWJC
- CJNE A,#9,JCINC10
- LJMP S2JC20
- JCINC10:MOV A,SWJC
- CJNE A,#10,JCINC11
- LJMP S2JC10
- JCINC11:RET
- ;------------显示处理程序,包括设置位闪烁
- SXCL1:MOV R0,#80H
- INC R0
- MOV @R0,#54H ;显示T
- INC R0
- MOV @R0,#31H ;显示1
- INC R0
- MOV @R0,#7EH ;显示>
- INC R0
- MOV @R0,T1_3 ;显示T1_3 ;地址位置84H
- INC R0
- MOV @R0,T1_2 ;显示T1_2 ;地址位置85H
- INC R0
- MOV @R0,T1_1 ;显示T1_1 ;地址位置86H
- INC R0 ;跳过空格
- INC R0
- MOV @R0,#26H ;显示&
- INC R0 ;跳过空格
- INC R0
- MOV @R0,#54H ;显示T
- INC R0
- MOV @R0,#32H ;显示2
- INC R0
- MOV @R0,#7EH ;显示>
- INC R0
- MOV @R0,T2_3 ;显示T2_3 ;地址位置8DH
- INC R0
- MOV @R0,T2_2 ;显示T2_2 ;地址位置8EH
- INC R0
- MOV @R0,T2_1 ;显示T2_1 ;地址位置8FH
- ;----第二行
- INC R0
- ;MOV @R0,SWJC ;这条用于显示设置键次数(设置位置)
- INC R0
- INC R0
- INC R0
- MOV @R0,#73H ;显示S
- INC R0
- MOV @R0,#31H ;显示1 ;地址位置94H
- INC R0
- MOV @R0,#7EH ;显示>
- INC R0
- MOV @R0,S1_2 ;显示S1_2 ;地址位置96H
- INC R0
- MOV @R0,S1_1 ;显示S1_1 ;地址位置97H
- INC R0 ;跳过空格
- INC R0
- MOV @R0,#26H ;显示&
- INC R0 ;跳过空格
- INC R0
- MOV @R0,#73H ;显示S
- INC R0
- MOV @R0,#32H ;显示2
- INC R0
- MOV @R0,#7EH ;显示>
- INC R0
- MOV @R0,S2_2 ;显示S2_2 ;地址位置9EH
- INC R0
- MOV @R0,S2_1 ;显示S2_1 ;地址位置9FH
- LCALL LCD_SL ;闪烁显示----设置用-----
- RET
- ;闪烁显示----设置用-----
- ;TSRAM2为秒计时器
- ;大于0.7秒就给指定位填上空格
- LCD_SL:PUSH A
- PUSH PSW
- MOV A,SWJC
- JZ LCD_SLX ;A为0就退出,也就是没有按键按下
- MOV A,TSRAM2
- SUBB A,#70
- JNC LCD_SL_1
- LCD_SLX:POP PSW
- POP A
- RET
- LCD_SL_1:MOV A,SWJC ;按键计数值对应闪烁位置
- CJNE A,#1,LCD_SL_2
- MOV R0,#84H ;LCD缓冲区对应位的地址
- LCD_SLX2:MOV @R0,#20H ;给该位放上空格
- POP PSW
- POP A
- RET
- LCD_SL_2:MOV A,SWJC ;按键计数值对应闪烁位置
- CJNE A,#2,LCD_SL_3
- MOV R0,#85H ;LCD缓冲区对应位的地址
- LJMP LCD_SLX2
- LCD_SL_3:MOV A,SWJC ;按键计数值对应闪烁位置
- CJNE A,#3,LCD_SL_4
- MOV R0,#86H ;LCD缓冲区对应位的地址
- LJMP LCD_SLX2
- LCD_SL_4:MOV A,SWJC ;按键计数值对应闪烁位置
- CJNE A,#4,LCD_SL_5
- MOV R0,#8DH ;LCD缓冲区对应位的地址
- LJMP LCD_SLX2
- LCD_SL_5:MOV A,SWJC ;按键计数值对应闪烁位置
- CJNE A,#5,LCD_SL_6
- MOV R0,#8EH ;LCD缓冲区对应位的地址
- LJMP LCD_SLX2
- LCD_SL_6:MOV A,SWJC ;按键计数值对应闪烁位置
- CJNE A,#6,LCD_SL_7
- MOV R0,#8FH ;LCD缓冲区对应位的地址
- LJMP LCD_SLX2
- LCD_SL_7:MOV A,SWJC ;按键计数值对应闪烁位置
- CJNE A,#7,LCD_SL_8
- MOV R0,#96H ;LCD缓冲区对应位的地址
- LJMP LCD_SLX2
- LCD_SL_8:MOV A,SWJC ;按键计数值对应闪烁位置
- CJNE A,#8,LCD_SL_9
- MOV R0,#97H ;LCD缓冲区对应位的地址
- LJMP LCD_SLX2
- LCD_SL_9:MOV A,SWJC ;按键计数值对应闪烁位置
- CJNE A,#9,LCD_SL_10
- MOV R0,#9EH ;LCD缓冲区对应位的地址
- LJMP LCD_SLX2
- LCD_SL_10:MOV A,SWJC ;按键计数值对应闪烁位置
- CJNE A,#10,LCD_SLX
- MOV R0,#9FH ;LCD缓冲区对应位的地址
- LJMP LCD_SLX2
- ;-------倒计时 T1
- ; T1_1 个位, T1_2 十位 , T1_3百位
- T1JC1:JNB F3,T1JC4
- CLR F3
- MOV A,SWJC
- JNZ T1JC4
- T1JC2:JB F4,T1JC7
- MOV A,T1_1 ;先检查是否全部为0
- ORL A,T1_2
- ORL A,T1_3
- ORL A,T2_1 ;先检查是否全部为0
- ORL A,T2_2
- ORL A,T2_3
- JZ T1JC4 ;如果都为0,那就是没有计数任务
- SETB F4 ;置标志位作输出用
- T1JC7:MOV A,T1_1 ;再检查T1是否为0
- ORL A,T1_2
- ORL A,T1_3
- JZ T2JC1 ;此时T1为0就转到T2倒计数
- T1JC3:MOV A,T1_3 ;此时T1不为0就转到T1倒计数
- MOV B,#100
- MUL AB
- MOV R2,A
- MOV A,T1_2
- MOV B,#10
- MUL AB
- ADD A,R2
- ADD A,T1_1
- DEC A
- MOV R2,A
- MOV B,#100
- DIV AB
- MOV T1_3,A
- MOV A,B
- MOV B,#10
- DIV AB
- MOV T1_2,A
- MOV T1_1,B
- MOV A,R2
- JZ T1JC5
- T1JC4:RET
- T1JC5:MOV A,T2_1 ;先检查T2是否为0
- ORL A,T2_2
- ORL A,T2_3
- JZ T1JC6 ;T1计数完后检查T2如果是0,那就停止输出
- SETB F5 ;T1计数完后检查T2如果有数值,那置F5用于间歇计时
- RET
- T1JC6:CLR F4 ;清标志位停止输出
- CLR F5
- MOV S1_1,S1_1A ;把数值恢复,用于下一轮计时
- MOV S1_2,S1_2A
- MOV S2_1,S2_1A
- MOV S2_2,S2_2A
- SETB F9 ;报警输出
- RET
- T2JC1:SETB F5 ;F5置位,用于后面的歇计时
- MOV A,T2_3 ;T2计数
- MOV B,#100
- MUL AB
- MOV R2,A
- MOV A,T2_2
- MOV B,#10
- MUL AB
- ADD A,R2
- ADD A,T2_1
- DEC A
- MOV R2,A
- MOV B,#100
- DIV AB
- MOV T2_3,A
- MOV A,B
- MOV B,#10
- DIV AB
- MOV T2_2,A
- MOV T2_1,B
- MOV A,R2
- JZ T1JC6
- RET
- ;------间歇计时S1JC
- S1JC1:JNB F5,S1JC8
- JNB F2,S1JC8
- CLR F2
- MOV A,SWJC
- JNZ S1JC8
- S1JC2:JB F6,S1JC4 ;如果标志F6此前已经置位,那说明已经开始了计时,如果还未置位,那就置位开始
- MOV S1_1A,S1_1 ;把数值保存起来,用于下一轮重新加载
- MOV S1_2A,S1_2
- MOV S2_1A,S2_1
- MOV S2_2A,S2_2
- SETB F6 ;正在计时标志位
- SETB F7 ;间歇翻转标志位
- S1JC3:MOV A,S1_1
- ORL A,S1_2
- JZ S1JC6 ;如果设置了S1为0,那退出,输出也就0
- S1JC4:JNB F7,S2JC1
- MOV A,S1_2
- MOV B,#10
- MUL AB
- ADD A,S1_1
- DEC A
- MOV R3,A
- MOV B,#10
- DIV AB
- MOV S1_2,A
- MOV S1_1,B
- MOV A,R3
- JZ S1JC5
- RET
- S1JC5:CLR F7
- MOV S1_1,S1_1A ;重新加载S1
- MOV S1_2,S1_2A
- S2JC1:MOV A,S2_2
- MOV B,#10
- MUL AB
- ADD A,S2_1
- DEC A
- MOV R3,A
- MOV B,#10
- DIV AB
- MOV S2_2,A
- MOV S2_1,B
- MOV A,R3
- JZ S2JC2
- RET
- S2JC2:SETB F7
- MOV S2_1,S2_1A
- MOV S2_2,S2_2A
- RET
- S1JC6:CLR F6
- CLR F7
- S1JC8:RET
- ;-----第1路输出
- OUT1_1:MOV C,F4
- ANL C,F7
- CPL C
- MOV OUT1,C
- RET
- ;----取消/停止 按键处理
- CLR_STOP1:MOV T1_1,#00 ; 清除计时数值
- MOV T1_2,#00
- MOV T1_3,#00
- MOV T2_1,#00
- MOV T2_2,#00
- MOV T2_3,#00
- MOV SWJC,#00
- CLR F4 ; 输出控制
- CLR F6 ; 间歇正在计时标志位
- CLR F7 ;间歇翻转标志位
- CLR F5
- MOV S1_1,S1_1A ;把数值恢复,用于下一轮计时
- MOV S1_2,S1_2A
- MOV S2_1,S2_1A
- MOV S2_2,S2_2A
- RET
- ;---开始运行操作---
- STAR_RUN1: MOV SWJC,#00; 清按键计数,开始倒计时
- MOV A,T1_1 ;先检查是否全部为0
- ORL A,T1_2
- ORL A,T1_3
- JNZ STAR_RUN2
- ORL A,T2_1
- ORL A,T2_2
- ORL A,T2_3
- JZ STAR_RUN3
- SETB F5 ;如果只有T2有数值那就置F5用于间歇计数
- STAR_RUN2:SETB F4 ; 如果不为0,那就接通输出
- SETB F7 ;间歇翻转标志位
- CLR F6 ; 间歇正在计时标志位
- STAR_RUN3:RET
- ;-----直接进入小火操作-----
- STAR_MIN1:MOV SWJC,#00; 清按键计数,开始倒计时
- MOV A,T2_1 ;先检查是否全部为0
- ORL A,T2_2
- ORL A,T2_3
- JNZ STAR_MIN2
- RET
- STAR_MIN2:MOV T1_1,#00 ; 清除T1计时数值
- MOV T1_2,#00
- MOV T1_3,#00
- SETB F5 ;置F5用于后面S1,S2间歇计数
- SETB F7 ;间歇翻转标志位
- SETB F4 ; 接通输出
- RET
- ;报警响声输出
- BUZ1:JNB F9,BUZ10
- JB F8,BUZ2
- SETB F8 ;标志已经开始输出计时
- MOV TSRAM2,#00
- MOV BUZRAM,#5 ;响铃3秒
- CLR BUZ ;接通响铃
- BUZ2:JNB F2,BUZ10
- CLR F2
- DEC BUZRAM
- MOV A,BUZRAM
- JNZ BUZ10
- SETB BUZ ;响铃时间已经完,关铃声
- CLR F9
- CLR F8
- BUZ10:RET
复制代码
这张图片是后期做的第二版,与上面的电路图略有不同,多了一个继电器,按键位置改了一位。其他功能完全一样。
功能说明: T1时间是开始烧沸水的时间,是分钟 ,T1的时间走完后就转到T2,T2是慢火时间,也是分钟, T2计数期间内--- s1是接通时间(秒),走完后转到s2, s2是断开时间(秒),走完后再转到s1, 反复间歇通断, 直到T2走完,跟着完全断电。
17楼提供电路PCB及程序下载:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|