專注電子技術(shù)學(xué)習(xí)與研究
當前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

用單片機設(shè)計15s倒計時器

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2009年10月26日   【字體:

/*
跳線設(shè)置:默認跳線位置,注意蜂鳴器選擇跳線J5要選23端
程序效果:利用單片機的定時/計數(shù)器設(shè)計一個15到0倒計時器,
  按S4后啟動,要求精確顯示到百分之一秒。
發(fā)揮部分:  
1、定時結(jié)束后有提示音報警,并可重新定時
2、定時過程中按獨立鍵盤s5可暫停,按S4繼續(xù)
運行環(huán)境:51hei單片機學(xué)習(xí)板
*/
  ORG 0000H
  LJMP START   //主程序必須避開地址000BH
  ORG 000BH  //定時器0的中段服務(wù)程序,起始地址為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 //調(diào)用顯示
   JB P3.7,LOOP3 //判斷高低,即KEY1按鍵是否按下
   CLR TR0   //按下,關(guān)閉定時器,這里并沒有消抖
   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后,驅(qū)動蜂鳴器
  LCALL DELAY   //延時
  LCALL DELAY
  SETB P2.2  //關(guān)閉蜂鳴器
  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  //亮最左邊的數(shù)碼管
 CLR P2.7
  XCH A,R0   //暫存A的值
  MOV A,33H
  MOVC A,@A+DPTR //根據(jù)表值查找所需的值
 SETB P2.6
 MOV P0,A  //顯示值
 CLR P2.6
  LCALL DELAY   //延時
  XCH A,R0 //恢復(fù)原值
  RL A    //循環(huán)左移,為下次做準備
 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  ;數(shù)碼管顯示的數(shù)值  
  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  //結(jié)束
 

關(guān)閉窗口

相關(guān)文章