打印

定时器问题

[复制链接]
871|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
baidudz|  楼主 | 2011-12-26 18:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想做个定时器定时给继电器供电或断电,时间可调,默认2分钟,
8255 pa,pb控制数码管,pc扫描键盘(只要4个键,pc1.2.3为行,pc4为列),做了几天始终做不来,可以显示,但是不能工作。。。。
高手帮忙改下程序
PA XDATA 0D1FFH
PB XDATA 0D2FFH
;PC XDATA 0D5FFH
CON XDATA 0D7FFH
SL EQU 40H
SH EQU 41H
ML EQU 42H
ORG 0000H
LJMP MAIN  
ORG 000BH

MAIN:
  MOV 30H,#00H
  MOV 40H,#00H
  MOV 41H,#00H
  MOV 42H,#02H
  MOV 60H,#1FH
  MOV TMOD,#21H ;定时器工作方式;
  MOV TH0,#3CH
  MOV TL0,#0B0H
  SETB EA ;开中断;
  SETB ET0
  SETB ET1

  MOV DPTR,#CON ;控制字设置;
  MOV A,#81H
  MOVX @DPTR,A   
  LJMP KEYSCAN
  LJMP START
  LJMP TIME   

;数码管显示函数;
START:
  MOV 20H,#00H
  MOV DPTR,#0D1FFH ;A选通分个位;
  MOV A,#0FEH
  MOVX @DPTR,A
   
  MOV DPTR,#0D2FFH ;送PB显示分秒间隔符;
  MOV A,#0A0H
  MOVX @DPTR,A   

  MOV DPTR,#0D2FFH ;关闭数码管;
  MOV A,0FFH
  MOVX @DPTR,A

  MOV DPTR,#0D1FFH ;A选通分个位;
  MOV A,#0FDH
  MOVX @DPTR,A

  MOV A,42H ;分个位数赋值给a;
  ADD A,20H
  MOV DPTR,#TABLE ;取分个位数;
  MOVC A,@A+DPTR

  MOV 21H,A ;送pb显示分个位;
  MOV DPTR,#0D2FFH
  MOV A,21H   
  MOVX @DPTR,A

  MOV DPTR,#0D2FFH ;闭数码管;
  MOV A,0FFH
  MOVX @DPTR,A

  MOV DPTR,#0D1FFH ;A选通分秒间隔符;
  MOV A,#0FBH
  MOVX @DPTR,A

  MOV DPTR,#0D2FFH ;送PB显示分秒间隔符;
  MOV A,#07FH
  MOVX @DPTR,A

  MOV DPTR,#0D2FFH ;闭数码管;
  MOV A,0FFH
  MOVX @DPTR,A

  MOV DPTR,#0D1FFH ;A选通秒十位;
  MOV A,#0F7H
  MOVX @DPTR,A

  MOV A,41H ;秒十位数赋值给a;
  ADD A,20H
  MOV DPTR,#TABLE ;取秒十位数;
  MOVC A,@A+DPTR

  MOV 21H,A ;送pb显示秒十位;
  MOV DPTR,#0D2FFH
  MOV A,21H   
  MOVX @DPTR,A

  MOV DPTR,#0D2FFH ;闭数码管;
  MOV A,0FFH
  MOVX @DPTR,A
   
  MOV DPTR,#0D1FFH ;A选通秒个位;
  MOV A,#0EFH
  MOVX @DPTR,A

  MOV A,40H ;秒个位数赋值给a;
  ADD A,20H
  MOV DPTR,#TABLE ;取秒个位数;
  MOVC A,@A+DPTR

  MOV 21H,A ;送pb显示秒个位;
  MOV DPTR,#0D2FFH
  MOV A,21H   
  MOVX @DPTR,A

  MOV A,40H
  JNZ OVER ;sl=0?是,继续,否,over;
  MOV A,41H
  JNZ OVER ;sH=0?是,继续,否,over;
  MOV A,60H
  JNZ OVER
  CLR TR0 ;定时器关闭;
  SETB TR1 ;定时器打开;
  SETB P1.2 ;断开继电器;

  MOV DPTR,#0D1FFH
  MOV A,#00H
  MOVX @DPTR,A

  MOV DPTR,#0D2FFH
  MOV A,#0A0H
  MOVX @DPTR,A
OVER:LJMP START
TABLE:DB 0A0H,0BBH,62H,2AH,39H,2CH,24H,0BAH,20H,28H,0A0H
  RET

;计时函数;

TIME:
  PUSH ACC
  PUSH PSW
  INC 30H ;20次计数器加1;
  MOV A,30H
  CJNE A,#20H,GOON ;到20次?是,继续执行,否,跳入GOON;
MIAO:
  MOV 30H,#00H
  DEC 40H ;秒低位减1;
  MOV A,40H
  CJNE A,#00H,GOON ;sl=0?是,继续,否,跳入goon;
  DEC 41H ;秒高位减1;
  MOV A,41H
  CJNE A,#00H,GOON ;SH=0?是,继续,否,goon;
  DEC 42H ;分减1;
  CJNE A,#00H,GOON ;ml=0?是,继续,否goon;
GOON:
  MOV TH0,#3CH
  MOV TL0,#0B0H
  SETB TR0
  POP PSW
  POP ACC
  RETI


;键盘扫描程序;
KEYSCAN:
  MOV DPTR,#CON ;控制字设置;
  MOV A,#81H
  MOVX @DPTR,A

LOOP1: MOV DPTR,#0D5FFH ;拉高PC.4;
  MOV A,#10H   
  MOVX @DPTR,A
MOVX A,@DPTR
  
  ANL A,#0FH ;判断是否有键闭合;
  JZ DONE

  ACALL DELAY50

  MOV A,#10H  
  ANL A,#0FH  
LOOP2:ADD A,#10H
  CJNE A,#18H,LOOP3
  MOV 42H,#00H
  INC 40H
  MOV R0,40H
  CJNE @R0,#09H,LOOP3
  INC 41H
  MOV 40H,#00H
  MOV R0,40H
LOOP3:CJNE A,#14H,LOOP4
  CJNE @R0,#00H,LOOP4
  MOV 40H,#09H
LOP: DEC 40H
DEC 41H
LOOP4:CJNE A,#12H,LOOP5
  SETB TR0
  CLR P1.2 ;继电器;
LOOP5:CJNE A,#11H,LOOP6
  CLR TR0
  SETB P1.2
LOOP6:MOV A,0D5FFH
  MOV P1,A ;P1=PC ;
DONE: RET

DELAY50:MOV R7,#200
  D1:MOV R6,#123
  D2:DJNZ R6,D2
  NOP
  DJNZ R7,D1
  RET


DELAY100:MOV R7,#400
D5:MOV R6,#123
D6:DJNZ R6,D2
NOP
DJNZ R7,D1
RET

END

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

239

主题

2284

帖子

0

粉丝