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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2276|回復(fù): 10
收起左側(cè)

單片機匯編語言想要串口發(fā)送一組數(shù)據(jù)虛擬串口測試串口在不停的發(fā)送數(shù)據(jù)類似死循...

[復(fù)制鏈接]
ID:691738 發(fā)表于 2020-2-16 21:40 | 顯示全部樓層 |閱讀模式
用模擬串口測試的時候,本來是想的是發(fā)送一次自定義的這組數(shù)據(jù)然而測試卻一直發(fā)送自定義的這組數(shù)據(jù),我實在是找不出錯誤了,希望各位大神幫幫忙,謝謝。我是小白,可能寫的有點亂,有點啰嗦,謝謝大家了。
ORG 0000H; LJMP MAIN;
ORG 0050H;
MAIN:   
MOV A,#0FFH;   
MOV R2,#0FFH;   
MOV SP,#80H;   
LCALL CHU;   
LCALL ReceiveOneByte;   
PANDUAN:     
CJNE R2,#0FEH,L1;          繼電器控制
        CLR P2.0;       
L1:CJNE R2,#0FDH,L2;          
SETB P2.0;       
L2: CJNE R2,#0FCH,L3;          
CLR P2.1;       
L3:CJNE R2,#0FBH,L4;          
SETB P2.1;       
L4:CJNE R2,#0FAH,L5;          
CLR P2.2;       
L5:CJNE R2,#0F9H,L6;          
SETB P2.2;       
L6:CJNE R2,#0F8H,L7;          
CLR P2.3;       
L7:CJNE R2,#0F7H,L8;          
SETB P2.3;       
L8:CJNE R2,#0F6H,L9;          
CLR P2.4;       
L9:CJNE R2,#0F5H,L10;          
SETB P2.4;       
L10:CJNE R2,#0F4H,L11;          
CLR P2.5;       
L11:CJNE R2,#0F3H,L12;          
SETB P2.5;       
L12:CJNE R2,#0F2H,L13;          
CLR P2.6;       
L13:CJNE R2,#0F1H,L14;          
SETB P2.6;       
L14:CJNE R2,#0F0H,L15;          
CLR P2.7;       
L15:CJNE R2,#0EFH,L16;          
SETB P2.7;                   繼電器控制結(jié)束       
L16:CJNE R2,#0FEH,L17; 數(shù)據(jù)控制            
MOV R2,#00H;      
MOV DPTR,#BUF1;                     
LCALL LOOP;          
LJMP MAIN;       
L17:CJNE R2,#0EDH,MAIN;            
MOV R2,#00H;          
MOV DPTR,#BUF2;                     
LCALL LOOP;          
LJMP MAIN;          
RET;   
LOOP:   
MOV R0,#03H;           定義發(fā)送數(shù)量   
MOV R3,#00H;
LM:   
MOV A,R3;   
MOVC A,@A+DPTR;   
LCALL SendOneByte;   
INC R3;   
DJNZ R0,LM;   
RET;
SendOneByte:   
CLR ES;                        發(fā)送數(shù)據(jù)   
CLR TI;   
MOV SBUF,A;
WAIT:     
JNB TI,WAIT;          發(fā)送等待   
CLR TI;   
SETB ES;   
RETI;
CHU:  
MOV TMOD,#20H;        串口初始化(勿動)   MOV SCON,#50H;   
MOV TH1,#0FDH;   
MOV TL1,#0FDH;   
MOV PCON,#00H;   
SETB EA;   
SETB ES;   
SETB TR1;   
RETI;
ReceiveOneByte:   
CLR RI;                        接收數(shù)據(jù)   
PUSH ACC;   
MOV A,SBUF;   
MOV R2,A;   
LCALL DELAY100MS;   
LCALL PANDUAN;   
MOV R2,#00H;      
POP ACC;
WAIT1:     
JNB RI,WAIT1;   
CLR RI;      
RETI;
DELAY100MS:   
MOV R7,#23H;  
DL1:   MOV R6,#0AH;  
DL0:   MOV R5,#82H;   
DJNZ R5,$;   
DJNZ R6,DL0;   
DJNZ R7,DL1;   
RET;BUF1:  DB 01H,02H,03H;                        定義數(shù)據(jù)段BUF2:  DB 0FDH,0FDH;
END;


