专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

用单片机设计15s倒计时器

作者:佚名   来源:本站原创   点击数:  更新时间:2009年10月26日   【字体:

/*
跳线设置:默认跳线位置,注意蜂鸣器选择跳线J5要选23端
程序效果:利用单片机的定时/计数器设计一个15到0倒计时器,
  按S4后启动,要求精确显示到百分之一秒。
发挥部分:  
1、定时结束后有提示音报警,并可重新定时
2、定时过程中按独立键盘s5可暂停,按S4继续
运行环境:51hei单片机学习板
*/
  ORG 0000H
  LJMP START   //主程序必须避开地址000BH
  ORG 000BH  //定时器0的中段服务程序,起始地址为000BH
  LJMP IT00
  ORG 0030H
START:    MOV TH0,#0EBH //装入初始值,定时时间为10ms
  MOV TL0,#64H
  MOV TMOD,#01H //工作方式1
  MOV 33H,#01   //显示初值为15s
  MOV 32H,#05
  MOV 31H,#00
  MOV 30H,#00
  SETB ET0   //打开定时0
  SETB EA   //开总中断
LOOP1:   JB P3.6,LOOP   //判断高低位,即按键KEY0是否按            下
  LCALL DISPLAY //为低,即按键按下,延时消抖
  LCALL DISPLAY
  JB P3.6,LOOP   //按键真的按下,并不是外界的干扰
  SETB TR0  //启动定时器
HERE:    LCALL DISPLAY //调用显示
   JB P3.7,LOOP3 //判断高低,即KEY1按键是否按下
   CLR TR0   //按下,关闭定时器,这里并没有消抖
   LJMP LOOP1    //等待KEY0的按下
LOOP3:   SJMP HERE    //KEY1没有按下,就需显示
LOOP:     LCALL DISPLAY  //KEY1没有按下,就需显示
  LJMP  LOOP1
//减10ms子程序
SUB1:    DEC 30H     //百分位减1
  MOV A,30H
  CJNE A,#0FFH,LOOP2 //判断百分位减到0之后是否        再减1
  MOV 30H,#09   //是,装入初值9
  DEC 31H    //十分位减1
  MOV A,31H
  CJNE A,#0FFH,LOOP2 //判断百分位减到0之后是否        再减1
  MOV 31H,#09
  DEC 32H
  MOV A,32H
  CJNE A,#0FFH,LOOP2
  MOV 32H,#09
  DEC 33H
  MOV A,33H
  CJNE A,#0FFH,LOOP2
  clr P2.2    //从15s减到0s后,驱动蜂鸣器
  LCALL DELAY   //延时
  LCALL DELAY
  SETB P2.2  //关闭蜂鸣器
  MOV 33H,#01   //装入初值15s
  MOV 32H,#05
  MOV 31H,#00
  MOV 30H,#00
LOOP2:   NOP    //空指令
  RET    //返回
//显示子程序
DISPLAY: MOV DPTR,#TAB  //赋表首地址
  MOV A,#0FBH 
 
 SETB P2.7
 MOV P0,A  //亮最左边的数码管
 CLR P2.7
  XCH A,R0   //暂存A的值
  MOV A,33H
  MOVC A,@A+DPTR //根据表值查找所需的值
 SETB P2.6
 MOV P0,A  //显示值
 CLR P2.6
  LCALL DELAY   //延时
  XCH A,R0 //恢复原值
  RL A    //循环左移,为下次做准备
 SETB P2.7
 MOV P0,A
 CLR P2.7
  XCH A,R0
  MOV A,32H
  MOVC A,@A+DPTR
 SETB P2.6
 MOV P0,A
 CLR P2.6
  LCALL DELAY
  XCH A,R0
  RL A

 SETB P2.7
 MOV P0,A
 clr P2.7

  XCH A,R0
  MOV A,31H
  MOVC A,@A+DPTR
 SETB P2.6
 MOV P0,A
 clr P2.6
  LCALL DELAY
  XCH A,R0
  RL A
 SETB P2.7
 MOV P0,A
 clr P2.7
  XCH A,R0
  MOV A,30H
  MOVC A,@A+DPTR
 SETB P2.6
 MOV P0,A
 clr P2.6
  LCALL DELAY
  RET
TAB:     DB 3FH,06H,5BH,4FH,66H  ;数码管显示的数值  
  DB 6DH,7DH,07H,7FH,6FH
IT00:     MOV TH0,#0EBH  //装入初值,时间为10ms
  MOV TL0,#64H
  LCALL SUB1   //减10ms
  RETI     //返回
DELAY:    MOV R7,#04 //延时子程序,时间大约为:2us*4*250
DEL2:       MOV R6,#250
DEL1:      DJNZ R6,DEL1
  DJNZ R7,DEL2
  RET
  END  //结束
 

关闭窗口

相关文章