寫電子鐘彙編語言,發射端發射4個數字到接收端的數碼管顯示四位數字,分別是分和秒各兩位數,
發射端:TIMER0是寫發射數字的判別式,TIMER1是配合串列埠模式1,SERIES是串列埠中斷接收端:LOOP是接端數字的判別式,接收一個BYTE,高位元是位數,低位元是數字,
TIMER0是顯示四位數字,SERIERS是串列埠中斷
程式寫不出來需要幫忙,發射端的TIMER0暫時寫秒的個位和十位,接收端的判別
數字接收過來的判別式已經寫好了,但是數字送過去依然失敗,接收端的TIMER0
程式沒有任何錯誤,可以在數碼管顯示數字,請神人幫忙完成越快越好
我用兩塊一樣的開發粄~
發射端程式:
q1 EQU 31H ;個位
q2 EQU 32H ;十位
ORG 0000H
AJMP START
ORG 000BH
AJMP TIMER0
ORG 001BH
AJMP TIMER1
ORG 0023H
AJMP SERIES
START: MOV IP,#00011010B ;中斷優先權有:串列埠.計數器1.計數器0
MOV IE,#10010010B ;中斷開啟有:總開關.串列埠.計數器0
MOV SCON,#01000000B ;串列埠模式1,不可接收資料
MOV TMOD,#00100010B ;計數器1模式2,計數器0模式2
MOV TCON,#11110000B ;計數器1開啟,計時器0溢位旗標,計時器0開啟
SETB TR0 ;開啟計數器0
MOV TH1,#253 ;設定計時器1的值,鮑率=9600
SETB TR1 ;開啟計數器1
MOV DPTR,#TABLE ;DPTR指向數碼管資料區
MOV q1,#00H ;個位,判別位數=0,數字=0
MOV q2,#10H ;十位,判別位數=1,數字=0
LOOP: sjmp loop
;---------------------------------------------------
TIMER0:
PUSH ACC
CLR TR0 ;關閉計數器0
MOV TH0,#6
MOV TL0,#6
djnz r4,k0 ; 延遲時間
mov r4,#100 ;
djnz r5,k0 ;
mov r5,#2 ;
;q1=00,00~09 q2=10,10~15
mov a,q1 ;q1=要發射的個位
inc a
mov q1,a
cjne a,#0ah,k1 ; 發射個位的式子,發射0~9是跑到k1
mov a,#00h ;當發射個位超過0a時會歸零
mov q1,a
mov sbuf,a ;發射個位等於0時
acall delay
mov a,q2 ;q2=要發射的十位
inc a
mov q2,a
cjne a,#16h,k1 ; 發射十位的式子,發射0~5是跑到k1
mov a,#10h ;把十位數歸零,但判別位數還是1
mov q2,a
mov sbuf,a
acall delay
k0: setb tr0
pop acc
reti ;返回主程式
k1:
mov sbuf,a ;發射數字
acall delay
setb tr0
pop acc
reti ;返回主程式
;---------------------------------------------------
TIMER1:
PUSH ACC
CLR TR1
MOV TH1,#253
SETB TR1
POP ACC
RETI
;---------------------------------------------------
SERIES:
JNB TI,RECEIVE ;判斷是否傳送完畢,如果否,就是接收完畢中斷
CLR TI
RETI
RECEIVE:
CLR RI ;清除接收中斷旗標
MOV A,SBUF
RETI
;---------------------------------------------------
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ; 數字0~9
DELAY: MOV R6,#250 ;延遲的副程式
DL1: MOV R7,#200
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
END
以下是接收端的程式:
ScanLine EQU 22H ;掃描信號
packet equ 23h ;接收數字的寄存器
ORG 0000H
AJMP START
ORG 000BH
AJMP TIMER0
ORG 0023H
AJMP SERIES
START: MOV IP,#00011010B ;中斷優先權:串列埠.計數器1.計數器0
MOV IE,#10011010B ;中斷致能:總開關開啟.串列埠.計數器1.計數器0
MOV SCON,#01010000B ;串列埠模式1,REN=1可接收資料
MOV TMOD,#00100001B ;計數器1模式2,計數器0模式1
MOV TCON,#11110000B ;-計數器1溢位+啟動,計數器0溢位+啟動
MOV TH0,#0ECH
MOV TL0,#78H
SETB TR0 ;-計數器0開啟
SETB EA
SETB ET0
SETB ET1
MOV TH1,#253 ;計數器1模式自動在載入253,鮑率=9600
SETB TR1 ;開啟記數器1
SETB TR0 ;開啟記數器0
MOV SP,#60H ;SP堆疊暫存器指向位置60H
MOV ScanLine,#11110111B ;掃描信號初值
MOV DPTR,#TABLE ;DPTR指向數碼管資料區
MOV R0,#30H ;四位數資料區
MOV 30H,#00 ;個位歸零
MOV 31H,#00 ;十位歸零
MOV 32H,#00 ;百位歸零
MOV 33H,#00 ;千位歸零
mov packet,#00 ;接收數字的寄存器
loop:
mov packet,sbuf ; 把接收的數字放到packet的寄存器裡面
mov a,packet ;把數字放到累積器a裡面
anl a,#0f0h ;把數字過濾個位數字,會剩下位數
cjne a,#00h,k1 ;判別是否為個位數字,若不是則跳k1副程式
anl packet,#0fh ;把接收到個位數字的位數歸零留下數字
mov r1,#30h
mov @r1,packet ;把濾除後留下的數字放入r1裡面即可顯示數字
ajmp loop
k1:
cjne a,#10h,k2 ;判別是否為十位數字,若不是則跳k2副程式
anl packet,#0fh ;把接收到十位數字的位數歸零留下數字
inc r1 ;r1=31h
mov @r1,packet ;把濾除後留下的數字放入r1裡面即可顯示數字
ajmp loop
k2: ajmp loop
TIMER0:
PUSH ACC
CLR TR0 ;關閉計數器0
MOV TH0,#0F4H ;重新設定計數器0的數值
MOV TL0,#078H
MOV A,@R0 ;載入時間資料
MOVC A,@A+DPTR ;將BCD碼轉成顯示碼
MOV P0,A ;將顯示碼送到P0
INC R0 ;下一位數
MOV A,ScanLine
MOV P2,A ;輸出掃描信號
RR A ;掃描下一行
MOV ScanLine,A ;更新掃描信號
CJNE A,#10111111B,ti00 ;已經掃描完四位數?
MOV R0,#30H ;重新設定緩衝區位址30H
MOV ScanLine,#11110111B ;重新設定掃描信號
ti00: SETB TR0
POP ACC
RETI ;返回主程式
;---------------------------------------------------
SERIES:
JNB TI,RECEIVE
CLR TI
RETI
RECEIVE:
CLR RI
MOV A,SBUF
mov packet,a
RETI
;--------------------------------------------------------
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;0~9
DELAY: MOV R6,#250 ;延遲副程式
DL1: MOV R7,#200
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
END
|