本帖最后由 buxiangzhuche 于 2021-12-17 19:49 編輯
255倒計時器的需求是,有s28(單刀開關),s29(按鈕)兩個控制構件,要求是s28低電位時,進入預設模式,有滑動電阻器輸入電壓,利用adc0808模數轉換,得到數字量,然后在8位數碼管最左3位動態顯示出來,s28高電位時,8位數碼管上最左邊3位顯示預設值,最右邊3位顯示實時倒計時值,按下s29(1下開始,2下暫停)開始倒計時,每一秒-1,減到0,則使蜂鳴器響30秒,然后8位數碼管最右邊重新顯示預設值,等待下一次倒計時。
自己寫的時候,遇到問題如下:①動態數碼管仿真顯示異常,s28接高電位可以顯示左右各3位,但是撥動到低電位只能顯示一位(正常是顯示左三位),利用的是同一個顯示子程序(寄存器值不同)。②s28只能從高電位切換回低電位(由低到高只顯示一位),且只有第一次有效,后面無論怎么撥動都只顯示一位,如①問題。③使用寄存器間接尋址,mov A,@R0,指向bcd碼緩存區時,指向異常,比如60H內有#01H,但是讀取的時候,a取到了0,inc r0,依次向后也是如此。接線圖以及單片機程序如下:
接線圖.png (201.94 KB, 下載次數: 37)
下載附件
接線圖
2021-12-17 19:49 上傳
- IOCON EQU 8003H
- PORTA EQU 8000H
- PORTB EQU 8001H
- IN0 EQU 9000H
- BUF EQU 60H ;ad轉換讀入緩存
- EOC BIT P1.0
- BIZ BIT P1.1
- S28 BIT P1.2
- S29 BIT P3.2
-
- ORG 0000H
- LJMP START
- ORG 0200H
-
- ORG 0003H
- JNB S28,out
- CPL TR0
- out:
- RETI
-
- ORG 000BH
- INC R4 ;+1,重裝值
- MOV TH0,#4EH
- MOV TL0,#20H
- CJNE R4,#20,leave
- MOV R4,#00H
- JNB F0,jishu
- CLR BIZ
- INC R5
- CJNE R5,#30,leave
- SETB BIZ
- MOV A,R3 ;無法 MOV R2,R3
- MOV R2,A
- LCALL CON
- CLR TR0
- AJMP leave
- jishu:
- MOV A,R2
- DEC A
- MOV R2,A
- MOV B,#100 ;開始計算
- DIV AB
- MOV 63H,A ;63H 預設百位
- MOV A,B
- MOV B,#10
- DIV AB
- MOV 64H,A ;64H 預設十位
- MOV 65H,B ;65H 預設個位
- CJNE R2,#00H,leave
- SETB F0
- leave:
- RETI
-
- CON:
- MOV 63H,60H
- MOV 64H,61H
- MOV 65H,62H
- RET
-
- SHOW:
- MOV R7,#80H ;從第一位開始
- MOV R0,#60H ;緩存首地址
- next:
- LCALL DELAY
- MOV A,@R0 ;送段碼
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV DPTR,#PORTA
- MOVX @DPTR,A
- INC R0 ;下一段
- MOV A,R7 ;送位碼
- CPL A
- INC DPTR ;指向portb
- MOVX @DPTR,A
- CPL A
- RR A ;下一位
- MOV R7,A
- CJNE R7,#10H,gou
- MOV R7,#04H
- gou:
- DJNZ R6,next
- RET
-
- TAB: DB 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
-
- DELAY:
- MOV R1,#0FFH
- DJNZ R1,$
- RET
-
- START:
- MOV P0,#0FFH ;準雙向口讀,先寫1
- MOV P1,#0FFH
- MOV P3,#0FFH
- MOV DPTR,#IOCON ;指向8255命令口
- MOV A,#80H ;PA、PB、PC設為基本輸出模式
- MOVX @DPTR,A
- MOV TMOD,#01H ;初始化T0定時器,11.1HZ頻率下,設為20000即可
- MOV TH0,#4EH
- MOV TL0,#20H
- SETB EA
- SETB ET0
- SETB EX0
- SETB IT0 ;下降沿觸發
- pan:
- JB S28, DJS ;是0,則進入設置計數值
- MOV DPTR,#9000H ;指向A/D的0通道
- SETB EOC
- MOVX @DPTR,A ;啟動A/D轉換
- JNB EOC,[ DISCUZ_CODE_17 ]nbsp; ;沒轉換好則等待
- MOVX A,@DPTR ;讀A/D轉換值
- MOV A,#107 ;測試用
- MOV R2,A ;用于倒計時
- MOV R3,A ;用于恢復計數值
- MOV R4,#00H ;用于計秒
- MOV R5,#00H ;用于計蜂鳴器
- MOV B,#100;開始計算
- DIV AB
- MOV 60H,A ;60H 預設百位
- MOV 63H,A
- MOV A,B
- MOV B,#10
- DIV AB
- MOV 61H,A ;61H 預設十位
- MOV 64H,A
- MOV 62H,B ;62H 預設個位
- MOV 65H,B
- MOV R6,#03H ;顯示位數
- LCALL SHOW
- AJMP PAN
- djs:
- MOV R6,#06H ;顯示位數
- LCALL SHOW
- AJMP PAN
- END
復制代碼
end.zip
(203.6 KB, 下載次數: 6)
2021-12-17 19:47 上傳
點擊文件名下載附件
源碼及接線圖
為了便于各位大佬前輩調試,源碼及protues8.9工程文件一并附上了,十分感謝。
|