欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

用單片機(jī)設(shè)計(jì)精確到百分之一秒的計(jì)時(shí)器

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2009年11月17日   【字體:

/*
程序效果:利用單片機(jī)的定時(shí)/計(jì)數(shù)器設(shè)計(jì)一個(gè)計(jì)時(shí)器,
 按key0后啟動(dòng),要求精確顯示到百分之一秒。
發(fā)揮部分:  
1:定時(shí)結(jié)束后有提示音報(bào)警,并可重新定時(shí)
2:定時(shí)時(shí)間可設(shè)置,最多30s
3:定時(shí)過(guò)程中可暫停
4:按下key1暫停計(jì)時(shí),并記下此刻數(shù)值
5:按下key2顯示第一次按下key1的數(shù)值(按下第一次有效,其它均無(wú)效)
3:本程序版權(quán)所有:51hei.com.
*/
 ORG 0000H
 LJMP START   //主程序必須避開(kāi)地址000BH
 ORG 000BH  //定時(shí)器0的中段服務(wù)程序,起始地址為000BH
 LJMP IT00
 ORG 0030H
START:    MOV TH0,#0EBH //裝入初始值,定時(shí)時(shí)間為10ms
 MOV TL0,#64H
 MOV TMOD,#01H //工作方式1
 MOV 40H,#00
 MOV 41H,#00
 MOV 42H,#00
 MOV 43H,#00
 MOV 33H,#00   //顯示初值為0
 MOV 32H,#00
 MOV 31H,#00
 MOV 30H,#00
 MOV R1,#00
 MOV R2,#00
 SETB ET0   //打開(kāi)定時(shí)0
 SETB EA   //開(kāi)總中斷
HERE:    JNB P3.4,KEY0  //掃描是否有按鍵按下
 JNB P3.5,KEY1
 JNB P3.6,KEY2
 LCALL DISPLAY  //此處是為了防止掉顯
 LJMP HERE

KEY0:    LCALL DELAY1  //延時(shí)10ms
 JB P3.4,HERE  //判斷key0是否真的按下去了
LKOP:      LCALL DISPLAY //真的按下去了
 JNB P3.4, LKOP //檢查是否松手,沒(méi)有則繼續(xù)循環(huán),別忘了要顯示
 MOV A,R2  
 CJNE A,#01,LSP //判斷key2 是否按下去過(guò)(只能按一次)

 MOV R2,#00  //清零

 MOV 30H,34H  //真的按下去了
 MOV 31H,35H  //顯示key2按下前的值
 MOV 32H,36H
 MOV 33H,37H
LSP:        SETB TR0 //啟動(dòng)定時(shí)器
 LJMP HERE

KEY1:      LCALL DELAY1 //顯示消抖
 JB P3.5,HERE
 CLR  TR0  //關(guān)閉定時(shí)器
LKOP1:    LCALL DISPLAY
 JNB  P3.5,LKOP1
 INC R1
 MOV A,R1
LEP:        CJNE A,#01,HERE  //判斷key2是否按下(只能按一次)
 MOV 40H,30H  //暫存key2按下去前的值
 MOV 41H,31H
 MOV 42H,32H
 MOV 43H,33H
 LJMP HERE

KEY2:      LCALL DELAY1
 JB P3.6,HERE
 CLR TR0
LKOP2:    LCALL DISPLAY
 JNB  P3.6,LKOP2
 INC R2  //加1,為標(biāo)志,用于判斷key2是否按下去了
 MOV A,R2  //此處寫的是一個(gè)通用形式,只暫存一個(gè)數(shù)值
LEP2:      CJNE A,#01,HERE  //此語(yǔ)句大可不寫
 MOV 34H,30H   
 MOV 35H,31H //保存碼表當(dāng)時(shí)的數(shù)值,便于回復(fù)到原值
 MOV 36H,32H
 MOV 37H,33H

 MOV 30H,40H   //保存key1第一次按下的數(shù)值
 MOV 31H,41H
 MOV 32H,42H
 MOV 33H,43H
 LJMP HERE
 
//每10ms加1子程序
ADD1:      INC 30H     //百分位減1
 MOV A,30H
 CJNE A,#00AH,LOOP2 //判斷百分位減到0之后是否再減1
 MOV 30H,#00   //是,裝入初值9
 INC 31H    //十分位減1
 MOV A,31H
 CJNE A,#0AH,LOOP2 //判斷百分位減到0之后是否再減1
 MOV 31H,#00
 INC 32H
 MOV A,32H
 CJNE A,#0AH,LOOP2
 MOV 32H,#00
 INC 33H
 MOV A,33H
 CJNE A,#0AH,LOOP2
 MOV 33H,#00
 SETB P2.0  //關(guān)閉蜂鳴器 
 LCALL DELAY   //延時(shí)
 LCALL DELAY
  CLR P2.0    //從15s減到0s后,驅(qū)動(dòng)蜂鳴器
 MOV 33H,#00   //裝入初值15s
 MOV 32H,#00
 MOV 31H,#00
 MOV 30H,#00
 CLR TR0   //關(guān)閉定時(shí)器,
LP1:         JB P3.4,LP //判斷KEY0是否按下
 SETB TR0 //按下,則啟動(dòng)定時(shí)器 ,這里我沒(méi)有消抖
 SJMP LOOP2
LP:  LCALL  DISPLAY  //沒(méi)有按下,調(diào)用顯示,防止掉顯
 SJMP LP1
LOOP2:    NOP    //空指令
 RET    //返回
//顯示子程序
DISPLAY: MOV DPTR,#TAB  //賦表首地址
 MOV A,#0FBH  
 MOV P2,A  //亮最左邊的數(shù)碼管
 XCH A,R0   //暫存A的值
 MOV A,33H
 MOVC A,@A+DPTR //根據(jù)表值查找所需的值
 MOV P0,A  //顯示值
 LCALL DELAY   //延時(shí)
 XCH A,R0 //恢復(fù)原值
 RL A    //循環(huán)左移,為下次做準(zhǔn)備

 MOV P2,A
 XCH A,R0
 MOV A,32H
 MOVC A,@A+DPTR
 MOV P0,A
 LCALL DELAY
 XCH A,R0
 RL A

 MOV P2,A
 XCH A,R0
 MOV A,31H
 MOVC A,@A+DPTR
 MOV P0,A
 LCALL DELAY
 XCH A,R0
 RL A

 MOV P2,A
 XCH A,R0
 MOV A,30H
 MOVC A,@A+DPTR
 MOV P0,A
 LCALL DELAY
 RET
TAB:     DB 3FH,06H,5BH,4FH,66H  ;數(shù)碼管顯示的數(shù)值  
 DB  6DH,7DH,07H,7FH,6FH   
IT00:     MOV TH0,#0EBH  //裝入初值,時(shí)間為10ms
 MOV TL0,#64H
 LCALL ADD1   //減10ms
 RETI     //返回
DELAY:    MOV R7,#04 //延時(shí)子程序,時(shí)間大約為:2us*4*250
DEL2:       MOV R6,#250
DEL1:       DJNZ R6,DEL1
 DJNZ R7,DEL2
 RET
DELAY1:  MOV R5,#20
DEL3:    MOV R4,#250
DEL4:      DJNZ R4,DEL4
    DJNZ R5,DEL3
 RET
 END  //結(jié)束 

關(guān)閉窗口

相關(guān)文章