打印

请教:单片机通讯问题

[复制链接]
1625|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flybluefox|  楼主 | 2008-9-18 21:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在做一个电路:单片机用的是89s52,由于单片机只有一个串口,需要用IO模拟一个串口,详见电路的框图。现在板子的两个部分max232和max485我已经分别调通,但是现在联调时,通讯就不正常了,我的调试过程如下:打开两个串口调试助手,从串口1发送数据,看串口2能否正确收到数据。可调试不成功,我从串口1发送“K”,串口2收到数据却是“R”。可能是程序没有写好,自己是新手,还没有写过多少单片机程序,还请大虾们多多指点!
我的程序如下:
ORG 0000H 
AJMP MAIN;转入主程序
ORG 000BH
LJMP LOOP2
ORG 0100H 

MAIN:MOV TMOD,#22H
     MOV SCON,#50H;设置成串口1方式
     MOV PCON,#00H
     MOV TH0,#0A0H ;9600bps 就是1000000/9600=104.167微秒,执行的时间是104.167*11.0592/12=96 
     MOV TL0,#0A0H ;定时器初值为(256-96)            
     MOV TH1,#0FDH;预置初值(按照波特率9600BPS预置初值)
     MOV TL1,#0FDH;预置初值(按照波特率9600BPS预置初值)
     CLR TR0
     SETB ET0
     SETB EA
     SETB TR1;启动定时器T1

     SETB P2.7;max485设置成接收状态
LOOP: JNB RI,$
     MOV A,SBUF 
     MOV R2,#09H
     CLR F0
     CLR P1.0
     SETB TR0
     SETB C
LOOP1: JNB F0,$   
     RRC A;把A.0的值移入到C中
     MOV P1.0,C;把C的值输出到模拟发送端
     CLR F0
     DJNZ R2,LOOP1
     CLR TR0
     CLR RI
     AJMP LOOP

LOOP2: SETB F0
       RETI
END

相关帖子

沙发
lbx_00| | 2008-9-19 12:05 | 只看该作者

异步通信的起始位和停止位要比信息位长

具体长多少,去查书,估计是你的模拟串口的起始位搞的怪,因为我看到它的起始位和信息位在实践延迟上没有区别,这是不对的。

使用特权

评论回复
板凳
lyjian| | 2008-9-19 12:41 | 只看该作者

楼上说的不对

使用特权

评论回复
地板
lyjian| | 2008-9-19 16:19 | 只看该作者

波特率误差挺大的

起始位的时间要比数据位多大概10个指令周期
停止位也没发完就开始发第二个字节。
第二个字节的起始位时间又和第一个字节的不一样。

使用特权

评论回复
5
匠人笔记| | 2008-9-21 13:36 | 只看该作者

huibianhaonan

kanbudong 

使用特权

评论回复
6
NE5532| | 2008-9-21 21:27 | 只看该作者

你跳得太快了

一来就搞两个串口联调。

先调发送那边,确认了以后调接收,然后再联调。

可参考我笔记:脱离仿真器玩单片机里的调试思想。

使用特权

评论回复
7
农民讲习所| | 2008-9-21 21:47 | 只看该作者

你这个程序能看但不能实用。

使用特权

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

本版积分规则

认证:上海芯圣(holychip)电子股份有限公司
简介:上海芯圣电子股份有限公司(Holychip)是一家专注于芯片设计研发和销售的集成电路设计企业,专业从事MCU及MCU周边芯片的研发和销售,致力于为客户提供高性能、高性价比的芯片产品、应用开发工具和系统解决方案。

14

主题

63

帖子

2

粉丝