回復(fù)

使用道具 舉報

ID:235200 發(fā)表于 2020-2-17 11:08 | 顯示全部樓層
沒有把程序的初始化和主循環(huán)程序分開,設(shè)置了串行中斷而未用中斷方式接收數(shù)據(jù)
回復(fù)

使用道具 舉報

ID:235200 發(fā)表于 2020-2-17 11:20 | 顯示全部樓層
ReceiveOneByte函數(shù)和SendOneByte函數(shù)不是中斷服務(wù)程序,怎能返回用RETI
CHU初始化函數(shù)返回也用RETI是嚴重錯誤
接收函數(shù)中用到LCALL DELAY100MS;這個延時
結(jié)論:程序邏輯思維不清,沒有把中斷概念理解透切
回復(fù)

使用道具 舉報

ID:691738 發(fā)表于 2020-2-17 12:23 | 顯示全部樓層
先謝謝您幫我找錯,我還是不太明白,接收是是按照發(fā)送的寫的,不是中斷方式嗎?我也不太明白中斷查詢的區(qū)別,小白一個,還有程序初始化和主循環(huán)具體在哪分開呢?能詳細點嗎?謝謝您 感謝
回復(fù)

使用道具 舉報

ID:691738 發(fā)表于 2020-2-17 12:28 | 顯示全部樓層
先謝謝您幫我找錯,我還是不太明白,接收是是按照發(fā)送的寫的,不是中斷方式嗎?我也不太明白中斷查詢的區(qū)別,小白一個,還有程序初始化和主循環(huán)具體在哪分開呢?能詳細點嗎?謝謝您 感謝
回復(fù)

使用道具 舉報

ID:235200 發(fā)表于 2020-2-17 13:01 | 顯示全部樓層
ORG 0000H;
        LJMP MAIN;
        ORG 0023H                 ;如果采用中斷,要設(shè)置中斷入口
        LJMP ReceiveOneByte       ;有接收數(shù)據(jù)就執(zhí)行
ORG 0050H;
MAIN:   
MOV A,#0FFH;   
MOV R2,#0FFH;   
MOV SP,#80H;   
LCALL CHU                 ;這是串口初始化程序,運行只要一次   
;以下是主循環(huán)

PANDUAN:                   ;所以主程序要轉(zhuǎn)移到這地方
CJNE R2,#0FEH,L1;          繼電器控制
        CLR P2.0;        
L1:CJNE R2,#0FDH,L2;           
SETB P2.0;        
L2: CJNE R2,#0FCH,L3;           
CLR P2.1;        
L3:CJNE R2,#0FBH,L4;           
SETB P2.1;        
L4:CJNE R2,#0FAH,L5;           
CLR P2.2;        
L5:CJNE R2,#0F9H,L6;           
SETB P2.2;        
L6:CJNE R2,#0F8H,L7;           
CLR P2.3;        
L7:CJNE R2,#0F7H,L8;           
SETB P2.3;        
L8:CJNE R2,#0F6H,L9;           
CLR P2.4;        
L9:CJNE R2,#0F5H,L10;           
SETB P2.4;        
L10:CJNE R2,#0F4H,L11;         
CLR P2.5;        
L11:CJNE R2,#0F3H,L12;           
SETB P2.5;        
L12:CJNE R2,#0F2H,L13;           
CLR P2.6;        
L13:CJNE R2,#0F1H,L14;         
SETB P2.6;        
L14:CJNE R2,#0F0H,L15;           
CLR P2.7;        
L15:CJNE R2,#0EFH,L16;           
SETB P2.7;                   繼電器控制結(jié)束        
L16:CJNE R2,#0FEH,L17; 數(shù)據(jù)控制            
MOV R2,#00H;      
MOV DPTR,#BUF1;                     
LCALL LOOP;           
LJMP PANDUAN   ;此處是主循環(huán)返回        
L17:CJNE R2,#0EDH,MAIN;            
MOV R2,#00H;           
MOV DPTR,#BUF2;                     
LCALL LOOP;           
LJMP PANDUAN   ;此處是主循環(huán)返回
RET;

