打印

串口接收的数据不对

[复制链接]
8045|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
发送程序
ORG  0000H
LJMP MAIN
ORG  0023H
LJMP COM_INT
ORG 1000H
MAIN:    MOV  SP,#53H    ;设置堆栈指针
         MOV  78H,#20H    ;设置要发送的数据块的首、末地址
         MOV  77H,#00H   
         MOV  76H,#20H
         MOV  75H,#40H
         ACALL TRANS      ;调用发送子程序
         SJMP  $
TRANS:   MOV TMOD,#20H    ;设置定时器/计数器
         MOV TH1,#0F3H     ;设置计数器1初值
         MOV TL1,#0F3H
         MOV PCON,#80H    ;波特率加倍
         SETB  TR1         ;打开计数器1
         MOV SCON,#40H   ;设置串行口工作方式
         MOV IE,#00H        ;先关闭中断,利用查询方式发送地址侲
         CLR F0
         MOV SBUF,78H     ;发送首地址高8位   78H对应的地址是#20H
WAIT1:   JNB TI,WAIT1
         CLR TI
         MOV SBUF,77H     ;发送首地址低8位   77H对应的地址是#00H
WAIT2:   JNB TI,WAIT2
         CLR TI
         MOV SBUF,76H     ;发送末地址高8位
WAIT3:   JNB TI,WAIT3
         CLR TI
         MOV SBUF,75H     ;发送末地址低8位
WAIT4:   JNB TI,WAIT4
         CLR TI
         MOV IE,#90H
         MOV DPH,78H
         MOV DPL,77H
         MOVX A,@DPTR
         MOV SBUF,A
WAIT:    JNB  F0,WAIT     ; F0为0则转移
         RET              ; 返回子程序开始
COM_INT: CLR  TI          ;关发送中断标志位TI
         INC  DPTR       ;数据指针加1,准备发送下个数据
         MOV  A,DPH      ;判断当前被发送的数据的地址是不是末地址
         CJNE A,76H,END1 ;不是末地址则跳转
         MOV  A,DPL      ;同上
         CJNE  A,75H,END1
         SETB  F0         ;数据发送完毕,置1标志位
         CLR   ES         ;关串行口中断
         CLR   EA         ;关中断
         RET               ;中断返回
END1:   MOVX  A,@DPTR    ;将要发送的数据送累加器,准备发送
         MOV   SBUF,A     ;发送数据
         RETI             ;中断返回
         END

用串口调试助手 Assess port看得到的数如下:
20 00 20 40 00 00 00 00 00...........
显示的两个数应该是地址桢吧,为什么没有接收到数据桢呢?是不是没有进入中断?怎么才能进入中断?
         MOV  78H,#20H   
         MOV  77H,#00H   
         MOV  76H,#20H
         MOV  75H,#40H
这四句是给出的地址还是数据?

相关帖子

沙发
likefpga|  楼主 | 2010-4-18 11:48 | 只看该作者
这是串口调试助手的接收显示:

使用特权

评论回复
板凳
一棵小草| | 2010-4-18 12:20 | 只看该作者
貌似缺少 SETB      EA
              SETB     ES   

而且在中断函数中,关掉中断,其他地方没开。那么也只能进一次中断了

使用特权

评论回复
地板
likefpga|  楼主 | 2010-4-18 13:05 | 只看该作者
END1:   MOVX  A,@DPTR    ;将要发送的数据送累加器,准备发送
         MOV   SBUF,A     ;发送数据
         RETI             ;中断返回
         
这个中断返回到哪里,是到END   CJNE A,76H,END1 ;?还是到COM_INT
INC DPTR这句该如何理解,DPTR增1对应着哪里增1?
请明白的稍微详细地说一下,十分感谢!!

使用特权

评论回复
5
likefpga|  楼主 | 2010-4-18 13:32 | 只看该作者
MOV IE,#90H  这句不是从查询状态出来以后开中断吗?

使用特权

评论回复
6
ejack| | 2010-4-18 14:04 | 只看该作者
1. 中断函数不该用RET返回。这程序跑得很玄乎……呼唤汇编高人给看看
2. 数据帧从外部RAM取内容,问题是外部RAM有内容吗?

使用特权

评论回复
7
likefpga|  楼主 | 2010-4-18 14:23 | 只看该作者
同意楼上的观点,这个程序我调了很长时间,串口助手好像只能收到地址桢,下面是对应该发送程序的接收程序:
    ORG     0000H
       LJMP    MAIN
       ORG     0023H
       LJMP    COM_INT
       ORG     1000H
MAIN:  MOV     SP,#53H    ;设置堆栈指针
       ACALL   RECEL     ;调用接收子程序
       SJMP    $
