欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
51單片機(jī)主機(jī)和多臺(tái)從機(jī)之間通信串行通信匯編程序
[打印本頁]
作者:
daniu
時(shí)間:
2014-12-26 22:37
標(biāo)題:
51單片機(jī)主機(jī)和多臺(tái)從機(jī)之間通信串行通信匯編程序
;主機(jī)和多臺(tái)從機(jī)之間通信。通信協(xié)議如下:
;(1)系統(tǒng)中255臺(tái)從機(jī)地址分別為00~FEH;
;(2)地址FFH是對(duì)所有從機(jī)都起作用的一條控制命令,命令各從機(jī)恢復(fù)SM2=2的狀態(tài);
;(3)主機(jī)發(fā)送的控制命令代碼為:00—要求從機(jī)接收數(shù)據(jù)塊,01—要求從機(jī)發(fā)送數(shù)據(jù)塊;
;(4)數(shù)據(jù)塊長度:16字節(jié)。
;(5)從機(jī)狀態(tài)字格式為:
;D7 D6 D5 D4 D3 D2 D1 D0
;ERR 0 0 0 0 0 TRDY RRDY
;其中:若ERR=1,表示從機(jī)接收到非法命令;若TRDY=1,表示從機(jī)發(fā)送準(zhǔn)備就緒;
;若RRDY=1,表示從機(jī)接收準(zhǔn)備就緒。
;編程方法:主機(jī)的串口通信以調(diào)用子程序方式進(jìn)行;從機(jī)以串口中斷的方式進(jìn)行,
;若從機(jī)未做好接收或發(fā)送數(shù)據(jù)的準(zhǔn)備,就從中斷程序中返回,在主程序中做好準(zhǔn)備。
;以下為主機(jī)串行通信程序
;入口參數(shù):R0—主機(jī)發(fā)送的數(shù)據(jù)塊首址;R1—主機(jī)接收的數(shù)據(jù)塊首址;R2—被尋址從機(jī)地址;
;R3—主機(jī)命令;R4—數(shù)據(jù)塊長度;
BITE EQU 9 ;串口發(fā)送9位數(shù)據(jù)
FSSZ EQU 40H ;主機(jī)發(fā)送的數(shù)據(jù)塊首址
JSSZ EQU 50H ;主機(jī)接收的數(shù)據(jù)塊首址
ORG 0000H ;程序執(zhí)行開始地址
LJMP KS ;跳至KS
ORG 0003H ;外中斷0中斷程序入口
RETI ;中斷返回
ORG 000BH ;定時(shí)器T0中斷程序入口
RETI ;中斷返回
ORG 0013H ;外中斷1中斷入口
RETI ;中斷返回
ORG 001BH ;定時(shí)器T1中斷程序入口
RETI ;跳至INTT1中斷服務(wù)程序
ORG 0023H ;串口中斷入口地址
RETI ;中斷返回
ORG 0100H
KS: MOV SP,#1FH ;設(shè)置堆棧指針
;此處可以插入其他程序
COM: MOV TMOD,#20H ;設(shè)置T1工作方式為方式2
MOV SCON,#0D8H ;置串行模式3,SM2=1,允許接收
MOV TH1,#0FDH ;11.0592MHz 晶振,波特率=9600,時(shí)長0.6695 FD
SETB TR1 ;啟動(dòng)T1
;若主機(jī)向10號(hào)從機(jī)發(fā)送數(shù)據(jù)塊,數(shù)據(jù)塊放置在內(nèi)部RAM區(qū)的40~4F單元中,
;則主程序調(diào)用子程序的入口條件如下:
MOV FSSZ,#0
MOV FSSZ+1,#1
MOV FSSZ+2,#2
MOV FSSZ+3,#3
MOV FSSZ+4,#4
MOV FSSZ+5,#5
MOV FSSZ+6,#6
MOV FSSZ+7,#7
MOV FSSZ+8,#8
;串口通信
MOV R2,#0AH ;與10號(hào)從機(jī)通信
;MOV R3,#00H ;主機(jī)要求從機(jī)接收數(shù)據(jù)塊
MOV R3,#01H ;主機(jī)要求從機(jī)發(fā)送數(shù)據(jù)塊
;占用資源:R0~R4,A、40H、50H
COM1: LCALL MS101 ;調(diào)用串口通信子程序
CJNE R4,#00H,COM1 ;查看是否發(fā)送接收數(shù)據(jù)完成
SJMP KS ;實(shí)際中加入其他程序
;以下為主機(jī)串行通信子程序
MS101: MOV A,R2 ;發(fā)送地址幀
MOV SBUF,A
JNB TI,$
CLR TI
JNB RI,[ DISCUZ_CODE_1 ]nbsp; ;等待從機(jī)應(yīng)答
CLR RI
MOV A,SBUF
XRL A,R2
JZ MS103 ;判應(yīng)答地址是否相符
RET
MS102: SETB TB8
MOV SBUF,#0FFH ;不相符重新聯(lián)絡(luò)
JNB TI,$
CLR TI
SJMP MS101 ;轉(zhuǎn)重發(fā)地址
MS103: CLR TB8 ;地址符合,準(zhǔn)備發(fā)送命令
MOV SBUF,R3 ;發(fā)送命令
JNB TI,$
CLR TI
JNB RI,[ DISCUZ_CODE_1 ]nbsp; ;等待從機(jī)應(yīng)答
CLR RI
MOV A,SBUF ;取應(yīng)答信息
JNB ACC.7,MS104 ;判斷是否出錯(cuò)
SJMP MS102 ;若從機(jī)接收命令出錯(cuò),重新聯(lián)絡(luò)
MS104: CJNE R3,#00H,MS105 ;判是否要求從機(jī)接收數(shù)據(jù)
JNB ACC.0,MS102 ;從機(jī)接收數(shù)據(jù)準(zhǔn)備就緒否?
MOV R0,#FSSZ ;主機(jī)發(fā)送的數(shù)據(jù)塊首址
MOV R4,#BITE ;設(shè)數(shù)據(jù)塊長度(9字節(jié))
LPTX: MOV SBUF,@R0 ;主機(jī)發(fā)送數(shù)據(jù)塊
JNB TI,[ DISCUZ_CODE_1 ]nbsp; ;等待發(fā)送完1幀
CLR TI
INC R0 ;修改地址指針
DJNZ R4,LPTX ;判數(shù)據(jù)塊是否傳完
RET ;返回主程序
MS105: JNB ACC.1,MS102 ;從機(jī)發(fā)送數(shù)據(jù)準(zhǔn)備就緒否?
MOV R1,#JSSZ ;主機(jī)接收的數(shù)據(jù)塊首址
MOV R4,#BITE ;設(shè)數(shù)據(jù)塊長度(9字節(jié))
LPRX: JNB RI,LPRX ;等待接收完1幀
CLR RI
MOV A,SBUF ;取出接收到的字符
MOV @R1,A
INC R1
DJNZ R4,LPRX ;未接收完則繼續(xù)
RET
END
;以下為從機(jī)串行通信程序
;從機(jī)的的串行通信采用中斷控制啟動(dòng)方式,串行口中斷服務(wù)程序利用1區(qū)工作寄存器。在串口通信啟動(dòng)后,
;仍采用查詢方式來接收或發(fā)送數(shù)據(jù)塊。從機(jī)的初始化程序中應(yīng)包括定時(shí)器1和串口初始化以及開中斷程序。
;程序中利用F0(PSW.5)作發(fā)送準(zhǔn)備就緒標(biāo)志,F(xiàn)1(PSW.1)作接收準(zhǔn)備就緒標(biāo)志。
SLAVE EQU 0AH ;設(shè)定從機(jī)地址
BITE EQU 9 ;串口發(fā)送9位數(shù)據(jù)
FSSZ EQU 40H ;主機(jī)發(fā)送的數(shù)據(jù)塊首址
JSSZ EQU 50H ;主機(jī)接收的數(shù)據(jù)塊首址
ORG 0000H ;程序執(zhí)行開始地址
LJMP KS ;跳至KS
ORG 0003H ;外中斷0中斷程序入口
RETI ;中斷返回
ORG 000BH ;定時(shí)器T0中斷程序入口
RETI ;中斷返回
ORG 0013H ;外中斷1中斷入口
RETI ;中斷返回
ORG 001BH ;定時(shí)器T1中斷程序入口
RETI ;跳至INTT1中斷服務(wù)程序
ORG 0023H ;中斷返回
LJMP SS10 ;跳至串口中斷服務(wù)程序
KS: MOV SP,#1FH ;設(shè)置堆棧指針
MOV TMOD,#20H ;設(shè)置T1工作方式為方式2
MOV SCON,#0F0H ;置串行模式3,SM2=1,允許接收
MOV TH1,#0FDH ;11.0592MHz 晶振,波特率=9600,時(shí)長0.6695
SETB TR1 ;啟動(dòng)T1
SETB EA ;開總中斷
MOV FSSZ,#0
MOV FSSZ+1,#1
MOV FSSZ+2,#2
MOV FSSZ+3,#3
MOV FSSZ+4,#4
MOV FSSZ+5,#5
MOV FSSZ+6,#6
MOV FSSZ+7,#7
MOV FSSZ+8,#8
SETB F0 ;作發(fā)送準(zhǔn)備就緒標(biāo)志
SETB F1 ;作接收準(zhǔn)備就緒標(biāo)志
SETB ES ;允許串口通信
SJMP [ DISCUZ_CODE_1 ]nbsp; ;可以插入其他程序
;串行口中斷服務(wù)程序(由0023轉(zhuǎn)來)
;占用資源:1區(qū)R0~R2,A、40H、50H、C
SS10: CLR RI
PUSH A ;保護(hù)現(xiàn)場
PUSH PSW
SETB RS0 ;選1區(qū)工作寄存器
CLR RS1
MOV A,SBUF
XRL A,#SLAVE ;SLAVE為本從機(jī)地址
JZ SSI01 ;判地址是否符合
RETU: POP PSW ;恢復(fù)現(xiàn)場
POP A
RETI
SSI01: CLR SM2 ;地址符合,準(zhǔn)備接收數(shù)據(jù)
MOV SBUF,#SLAVE ;從機(jī)地址送主機(jī),準(zhǔn)備核對(duì)
JNB TI,[ DISCUZ_CODE_1 ]nbsp; ;等待發(fā)送完1幀
CLR TI
JNB RI,[ DISCUZ_CODE_1 ]nbsp; ;等待接收完1幀
CLR RI
JNB RB8,SSI02 ;是數(shù)據(jù)幀跳轉(zhuǎn)
SETB SM2 ;復(fù)位信號(hào),把SM2置“1”
SJMP RETU
SSI02: MOV A,SBUF ;取命令
CLR C
CJNE A,#02H,SS1 ;檢查命令是否合法,如果A<2,則C=1,否則C=0
SS1: JC SSI03 ;A<02H則繼續(xù)
MOV SBUF,#08H ;非法命令,置ERR=1
JNB TI,[ DISCUZ_CODE_1 ]nbsp; ;等待發(fā)送完1幀
CLR TI
SJMP RETU ;返回
SSI03: JZ CMD0 ;A=00H,準(zhǔn)備接收數(shù)據(jù)塊
JB F0,SSI04 ;發(fā)送準(zhǔn)備就緒否
MOV SBUF,#00H ;回答未準(zhǔn)備就緒
JNB TI,[ DISCUZ_CODE_1 ]nbsp; ;等待發(fā)送完1幀
SJMP RETU
SSI04: MOV SBUF,#02H ;發(fā)送準(zhǔn)備就緒,置TRDY=1
JNB TI,$
CLR TI
CLR F0 ;清發(fā)送準(zhǔn)備標(biāo)志
MOV R0,#FSSZ
MOV R2,#BITE ;發(fā)送或接收字節(jié)數(shù)送1區(qū)工作寄存器R2,現(xiàn)設(shè)定為9字節(jié)
LP1: MOV SBUF,@R0 ;發(fā)送數(shù)據(jù)塊
JNB TI,$
CLR TI
INC R0 ;修改數(shù)據(jù)指針
DJNZ R2,LP1
SETB SM2 ;發(fā)送完,置SM2=1
SJMP RETU
CMD0: JB F1,SSI05 ;判接收準(zhǔn)備就緒否?
MOV SBUF,#00H ;回答未準(zhǔn)備就緒
JNB TI,$
CLR TI
SJMP RETU
SSI05: MOV SBUF,#01H ;接收準(zhǔn)備就緒,置RRDY=1
JNB TI,$
CLR TI
CLR F1
MOV R1,#JSSZ ;接收緩沖區(qū)首址送1區(qū)工作寄存器R1,現(xiàn)設(shè)定為50~5FH
MOV R2,#BITE
LP2: JNB RI,LP2 ;等待1幀接收完
CLR RI
MOV @R1,SBUF
INC R1
DJNZ R2,LP2
SETB SM2 ;接收完,置SM2=1
SJMP RETU
END
復(fù)制代碼
作者:
hongfeng0107
時(shí)間:
2017-11-11 12:01
可以請(qǐng)教您問題嗎
作者:
SOPHHANA
時(shí)間:
2018-4-25 09:54
偷一手代碼,溜了
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1