LOOP:   
MOV R0,#03H;           定義發(fā)送數(shù)量   
MOV R3,#00H;
LM:   
MOV A,R3;   
MOVC A,@A+DPTR;   
LCALL SendOneByte;     這是發(fā)送已知的3個字節(jié)
INC R3;   
DJNZ R0,LM;   
RET;

SendOneByte:                ;這個發(fā)送程序可以不用中斷
CLR ES;                        發(fā)送數(shù)據(jù)   
CLR TI;   
MOV SBUF,A;
WAIT:     
JNB TI,WAIT;          發(fā)送等待   
CLR TI;   
SETB ES;   
RETI;                        ;如果不用中斷就要改為RET
CHU:  
MOV TMOD,#20H;        串口初始化(勿動)   
MOV SCON,#50H;   
MOV TH1,#0FDH;   
MOV TL1,#0FDH;   
MOV PCON,#00H;   
SETB EA;              允許中斷
SETB ES;              
SETB TR1;   
RETI;                 ;此處要改為RET

ReceiveOneByte:   
CLR RI;                        接收數(shù)據(jù)   
PUSH ACC;   
MOV A,SBUF;   
MOV R2,A;                    接收數(shù)據(jù)存入R2就可以了,主程序不斷判斷R2中的數(shù)據(jù)
;LCALL DELAY100MS;           ;以下幾行不要了
;LCALL PANDUAN;   
;MOV R2,#00H;      
POP ACC;
;WAIT1:                      ;這幾行判斷是否接收完,中斷方式不要,查詢方式也要放在前面
;JNB RI,WAIT1;   
;CLR RI;      
RETI;
DELAY100MS:   
MOV R7,#23H;  
DL1:   MOV R6,#0AH;  
DL0:   MOV R5,#82H;   
DJNZ R5,$;   
DJNZ R6,DL0;   
DJNZ R7,DL1;   
RET;
BUF1:  DB 01H,02H,03H;                        定義數(shù)據(jù)段
BUF2:  DB 0FDH,0FDH;
END;
回復(fù)

使用道具 舉報

ID:691738 發(fā)表于 2020-2-17 14:24 | 顯示全部樓層
感謝,非常感謝,很詳細,學(xué)習(xí)了,再次感謝您
回復(fù)

使用道具 舉報

ID:691738 發(fā)表于 2020-2-17 16:42 | 顯示全部樓層
你好,我還有一個問題,怎么定義236個字節(jié)的數(shù)據(jù)呢,我試了一下只能定義100個字節(jié),多了就報錯,語法錯誤,應(yīng)該怎么定義呢?謝謝
回復(fù)

使用道具 舉報

ID:235200 發(fā)表于 2020-2-17 18:52 | 顯示全部樓層
這樣定義:
BUF1:  DB 01H,02H,……
           DB 01H,02H,……
           DB 01H,02H,……
            DB 01H,02H,……
但要注意取數(shù)據(jù)的方式,一般采用MOVC  A,@A+DPTR 命令最多只能取255個,但定義不受限制
回復(fù)

使用道具 舉報

ID:691738 發(fā)表于 2020-2-17 21:15 | 顯示全部樓層
好的 明白了 感謝您 學(xué)到了很多
回復(fù)

使用道具 舉報

ID:691738 發(fā)表于 2020-2-19 16:01 | 顯示全部樓層
你好,現(xiàn)在好像又遇到了新的問題,用proteus和串口助手進行仿真,數(shù)據(jù)可以正常發(fā)送執(zhí)行,燒錄到單片機不行了,單片機型號是stc89C52rc,晶振是11.0592MHz,現(xiàn)在現(xiàn)象是用串口助手給單片機發(fā)送數(shù)據(jù),單片機沒反應(yīng),更改其它波特率,有時會動作一下,外接的繼電器,已經(jīng)折騰了一天了,不知道該怎么辦,希望您再給指點指點,謝謝
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表