RECEL: MOV     R0,#78H    ;设置地址接收区
       MOV     TMOD,#20H  ;设置定时器/计数器工作方式
       MOV     TH1,#0F3H  ;设置波特率
       MOV     TL1,#0F3H  
            MOV     PCON,#80H  ;波特率加倍
       SET     TR1        ;开计数器
       MOV     SCON,#50H  ;设置串行口工作方式
       MOV     IE,#90H    ;开中断
       CLR     F0         ;清标志位
       CLR     7FH
WAIT:  JNB     7FH,WAIT    ;查询标志位等待接收
       RET
COM_INT:  PUSH   DPL      ;压栈,保护现场
          PUSH   DPH   
                  PUSH   ACC
                 CLR    RI        ;清接收中断标志位
          JB     F0,R_DATA ;判断接收的是数据还是地址F0=0为地址
          MOV    A,SBUF    ;接收地址
          MOV    @R0,A     ;将地址桢送指定的寄存器
          DEC    R0
                 CJNE   R0,#74H,RETN
                 SETB   F0        ;置位标志位,地址接收完毕
RETN:     POP    ACC       ;出栈,恢复现场
        POP    DPH
              POP    DPL
              RETI             ;中断返回
R_DATA:   MOV    DPH,78H   ;数据接收程序区
         MOV    DPL,77H   
                MOV    A,SBUF    ;接收数据
         MOVX   @DPTR,A   ;送指定的数据存储单元中
         INC    77H       ;地址加1
               MOV    A,77H     ;判断当前接收的数据的地址是否向高8位进位
         JNZ    END2
               INC    78H
END2:     MOV    A,76H
              CJNE   A,78H,RETN ;判断是否为最后一桢数据,不是则继续
        MOV    A,75H
              CJNE   A,77H,RETN ;是最后一桢数据则清各种标志位
        CLR    ES
              CLR    EA
             SETB   7FH
             SJMP   RENT
             END

使用特权

评论回复
8
likefpga|  楼主 | 2010-4-18 17:33 | 只看该作者
请串口、汇编都很熟的达人,指点迷津。

使用特权

评论回复
9
vrgood| | 2010-4-18 22:55 | 只看该作者
后面64个00不就是你收到的数据吗?也就是说你外部RAM地址2000-203F的空间读到的数据都是0。

使用特权

评论回复
10
likefpga|  楼主 | 2010-4-19 07:05 | 只看该作者
那如果想让读到的数据有内容(非0),应该在发送程序中如何编写?

使用特权

评论回复
11
冷漠| | 2010-4-19 09:43 | 只看该作者
本帖最后由 冷漠 于 2010-4-19 09:47 编辑

十六进制发送,发送区写"123456789abcdef"(没有冒号)即可。

要先摸透AccessPort,只要先把Com1或Com2的2、3脚短路(不连接任何外部电路),设置“自动发送”,时间间隔“1000毫秒”,即可观察到接收区显示接收到的发送区发出的数据,一秒种一帧。

使用特权

评论回复
12
冷漠| | 2010-4-19 17:31 | 只看该作者

XSEG AT 02000H ; 少写一个0,修正。

本帖最后由 冷漠 于 2010-4-19 17:34 编辑

这么写

使用特权

评论回复
13
冷漠| | 2010-4-19 17:38 | 只看该作者
直接输入也好。


使用特权

评论回复
14
likefpga|  楼主 | 2010-4-19 17:53 | 只看该作者
能不能把工程文件发给我,十分感谢。

使用特权

评论回复
15
likefpga|  楼主 | 2010-4-19 18:37 | 只看该作者
还是问冷漠同志,如下:
你说的十六进制发送,发送区是在keil中,还是在调试助手AccessPort中?也就是说发送和接收都在Access Port中?

使用特权

评论回复
16
ejack| | 2010-4-19 19:53 | 只看该作者
想让发送的数据串非0,你自己发一个非零的字符串不就得了

使用特权

评论回复
17
likefpga|  楼主 | 2010-4-19 20:30 | 只看该作者
13楼,你的memory1的窗口中的数据是怎么得到的,请指点。

使用特权

评论回复
18
冷漠| | 2010-4-19 20:32 | 只看该作者
回15楼:见贴图。与自己的程序无关,先玩通串口助手。汇编成组向Xdata置数,第一是借助C模块。第二是利用汇编宏。都很好玩,刺激。

使用特权

评论回复
19
likefpga|  楼主 | 2010-4-19 20:39 | 只看该作者
谢了,照你所说,好好研究一下。

使用特权

评论回复
20
likefpga|  楼主 | 2010-4-20 07:07 | 只看该作者
引用:汇编成组向Xdata置数,第一是借助C模块。第二是利用汇编宏。

1.我刚刚开始学单片机,能不能说得稍微详细一点儿。
2.你上图的结果是怎么设置串口和串口调试助手得到的?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

34

帖子

0

粉丝