51單片機(jī) 雙機(jī)通信(匯編)
;用方式一雙機(jī)通信:定時(shí)器采用定時(shí)器1(8位自動(dòng)重裝),波特率采用9600bit/s
;此程序?qū)崿F(xiàn)雙機(jī)同時(shí)發(fā)送(數(shù)碼管0-9),并能同時(shí)接受,并顯示出來,真正實(shí)現(xiàn)異步全雙工
org 0000h
ljmp reset
org 0003h
reti
org 000bh
reti
org 001bh
reti
org 0023h
ljmp tans_int ;串口中斷入口
reset: mov r0,#0 ;先進(jìn)行系統(tǒng)準(zhǔn)備(可以不要)
djnz r0,$
init: mov r1,#4 ;各個(gè)寄存器初始化
mov tmod,#0020h
mov th1,#0fdh
mov tl1,#0fdh
setb tr1 ;打開定時(shí)器中斷
mov pcon,#00h
clr sm0 ;設(shè)置工作方式1
setb sm1
setb ren ;允許串行口接收數(shù)據(jù)
clr ti
clr ri
setb es ;打開串行中斷
setb ea ;打開全局中斷
main:
mov r0,#9
mov a,#0
loop:
mov dptr,#table ;主函數(shù)主要實(shí)現(xiàn)串行發(fā)送
mov a,r0
movc a,@a+dptr
mov sbuf,a
jb ti,$ ;判斷發(fā)送中斷標(biāo)志是否在中斷中清零
lcall delay ;若清零,則延時(shí)
inc dptr
dec r0
cjne r0,#255,loop ;減到0之后會(huì)變成255
ljmp main
tans_int:
push acc
push psw
jnb ti,recive_clr ;判斷是否為發(fā)送中斷
clr ti
sjmp int_end
recive_clr:
jnb ri,int_end ;判斷是否為接收中斷
clr ri
mov a,sbuf ;若是,則顯示出來
mov p2,a
int_end:
pop psw
pop acc
reti
table: ;共陽極數(shù)碼管掃描碼
db 0c0h,0f9h,0a4h,0b0h,99h
db 92h,82h,0f8h,80h,90h
delay:
mov r3,#4 ;延時(shí)函數(shù)(延時(shí)大概5**255*255*2=500ms)
l0:mov r4,#0
l1: mov r5,#0ffh
djnz r5,$
djnz r4,l1
djnz r3,l0
ret
end
評(píng)論