打印

求教高手:at89c2051的单片机-PC 485通信问题

[复制链接]
6471|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 zhumingxing 于 2010-5-12 14:45 编辑

我用at89C2051,485控制芯片用sn75176,笔记本电脑通过232转485设备与单片机通讯,波特率2400,用串口调试助手发送1或者2或者3时,接收到的总是“——————”这些,无法显示发送的数据。
程序如下:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char flag,a,i;
void DelayUs(unsigned char us)   //delay us微秒级延时
{
unsigned char uscnt;
uscnt=us>>1;/* Crystal frequency in 12MHz*/
while(--uscnt);
}
/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
while(--ms)
   {
     DelayUs(250);
     DelayUs(250);
     DelayUs(250);
     DelayUs(250);
   }
}

void init()
  {
  
   TMOD=0x20;//定时器1,模式2
   TH1=0xF3;//波特率2400bps,12Mhz晶振
   TL1=0xF3;
   TR1=1;
   REN=1;//允许串行接收位
   SM0=0;
   SM1=1;//8位数据位,方式1
   EA=1;
   ES=1;
                              
  }
void main()
{
  init();
   delay();
  while(1)
    {
     if(flag==1)//标志位为1,收到数据后
      {
       DelayMs(4);
       ES=0;               
      SBUF=a;//把数据发送回来
     while(!TI);
      TI=0;
      ES=1;
      flag=0;
    }
   }
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
}

截图01.jpg (55.39 KB )

电路图

电路图

相关帖子

沙发
zhumingxing|  楼主 | 2010-5-12 14:40 | 只看该作者
其中TD30和RD30无上拉电阻

使用特权

评论回复
板凳
37150839| | 2010-5-12 16:55 | 只看该作者
换华邦的W79E2051吧,等你试好了AT89C2051 也买不到货了

使用特权

评论回复
地板
华邦掌门人| | 2010-5-12 16:58 | 只看该作者
呵呵 楼上的心有体会了

使用特权

评论回复
5
冷漠| | 2010-5-12 18:40 | 只看该作者
照此接法,什么外设都不用接,串口助手发出的内容必然回馈到接收端,——自发自收。发出123,助手自己必然收到并在接收区显示123.

使用特权

评论回复
6
zhumingxing|  楼主 | 2010-5-13 08:27 | 只看该作者
不理解啊 3# 37150839

使用特权

评论回复
7
zhumingxing|  楼主 | 2010-5-13 08:28 | 只看该作者
这个程序用232通信没有问题啊 ,485就不行5# 冷漠

使用特权

评论回复
8
冷漠| | 2010-5-13 08:54 | 只看该作者
哈,当然不行,你至少先要把回馈回路阻断。就好像232,把发送端和接收端短路了,你这个程序还行吗?——而你现在的485电路不就是发送接收回馈(短路)吗?75176不是这么用的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
zhumingxing + 1
9
zhumingxing|  楼主 | 2010-5-13 12:51 | 只看该作者
嗯,谢谢,我试试 8# 冷漠

使用特权

评论回复
10
冷漠| | 2010-5-13 20:35 | 只看该作者
75176接法,只需要一个,用一个P1.x端口控制74ls14,高电平输入,低电平输出。

使用特权

评论回复
11
dong2007| | 2010-5-13 21:11 | 只看该作者
楼上的个性签名:要想让别人关照自己的自尊,首先自己先要有所成就才行。
强顶!

使用特权

评论回复
12
冷漠| | 2010-5-13 21:36 | 只看该作者
知音啊。楼上的签名冷漠也记住啦。
再写一句:“人是为了自己喜爱(热爱)的东西活着的。”

使用特权

评论回复
13
zhumingxing|  楼主 | 2010-5-14 10:38 | 只看该作者
那我的电路图把接收的那个75176去掉,只用发送功能可以吗 10# 冷漠

使用特权

评论回复
14
冷漠| | 2010-5-14 11:12 | 只看该作者
应该可以,把接收那个75176拔掉就行。只发不收

使用特权

评论回复
15
zhumingxing|  楼主 | 2010-5-14 13:26 | 只看该作者
嗯,谢谢哦 14# 冷漠

使用特权

评论回复
16
冷漠| | 2010-5-14 13:47 | 只看该作者
本帖最后由 冷漠 于 2010-5-14 13:49 编辑

行了以后告诉我。不行我给你个收/发程序。
RS485/sn75176 玩了3年了;一对双绞线,挂了40个节点,收/发来回半双工。速率375K。距离100米。——应该更远。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
zhumingxing + 1
17
zhumingxing|  楼主 | 2010-5-14 15:04 | 只看该作者
本帖最后由 zhumingxing 于 2010-5-14 15:11 编辑

我把程序改了,把接收的那个75176拔掉了,让2051一直向PC发数据“123456”,结果串口调试助手收到的却是“V6 g硋V6 g硋V6 g硋V6 g硋V6 g硋V6 g硋V6 g硋V6 g硋V”这些字符,不知道为什么啊
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char flag,a,i;
uchar code table[]="123456 ";
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1;/* Crystal frequency in 12MHz*/
while(--uscnt);
}
/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
while(--ms)
   {
     DelayUs(250);
     DelayUs(250);
     DelayUs(250);
     DelayUs(250);
   }
}
void delay()
{ ; ; }
void init()
  {
  
   TMOD=0x20;//定时器1,模式2
   TH1=0xF3;//波特率2400bps,12Mhz晶振
   TL1=0xF3;
   TR1=1;
   REN=0;//禁止串行接收位
   SM0=0;
   SM1=1;//8位数据位,方式1
   EA=0;
   ES=0;
                              
  }
void main()
{
  init();
   delay();
  while(1)
    {
       DelayMs(40);
     for(i=0;i<6;i++)
        {
         SBUF=table;
DelayMs(2);
         while(!TI);
          TI=0;
      }
   }
} 16# 冷漠

使用特权

评论回复
18
zhumingxing|  楼主 | 2010-5-14 15:09 | 只看该作者
我所用的232转485
16# 冷漠

截图02.jpg (170.59 KB )

截图02.jpg

使用特权

评论回复
19
冷漠| | 2010-5-14 17:05 | 只看该作者
本帖最后由 冷漠 于 2010-5-14 17:18 编辑

建议:你先直接用232和PC串口助手通信,都通过了,然后再接RS232转RS485。

有些问题我不明白:你自己单片机这边接了个75176,已经转成485了,经双绞线传输后只能通过又一个75176再恢复成232才能接PC机是不是?

再有注意串口助手设定“16进制显示”。还有你PC机串口线必须用标准9芯电缆,都要自己万用表细心量过。PC机是3出2入的,你的电缆就应该3入2出。——第2脚有-10V左右电压。第3脚无电压。

有点明白了:既然用HEXIN转接器,那你还设计75176电路干什么?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
zhumingxing + 1
20
zq1987731| | 2010-5-14 17:24 | 只看该作者
75176的收使能接地,发使能由你的IO控制
485的输出本就该反馈给输入便于冲突检测处理,这种应用在工业级产品上多了去了
别把485当成232,前者半双工,后者全双工,机制都不一样

使用特权

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

本版积分规则

13

主题

142

帖子

3

粉丝