21ic电子技术开发论坛 单片机与嵌入式系统 侃单片机论坛 51串口问题
发新帖我要提问
返回列表
打印

51串口问题

[复制链接]
1883|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在编写串口测试的时候,遇到了这样的问题,调试了好几遍,都没找到问题出在哪儿,很困惑,希望有人能指点下。
  源程序如下:

             ORG 0000H
           JMP START
           ORG 0030H
START:
           MOV SP,#30H
           MOV SCON,#50H                         ;串行口工作模式1,接收使能
           MOV TMOD,#20H    ;Timer 1 工作模式2
           MOV TH1,#0FDH    ;波特率9600
           MOV TL1,#0FDH    ;启动Timer 1
           SETB TR1
   
           CLR RS1                               ;小数部分原来数值
           CLR RS0
           MOV R0,#0
           MOV R1,#1
           MOV R2,#2
           MOV R3,#3
           MOV R4,#4
           CLR RS1                               ;整数部分原来数值
           SETB RS0
           MOV R0,#10H            ;该位为0,在该位后面显示小数点
           MOV R1,#1
           MOV R2,#2                           
           MOV R3,#3
           MOV R4,#4
           MOV R5,#0
           MOV R6,#0
           MOV R7,#0
           MOV 7FH,R7                            ;整数部分转移到内存区
           MOV 7EH,R6
           MOV 7DH,R5
           MOV 7CH,R4
           MOV 7BH,R3
           MOV 7AH,R2                           
           MOV 79H,R1
           MOV 78H,R0            ;此位含小数点
           CLR RS1
           CLR RS0
           MOV 77H,R4            ;小数部分转移到内存区
           MOV 76H,R3
           MOV 75H,R2
           MOV 74H,R1
           MOV 73H,R0
           SETB RS1
           CLR RS0
           MOV B,#13                             ;B存放当前转移的第几个字节
           MOV R0,#7FH                           ;R0中存放当前要转换的数据的地址 7FH-73H
    MOV R1,#72H                           ;R1中存放当前数据要转移到的地址 72H-66H
   
   HEX2ASCII:
           MOV A,R0                              
           CJNE A,#78H,NDOT                      ;如果该位后不显示小数,则跳到NDOT
           JMP DOT_ALERT                         ;该位后要显示小数,跳到DOT_ALERT
      NDOT:                                      ;该位后不显示小数
           MOV A,@R0
           ORL A,#30H            
    MOV @R1,A
           DEC R0
           DEC R1
           DJNZ B,HEX2ASCII
    JMP ZERO_DEL                          ;转化完毕
      DOT_ALERT:                                 ;该位后显示小数点
           MOV A,@R0                             ;转化该位
           ORL A,#30H
           MOV @R1,A
           DEC R1
           MOV @R1,#2EH                          ;该位后显示小数点
           DEC R0
           DEC R1
           DJNZ B,HEX2ASCII
    ZERO_DEL:   
                                                 ;控制最前面的0不显示
           MOV R0,#72H
           MOV R1,#14
         
    ZERO_LOOP:
           MOV A,R1
           CJNE A,#7,ZERO_NEXT
    JMP DIS_ASCII
    ZERO_NEXT:
           MOV A,@R0
           CJNE A,#30H,DIS_ASCII
           DEC R0
           DJNZ R1,ZERO_LOOP
                          
     DIS_ASCII:
           MOV A,@R0
           MOV SBUF,A            ;发送数据
           JBC TI,DIS_ASCII                ;若没有发送完,继续发送
           LCALL DIS_DELAY                       ;发送完一个ASCII码后,延时0.1ms
           
           SETB RS1
           CLR RS0
           DJNZ R1,DIS_NEXT           ;发送下一位
           SJMP $
           
         DIS_NEXT:
           DEC R0
           JMP DIS_ASCII
  DIS_DELAY:                                     ;延时0.1ms
           SETB RS1
           SETB RS0
                       
           MOV R3,#48
    DJNZ R3,$
           DJNZ R2,DIS_DELAY
  
           RET
;---------------------------------------------------------------------------                  
           END

相关帖子

沙发
icycoffee|  楼主 | 2011-5-14 15:14 | 只看该作者
该程序主要想显示一串数字,并且数字前面的0不显示,例如:00043210.43210 在虚拟终端上显示应该是
43210.43210 另外,如果是小数,例如:00000000.43210 则显示0.43210

使用特权

评论回复
板凳
icycoffee|  楼主 | 2011-5-14 15:16 | 只看该作者
但是运行改程序后,在虚拟终端上并没有显示43210.43210 而是显示43210.4f210 就是小数第2位显示不正确,可是我在keil里面明明看到在68H内存区内的ASCII码值是33H !!!为什么不显示3呢???

使用特权

评论回复
地板
mohanwei| | 2011-5-14 15:35 | 只看该作者
把中断优化级别设为0,在发送到串口前下断点,观测缓冲区是否正确,再单步观测发送到SBUF的过程

使用特权

评论回复
5
mohanwei| | 2011-5-14 15:36 | 只看该作者
把你的程序拷贝到keil里编译运行了一下,一字不改,发现输出到虚拟串口的是:
43210.43210
:lol

使用特权

评论回复
6
icycoffee|  楼主 | 2011-5-14 15:41 | 只看该作者
5# mohanwei

难道是我今天人品不佳 proteus不给力:funk:

使用特权

评论回复
7
icycoffee|  楼主 | 2011-5-14 15:42 | 只看该作者
5# mohanwei

你用PROTEUS仿真过没???

使用特权

评论回复
8
mohanwei| | 2011-5-14 15:52 | 只看该作者

Keil自身就带虚拟串口……

使用特权

评论回复
9
icycoffee|  楼主 | 2011-5-14 16:04 | 只看该作者
8# mohanwei

刚才我也试过了 但是不知道为什么放到PROTEUS里面就不行了 那个小数部分的3就是显示f :L

使用特权

评论回复
10
ygzjyh| | 2011-5-14 18:34 | 只看该作者
你把下面的程序段的R3改为50H就可以在PROTEUS中正常显示了。                       
           MOV R3,#48
    DJNZ R3,$
           DJNZ R2,DIS_DELAY
  
           RET

使用特权

评论回复
11
ygzjyh| | 2011-5-14 18:34 | 只看该作者
你把下面的程序段的R3改为50H就可以在PROTEUS中正常显示了。                       
           MOV R3,#48
    DJNZ R3,$
           DJNZ R2,DIS_DELAY
  
           RET

使用特权

评论回复
12
icycoffee|  楼主 | 2011-5-15 09:54 | 只看该作者
11# ygzjyh

这个跟延时有什么关系?R3改成其它的又不能正常显示了,改成50和50H能正常显示,为什么???

使用特权

评论回复
13
icycoffee|  楼主 | 2011-5-15 09:55 | 只看该作者
11# ygzjyh

很诡异啊

使用特权

评论回复
14
ygzjyh| | 2011-5-15 12:43 | 只看该作者
应该是R3寄存器复用了,你仔细检查一下吧,另外串口最好用中断方式,不要用查询方式,这样结构更加清晰。

使用特权

评论回复
15
icycoffee|  楼主 | 2011-5-15 14:24 | 只看该作者
14# ygzjyh
谢了 我再改一下调试调试看看

使用特权

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

本版积分规则

个人签名:热爱生活 崇尚自由

0

主题

46

帖子

1

粉丝
关闭 热门推荐
快速回复 在线客服 返回列表 返回顶部