|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
OUT BIT P3.7 ;输出
KEY BIT P3.4 ;按键
INK BIT P3.2 ;外部中断1
;-------程序开始
ORG 0000H
NOP
SJMP MAIN ;转主程序
;-------中断向量表
ORG 0003H ;外部中断0
RETI
ORG 000BH ;定时器0
RETI
ORG 0013H ;外部中断1
CLR IE1
RETI
ORG 001BH ;定时器1
RETI
ORG 0023H ;串行口
RETI
ORG 002BH ;定时器2/ADC/SPI
RETI
ORG 0033H CA/LVD/外部中断2
RETI
ORG 003BH ;外部中断3
RETI
;-------中断向量表结束
ORG 0040H
MAIN: MOV SP,#6FH ;系统初始化
MOV IE,#0
MOV R0,#0
MOV R1,#0
MOV R2,#4
MOV R3,#5
MOV 20H,#0
MOV 21H,#8 ;脉冲1时长(单位10ms)
MOV 22H,#30 ;中间停时长
MOV 23H,#10 ;脉冲2时长
SETB OUT ;清输出
SETB IT1 ;设置外部中断1下降沿触发
SETB PX1 ;设置外部中断1高优先级
MOV IE,#84H ;开中断总允许,外部中断1
SJMP SLP ;转停
AGIN: MOV C,04 ;读停状态标志
JC STOP1 ;停状态标志为1转STOP1
MOV C,00 ;读输出标志00
JC TOINT1 ;输出标志00为1转TOINT1
MOV C,KEY ;读按键
JC LOOP0 ;键没按下转LOOP0
MOV C,01 ;键按下读按键前状态01
JNC KLOP1 ;按键前状态为0转处理
MOV C,02 ;按键前状态为1读按键处理02
JC SLP ;按键处理过转停
DJNZ R3,SLP ;按键没处理计数没到转停
INC 21H ;按键计数到脉冲输出加1
INC 21H ;按键计数到脉冲输出加1
INC 23H ;按键计数到脉冲输出加1
INC 23H ;按键计数到脉冲输出加1
SETB 02 ;置按键处理02
MOV R3,#5 ;置按键处理计数
SJMP SLP ;转停
KLOP1: SETB 01 ;置按键前状态01
SLP: MOV A,21H ;读脉冲输出长
RR A ;除2
CPL A ;取反
MOV P1,A ;脉冲输出长P1
MOV PCON,#01H ;使得芯片睡眠,由中断唤醒
SJMP AGIN ;中断唤醒重来
LOOP0: CLR 01 ;清按键前状态
CLR 02 ;清按键处理状态
MOV C,INK ;读起动按键
JC SLP ;起动按键没按下转停
SETB 00 ;置输出标志00
SJMP SLP ;转停
TOINT1: MOV C,OUT ;读输出
JNC OUTOK ;有输出转OUTOK
MOV C,03 ;没输出读输出0状态
JC VOUT1 ;输出0状态为1转VOUT1
CLR OUT ;没输出输出1
MOV R0,21H ;写输出时间
SJMP SLP ;转停
VOUT1: DJNZ R1,SLP ;输出0状态为1计数没到转停
CLR OUT ;计数到输出2
MOV R0,23H ;写输出时间
SJMP SLP ;转停
OUTOK: DJNZ R0,SLP ;输出时间没到转停
SETB OUT ;清输出
MOV C,03 ;读输出0状态
JC LOOP1 ;输出0状态为1转LOOP1
SETB 03 ;置输出0状态
MOV R1,22H ;写输出0时间
SJMP SLP ;转停
LOOP1: CLR 00 ;清去输出标志03
CLR 03 ;清输出0状态
SETB 04 ;置停状态
MOV R2,#0FFH ;置停时间2.55秒
SJMP SLP ;转停
STOP1: DJNZ R2,SLP ;停时间没到转停
CLR 04 ;清停状态
SJMP SLP ;转停
END |
|