找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1293|回复: 10
打印 上一主题 下一主题
收起左侧

单片机汇编语言想要串口发送一组数据虚拟串口测试串口在不停的发送数据类似死循...

[复制链接]
跳转到指定楼层
楼主
ID:691738 发表于 2020-2-16 21:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用模拟串口测试的时候,本来是想的是发送一次自定义的这组数据然而测试却一直发送自定义的这组数据,我实在是找不出错误了,希望各位大神帮帮忙,谢谢。我是小白,可能写的有点乱,有点啰嗦,谢谢大家了。
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;                   继电器控制结束       
L16:CJNE R2,#0FEH,L17; 数据控制            
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;           定义发送数量   
MOV R3,#00H;
LM:   
MOV A,R3;   
MOVC A,@A+DPTR;   
LCALL SendOneByte;   
INC R3;   
DJNZ R0,LM;   
RET;
SendOneByte:   
CLR ES;                        发送数据   
CLR TI;   
MOV SBUF,A;
WAIT:     
JNB TI,WAIT;          发送等待   
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;                        接收数据   
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;                        定义数据段BUF2:  DB 0FDH,0FDH;
END;


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2020-2-17 11:08 | 只看该作者
没有把程序的初始化和主循环程序分开,设置了串行中断而未用中断方式接收数据
回复

使用道具 举报

板凳
ID:235200 发表于 2020-2-17 11:20 | 只看该作者
ReceiveOneByte函数和SendOneByte函数不是中断服务程序,怎能返回用RETI
CHU初始化函数返回也用RETI是严重错误
接收函数中用到LCALL DELAY100MS;这个延时
结论:程序逻辑思维不清,没有把中断概念理解透切
回复

使用道具 举报

地板
ID:691738 发表于 2020-2-17 12:23 | 只看该作者
先谢谢您帮我找错,我还是不太明白,接收是是按照发送的写的,不是中断方式吗?我也不太明白中断查询的区别,小白一个,还有程序初始化和主循环具体在哪分开呢?能详细点吗?谢谢您 感谢
回复

使用道具 举报

5#
ID:691738 发表于 2020-2-17 12:28 | 只看该作者
先谢谢您帮我找错,我还是不太明白,接收是是按照发送的写的,不是中断方式吗?我也不太明白中断查询的区别,小白一个,还有程序初始化和主循环具体在哪分开呢?能详细点吗?谢谢您 感谢
回复

使用道具 举报

6#
ID:235200 发表于 2020-2-17 13:01 | 只看该作者
ORG 0000H;
        LJMP MAIN;
        ORG 0023H                 ;如果采用中断,要设置中断入口
        LJMP ReceiveOneByte       ;有接收数据就执行
ORG 0050H;
MAIN:   
MOV A,#0FFH;   
MOV R2,#0FFH;   
MOV SP,#80H;   
LCALL CHU                 ;这是串口初始化程序,运行只要一次   
;以下是主循环

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;                   继电器控制结束        
L16:CJNE R2,#0FEH,L17; 数据控制            
MOV R2,#00H;      
MOV DPTR,#BUF1;                     
LCALL LOOP;           
LJMP PANDUAN   ;此处是主循环返回        
L17:CJNE R2,#0EDH,MAIN;            
MOV R2,#00H;           
MOV DPTR,#BUF2;                     
LCALL LOOP;           
LJMP PANDUAN   ;此处是主循环返回
RET;

LOOP:   
MOV R0,#03H;           定义发送数量   
MOV R3,#00H;
LM:   
MOV A,R3;   
MOVC A,@A+DPTR;   
LCALL SendOneByte;     这是发送已知的3个字节
INC R3;   
DJNZ R0,LM;   
RET;

SendOneByte:                ;这个发送程序可以不用中断
CLR ES;                        发送数据   
CLR TI;   
MOV SBUF,A;
WAIT:     
JNB TI,WAIT;          发送等待   
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;                        接收数据   
PUSH ACC;   
MOV A,SBUF;   
MOV R2,A;                    接收数据存入R2就可以了,主程序不断判断R2中的数据
;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;                        定义数据段
BUF2:  DB 0FDH,0FDH;
END;
回复

使用道具 举报

7#
ID:691738 发表于 2020-2-17 14:24 | 只看该作者
感谢,非常感谢,很详细,学习了,再次感谢您
回复

使用道具 举报

8#
ID:691738 发表于 2020-2-17 16:42 | 只看该作者
你好,我还有一个问题,怎么定义236个字节的数据呢,我试了一下只能定义100个字节,多了就报错,语法错误,应该怎么定义呢?谢谢
回复

使用道具 举报

9#
ID:235200 发表于 2020-2-17 18:52 | 只看该作者
这样定义:
BUF1:  DB 01H,02H,……
           DB 01H,02H,……
           DB 01H,02H,……
            DB 01H,02H,……
但要注意取数据的方式,一般采用MOVC  A,@A+DPTR 命令最多只能取255个,但定义不受限制
回复

使用道具 举报

10#
ID:691738 发表于 2020-2-17 21:15 | 只看该作者
好的 明白了 感谢您 学到了很多
回复

使用道具 举报

11#
ID:691738 发表于 2020-2-19 16:01 | 只看该作者
你好,现在好像又遇到了新的问题,用proteus和串口助手进行仿真,数据可以正常发送执行,烧录到单片机不行了,单片机型号是stc89C52rc,晶振是11.0592MHz,现在现象是用串口助手给单片机发送数据,单片机没反应,更改其它波特率,有时会动作一下,外接的继电器,已经折腾了一天了,不知道该怎么办,希望您再给指点指点,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表